﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-空间站-文章分类-HTML &amp; Script</title><link>http://www.blogjava.net/i369/category/22057.html</link><description>北极心空</description><language>zh-cn</language><lastBuildDate>Thu, 20 Mar 2008 22:51:30 GMT</lastBuildDate><pubDate>Thu, 20 Mar 2008 22:51:30 GMT</pubDate><ttl>60</ttl><item><title>围绕Ext JS 2.0的IDE、插件和工具 [转自javaeye]</title><link>http://www.blogjava.net/i369/articles/187545.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 20 Mar 2008 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/187545.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/187545.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/187545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/187545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/187545.html</trackback:ping><description><![CDATA[<table id="forum_main" cellspacing="1">
    <tbody id="posts">
        <tr id="p_461188">
            <td class="postauthor">
            <ul>
                <li></li>
            </ul>
            </td>
            <td class="postcontent">
            <div class="postactions">&nbsp;</div>
            <div class="postbody clearfix">
            <div id="related_topics" style="position: relative" _madepositioned="true" _eventid="2">&nbsp;&nbsp; Ext 2.0的API包含许多的方法（函数）、属性和配置项，涵盖的面非常大，要全部列出几乎是不可能的。虽然<a href="http://extjs.com/deploy/dev/docs/" target="_blank">API文档</a>是童叟无欺精心打造的，但实际开发中，若果能够像其它语言Java和C#那样地支持JavaScript代码提示，那就更好啦。可喜的是，有若干的开发环境（IDE）和插件能够支持－－并且是直接支持Ext 2.0。<br />
            <br />
            &nbsp; &nbsp; <strong>Aptana Studio</strong><br />
            &nbsp; &nbsp; 一谈到JavaScript的开发工具，就不得不提<a href="http://aptana.com/studio/" target="_blank">Aptana</a>了。就我实际工作来说，每天都用它来完成Adobe AIR的工作。但是Aptana当前捆绑的Ext的版本有些旧（1.1的），下面就介绍一个<a href="http://orsox.mocis.at/download.php?view.1" target="_blank">插件</a>的安装方法，让Aptana支持到2.0（由Markus Schmidleitner提供，用起来还不错）：</div>
            <blockquote>1.下载并安装Aptana Studio;<br />
            2.打开你的Aptana程序目录（我这儿是C:\Aptana），复制jar格式的文件到plugins目录；<br />
            3.重启Aptana；<br />
            4.进入Window -&gt; Preferences -&gt; Aptana -&gt; Editors -&gt; JavaScript -&gt; Code Assist选择Ext 2.0（或要反选Ext.1.1）。</blockquote>
            <p><br />
            <img alt="" src="http://extjs.com/playpen/screenshots/codeassist/aptana.gif" border="0" _counted="undefined" /></p>
            <p align="center"><span style="font-size: 10px">Aptana Studio with Ext 2.0 code assist</span></p>
            <br />
            <strong>Spket Eclipse插件与IDE</strong><br />
            &nbsp; &nbsp; <a href="http://www.spket.com/" target="_blank">Spket IDE</a>是目前支持Ext 2.0最为出色的IDE。 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的Script doc中。<br />
            &nbsp; &nbsp; 由于Spket只是一个单纯的编辑器，没有其它格式的支持（如CSS），所以我的做法是用它的Eclipse插件形式，安装到Aptana。安装办法如下：<br />
            <blockquote>&nbsp; &nbsp; 1.下载安装Aptana Studio（包含有Eclipse）；<br />
            &nbsp; &nbsp; 2.启动Aptana并打开程序菜单到：Help &#8594; Software Updates &#8594; Find and Install&#8230; &#8594; Search for new features to install &#8594; New remote site&#8230; <br />
            &nbsp; &nbsp; 3.名称: &#8220;Spket&#8221;，地址URL是<a href="http://www.spket.com/update/" target="_blank">http://www.spket.com/update/</a> <br />
            &nbsp; &nbsp; 4.重启Aptana；<br />
            &nbsp; &nbsp; 5.观看一下这个SketIDE的<a href="http://www.spket.com/demos/js.html" target="_blank">教程</a>，看看Ext代码提示的功能有多省事（你可以修改/src/ext.jsb 保持最新版的Ext），基本步骤如下：<br />
            <ol>
                <li>Window &#8594; Preferences &#8594; Spket &#8594; JavaScript Profiles &#8594; New ；
                <li>输入&#8220;ExtJS&#8221;点击OK；
                <li>选择&#8220;ExtJS&#8221; 并点击&#8220;Add Library&#8221;然后在下拉条中选取&#8220;ExtJS&#8221;；
                <li>选择 &#8220;ExtJS&#8221;并点击&#8220;Add File&#8221;，然后在你的./ext-2.x/source目录中选取&#8220;ext.jsb&#8221; 文件；
                <li>设置新的ExtJS Profile，选中并点击&#8220;JavaScript Profiles&#8221; 对话框右手边的&#8220;Defalut&#8221;按钮；
                <li>重启Aptana；
                <li>创建新的JS文件并输入： Ext这样就可设置Ext Code代码自动完成的功能。</li>
            </ol>
            </blockquote><br />
            &nbsp; &nbsp; 由于你是在Aptana中安装插件的，Aptana还是你默认的JS编辑器，所以要试用Spket，你要在那个文件上选中&#8220;Open with&#8221;－&gt; Spket JavaScript Editor 。<br />
            <br />
            <img alt="" src="http://extjs.com/playpen/screenshots/codeassist/spket.gif" border="0" _counted="undefined" />
            <p align="center"><span style="font-size: 10px">Spket in Aptana with full documentation and code assist</span></p>
            <p><br />
            <strong>Komodo Edit </strong><br />
            &nbsp; &nbsp; <a href="http://www.activestate.com/Products/komodo_edit/" target="_blank">Komodo Edit</a>为众多格式文件提供支持，包括Perl、PHP、Python、Ruby和Tcl。亦支持浏览器方面的代码包括有JavaScript、CSS、HTML和XML。Windows、Mac Os和Linux平台都可用。<br />
            &nbsp; &nbsp; 安装Ext支持下的Komodo：</p>
            <blockquote>&nbsp; &nbsp; 1.下载和安装Komodo Edit；<br />
            &nbsp; &nbsp; 2.下载<a href="http://community.activestate.com/komodo-extension/extjs-api-catalog-collection" target="_blank">API catalog</a>；<br />
            &nbsp; &nbsp; 3.进入Edit -&gt; Preferences -&gt; Code Intelligence 并选择位于&#8220;API Catalog&#8221;下方的按钮&#8220;Add an API catalog&#8221; ；<br />
            &nbsp; &nbsp; 4.选择刚才下载的ExtJS API cat<a href="http://www.activestate.com/Products/komodo_edit/" target="_blank">Komodo Edit</a>alog CIX 。</blockquote>
            <p><br />
            <img alt="" src="http://extjs.com/playpen/screenshots/codeassist/komodo.gif" border="0" _counted="undefined" /></p>
            <p align="center"><span style="font-size: 10px">Komodo with Ext JS code intelligence</span></p>
            <br />
            <strong>Dreamweaver</strong><br />
            &nbsp; &nbsp; 对于Dreamweaver的用户，有两种可用的插件<a href="http://www.spket.com/dreamweaver-extension.html" target="_blank">SpketDW</a>(Dreamweaver 2004或新版)和<a href="http://www.spket.com/dreamweaver-extension.html" target="_blank">SpketDWCS</a>(Dreamweaver CS3)。两者都是Spket团队开发的(刚才提及的)，因此也同样精确和出色。另外Dreamweaver插件的一大特点是很好地支持配置项的代码提示。<br />
            <p align="left">&nbsp;</p>
            <br />
            <span style="float: left"><span style="font-family: 宋体"><img alt="" src="http://extjs.com/playpen/screenshots/codeassist/dw-fns.gif" border="0" _counted="undefined" /></span>
            <p align="center"><span style="font-size: 10px"><span style="font-family: 宋体">Members code assist</span></span></p>
            <br />
            <p align="center"><span style="font-size: 10px"><br />
            </span></p>
            <br />
            </span><br />
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <br />
            <span style="float: left">
            <p align="center"><span style="font-family: 宋体"><img alt="" src="http://extjs.com/playpen/screenshots/codeassist/dw-configs.gif" border="0" _counted="undefined" /></span></p>
            <br />
            <p align="center"><span style="font-size: 10px"><span style="font-family: 宋体">Config option code assist</span></span></p>
            <br />
            <p align="center"><span style="font-size: 10px"><br />
            </span></p>
            <br />
            </span><br />
            <p align="left">&nbsp;</p>
            <p align="left"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: Arial Unicode MS"><br />
            </span></span></span></p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <br />
            <p align="left">&nbsp;</p>
            <p align="left"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: Arial Unicode MS"><br />
            </span></span></span></p>
            <p align="left"><br />
            </p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;</p>
            <p align="left">&nbsp;&nbsp; 要下载和安装，请浏览他们的<a href="http://www.spket.com/dreamweaver-extension.html" target="_blank">站点</a>。<br />
            <br />
            <strong>其它的IDE</strong><br />
            &nbsp; &nbsp; 还有其它的IDE,像由社区发起的正在工作着的IntelliJ和<a href="http://extjs.com/forum/showthread.php?t=18751" target="_blank">Visual Studio 2008</a>。<br />
            <br />
            <strong>总结</strong><br />
            &nbsp; &nbsp; 当工作中需要到Ext 2.0，的确有一些工具能辅助你提升工作效率，这真的要比较一番（Check them out、check out、checkout...）。如果你也发现有其它更好的工具，不妨雁过留声，与我们分享。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/187545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-03-20 18:25 <a href="http://www.blogjava.net/i369/articles/187545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eXtremeComponents指南</title><link>http://www.blogjava.net/i369/articles/149779.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sun, 30 Sep 2007 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/149779.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/149779.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/149779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/149779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/149779.html</trackback:ping><description><![CDATA[<div class="toc">
<p><strong>Table of Contents</strong></p>
<dl>
<dt><a href="http://www.blogjava.net/lucky/articles/32470.html#d0e19">定制FilterCell</a>
<dd>
<dl>
<dt>1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e22">引言</a>
<dd>
<dl>
<dt>1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e29">定制Droplist过滤器Cell示例</a></dt></dl></dd></dl>
<dt><a href="http://www.blogjava.net/lucky/articles/32470.html#d0e67">定制FilterRowsCallback</a>
<dd>
<dl>
<dt>1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e70">引言</a>
<dd>
<dl>
<dt>1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e82">定制FilterRowsCallback示例</a></dt></dl></dd></dl>
<dt><a href="http://www.blogjava.net/lucky/articles/32470.html#d0e108">Form指南</a>
<dd>
<dl>
<dt>1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e111">引言</a>
<dd>
<dl>
<dt>1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e118">JSP</a>
<dd>
<dl>
<dt>1.1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e132">Form特性的技术说明</a>
<dt>1.1.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e141">Checkbox</a>
<dt>1.1.3. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e146">Custom Cell</a>
<dt>1.1.4. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e163">JavaScript</a></dt></dl>
<dt>1.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e168">Cell</a>
<dt>1.3. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e177">Controller</a>
<dd>
<dl>
<dt>1.3.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e189">表标签动作Controller</a>
<dt>1.3.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e196">Form动作Controller</a>
<dt>1.3.3. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e203">重新得到Checkbox的值</a></dt></dl></dd></dl></dd></dl>
<dt><a href="http://www.blogjava.net/lucky/articles/32470.html#d0e212">Html视图定制指南</a>
<dd>
<dl>
<dt>1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e215">引言</a>
<dd>
<dl>
<dt>1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e224">View接口</a>
<dt>1.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e231">Messages示例</a></dt></dl></dd></dl>
<dt><a href="http://www.blogjava.net/lucky/articles/32470.html#d0e269">拦截器使用指南</a>
<dd>
<dl>
<dt>1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e272">引言</a>
<dd>
<dl>
<dt>1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e279">拦截器列表</a>
<dt>1.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e323">行拦截器示例</a></dt></dl></dd></dl>
<dt><a href="http://www.blogjava.net/lucky/articles/32470.html#d0e345">Limit指南</a>
<dd>
<dl>
<dt>1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e348">引言</a>
<dd>
<dl>
<dt>1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e355">JSP</a>
<dt>1.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e366">Controller</a>
<dt>1.3. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e396">Service</a>
<dd>
<dl>
<dt>1.3.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e401">取得总行数</a>
<dt>1.3.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e416">取得Collection</a></dt></dl>
<dt>1.4. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e431">DAO</a>
<dd>
<dl>
<dt>1.4.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e436">定义Query字符串</a>
<dt>1.4.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e449">Filter 和 Sort Query 字符串</a>
<dt>1.4.3. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e466">Limit Query String</a>
<dt>1.4.4. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e473">取回总行数和Collection.</a>
<dt>1.4.5. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e482">默认的Sort顺序</a></dt></dl></dd></dl></dd></dl>
<dt><a href="http://www.blogjava.net/lucky/articles/32470.html#d0e489">Preferences 指南</a>
<dd>
<dl>
<dt>1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e492">引言</a>
<dd>
<dl>
<dt>1.1. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e499">Preferences表</a>
<dt>1.2. <a href="http://www.blogjava.net/lucky/articles/32470.html#d0e657">指定Preference别名</a></dt></dl></dd></dl></dd></dl></div>
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e19"></a>定制FilterCell</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e22"></a>1.&nbsp;引言</h2>
</div>
</div>
</div>
<p>列的filterCell属性控制过滤器如何显示，它和cell属性非常相像并且也是实现Cell接口。马上要定义的是默认的和droplist这两个过滤器cells。 默认的是一个输入框元素而droplist是一个下拉列表元素。当然，如果你需要进行一些定制你可以插接自己的实现。</p>
<p>最近，我被问到是否能够实现一个过滤器cell，显示已经通过别的过滤器过滤得到数据子集。答案当然是肯定的，而且这是我将在这里示范的。通常定制的 cell可以很容易被创建，这个示例将印证这点。在这个示例里last name列里显示的将是通过first name过滤后的子集。如果没有通过 first name过滤那么所有值都将被显示。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e29"></a>1.1.&nbsp;定制Droplist过滤器Cell示例</h3>
</div>
</div>
</div>
<p>通常你只需要为过滤器cell实现Cell接口。然而，因为我们要创建的过滤器cell是一个下拉列表，我们可以通过扩展 FilterDroplistCell来获得它已经提供的很多功能，FilterDroplistCell是发行包已经提供的cells之一。</p>
<p>我们需要覆盖FilterDroplistCell的唯一方法是getFilterDropList()。这是整个类的全部代码：</p>
<pre class="programlisting">public class FilteredDroplistCell extends FilterDroplistCell {<br />
private static Log logger = LogFactory.getLog(FilterDroplistCell.class);<br />
<br />
protected List getFilterDropList(TableModel model, Column column) {<br />
List droplist = new ArrayList();<br />
<br />
String firstNameFilter = model.getLimit().getFilterSet().getValue("firstName");<br />
<br />
Collection beans = model.getCollectionOfBeans();<br />
for (Iterator iter = beans.iterator(); iter.hasNext();) {<br />
Object bean = iter.next();<br />
try {<br />
String firstName = BeanUtils.getProperty(bean, "firstName");<br />
if (StringUtils.isNotBlank(firstNameFilter) &amp;&amp; !firstName.equals(firstNameFilter)) {<br />
continue;<br />
}<br />
<br />
String lastName = BeanUtils.getProperty(bean, column.getProperty());<br />
if ((lastName != null) &amp;&amp; !droplist.contains(lastName)) {<br />
droplist.add(lastName);<br />
}<br />
} catch (Exception e) {<br />
logger.debug("Problems getting the droplist.", e);<br />
}<br />
}<br />
<br />
Collections.sort(droplist);<br />
<br />
return droplist;<br />
}<br />
}<br />
</pre>
<p>如果你比较这个类和父类，你会发现它们只有微小的区别。</p>
<p>首先需要注意的是我们需要找出first name是否已经被过滤了。</p>
<pre class="programlisting">String firstNameFilter = model.getLimit().getFilterSet().getValue("firstName");</pre>
<p>然后我们需要判断当前bean的first name值是否和first name过滤器值相同。如果相同，将当前的last name值 添加到droplist中。</p>
<pre class="programlisting">String firstName = BeanUtils.getProperty(bean, "firstName");<br />
if (StringUtils.isNotBlank(firstNameFilter) &amp;&amp; !firstName.equals(firstNameFilter)) {<br />
continue;<br />
}<br />
</pre>
<p>如果last name将添加到droplist中，我们需要检查droplist中是否已经包含了这个值。如果没有，我们就把它添加到droplist中。 </p>
<pre class="programlisting">String lastName = BeanUtils.getProperty(bean, column.getProperty());<br />
if ((lastName != null) &amp;&amp; !droplist.contains(lastName)) {<br />
droplist.add(lastName);<br />
}</pre>
<p>为了使用这个Cell你应该在Preferences中声明一个别名。 <span class="emphasis"><em>当然，你可以省略这步而在JSP中提供这个Cell实现类的全路径，但是使用Preferences更简洁。</em></span></p>
<pre class="programlisting">column.filterCell.filteredDroplist=org.extremesite.cell.FilteredDroplistCell</pre>
<p>在ColumnTag通过设置filterCell属性来使用FilteredDroplistCell。</p>
<pre class="programlisting">&lt;ec:column property="lastName" filterCell="filteredDroplist"/&gt;</pre>
<p><span class="emphasis"><em>如果不清楚Preferences和ColumnTag定义语法请参考Preferences指南。 </em></span></p>
</div>
</div>
</div>
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e67"></a>定制FilterRowsCallback</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e70"></a>1.&nbsp;引言</h2>
</div>
</div>
</div>
<p>FilterRowsCallback被用来过滤传给eXtremeTable的Beans的Collection。 FilterRowsCallback的默认实现是得到Beans或Maps的Collection，然后通过实现jakarta Predicate接口来进行过滤。当然，如果你需要进行一些定制你可以插接自己的实现。</p>
<p>首先声明，本示例代码包含一些从原包中剪切、粘贴的代码(<span class="emphasis"><em>虽然不是很多</em></span>)。在 最初的最终发行包之后，值过滤得到进一步改善使得更具复用性并更容易实现，可能和定制cell代码行数相同。 当然，我被要求并非常乐意示范如何在当前代码基础上实现定制过滤。这有非常清晰的hooks实现，并且很容易实现。</p>
<p>本示例示范了如何调整代码为过滤器提供一个精确的比较功能。当前的实现是通过使用StringUtils.contains()方法进行模糊比较。 本示例将使用StringUtils.equals()方法。你可以按照你的需要来调整代码进行更多定制。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e82"></a>1.1.&nbsp;定制FilterRowsCallback示例</h3>
</div>
</div>
</div>
<p>首先你需要做的是创建一个实现Predicate接口的定制类。Predicate要求我们实现evaluate()方法来判断是否包含 当前bean。因为你仅仅调整现在已有的功能，首先得到filterPredicate的源代码（在发行包的callback包下）， 拷贝到你的工程里。然后向下面展示的一样将 StringUtils.contains()方法修改为StringUtils.equals()方法：</p>
<pre class="programlisting">public final class ExactMatchFilterPredicate implements Predicate {<br />
private boolean isSearchMatch(String value, String search) {<br />
<br />
...<br />
<br />
else if (StringUtils.equals(value, search)) {<br />
return true;<br />
}<br />
<br />
...<br />
<br />
}<br />
}<br />
</pre>
<p>然后我们需要实现和Predicate共同作用的FilterRowsCallback接口。再一次从发行包的callback包下拷贝ProcessRowsCallback源代码到你的工程里。 请参照我们创建的定制的ExactMatchFilterPredicate 类来确认仅仅实现了FilterRowsCallback和修改Predicate。</p>
<pre class="programlisting">public class ExactMatchFilterRows implements FilterRowsCallback {<br />
public Collection filterRows(TableModel model, Collection rows) throws Exception {<br />
<br />
...<br />
<br />
if (filtered) {<br />
Collection collection = new ArrayList();<br />
Predicate filterPredicate = new ExactMatchFilterPredicate(model);<br />
CollectionUtils.select(rows, filterPredicate, collection);<br />
<br />
return collection;<br />
}<br />
<br />
...<br />
<br />
}<br />
}<br />
</pre>
<p>为了使用这个FilterRowsCallback你应该在Preferences中声明一个别名。<span class="emphasis"><em>当然，你可以省略这步而在JSP中提供这个FilterRowsCallback实现类的全路径，但是使用Preferences更简洁。</em></span></p>
<pre class="programlisting">table.filterRowsCallback.exactMatch=org.extremesite.callback.ExactMatchFilterRows</pre>
<p>在TableTag通过设置filterRowsCallback属性来使用ExactMatchFilterRows。</p>
<pre class="programlisting">&lt;ec:table filterRowsCallback="exactMatch"/&gt;</pre>
<p><span class="emphasis"><em>如果不清楚Preferences和ColumnTag定义语法请参考Preferences指南。</em></span> </p>
</div>
</div>
</div>
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e108"></a>Form指南</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e111"></a>1.&nbsp;引言</h2>
</div>
</div>
</div>
<p>eXtremeTable本质上是一个form组件，所以我假定表被包在form里，所有的功能都被认为是对form元素的操作。如果你想在表体中包含一些定制的form元素， 或者想将eXtremeTable嵌入到另外的form中，那么你就要使用表标签的form属性用来参照最近的form。</p>
<p>为了示范form特性，我们要做的工作将分解为JSP，Cell和Controller。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e118"></a>1.1.&nbsp;JSP</h3>
</div>
</div>
</div>
<p>下面列出的是checkbox示例的完整代码。想要强调的主要事情是表标签form属性设置为presForm，它参照被称为presForm的form元素。 </p>
<p>同时请注意表标签的autoIncludeParameters属性。进行排序、过滤、分页时，默认的eXtremeTable将保持所有传至JSP页面的参数。 这个特性对于内部其他的form进行排序、过滤、分页时，用于高效复制form元素同样有效。可以设置 autoIncludeParameters属性为false来固定它。</p>
<p><span class="emphasis"><em>在这个form使用id属性是因为xhtm标准的要求，同时你也可以使用form的name属性。 </em></span></p>
<pre class="programlisting">&lt;form id="presForm" action="&lt;c:url value="http://blog.techweb.com.cn/selectedPresidentsListedController.run"/&gt;" method="post"&gt;<br />
<br />
Enter your name: <br />
&lt;input <br />
type="text" <br />
name="userName" <br />
style="font-family:verdana,arial,helvetica,sans-serif;font-size:11px;"<br />
value="&lt;c:out value="http://blog.techweb.com.cn/${param.userName}"/&gt;"<br />
/&gt;<br />
<br />
&lt;ec:table <br />
items="presidents"<br />
action="${pageContext.request.contextPath}/selectedPresidentsController.run"  <br />
view="compact"<br />
imagePath="${pageContext.request.contextPath}/images/table/compact/*.gif"<br />
rowsDisplayed="8"<br />
autoIncludeParameters="false"<br />
form="presForm"<br />
&gt;<br />
&lt;ec:exportPdf <br />
fileName="output.pdf" <br />
tooltip="Export PDF" <br />
headerColor="black" <br />
headerBackgroundColor="#b6c2da" <br />
headerTitle="Presidents"<br />
/&gt;<br />
&lt;ec:row&gt;<br />
&lt;ec:column <br />
alias="checkbox"<br />
title=" " <br />
width="5px" <br />
filterable="false" <br />
sortable="false" <br />
viewsAllowed="compact"<br />
cell="selectedPresident"<br />
/&gt;<br />
&lt;ec:column property="fullName" title="Name"/&gt;<br />
&lt;ec:column property="nickName" /&gt;<br />
&lt;ec:column property="term" /&gt;<br />
&lt;/ec:row&gt;<br />
&lt;/ec:table&gt;<br />
<br />
&lt;input<br />
type="button"<br />
name="sel"<br />
class="button"<br />
value="List Selected Presidents"<br />
onclick="document.forms.presForm.submit();"<br />
/&gt;<br />
<br />
&lt;script type="text/javascript"&gt;<br />
function setPresidentState(chkbx) {<br />
//make sure that always know the state of the checkbox<br />
if (chkbx.checked) {<br />
eval('document.forms.presForm.chkbx_' + chkbx.name).value='SELECTED';<br />
} else {<br />
eval('document.forms.presForm.chkbx_' + chkbx.name).value='UNSELECTED';<br />
}<br />
}<br />
&lt;/script&gt;<br />
<br />
&lt;/form&gt;</pre>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e132"></a>1.1.1.&nbsp;Form特性的技术说明</h4>
</div>
</div>
</div>
<p>表标签form属性参照最近的form是你使用这个特性所必须知道的，为了更好的理解这个特性，介绍更多的关于内部实现技术的细节是值得的。</p>
<p>如果您不特意指定form属性，eXtremeTable自动在表附近包上一个form。所有表的动作例如：排序、过滤、分页将自动给一些隐藏的input元素赋值，然后提交这个form到表标签action属性设置的Aciton。 这非常有效，除非您想要将自己的form元素设置到表体，或者想将这个表放到别的form里。 </p>
<p>表标签form属性参照最近的form，所有表的动作例如：排序、过滤、分页将自动给一些隐藏的input元素赋值，但是现在 最近form的action属性将要改变表标签的动作。这非常重要，因为：当排序、过滤、分页时，eXtremeTable能够从一个controller得到数据集合 ，但是提交这个form到别的controller来处理这个form时需要对用户的输入进行处理。然而，这些对于你使用表标签来说都是透明的。 就像你现在做的那样简单地设置表标签的action属性，然后设置相关的form到你想提交的位置。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e141"></a>1.1.2.&nbsp;Checkbox</h4>
</div>
</div>
</div>
<p>示例的第一列是checkbox。因为这列不需要参照bean的属性，alias属性用来唯一地标识这列。你可以使用property 属性，但是alias属性使这列如何使用更清楚。alias属性还被用来当同样的属性被多列使用时唯一地标识一列。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e146"></a>1.1.3.&nbsp;Custom Cell</h4>
</div>
</div>
</div>
<p>您也许想知道定制的cell是如何通过名称selectedPresident被参照的(cell="selectedPresident")。这是一个 对eXtremeTable的preferences特性更强的使用。所有要做的就是在extremecomponents.properties文件中添加一个属性。 <span class="emphasis"><em>请参考Preferences来了解更多的信息</em></span></p>
<pre class="programlisting">column.cell.selectedPresident=org.extremesite.cell.SelectedPresidentCell</pre>
<p>column.cell.selectedPresident就是你定义的用来参照这个cell的名称。</p>
<p>当然你也可以使用这个Cell的全名来进行参照。</p>
<pre class="programlisting">&lt;ec:column <br />
alias="checkbox"<br />
title=" " <br />
width="5px" <br />
filterable="false" <br />
sortable="false" <br />
viewsAllowed="compact"<br />
cell="org.extremesite.cell.SelectedPresidentCell"<br />
/&gt;</pre>
<p>在属性文件中定义参照更方便，它可以被任何JSP文件引用。如果类名或包名改变的话你只需要对一个地方进行修改。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e163"></a>1.1.4.&nbsp;JavaScript</h4>
</div>
</div>
</div>
<p>JavaScript的setPresidentState()方法被定制cell用来设置每个checkbox元素的是否被选中。 设置一个隐藏元素的原因是为了获得浏览器的动作而不提交没有选中的checkbox。通过这个Controller将一直知道一个元素是否别选中。</p>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e168"></a>1.2.&nbsp;Cell</h3>
</div>
</div>
</div>
<p>定制的cell被用来生成checkbox，另外它也创建一个隐藏元素用来表示这个checkbox元素是否被选中。 当用户进行排序、过滤、分页时，被选中的数据集合将被放到session里。</p>
<p>getExportDisplay()方法没有返回值，因为治理只需要Html显示。</p>
<pre class="programlisting">public class SelectedPresidentCell implements Cell {<br />
public String getExportDisplay(TableModel model, Column column) {<br />
return null;<br />
}<br />
<br />
public String getHtmlDisplay(TableModel model, Column column) {<br />
HtmlBuilder html = new HtmlBuilder();<br />
<br />
CellBuilder.tdStart(html, column);<br />
<br />
try {<br />
Object bean = model.getCurrentRowBean();<br />
String presidentId = BeanUtils.getProperty(bean, "presidentId");<br />
<br />
Collection selectedPresidentsIds = (Collection)model.getContext().getSessionAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);<br />
if (selectedPresidentsIds != null &amp;&amp; selectedPresidentsIds.contains(presidentId)) {<br />
html.input("hidden").name("chkbx_" + presidentId).value(SelectedPresidentsConstants.SELECTED).xclose();<br />
html.input("checkbox").name(BeanUtils.getProperty(bean, "presidentId"));<br />
html.onclick("setPresidentState(this)");<br />
html.checked();<br />
html.xclose();<br />
} else {<br />
html.input("hidden").name("chkbx_" + presidentId).value(SelectedPresidentsConstants.UNSELECTED).xclose();<br />
html.input("checkbox").name(BeanUtils.getProperty(bean, "presidentId"));<br />
html.onclick("setPresidentState(this)");<br />
html.xclose();<br />
}<br />
} catch (Exception e) {}<br />
<br />
CellBuilder.tdEnd(html);<br />
<br />
return html.toString();<br />
}<br />
}</pre>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e177"></a>1.3.&nbsp;Controller</h3>
</div>
</div>
</div>
<p><span class="emphasis"><em>提示：Spring框架的Controller和Struts框架的Action非常相像。</em></span> </p>
<p>当在另外的form中使用eXtremeTable时，你可能有1个或2个controllers。当form被提交时，你需要一个controller 来处理用户的输入并重新定向到另外的JSP页面。当排序、过滤、分页时，你可能有另外的controller来得到表使用的数据集合并重定向会本页。或者你可以在同一个controller中分别处理。 </p>
<p>checkbox示例里我使用一个controller来关联表标签的action属性。我也使用另外一个controller来关联form元素的动作。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e189"></a>1.3.1.&nbsp;表标签动作Controller</h4>
</div>
</div>
</div>
<p>这个controller负责调用SelectedPresidentsUtils来保存被选中的presidentIds到session里并回到同一页。 </p>
<pre class="programlisting">SelectedPresidentsUtils.saveSelectedPresidentsIDs(request);<br />
Collection presidents = presidentsService.getPresidents();<br />
request.setAttribute("presidents", presidents);</pre>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e196"></a>1.3.2.&nbsp;Form动作Controller</h4>
</div>
</div>
</div>
<p>这个controller负责通过presidentIds得到数据集并重定向到下一个Jsp页面</p>
<pre class="programlisting">Collection selectedPresidentsIds = SelectedPresidentsUtils.saveSelectedPresidentsIDs(request);<br />
Collection selectedPresidents = SelectedPresidentsUtils.getSelectedPresidents(presidentsService.getPresidents(), selectedPresidentsIds);<br />
request.setAttribute("selected", selectedPresidents);<br />
request.getSession().removeAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);</pre>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e203"></a>1.3.3.&nbsp;重新得到Checkbox的值</h4>
</div>
</div>
</div>
<p>我将列出保存presidentIds到session的代码。我经常被问到如何重新得到eXtremeTable中form元素的值。 它的原理是设置form输入元素名字属性值前面加上一些东西来唯一标识元素</p>
<p>本示例中我关心的是以chkbx开头参数的元素。chkbx后面是唯一的关联到checkbox的presidentId。它被用来判断这个checkbox是否别选中。</p>
<pre class="programlisting">public static Collection saveSelectedPresidentsIDs(HttpServletRequest request) {<br />
Collection presidents = (Collection) request.getSession().getAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);<br />
<br />
if (presidents == null) {<br />
presidents = new ArrayList();<br />
request.getSession().setAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS, presidents);<br />
}<br />
<br />
Enumeration parameterNames = request.getParameterNames();<br />
while (parameterNames.hasMoreElements()) {<br />
String parameterName = (String) parameterNames.nextElement();<br />
if (parameterName.startsWith("chkbx_")) {<br />
String presidentId = StringUtils.substringAfter(parameterName, "chkbx_");<br />
String parameterValue = request.getParameter(parameterName);<br />
if (parameterValue.equals(SelectedPresidentsConstants.SELECTED)) {<br />
if (!presidents.contains(presidentId)) {<br />
presidents.add(presidentId);<br />
}<br />
} else {<br />
presidents.remove(presidentId);<br />
}<br />
}<br />
}<br />
<br />
return presidents;<br />
}</pre>
</div>
</div>
</div>
</div>
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e212"></a>Html视图定制指南</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e215"></a>1.&nbsp;引言</h2>
</div>
</div>
</div>
<p>eXtremeTable使用View接口来生成HTML。你可以使用发行包已经提供的视图，或者你可以插入自己的视图实现。 现在，创建你自己的视图相对比较简单，但讨论一些设计想法和如何着手实现一个定制的视图还是有价值的。</p>
<p>我想使创建定制视图简单，但不是想构造一个更复杂的类似swing的模型，原因是那需要创建大量的对象来处理对应的内部工作。 eXtremeTable以高效为目标，我也想在视图的实现上贯彻这种想法，所以我决定创建一系列的静态构造器类来实现分解的最小功能。你可以通过组合这些功能来实现你的定制视图。 </p>
<p>学习定制视图的最好途径是阅读已经存在的视图的源代码，修改它来满足你的需求。如果我示范所有东西的话，这篇指南将变的非常冗长。取而代之的是我将直接修改默认视图的工具条作为定制视图的一个示例。 对于不同构造器的具体细节我建议你阅读源代码。我也将尽量更新javadocs来提供更好的帮助。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e224"></a>1.1.&nbsp;View接口</h3>
</div>
</div>
</div>
<p>实现View接口的类有3次插入内容的机会。beforeBody()方法会被立刻调用，body()方法在每一行的每一列处理的时候调用。 afterBody()方法是被eXtremeTable调用的最后方法，它将返回代表视图的一个对象。在这个HTML视图示例里，它将是一个字符串。</p>
<pre class="programlisting">public interface View {<br />
public void beforeBody(TableModel model);<br />
public void body(TableModel model， Column column);<br />
public Object afterBody(TableModel model);<br />
}<br />
</pre>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e231"></a>1.2.&nbsp;Messages示例</h3>
</div>
</div>
</div>
<p>在这篇指南里我将直接修改工具条来实现这网站上Messages示例的定制视图。</p>
<pre class="programlisting">public class MessagesView extends AbstractHtmlView { <br />
protected void toolbar(TableModel model) {<br />
TwoColumnTableLayout toolbar = new MessagesToolbar();<br />
toolbar.layout(getHtmlBuilder()， model);<br />
}<br />
<br />
protected void statusBar(TableModel model) {<br />
TwoColumnRowLayout statusBar = new MessagesStatusBar();<br />
statusBar.layout(getHtmlBuilder()， model);<br />
}<br />
}<br />
</pre>
<p>这里使用的是默认视图，因此它扩展了虚拟视图来修改工具条和状态条。如何修改工具条和（或）状态条也是开发人员问的最多问题。 </p>
<p>默认视图的工具条位于表的上方包括翻页链接和标题。工具条使用TwoColumnTableLayout，它是一个用于提供在自己表中实现左右两列布局的虚拟类。 它将实现能够浮在表上方的完美布局。下面就是你需要关心的虚拟方法，在实际的html视图中已经为你完成了这个布局。</p>
<pre class="programlisting">public abstract class TwoColumnTableLayout {<br />
protected abstract boolean showLayout(TableModel model);<br />
protected abstract void columnLeft(HtmlBuilder html， TableModel model);<br />
protected abstract void columnRight(HtmlBuilder html， TableModel model);<br />
}<br />
</pre>
<p>showLayout()方法用来阻止或导致布局的展现。在我的定制视图中如果翻页或（和）导出显示那么工具条将展现。</p>
<pre class="programlisting">protected boolean showLayout(TableModel model) {<br />
boolean showPagination = BuilderUtils.showPagination(model);<br />
boolean showExports = BuilderUtils.showExports(model);<br />
if (!showPagination &amp;&amp; !showExports) {<br />
return false;<br />
}<br />
<br />
return true;<br />
}</pre>
<p>下面显示了左列和右列的部分代码。注意在我的定制视图中首页和前一页使用了文字来替代图片显示。我真正希望示范的是你需要做的：找到正确的构造器类并且仅仅是扩展HtmlBuilder的标签。 <span class="emphasis"><em>构造器类对于示范如何找到模型里的信息（以便你能够做比他们能够提供的更多的定制工作）也非常有用，。</em></span></p>
<pre class="programlisting">protected void columnLeft(HtmlBuilder html， TableModel model) {<br />
html.td(2).close();<br />
TableBuilder.title(html， model);<br />
html.tdEnd();<br />
}<br />
<br />
protected void columnRight(HtmlBuilder html， TableModel model) {<br />
boolean showPagination = BuilderUtils.showPagination(model);<br />
...<br />
if (showPagination) {<br />
html.td(4).close();<br />
ToolbarBuilder.firstPageItemAsText(html， model);<br />
html.tdEnd();<br />
<br />
html.td(4).close();<br />
ToolbarBuilder.prevPageItemAsText(html， model);<br />
html.tdEnd();<br />
...<br />
}<br />
...<br />
}<br />
</pre>
<p>为了使用这个视图你需要在Preferences定义一个别名。 <span class="emphasis"><em>你可以省略这部而在JSP直接给出这个视图的完整有效的类名，不过Preferences更为简洁。</em></span></p>
<pre class="programlisting">table.view.messages=org.extremesite.view.MessagesView</pre>
<p>TableTag也将设置视图属性来使用MessagesView视图。</p>
<pre class="programlisting">&lt;ec:table view="messages"&gt;</pre>
<p><span class="emphasis"><em>如果不清楚Preferences和TableTag定义语法请参考Preferences指南。</em></span> </p>
</div>
</div>
</div>
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e269"></a>拦截器使用指南</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e272"></a>1.&nbsp;引言</h2>
</div>
</div>
</div>
<p>拦截特性被用在运行时需要修改属性值的时候，它使得改变基于数据的eXtremeTable的行为成为可能。在阅读扩展标签属性时，你会发现它和扩展标签属性具有同样的概念和方法标识。 区分使用他们的首要准则是：如果需要向TLD里已经定义的并且能够在JSP中访问的标签添加新的属性时，应该使用扩展标签属性；如果仅仅是需要修改已经定义好的属性的值的时候，应该使用拦截器。 </p>
<p>你可能需要了解更多的eXtremeTable如何运作的技术背景才能完全理解这种特性。 eXtremeTable首先做的就是遍历所有标签并创建对应的模型beans (pojos)。beans是具有和标签一样属性，但是使用真实类型来替换仅仅使用字符串类型的对象。beans是被模型使用并且是你需要使用拦截特性修改的对象。 所有的拦截器接口都定义了一个add方法， add方法被用来处理模型bean第一次创建时的属性。行和列的拦截器还有一个modify 方法。modify方法可以在当行和类进行处理是对属性值进行操作。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e279"></a>1.1.&nbsp;拦截器列表</h3>
</div>
</div>
</div>
<p>下面列出了具有拦截特性的标签和他们需要被实现的接口，Bean栏显示了被模型创建的Bean。</p>
<div class="informaltable">
<table border="1">
    <colgroup>
    <col></col>
    <col></col>
    <col></col></colgroup>
    <thead>
        <tr>
            <th align="center">标签</th>
            <th align="center">接口</th>
            <th align="center">Bean</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>TableTag</td>
            <td>org.extremecomponents.table.intercept.InterceptTable</td>
            <td>org.extremecomponents.table.bean.Table</td>
        </tr>
        <tr>
            <td>RowTag</td>
            <td>org.extremecomponents.table.intercept.InterceptRow</td>
            <td>org.extremecomponents.table.bean.Row</td>
        </tr>
        <tr>
            <td>ColumnTag</td>
            <td>org.extremecomponents.table.intercept.InterceptColumn</td>
            <td>org.extremecomponents.table.bean.Column</td>
        </tr>
        <tr>
            <td>ExportTag</td>
            <td>org.extremecomponents.table.intercept.InterceptExport</td>
            <td>org.extremecomponents.table.bean.Export</td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e323"></a>1.2.&nbsp;行拦截器示例</h3>
</div>
</div>
</div>
<p>示范拦截特性的完美示例就是根据一定的标准来对行进行高亮显示，这也是我们将要完成的示例。它很短也很简单，不过它实现的概念同样适用于每一个拦截器接口。 </p>
<p>我们需要做的第一件事就是实现InterceptRow接口。你会注意到这个接口有两个方法：addRowAttributes() 和modifyRowAttributes()。addRowAttributes方法在行bean创建的时候被调用， modifyRowAttributes方法在表处理当前页面行的时候被调用。</p>
<pre class="programlisting">public class MarkerIntercept implements InterceptRow {<br />
public void addRowAttributes(TableModel tableModel, Row row) {<br />
}<br />
<br />
public void modifyRowAttributes(TableModel model, Row row) {<br />
President president = (President) model.getCurrentRowBean();<br />
String career = president.getCareer();<br />
if (StringUtils.contains(career, "Soldier")) {<br />
row.setStyle("background-color:#fdffc0;");<br />
} else {<br />
row.setStyle("");<br />
}<br />
}<br />
}<br />
</pre>
<p>在Preferences里你应该定义这个行拦截器的别名。</p>
<pre class="programlisting">row.intercept.marker=org.extremesite.intercept.MarkerIntercept</pre>
<p>这样就可以在行标签中使用拦截器MarkerIntercept了。</p>
<pre class="programlisting">&lt;ec:row intercept="marker"&gt;</pre>
<p><span class="emphasis"><em>如果不清楚Preferences和TableTag定义语法请参考Preferences指南。</em></span> </p>
</div>
</div>
</div>
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e345"></a>Limit指南</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e348"></a>1.&nbsp;引言</h2>
</div>
</div>
</div>
<p>在你需要处理大量数据时你应该考虑使用eXtremeTable的Limit特性。Limit这个名字来自MySQL的limit 命令，Limit接口的目的就是如何对表的结果集进行limit处理。Limit实现知道当排序、过滤、分页、导出时，用户如何与表互相作用。有了这些信息你 将能够使用可能是最有效的方式显示正确的过滤、排序后的请求页面。</p>
<p>为了示范Limit特性，我将要做的工作将分解为JSP、Controller、Service和DAO。这示范了一种使用分层的方式来处理 Limit。你可以根据自己的需要来增加或减少层。本示例也使用了Spring框架来重新得到使用Spring的JDBC取得的数据，因此你的代码看起来可能有点不同。eXtremeTable的一个特点就是不依赖任何框架和容器。 </p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e355"></a>1.1.&nbsp;JSP</h3>
</div>
</div>
</div>
<p>为了使用Limit特性，eXtremeTable需要使用limit特定的RetrieveRowsCallback、 FilterRowsCallback和SortRowsCallback接口。eXtremeComponents提供了每个接口的一个实现，可以简单地通过设置每个属性值为limit来简单来使用。 </p>
<pre class="programlisting">&lt;ec:table <br />
items="presidents"<br />
retrieveRowsCallback="limit"<br />
filterRowsCallback="limit"<br />
sortRowsCallback="limit"<br />
view="limit"<br />
&gt;<br />
...</pre>
<p>另外视图属性参照一个名为limit的定制视图。这是一个简单修改默认eXtremeTable视图，不包含最后页工具条的实现。这仅仅关系到你是否能取得确切需要的行。 一些数据库例如Oracle和MySQL都提供了一种得到确定行的特性，但是，其他的数据库例如：Sybase没有提供特性。在我的示例中我考虑最坏的情况你的数据库不支持这种特性。</p>
<p>即使你的数据库不提供取得特定行的特性，当你考虑用户如何和表协同工作时，Limit仍然非常有意义。用户通常会对一些数据进行排序、过滤和分页。 这个例子中15条数据构成一页，第一页需要15条数据，第二页需要30条数据，第三页需要45条数据，以此类推。在经过一段时间分页后，他们常常使用过滤来提炼数据。 即使他们不这样做，他们也必须在此之前对大量的数据进行分页，这将影响效率。当然如果允许用户点击最后页，那么所有的数据都将被取出，这将非常影响效率。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e366"></a>1.2.&nbsp;Controller</h3>
</div>
</div>
</div>
<p><span class="emphasis"><em>提示：Spring框架的Controller和Struts框架的Action非常相像。</em></span> </p>
<p>controller首先需要创建一个Limit。为了完成这个你需要得到一些关于Context和LimitFactory的帮助。</p>
<pre class="programlisting">Context context = new HttpServletRequestContext(request);<br />
LimitFactory limitFactory = new TableLimitFactory(context);<br />
Limit limit = new TableLimit(limitFactory);</pre>
<p>Context是一个处理取得属性的接口，LimitFactory使用Context来找出用户如何和eXtremeTable交互。 然后Limit使用LimitFactory来组装自己。</p>
<p>为了初始化Limit，它将包含所有的有用的信息。这些信息包括数据将被如何排序和过滤，哪一页将被显示和是否允许被导出。</p>
<p>然而，Limit仍然需要得到行的信息，这样正确的信息页面才能被显示给用户。行信息包括开始行、结束行、当前显示行。 controller必须从service得到这些信息，而Service将从dao中得到这些信息。这里我只给出Controller端的代码。</p>
<pre class="programlisting">int totalRows = presidentsService.getTotalPresidents(limit.getFilterSet(), limit.isExported());<br />
limit.setRowAttributes(totalRows, defaultRowsDisplayed);</pre>
<p>limit需要得到所有的行来得到行的信息。service需要知道那些被过滤，不管这些数据是否要导出。为了设置行信息，默认的一页显示的行数需要被设置。 这可以通过对TableTag的rowsDisplayed属性设置一个确定的数值来实现。</p>
<p>现在我们只需要从services得到Collection数据。</p>
<pre class="programlisting">Collection presidents = presidentsService.getPresidents(limit.getFilterSet(), limit.getSort(), limit.getRowEnd());</pre>
<p>因为limit已经包含所有信息，这将十分容易。所有需要做的就是传入过滤器，排序和最后行的信息。 最后要做的是将Collections和totalRow这些信息传送回JSP以便eXtremeTable知道如何显示这些信息。</p>
<pre class="programlisting">request.setAttribute("presidents", presidents);<br />
request.setAttribute("totalRows", new Integer(totalRows));</pre>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e396"></a>1.3.&nbsp;Service</h3>
</div>
</div>
</div>
<p>service需要和dao进行交互来得到总行数和Collection。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e401"></a>1.3.1.&nbsp;取得总行数</h4>
</div>
</div>
</div>
<p>controller需要到第一条信息就是总行数。</p>
<pre class="programlisting">public int getTotalPresidents(FilterSet filterSet, boolean isExported) {<br />
String totalQuery = presidentsDao.getTotalPresidentsQuery();<br />
String modTotalQuery = filterQuery(filterSet, totalQuery);<br />
int totalRows = presidentsDao.getTotalPresidents(modTotalQuery);<br />
if (isExported &amp;&amp; totalRows &gt; maxExportRows) {<br />
totalRows = maxExportRows;<br />
}<br />
return totalRows;<br />
}</pre>
<p>service和dao一起来过滤结果集，它的工作方式是在Where语句后面增加更多的AND语句来修改查询字符串。为此，你需要和Limit FilterSet一起工作。</p>
<p>FilterSet是一个过滤器对象数组，一个过滤器包括一个bean property和这个过滤器的值。或者，简单的说就是用户想要过滤的行和他们输入的值。这使得它非常容易交互。service只需要迭代所有的 FilterSet并调用dao来拼接查询语句。（译者注：过滤的实现方式是：在Where后面增加And语句来改变查询语句以达到对数据进行过滤的效果）</p>
<pre class="programlisting">private String filterQuery(FilterSet filterSet, String query) {<br />
if (!filterSet.isFiltered() || filterSet.isCleared()) {<br />
return query;<br />
}<br />
<br />
Filter filters[] = filterSet.getFilters();<br />
for (int i = 0; i &lt; filters.length; i++) {<br />
Filter filter = filters[i];<br />
String property = filter.getProperty();<br />
String value = filter.getValue();<br />
query = presidentsDao.filterQuery(query, property, value);<br />
}<br />
<br />
return query;<br />
}</pre>
<p>query修改包括了filter信息，总行数。在一些情况下这就足够，但是当用户导出数据时仍然存在一个潜在的问题。为了保持高效 service不允许导出超出一个最大行数的数据。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e416"></a>1.3.2.&nbsp;取得Collection</h4>
</div>
</div>
</div>
<p>controller需要到第二条信息就是Collection。</p>
<pre class="programlisting">public Collection getPresidents(FilterSet filterSet, Sort sort, int rowEnd) {<br />
String patientsQuery = presidentsDao.getPresidentsQuery();<br />
String modPatientsQuery = filterQuery(filterSet, patientsQuery);<br />
modPatientsQuery = sortQuery(sort, modPatientsQuery);<br />
modPatientsQuery = presidentsDao.limitQuery(rowEnd, modPatientsQuery);<br />
return presidentsDao.getPresidents(modPatientsQuery);<br />
}</pre>
<p>和前面一样，service和dao一起来过滤结果集。</p>
<p>另外query字符串需要扩展ORDER BY语句以便数据按照正确的方式进行排序。Sort包含一个bean property和 sortOrder值（正序还是逆序）。service仅仅需要使用Sort来调用dao。</p>
<pre class="programlisting">private String sortQuery(Sort sort, String query) {<br />
if (!sort.isSorted()) {<br />
String defaultSortOrder = presidentsDao.getDefaultSortOrder();<br />
if (StringUtils.isNotBlank(defaultSortOrder)) {<br />
return query + defaultSortOrder;<br />
}<br />
<br />
return query;<br />
}<br />
<br />
String property = sort.getProperty();<br />
String sortOrder = sort.getSortOrder();<br />
<br />
return presidentsDao.sortQuery(query, property, sortOrder);<br />
}<br />
</pre>
<p>query字符串最后需要的修改就是增加数据库特别的指令来limit将要被返回的结果集。这就是limitQuery() 方法的作用。</p>
</div>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e431"></a>1.4.&nbsp;DAO</h3>
</div>
</div>
</div>
<p>dao为service负责底层数据工作。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e436"></a>1.4.1.&nbsp;定义Query字符串</h4>
</div>
</div>
</div>
<p>为了真正理解dao，query字符串需要被展示。</p>
<p>这就是得到数据的presidents query字符串：</p>
<pre class="programlisting">private final static String presidentsQuery = <br />
" SELECT " +<br />
"    president_id presidentId, " + <br />
"    first_name firstName, " +<br />
"    last_name lastName, " +<br />
"    nick_name nickName,  " +<br />
"    concat(first_name, ' ',last_name) fullName, " +<br />
"    term,  " +<br />
"    born,  " +<br />
"    died,  " +<br />
"    education, " + <br />
"    career,  " +<br />
"    political_party politicalParty " +<br />
" FROM presidents ";</pre>
<p>这是得到总行数的query字符串：</p>
<pre class="programlisting">private final static String totalPresidentsQuery = <br />
" SELECT count(*) FROM presidents ";</pre>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e449"></a>1.4.2.&nbsp;Filter 和 Sort Query 字符串</h4>
</div>
</div>
</div>
<p>两个最有趣的方法就是过滤和排序。</p>
<p>filter看起来像这样：</p>
<pre class="programlisting">public String filterQuery(String query, String property, String value) {<br />
StringBuffer result = new StringBuffer(query);<br />
<br />
if (query.indexOf("WHERE") == -1) {<br />
result.append(" WHERE 1 = 1 "); //stub WHERE clause so can just append AND clause<br />
}<br />
<br />
if (property.equals("fullName")) {<br />
result.append(" AND concat(first_name, ' ',last_name) like '%" + value + "%'");<br />
} else if (property.equals("nickName")) {<br />
result.append(" AND nick_name like '%" + value + "%'");<br />
} else {<br />
result.append(" AND " + property + " like '%" + value + "%'");<br />
}<br />
<br />
return result.toString();<br />
}</pre>
<p>filterQuery()方法需要增加正确的AND语句到query字符串。</p>
<p>sort看起来非常类似：</p>
<pre class="programlisting">public String sortQuery(String query, String property, String sortOrder) {<br />
StringBuffer result = new StringBuffer(query + " ORDER BY ");<br />
<br />
if (property.equals("fullName")) {<br />
result.append("concat(first_name, ' ',last_name) " + sortOrder);<br />
} else {<br />
result.append(property + " " + sortOrder);<br />
}<br />
<br />
return result.toString();<br />
}</pre>
<p>sortQuery()方法需要增加正确的ORDER BY语句到query字符串。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e466"></a>1.4.3.&nbsp;Limit Query String</h4>
</div>
</div>
</div>
<p>现在query字符串修改能够正确的进行filter和sort，它还需要修改以便只取页面显示相关的数据。MySQL为s the limit命令。</p>
<pre class="programlisting">public String limitQuery(int rowEnd, String query) {<br />
return query + " limit " + rowEnd;<br />
}</pre>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e473"></a>1.4.4.&nbsp;取回总行数和Collection.</h4>
</div>
</div>
</div>
<p>service需要的唯一东西就是：总行数和Collection。</p>
<pre class="programlisting">public Collection getPresidents(final String query) {<br />
return jdbcTemplate.query(query, new ResultReader() {<br />
List results = new ArrayList();<br />
public List getResults() {<br />
return results;<br />
}<br />
<br />
public void processRow(ResultSet rs)<br />
throws SQLException {<br />
President president = new President();<br />
president.setPresidentId(new Integer(rs.getInt("presidentId")));<br />
president.setFirstName(rs.getString("firstName"));<br />
president.setLastName(rs.getString("lastName"));<br />
president.setNickName(rs.getString("nickName"));<br />
president.setFullName(rs.getString("fullName"));<br />
president.setTerm(rs.getString("term"));<br />
president.setBorn(rs.getDate("born"));<br />
president.setDied(rs.getDate("died"));<br />
president.setEducation(rs.getString("education"));<br />
president.setCareer(rs.getString("career"));<br />
president.setPoliticalParty(rs.getString("politicalParty"));<br />
results.add(president);<br />
}<br />
});        <br />
}<br />
<br />
public int getTotalPresidents(final String query) {<br />
return jdbcTemplate.queryForInt(query);<br />
}</pre>
<p>ResultReader是一个帮助处理JDBC查询的Spring特殊类，作为一个callback来处理JDBC ResultSet。jdbcTemplate是对JDBC连接的抽象。</p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a name="d0e482"></a>1.4.5.&nbsp;默认的Sort顺序</h4>
</div>
</div>
</div>
<p>最后，这是service需要的默认sort顺序：</p>
<pre class="programlisting">public String getDefaultSortOrder() {<br />
return " ORDER BY concat(first_name, ' ', last_name) ";        <br />
}</pre>
</div>
</div>
</div>
</div>
<div class="article" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a name="d0e489"></a>Preferences 指南</h2>
</div>
</div>
<hr />
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="d0e492"></a>1.&nbsp;引言</h2>
</div>
</div>
</div>
<p>为了设置全局属性和设置，你需要使用Preferences特性，它现在使用一个属性文件来实现。本文档将很好地介绍如何在web.xml里设置Preferences， 以及一些需要被定义的通用属性。在这里我非常乐意介绍一些关于Preferences的进一步用法。</p>
<p>所有标签属性表示一个可插接的接口，它可以通过给出实现的全路径来设置。这为插接实现提供了一条便利的途径。当然这存在一些为过长术语的设计和维护的考虑。 第一，对你的接口实现进行硬编码；第二，如果你需要在别的JSP中用到同一个接口实现，你需要拷贝你全路径。解决这两个问题的有效办法就是在Preferences中声明一切。</p>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e499"></a>1.1.&nbsp;Preferences表</h3>
</div>
</div>
</div>
<p>下面列出的是可以在Preferences中申明的所有接口。Tag列展示的是eXtremeTable的标签，Attribute 列展示的是相关标签的对应属性。Interface列展示的是需要被实现的Java接口。Preference Key列展示的是 Preferences里对应的健。</p>
<div class="informaltable">
<table border="1">
    <colgroup>
    <col></col>
    <col></col>
    <col></col>
    <col></col></colgroup>
    <thead>
        <tr>
            <th align="center">Tag</th>
            <th align="center">Attribute</th>
            <th align="center">Interface</th>
            <th align="center">Preference Key</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>TableTag</td>
            <td>filterRowsCallback</td>
            <td>org.extremecomponents.table.callback.FilterRowsCallback</td>
            <td>table.filterRowsCallback</td>
        </tr>
        <tr>
            <td>TableTag</td>
            <td>intercept</td>
            <td>org.extremecomponents.table.intercept.InterceptTable</td>
            <td>table.intercept</td>
        </tr>
        <tr>
            <td>TableTag</td>
            <td>retrieveRowsCallback</td>
            <td>org.extremecomponents.table.callback.RetrieveRowsCallback</td>
            <td>table.retrieveRowsCallback</td>
        </tr>
        <tr>
            <td>TableTag</td>
            <td>sortRowsCallback</td>
            <td>org.extremecomponents.table.callback.SortRowsCallback</td>
            <td>table.sortRowsCallback</td>
        </tr>
        <tr>
            <td>TableTag</td>
            <td>state</td>
            <td>org.extremecomponents.table.state.State</td>
            <td>table.state</td>
        </tr>
        <tr>
            <td>TableTag</td>
            <td>view</td>
            <td>org.extremecomponents.table.view.View</td>
            <td>table.view</td>
        </tr>
        <tr>
            <td>RowTag</td>
            <td>intercept</td>
            <td>org.extremecomponents.table.intercept.InterceptRow</td>
            <td>row.intercept</td>
        </tr>
        <tr>
            <td>ColumnTag</td>
            <td>calc</td>
            <td>org.extremecomponents.table.calc.Calc</td>
            <td>column.calc</td>
        </tr>
        <tr>
            <td>ColumnTag</td>
            <td>cell</td>
            <td>org.extremecomponents.table.cell.Cell</td>
            <td>column.cell</td>
        </tr>
        <tr>
            <td>ColumnTag</td>
            <td>filterCell</td>
            <td>org.extremecomponents.table.cell.Cell</td>
            <td>column.filterCell</td>
        </tr>
        <tr>
            <td>ColumnTag</td>
            <td>headerCell</td>
            <td>org.extremecomponents.table.cell.Cell</td>
            <td>column.headerCell</td>
        </tr>
        <tr>
            <td>ColumnTag</td>
            <td>intercept</td>
            <td>org.extremecomponents.table.intercept.InterceptColumn</td>
            <td>column.intercept</td>
        </tr>
        <tr>
            <td>ExportTag</td>
            <td>intercept</td>
            <td>org.extremecomponents.table.intercept.InterceptExport</td>
            <td>export.intercept</td>
        </tr>
        <tr>
            <td>ExportTag</td>
            <td>view</td>
            <td>org.extremecomponents.table.view.View</td>
            <td>export.view</td>
        </tr>
        <tr>
            <td>ExportTag</td>
            <td>viewResolver</td>
            <td>org.extremecomponents.table.filter.ViewResolver</td>
            <td>export.viewResolver</td>
        </tr>
    </tbody>
</table>
</div>
<p><span class="emphasis"><em>提示：当在写作本指南的时候，我意识到我忘记了让标签ColumnsTag的autoGenerateColumns 属性和Preferences协同工作。这将在下一版修正。</em></span> </p>
</div>
<div class="section" lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="d0e657"></a>1.2.&nbsp;指定Preference别名</h3>
</div>
</div>
</div>
<p>上表展示了如何声明preference键，但是没有解释如何指定有意义的别名。如果你注意到preference键提供了一致的语法 <span class="emphasis"><em>tag.attribute</em></span>，指定键的别名仅仅是在它的基础上进行扩展。它的语法为： <span class="emphasis"><em>tag.attribute.alias</em></span>。</p>
<p>eXtremeTable提供了一个名为RowCountCell定制的cell，它的作用是现实当前的行数。我将在Preferences里使用ColumnTag cell声明来示范RowCountCell的使用。</p>
<p>首先通过实现Cell接口或者扩展AbstractCell来编写具体的实现类。</p>
<pre class="programlisting">public class RowCountCell extends AbstractCell {<br />
protected String getCellValue(TableModel model, Column column) {<br />
int rowcount = ((model.getLimit().getPage() - 1) <br />
* model.getLimit().getCurrentRowsDisplayed()) <br />
+ model.getRowHandler().getRow().getRowCount();<br />
return String.valueOf(rowcount);<br />
}<br />
}<br />
</pre>
<p>然后在Preferences (属性文件)进行声明并给出别名。<span class="emphasis"><em>eXtremeTable在一个Preferences里保存所有的配置信息，你可以通过使用本地 Preferences的来覆盖任何的这些属性。</em></span> </p>
<p>RowCountCell默认的别名是rowCount：</p>
<pre class="programlisting">column.cell.rowCount=org.extremecomponents.table.cell.RowCountCell</pre>
<p>在ColumnTag中通过别名引用Cell：</p>
<pre class="programlisting">&lt;ec:column alias="count" cell="rowCount"/&gt;</pre>
<p>现在你可以通过rowCount来引用这个Cell，如果包名改变了你只需要对Preferences进行修改。</p>
<p><span class="emphasis"><em>提示：本示例中我使用了ColumnTag的别名属性。别名属性应用在有两列使用同样的property，也应用在列不直接和列的 bean property关联的情况下。本示例就属于这种情况。</em></span> </p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/149779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-09-30 09:49 <a href="http://www.blogjava.net/i369/articles/149779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用dtree构建动态树型菜单 </title><link>http://www.blogjava.net/i369/articles/149776.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sun, 30 Sep 2007 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/149776.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/149776.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/149776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/149776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/149776.html</trackback:ping><description><![CDATA[<div>dtree是一个免费的javascript脚本，只需定义有限的几个参数，就可以做出漂亮的树型菜单。下载目录：<a href="http://www.destroydrop.com/javascripts/tree/"><font color="#990000"><a href="http://www.destroydrop.com/javascripts/tree/" target="_blank">http://www.destroydrop.com/javascripts/tree/</a></font></a><br />
&nbsp;以下是dtree的用法示例：<br />
&nbsp;1）初始化菜单<br />
&nbsp;&lt;script&nbsp;type="text/javascript"&gt;<br />
&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;var&nbsp;Tree&nbsp;=&nbsp;new&nbsp;Array;<br />
&nbsp;&nbsp;//&nbsp;nodeId&nbsp;|&nbsp;parentNodeId&nbsp;|&nbsp;nodeName&nbsp;|&nbsp;nodeUrl<br />
&nbsp;&nbsp;Tree[0]&nbsp;&nbsp;=&nbsp;"1|0|Page&nbsp;1|#";<br />
&nbsp;&nbsp;Tree[1]&nbsp;&nbsp;=&nbsp;"2|1|Page&nbsp;1.1|#";<br />
&nbsp;&nbsp;Tree[2]&nbsp;&nbsp;=&nbsp;"3|1|Page&nbsp;1.2|#";<br />
&nbsp;&nbsp;Tree[3]&nbsp;&nbsp;=&nbsp;"4|3|Page&nbsp;1.2.1|#";<br />
&nbsp;&nbsp;Tree[4]&nbsp;&nbsp;=&nbsp;"5|1|Page&nbsp;1.3|#";<br />
&nbsp;&nbsp;Tree[5]&nbsp;&nbsp;=&nbsp;"6|2|Page&nbsp;1.1.1|#";<br />
&nbsp;&nbsp;Tree[6]&nbsp;&nbsp;=&nbsp;"7|6|Page&nbsp;1.1.1.1|#";<br />
&nbsp;&nbsp;Tree[7]&nbsp;&nbsp;=&nbsp;"8|6|Page&nbsp;1.1.1.2|#";<br />
&nbsp;&nbsp;Tree[8]&nbsp;&nbsp;=&nbsp;"9|1|Page&nbsp;1.4|#";<br />
&nbsp;&nbsp;Tree[9]&nbsp;&nbsp;=&nbsp;"10|9|Page&nbsp;1.4.1|#";<br />
&nbsp;&nbsp;Tree[10]&nbsp;=&nbsp;"11|0|Page&nbsp;2|#";<br />
&nbsp;&nbsp;//--&gt;<br />
&nbsp;&lt;/script&gt;<br />
&nbsp;2）调用函数<br />
&nbsp;&lt;div&nbsp;class="tree"&gt;<br />
&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&gt;<br />
&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;createTree(Tree,1,7);&nbsp;&nbsp;//&nbsp;starts&nbsp;the&nbsp;tree&nbsp;at&nbsp;the&nbsp;top&nbsp;and&nbsp;open&nbsp;it&nbsp;at&nbsp;node&nbsp;nr.&nbsp;7<br />
&nbsp;&nbsp;//--&gt;<br />
&nbsp;&nbsp;&lt;/script&gt;<br />
&nbsp;&lt;/div&gt;
<div>&nbsp;</div>
<div>2。jsp动态实现<br />
&nbsp;&nbsp;&nbsp;分以下步骤实现动态的树型菜单：<br />
&nbsp;&nbsp;&nbsp;1）在数据库建tree_info表，有nodeId，parentNodeId，nodeName，nodeUrl四个字段，来存储节点信息。<br />
&nbsp;&nbsp;&nbsp;2）编写java类，用于从数据库找出节点信息，并且生成javascript脚本。<br />
&nbsp;&nbsp;&nbsp;3）编写tag类。用于封装逻辑，简化jsp的开发。<br />
&nbsp;&nbsp;&nbsp;4）建一个web程序进行测试。</div>
<div>3。详细过程<br />
&nbsp;&nbsp;&nbsp;1）在数据库建表，脚本如下：<br />
&nbsp;&nbsp;&nbsp;CREATE&nbsp;TABLE&nbsp;`test`.`tree_info`&nbsp;(<br />
&nbsp;&nbsp;&nbsp;`node_id`&nbsp;INTEGER&nbsp;UNSIGNED&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;-1,<br />
&nbsp;&nbsp;&nbsp;`parent_id`&nbsp;INTEGER&nbsp;UNSIGNED&nbsp;NOT&nbsp;NULL&nbsp;DEFAULT&nbsp;-1,<br />
&nbsp;&nbsp;&nbsp;`node_name`&nbsp;VARCHAR(45)&nbsp;NOT&nbsp;NULL,<br />
&nbsp;&nbsp;&nbsp;`ref_url`&nbsp;VARCHAR(45)&nbsp;NOT&nbsp;NULL,<br />
&nbsp;&nbsp;&nbsp;PRIMARY&nbsp;KEY(`node_id`)<br />
&nbsp;)<br />
&nbsp;我使用mysql数据库，如果脚本细节有出入，请自行修改<br />
&nbsp;&nbsp;&nbsp;&nbsp;按照上面的dTree示例插入数据<br />
&nbsp;&nbsp;&nbsp;2）编写TreeInfo.java，这个类用于封装节点信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package&nbsp;com.diegoyun.web.tree;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public&nbsp;class&nbsp;TreeInfo&nbsp;{<br />
&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;nodeId&nbsp;=&nbsp;-1;//node&nbsp;id<br />
&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;parentId&nbsp;=&nbsp;-1;//parentId<br />
&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;nodeName&nbsp;=&nbsp;null;//node&nbsp;name<br />
&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;url&nbsp;=&nbsp;null;//url&nbsp;references</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getNodeId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nodeId;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setNodeId(int&nbsp;nodeId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.nodeId&nbsp;=&nbsp;nodeId;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getParentId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;parentId;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setParentId(int&nbsp;parentId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.parentId&nbsp;=&nbsp;parentId;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getNodeName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nodeName;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setNodeName(String&nbsp;nodeName)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.nodeName&nbsp;=&nbsp;nodeName;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getUrl()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;url;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setUrl(String&nbsp;url)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.url&nbsp;=&nbsp;url;<br />
&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;编写TreeUtil.java，用于从数据库得到节点信息，封装到TreeInfo对象，并生成javascript脚本<br />
&nbsp;&nbsp;&nbsp;TreeUtil.java<br />
&nbsp;&nbsp;&nbsp;package&nbsp;com.diegoyun.web.tree;<br />
&nbsp;&nbsp;import&nbsp;java.util.Collection;<br />
&nbsp;&nbsp;import&nbsp;java.util.ArrayList;<br />
&nbsp;&nbsp;import&nbsp;java.util.Iterator;<br />
&nbsp;&nbsp;import&nbsp;java.util.List;<br />
&nbsp;&nbsp;import&nbsp;java.sql.PreparedStatement;<br />
&nbsp;&nbsp;import&nbsp;java.sql.ResultSet;<br />
&nbsp;&nbsp;import&nbsp;java.sql.Connection;<br />
&nbsp;&nbsp;import&nbsp;java.sql.DriverManager;</div>
<div>&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public&nbsp;class&nbsp;TreeUtil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;List&nbsp;retrieveNodeInfos(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;coll&nbsp;=&nbsp;new&nbsp;ArrayList();</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;driverName&nbsp;=&nbsp;"com.mysql.jdbc.Driver";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;host&nbsp;=&nbsp;"localhost";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;port&nbsp;=&nbsp;":3306";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;serverID&nbsp;=&nbsp;"test";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;userName&nbsp;=&nbsp;"root";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;userPwd&nbsp;=&nbsp;"root";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:mysql://"&nbsp;+&nbsp;host&nbsp;+&nbsp;port&nbsp;+&nbsp;"/"&nbsp;+&nbsp;serverID&nbsp;;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;null&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement&nbsp;ps&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driverName).newInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection(url&nbsp;,&nbsp;userName&nbsp;,&nbsp;userPwd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;"select&nbsp;*&nbsp;from&nbsp;tree_info";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps&nbsp;=&nbsp;conn.prepareStatement(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;ps.executeQuery();</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeInfo&nbsp;info&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs!=null&nbsp;&amp;&amp;&nbsp;rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;new&nbsp;TreeInfo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setNodeId(rs.getInt(1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setParentId(rs.getInt(2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setNodeName(rs.getString(3));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.setUrl(rs.getString(4));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coll.add(info);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rs!=null){<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs=null;<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ps!=null){<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps.close();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps=null;<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<div><br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;coll;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;String&nbsp;createTreeInfo(List&nbsp;alist){<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;contents&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;contents.append("&lt;!--\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;contents.append("var&nbsp;Tree&nbsp;=&nbsp;new&nbsp;Array;");//create&nbsp;a&nbsp;array&nbsp;in&nbsp;javascript<br />
&nbsp;&nbsp;&nbsp;&nbsp;TreeInfo&nbsp;info&nbsp;=null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;max&nbsp;=&nbsp;alist.size(),i=0;i&lt;max;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;(TreeInfo)alist.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//define&nbsp;elements&nbsp;of&nbsp;array<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("Tree[");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("]=\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getNodeId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("|");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getParentId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("|");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getNodeName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("|");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(info.getUrl());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append("\";");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;contents.append("//--&gt;");</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;contents.toString();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;alist&nbsp;=&nbsp;TreeUtil.retrieveNodeInfos();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeInfo&nbsp;info&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Iterator&nbsp;i&nbsp;=&nbsp;c.iterator();i.hasNext();){<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;(TreeInfo)i.next();<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("*****"&nbsp;+&nbsp;info.getNodeName());<br />
&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(TreeUtil.createTreeInfo(alist));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</div>
<div>&nbsp;3)编写标签类<br />
&nbsp;InitTreeTag.java<br />
&nbsp;package&nbsp;com.diegoyun.web.taglibs;<br />
&nbsp;import&nbsp;com.diegoyun.web.tree.TreeUtil;<br />
&nbsp;import&nbsp;javax.servlet.jsp.tagext.TagSupport;<br />
&nbsp;import&nbsp;javax.servlet.jsp.JspException;<br />
&nbsp;import&nbsp;java.io.IOException;</div>
<div>&nbsp;/**<br />
&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;*/<br />
&nbsp;public&nbsp;class&nbsp;InitTreeTag&nbsp;extends&nbsp;TagSupport{</div>
<div>&nbsp;&nbsp;public&nbsp;int&nbsp;doEndTag()&nbsp;throws&nbsp;JspException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;tree&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;tree.append("&lt;script&nbsp;type=\"text/javascript\"&gt;\n");<br />
&nbsp;&nbsp;&nbsp;tree.append(TreeUtil.createTreeInfo(TreeUtil.retrieveNodeInfos()));<br />
&nbsp;&nbsp;&nbsp;tree.append("&lt;/script&gt;\n");<br />
&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;pageContext.getOut().println(tree.toString());<br />
&nbsp;&nbsp;&nbsp;}catch(IOException&nbsp;ioe){<br />
&nbsp;&nbsp;&nbsp;&nbsp;ioe.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return&nbsp;super.doEndTag();<br />
&nbsp;&nbsp;}<br />
&nbsp;}</div>
<div>&nbsp;ShowTreeTag.java&nbsp;:&nbsp;</div>
<div>&nbsp;package&nbsp;com.diegoyun.web.taglibs;</div>
<div>&nbsp;import&nbsp;javax.servlet.jsp.tagext.TagSupport;<br />
&nbsp;import&nbsp;javax.servlet.jsp.JspException;<br />
&nbsp;import&nbsp;java.io.IOException;</div>
<div>&nbsp;/**<br />
&nbsp;&nbsp;*&nbsp;@author&nbsp;Diegoyun<br />
&nbsp;&nbsp;*&nbsp;@version&nbsp;1.0<br />
&nbsp;&nbsp;*/<br />
&nbsp;public&nbsp;class&nbsp;ShowTreeTag&nbsp;extends&nbsp;TagSupport{<br />
&nbsp;&nbsp;public&nbsp;int&nbsp;doEndTag()&nbsp;throws&nbsp;JspException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer&nbsp;=&nbsp;showTree();<br />
&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;pageContext.getOut().println(buffer.toString());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;catch&nbsp;(IOException&nbsp;ioe)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ioe.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return&nbsp;super.doEndTag();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;private&nbsp;StringBuffer&nbsp;showTree(){<br />
&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;div&nbsp;class=\"tree\"&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;script&nbsp;type=\"text/javascript\"&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;!--\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("createTree(Tree，1，7);\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("//--&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;/script&gt;\n");<br />
&nbsp;&nbsp;&nbsp;sb.append("&lt;/div&gt;\n");<br />
&nbsp;&nbsp;&nbsp;return&nbsp;sb;<br />
&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;}</div>
<div>&nbsp;标签的tld如下：<br />
&nbsp;&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"&nbsp;?&gt;<br />
&nbsp;&lt;!DOCTYPE&nbsp;taglib<br />
&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;JSP&nbsp;Tag&nbsp;Library&nbsp;1.2//EN"<br />
&nbsp;&nbsp;&nbsp;"<a href="http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"><font color="#990000"><a href="http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" target="_blank">http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd</a></font></a>"&gt;<br />
&nbsp;&lt;taglib&gt;<br />
&nbsp;&nbsp;&lt;tlib-version&gt;1.0&lt;/tlib-version&gt;<br />
&nbsp;&nbsp;&lt;jsp-version&gt;1.2&lt;/jsp-version&gt;<br />
&nbsp;&nbsp;&lt;short-name&gt;tree&lt;/short-name&gt;<br />
&nbsp;&nbsp;&lt;!--initTreeTag--&gt;<br />
&nbsp;&nbsp;&lt;tag&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;init&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;tag-class&gt;com.diegoyun.web.taglibs.InitTreeTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&lt;/tag&gt;<br />
&nbsp;&nbsp;&lt;!--ShowTreeTag--&gt;<br />
&nbsp;&nbsp;&lt;tag&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;show&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;tag-class&gt;com.diegoyun.web.taglibs.ShowTreeTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&lt;/tag&gt;<br />
&nbsp;&lt;/taglib&gt;</div>
<div>&nbsp;4）建立web过程，编写jsp进行测试。</div>
<div>&nbsp;index.jsp如下：<br />
&nbsp;&lt;%@&nbsp;page&nbsp;language="java"%&gt;<br />
&nbsp;&lt;%@&nbsp;taglib&nbsp;uri="/WEB-INF/tlds/tree.tld"&nbsp;prefix="tree"%&gt;</div>
<div><br />
&nbsp;&lt;html&gt;<br />
&nbsp;&lt;head&gt;<br />
&nbsp;&nbsp;&lt;title&gt;Tree&nbsp;example&lt;/title&gt;<br />
&nbsp;&nbsp;&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=iso-8859-1"&gt;<br />
&nbsp;&nbsp;&lt;link&nbsp;rel="StyleSheet"&nbsp;href="tree.css"&nbsp;type="text/css"&gt;<br />
&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&nbsp;src="tree.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&lt;tree:init/&gt;<br />
&nbsp;&lt;/head&gt;</div>
<div>&nbsp;&lt;body&gt;</div>
<div><br />
&nbsp;&lt;b&gt;Tree&nbsp;example&nbsp;:&lt;/b&gt;&lt;br&nbsp;/&gt;&lt;br&nbsp;/&gt;<br />
&nbsp;&lt;tree:show/&gt;<br />
&nbsp;&lt;br&nbsp;/&gt;&lt;br&nbsp;/&gt;</div>
<div>&nbsp;</div>
<div>&nbsp;&lt;/body&gt;<br />
&nbsp;&lt;/html&gt;</div>
<a class="hidden" href="http://zc4530.blog.51cto.com/96735/29722">本文出自 51CTO.COM技术博客</a></div>
<img src ="http://www.blogjava.net/i369/aggbug/149776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-09-30 09:48 <a href="http://www.blogjava.net/i369/articles/149776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dtree右键菜单 </title><link>http://www.blogjava.net/i369/articles/149778.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sun, 30 Sep 2007 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/149778.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/149778.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/149778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/149778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/149778.html</trackback:ping><description><![CDATA[<div>&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;TITLE&gt;&lt;/TITLE&gt;<br />
&lt;META content="text/html; charset=gb2312" http-equiv=Content-Type&gt;<br />
&lt;META content="MSHTML 5.00.2920.0" name=GENERATOR&gt;<br />
&lt;script&gt;<br />
&lt;!--<br />
// menu object<br />
function contextMenu()<br />
{<br />
this.items = new Array();<br />
<br />
this.addItem = function (item)<br />
{<br />
this.items[this.items.length] = item;<br />
}<br />
<br />
this.show = function (oDoc)<br />
{<br />
var strShow = "";<br />
var i;<br />
<br />
strShow = "&lt;div id=\"rightmenu\" style=\"BACKGROUND-COLOR: #ffffff; BORDER: #000000 1px solid; LEFT: 0px; POSITION: absolute; TOP: 0px; VISIBILITY: hidden; Z-INDEX: 10\"&gt;";<br />
strShow += "&lt;table border=\"0\" height=\"";<br />
strShow += this.items.length * 20;<br />
strShow += "\" cellpadding=\"0\" cellspacing=\"0\"&gt;";<br />
strShow += "&lt;tr height=\"3\"&gt;&lt;td bgcolor=\"#d0d0ce\" width=\"2\"&gt;&lt;/td&gt;&lt;td&gt;";<br />
strShow += "&lt;table border=\"0\" width=\"100%\" height=\"100%\" cellpadding=0 cellspacing=0 bgcolor=\"#ffffff\"&gt;";<br />
strShow += "&lt;tr&gt;&lt;td bgcolor=\"#d0d0ce\" width=\"23\"&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=\" \" height=\"1\" border=\"0\"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;";<br />
strShow += "&lt;/td&gt;&lt;td width=\"2\"&gt;&lt;/td&gt;&lt;/tr&gt;";<br />
strShow += "&lt;tr&gt;&lt;td bgcolor=\"#d0d0ce\"&gt;&lt;/td&gt;&lt;td&gt;";<br />
strShow += "&lt;table border=\"0\" width=\"100%\" height=\"100%\" cellpadding=3 cellspacing=0 bgcolor=\"#ffffff\"&gt;";<br />
oDoc.write(strShow);<br />
for(i=0; i&lt;this.items.length; i++)<br />
{<br />
this.items[i].show(oDoc);<br />
}<br />
strShow = "&lt;/table&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;";<br />
strShow += "&lt;tr height=\"3\"&gt;&lt;td bgcolor=\"#d0d0ce\"&gt;&lt;/td&gt;&lt;td&gt;";<br />
strShow += "&lt;table border=\"0\" width=\"100%\" height=\"100%\" cellpadding=0 cellspacing=0 bgcolor=\"#ffffff\"&gt;";<br />
strShow += "&lt;tr&gt;&lt;td bgcolor=\"#d0d0ce\" width=\"23\"&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=\" \" height=\"1\" border=\"0\"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;";<br />
strShow += "&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;";<br />
strShow += "&lt;/table&gt;&lt;/div&gt;\n";<br />
oDoc.write(strShow);<br />
}<br />
}<br />
<br />
// menu Item object<br />
function contextItem(text, icon, cmd, type)<br />
{<br />
this.text = text ? text : "";<br />
this.icon = icon ? icon : "";<br />
this.cmd = cmd ? cmd : "";<br />
this.type = type ? type : "menu";<br />
<br />
this.show = function (oDoc)<br />
{<br />
var strShow = "";<br />
<br />
if(this.type == "menu")<br />
{<br />
strShow += "&lt;tr ";<br />
strShow += " 'on');\" ";<br />
strShow += " 'out');\" ";<br />
strShow += "onclick=\"";<br />
strShow += this.cmd;<br />
strShow += "\"&gt;";<br />
strShow += "&lt;td class=\"ltdexit\" width=\"16\"&gt;";<br />
if (this.icon == "")<br />
strShow += "&amp;nbsp;";<br />
else {<br />
strShow += "&lt;img border=\"0\" src=\"";<br />
strShow += this.icon;<br />
strShow += "\" width=\"16\" height=\"16\" style=\"POSITION: relative\"&gt;&lt;/img&gt;";<br />
}<br />
strShow += "&lt;/td&gt;&lt;td class=\"mtdexit\"&gt;";<br />
strShow += this.text;<br />
strShow += "&lt;/td&gt;&lt;td class=\"rtdexit\" width=\"5\"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;";<br />
}<br />
else if (this.type == "separator")<br />
{<br />
strShow += "&lt;tr&gt;&lt;td class=\"ltdexit\"&gt;&amp;nbsp;&lt;/td&gt;";<br />
strShow += "&lt;td class=\"mtdexit\" colspan=\"2\"&gt;&lt;hr color=\"#000000\" size=\"1\"&gt;&lt;/td&gt;&lt;/tr&gt;";<br />
}<br />
<br />
oDoc.write(strShow);<br />
}<br />
}<br />
<br />
function changeStyle(obj, cmd)<br />
{ <br />
if(obj) try {<br />
var imgObj = obj.children(0).children(0);<br />
<br />
if(cmd == 'on') {<br />
obj.children(0).className = "ltdfocus";<br />
obj.children(1).className = "mtdfocus";<br />
obj.children(2).className = "rtdfocus";<br />
if(imgObj)<br />
{<br />
if(imgObj.tagName.toUpperCase() == "IMG")<br />
{<br />
imgObj.style.left = "-1px";<br />
imgObj.style.top = "-1px";<br />
}<br />
}<br />
}<br />
else if(cmd == 'out') {<br />
obj.children(0).className = "ltdexit";<br />
obj.children(1).className = "mtdexit";<br />
obj.children(2).className = "rtdexit";<br />
if(imgObj)<br />
{<br />
if(imgObj.tagName.toUpperCase() == "IMG")<br />
{<br />
imgObj.style.left = "0px";<br />
imgObj.style.top = "0px";<br />
}<br />
}<br />
}<br />
}<br />
catch (e) {}<br />
}<br />
<br />
function showMenu()<br />
{<br />
var x, y, w, h, ox, oy;<br />
<br />
x = event.clientX;<br />
y = event.clientY;<br />
<br />
var obj = document.getElementById("rightmenu");<br />
if (obj == null)<br />
return true;<br />
<br />
ox = document.body.clientWidth;<br />
oy = document.body.clientHeight;<br />
if(x &gt; ox || y &gt; oy)<br />
return false;<br />
w = obj.offsetWidth;<br />
h = obj.offsetHeight;<br />
if((x + w) &gt; ox)<br />
x = x - w;<br />
if((y + h) &gt; oy)<br />
y = y - h;<br />
<br />
obj.style.posLeft = x + document.body.scrollLeft;<br />
obj.style.posTop = y + document.body.scrollTop;<br />
obj.style.visibility = "visible";<br />
<br />
return false;<br />
}<br />
function hideMenu()<br />
{<br />
if(event.button == 0)<br />
{<br />
var obj = document.getElementById("rightmenu");<br />
if (obj == null)<br />
return true;<br />
obj.style.visibility = "hidden";<br />
obj.style.posLeft = 0;<br />
obj.style.posTop = 0;<br />
}<br />
}<br />
<br />
function writeStyle()<br />
{<br />
var strStyle = "";<br />
<br />
strStyle += "&lt;STYLE type=text/css&gt;";<br />
strStyle += "TABLE {Font-FAMILY: \"Tahoma\",\"Verdana\",\"宋体\"; FONT-SIZE: 9pt}";<br />
strStyle += ".mtdfocus {BACKGROUND-COLOR: #ccccff; BORDER-BOTTOM: #000000 1px solid; BORDER-TOP: #000000 1px solid; CURSOR: hand}";<br />
strStyle += ".mtdexit {BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: #ffffff 1px solid; BORDER-TOP: #ffffff 1px solid}";<br />
strStyle += ".ltdfocus {BACKGROUND-COLOR: #ccccff; BORDER-BOTTOM: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; CURSOR: hand}";<br />
strStyle += ".ltdexit {BACKGROUND-COLOR: #d0d0ce; BORDER-BOTTOM: #d0d0ce 1px solid; BORDER-TOP: #d0d0ce 1px solid; BORDER-LEFT: #d0d0ce 1px solid}";<br />
strStyle += ".rtdfocus {BACKGROUND-COLOR: #ccccff; BORDER-BOTTOM: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-RIGHT: #000000 1px solid; CURSOR: hand}";<br />
strStyle += ".rtdexit {BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: #ffffff 1px solid; BORDER-TOP: #ffffff 1px solid; BORDER-RIGHT: #ffffff 1px solid}";<br />
strStyle += "&lt;/STYLE&gt;";<br />
<br />
document.write(strStyle);<br />
}<br />
<br />
function makeMenu()<br />
{<br />
var myMenu, item;<br />
<br />
var homepage_cmd = "this.style.behavior='url(#default#homepage)';this.setHomePage('http://baby.mob8.cn/'); return false;";<br />
var favorate_cmd = "window.external.addFavorite('http://baby.mob8.cn','网页教学网'); return false;";<br />
var viewcode_cmd = "window.location = 'view-source:' + window.location.href";<br />
<br />
myMenu = new contextMenu();<br />
<br />
item = new contextItem("返回主页", "http://www.webjx.com/js/home.gif", "top.location='http://baby.mob8.cn/';", "menu");<br />
myMenu.addItem(item);<br />
<br />
item = new contextItem("设为主页", "http://www.webjx.com/js/home.gif", homepage_cmd, "menu");<br />
myMenu.addItem(item);<br />
<br />
item = new contextItem("添加到收藏夹", "http://www.webjx.com/js/favadd.gif", favorate_cmd, "menu");<br />
myMenu.addItem(item);<br />
<br />
item = new contextItem("联系作者", "http://www.webjx.com/js/mail.gif", "location.href='mailto:46235412@qq.com'", "menu");<br />
myMenu.addItem(item);<br />
<br />
item = new contextItem("", "", "", "separator");<br />
myMenu.addItem(item);<br />
<br />
item = new contextItem("察看源码", "http://www.webjx.com/js/edit.gif", viewcode_cmd, "menu");<br />
myMenu.addItem(item);<br />
<br />
myMenu.show(this.document);<br />
<br />
delete item;<br />
delete myMenu;<br />
}<br />
<br />
function toggleMenu(isEnable)<br />
{<br />
if(isEnable)<br />
document.oncontextmenu = showMenu;<br />
else<br />
document.oncontextmenu = new function() {return true;};<br />
}<br />
<br />
writeStyle();<br />
makeMenu();<br />
document.onclick = hideMenu;<br />
document.oncontextmenu = showMenu;<br />
file://--&gt;<br />
&lt;/script&gt;<br />
<br />
&lt;/HEAD&gt;<br />
&lt;body marginwidth="0" marginheight="0" leftmargin="0" topmargin="0"&gt;<br />
&lt;table border="0" width="100%" height="100%" cellpadding="0" cellspacing="3"&gt;<br />
&lt;tr&gt;&lt;td valign="top"&gt;<br />
&lt;div id="docBoard" style="width: 100%"&gt;<br />
超酷的XP风格的网页右键菜单特效代码<a href="http://baby.mob8.cn/" target="_blank">http://baby.mob8.cn</a><br />
&lt;/div&gt;<br />
&lt;/td&gt;<br />
&lt;td valign="top" align="right"&gt;<br />
&lt;p&gt;&lt;input type="checkbox" name="closerm" onclick="toggleMenu(!this.checked);"&gt;关闭右键菜单&lt;/p&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/HTML&gt;<br />
<a class="hidden" href="http://zc4530.blog.51cto.com/96735/29725">本文出自 51CTO.COM技术博客</a></div>
<img src ="http://www.blogjava.net/i369/aggbug/149778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-09-30 09:48 <a href="http://www.blogjava.net/i369/articles/149778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp中使用EL表达式不解析(无效)的问题 </title><link>http://www.blogjava.net/i369/articles/135855.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 10 Aug 2007 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/135855.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/135855.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/135855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/135855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/135855.html</trackback:ping><description><![CDATA[在使用jsp的el表达式时，发现tomcat 5对其不解析。按原样输出如${items}.<br>原样把tomcat 的jsp例子拷过来还是如此。web.xml里和lib里的配置都配好了。找了很久才发现web.xml文件使用的是servlet 2.3版本的声明的问题。el在servlet 2.3中默认是不启用的。
<p>servlet 2.3的<br></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE&nbsp;web-app<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;PUBLIC&nbsp;'-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN'<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;'http://java.sun.com/dtd/web-app_2_3.dtd'</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="WebApp_ID"</span><span style="COLOR: #0000ff">&gt;</span></div>
</div>
<p>tomcat自带的 servlet 2.4的。<br></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app&nbsp;</span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="COLOR: #ff0000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="COLOR: #ff0000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;version</span><span style="COLOR: #0000ff">="2.4"</span><span style="COLOR: #0000ff">&gt;</span></div>
</div>
<p>把web.xml的声明部分改为2.4的即可。<br>还有就是如果使用了&lt;taglib&gt;标签就需要加&lt;jsp-config&gt;父标签。具体内容看jsp2.0和servlet2.4规范</p>
<p>&nbsp;&lt;jsp-config&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;/tags/struts-bean.tld&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-bean.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;/jsp-config&gt;</p>
<p>&nbsp;</p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1667667</p>
<img src ="http://www.blogjava.net/i369/aggbug/135855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-10 16:03 <a href="http://www.blogjava.net/i369/articles/135855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[2007-01-21 18时发布]ecside 1.0rc1: 列表组件eXtremeComponents全面增强版</title><link>http://www.blogjava.net/i369/articles/135464.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 09 Aug 2007 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/135464.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/135464.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/135464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/135464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/135464.html</trackback:ping><description><![CDATA[<strong><font color=#0000ff>ecside介绍：<br></font></strong>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<p>ecside是一个开源的<strong><font color=#ff0000>列表组件</font></strong>。<br>他源自著名开源列表组件 eXtremeComponents （http://www.extremecomponents.org），<br>但现在已经脱离eXtremeComponents,独立发展（仍有大量代码来自 eXtremeComponents）。<br>&#8220;<strong><font color=#ff9900>做最实用易用的列表组件</font></strong>&#8221;是ecside最终的目标。</p>
<p><font face=Arial>作者： fins ( name: Wei Zijun&nbsp;&nbsp;&nbsp; email:fins@163.com&nbsp;&nbsp; blog:http://fins.javaeye.com )<br></font><font face=Arial></font></p>
<p><font face=Arial>在使用前，请阅读一下以下信息，以帮助您了解您要使用的将是一个多么不成熟的东西(但它会有成熟的一天，而且那天不会远 呵呵)：<br>1 ecside不能和原始版本的 eXtremeComponents 同时使用，且不保证能与原先使用 eXtremeComponents 的系统兼容，请见谅。<br>2 目前只支持GBK编码的应用，请见谅。<br>3 目前只在IE6 和FireFox2 上进行过测试，不保证兼容其他(版本)浏览器，请见谅。<br>4 目前提供的样式风格巨丑无比，请见谅。<br>5 目前没有完备的文档和例子，请见谅。<br>6 代码没有注释，没有测试用例，请见谅。<br>7 没有很好的版本控制，没有构建脚本，请见谅。<br>8 拥有无数未知的bug，请见谅。</font></p>
<p><br><strong><font color=#0000ff>ecside发布地址：</font></strong><br>http://fins.javaeye.com/blog/40190 </p>
<p><font face=Arial><font color=#3366ff><strong>ecside发布地址：<br></strong><font color=#000000>http://fins.javaeye.com/blog/40190 <br></font><strong>ecside圈子:<br></strong><font color=#000000>http://ecside.javaeye.com/</font><br><strong>ecside综合讨论专用帖<br></strong><a href="http://fins.javaeye.com/blog/48723"><font color=#000000><u>http://fins.javaeye.com/blog/48723</u></font></a></font>&nbsp; <br></font></p>
<p><br><strong><font color=#0000ff>其他出色的列表组件(有些是收费的)：<br></font></strong>eXtremeComponents原始版 ( http://www.extremecomponents.org )<br>dhtmlXGrid ( http://scbr.com/docs/products/dhtmlxGrid/ )<br>displaytag ( http://displaytag.sourceforge.net )<br>nitobi grid ( http://www.nitobi.com/products/grid/ ) <br>ActiveWidgets gird ( http://www.activewidgets.com/grid/ )<br>rico livegrid ( http://openrico.org/rico/livegrid.page )</p>
<p>&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br><strong><font color=#ff0000>主要增强的功能：<br></font></strong>1 可设置工具条位置（上 下 或 不显示）<br>2 可设置工具条内容（显示哪些 不显示哪些）<br>3 可设置工具条上各个功能按钮的相对位置<br>4 增加了<strong><font color=#ff9900>调整页大小的选择框，并可自定义选择框内的内容</font></strong><br>5 增加了带有邻近页面的导航条<br>6 增加了可跳转到指定页面的跳转框<br><font face=Arial>7 增加了当前<font color=#ff9900><strong>选中行高亮</strong></font></font><br>8 为ec:table 增加了 excludeParameters 和 includeParameters 属性，可以实现更快捷简便的&#8220;参数保留/不保留&#8221;功能<br>9 可添加自定义的html代码到工具条内 或其他位置<br>10 <font color=#ff9900><strong>可手动调整列宽</strong><br></font>11 增加了&#8220;<strong><font color=#ff9900>列表内部滚动条</font></strong>&#8221;(实现<font color=#ff9900>列表头固定</font>，列表体滚动的功能)<br>12 为ec:row和ec:column 添加更多的html事件支持，现支持：onmouserover onmouserout onclick ondbclick<br>13 为ec:table ec:row ec:column增加了自定义扩展属性功能<br>14 增加 ec:extendrow 标签，实现列表扩展行的功能<br>15 增加<strong><font color=#ff9900>shadowRow(影子行)功能</font></strong>：每行下面可以再加一个子行 这个行里显示什么可以由大家自己定义<br>16 增加页面变量 <strong><font color=#ff9900>${TOTALROWCOUNT}</font></strong> 用来标示当前纪录在全部记录中的行数<br>17 增加了打印功能（尚不完善）<br>18 ec:column属性增加 ellipsis ,实现单元格内数据过长的时候 自动截短并加"..."的功能(ie only)<br>19 实现了跨列的列表头<br>20 <font color=#ff9900><strong>统计栏的标题格可跨列</strong><br></font>21 增加了若干种cell 和 headerCell,例如checkbox radio<br>22 取消了imagePath属性,样式相关的图片信息全部提入css内<br>23 重（第4声）用了js 和css ，很多功能用js来实现<br>24 支持了<font color=#ff9900><strong>ajax翻页</strong></font><br>25 支持<strong><font color=#ff9900>预查询功能</font></strong>，在察看第n页的时候，把n+1页的数据也查询出来（隐藏着）备用，加快查看下一页的速度<br>26 将导出<strong><font color=#ff9900>excel</font></strong>所使用的组件由<font color=#ff9900><strong>poi切换成了 jxl</strong></font><br>27 xls导出方式修改 原始的导出是导出的vo/map里的原始数值 现在是<strong><font color=#ff9900>导出页面实际显示的内容</font></strong><br><font face=Arial>28 增加<font color=#ff9900><strong>简捷导出方式</strong></font> (通过ec:table的 xlsFileName pdfFileName csvFileName属性)<br>29 支持<font color=#ff9900><strong>pdf中文导出</strong></font>。<br>30 代码进行了大规模的重构<br>31 增加了很多ajax相关特性<br><font face=Arial>32 实现了<font color=#ff0000><strong>可编辑列表</strong></font>功能 以及<strong><font color=#ff0000>cell的映射</font></strong>功能</font></font><font face=Arial><br>... ...</font></p>
<font face=Arial>
<p><br>更新日志：<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>新增加的特性通常都在 <strong><font color=#ff0000>demo.do.jsp</font></strong>这个例子里进行演示。</p>
<p><font face=Arial>===============================<br>2007-01-21 15点<br>===============================<br>对于以下更新，demo.do.jsp进行了修改，大家看看例子可能会更好理解.</font></p>
<p><font face=Arial><font face=Arial>1) 实现了<strong><font color=#ff0000>cell的映射功能</font></strong>（详见示例的性别 和 角色列）,用法:<br></font>了一个<strong><font color=#ff0000>简单的小标签</font></strong> 用来从map生成 select的option列表。<br><ec:options items="MAP在context内的key" defaultkey="默认选中的option的value" tagattributes="附加的html属性"></ec:options></font></p>
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=tag>&lt;</span><span class=tag-name>ec:column</span><span>&nbsp;</span><span class=attribute>mappingItem</span><span>=</span><span class=attribute-value>"用来映射的MAP在context内的key"</span><span>&nbsp;</span><span class=attribute>mappingDefaultValue</span><span>=</span><span class=attribute-value>"当找不到映射值时要使用的默认值"</span><span>...</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>例如，在示例中，角色的信息以 &#8220;标识--名称&#8221;的形式放到了一个 map内<br>在action中 把这个map放到了 request.setAttribute("USERROLE_MAP", CommonDictionary.USERROLE);内<br>在页面使用<br></p>
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=tag>&lt;</span><span class=tag-name>ec:column</span><span>&nbsp;</span><span class=attribute>property</span><span>=</span><span class=attribute-value>"USERROLE"</span><span>&nbsp;</span><span class=attribute>title</span><span>=</span><span class=attribute-value>"角色"</span><span>&nbsp;</span><span class=attribute>mappingItem</span><span>=</span><span class=attribute-value>"USERROLE_MAP"</span><span>&nbsp;</span><span class=attribute>mappingDefaultValue</span><span>=</span><span class=attribute-value>"[错误的角色]"</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p><br>就会自动将名称显示<font face=Arial>出来。<br>2) 做</font></p>
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-xml>
    <li class=alt><span><span class=tag>&lt;</span><span class=tag-name>ec:options</span><span>&nbsp;</span><span class=attribute>items</span><span>=</span><span class=attribute-value>"MAP在context内的key"</span><span>&nbsp;</span><span class=attribute>defaultKey</span><span>=</span><span class=attribute-value>"默认选中的option的value"</span><span>&nbsp;</span><span class=attribute>tagAttributes</span><span>=</span><span class=attribute-value>"附加的html属性"</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p><br>3) 对<strong><font color=#ff0000>ec:extend</font></strong>标签做了扩充，增加了位置设置属性 <strong><font color=#ff0000>location</font></strong><br>top: form内列表主体前&nbsp; ; bottom : form内列表主体后&nbsp; <br>toolbar或不设置location属性&nbsp; 在toolbar的扩展位置.<br>4) 代码进行了一点点修改，对使用没有影响。</p>
<p><font face=Arial>===============================<br><font color=#ff0000>2007-01-20 9点&nbsp;&nbsp; ECSIDE 1.0 RC1 发布啦</font><br>===============================<br>沉寂两天，但一直没有闲着，带来了大变化 索性来个 1.0 RC1 版 :) 。<br>1) 实现了<font color=#ff0000><strong>灵活的可定制的&#8220;可编辑列表&#8221;功能</strong></font> （详见help.txt 200行左右的描述 以及示例）<br>支持多种编辑方式（文本框 下拉框 将来还会支持更多），可自定义模版（使用自定义的文本框 下拉框），还提供了：<br>对可编辑列进行标识，对编辑过的cell进行标识（默认为改变单元格背景色），<br>使用ajax技术提交后台，提交成功的cell将清除编辑标识 等贴心设计。<br>2) 增加了 <font color=#ff0000><strong>高亮显示选中行的功能</strong></font>，使用 ec:table属性: selectlightRow="true"<br>3) 去掉了 fullnavigation导航条，将其与navigation导航条合并<br>改为为ec:table增加属性 <font color=#ff0000><strong>nearPageNum="数字"</strong></font> 用来设置导航条前后显示的邻近页数 等于0时 为不使用邻近页。<br>4) 为ec:table增加了 maxRowsExported="数字" 属性，用来限制导出大最大条数， 如果数据超过这个数目，则不执行导出操作。<br>5) 为之前增加的ec:table的pageSizeList属性 增加了特性<br>pageSizeList="<font color=#ff0000><strong>max:200</strong></font>,10,15,30,50,100,all" 如果 10--100以及all中，某一项大过了max的200则 不在列表中显示。<br>也可以只使用pageSizeList="max:200" 此时将 使用默认设置，并进行max控制。<br>6) <strong><font color=#ff0000>解决了pdf中文编码问题，终于支持pdf导出了</font></strong>。<br>7) 恢复了对sitemesh的支持，用法见原版ec文档（我没有亲自没有测试,因为我不会用sitemesh :( ）。<br>8) <font color=#ff0000>Ajax翻页优化</font>，同时增加了 ECSide.findAjaxZoneAtClien 属性，可设置 <strong><font color=#ff0000>客户端 还是 服务端进行 html代码剪裁</font></strong>。<br>默认推荐使用 服务器端。<br>9) 再次对js和java代码进行了较大规模的重构,清理了一些无用代码，添加了必要的协议信息。<br>10) 一些细节的修改(例如对滚轮的支持更自然,filterable="true"手动调节列宽功能屏蔽等) <br>还有对一些小bug的修正，但是由于变化较大，肯定还会带来一些新bug。<br>11) 整个示例的应用<font color=#ff0000>逐步发展为 ecside 的最佳实践</font>，加入了<font color=#ff0000>hsqldb</font>（hsqldb的使用参考了springside），全新的例子。<br>当然还不够好 会在以后的日子里继续完善。<br>12) 做了一个简单的<font color=#ff0000>logo</font> :)。</font></p>
<p><font face=Arial><strong><font color=#3366ff>顺便问一下：</font><br>我使用了 springside 的 HsqlListener （做了些修改 但绝对不涉及到核心），为什么在每次重启应用的时候总是包下面的异常呢？？<br></strong>Exception in thread "HSQLDB Timer @15d63da" java.lang.NullPointerException<br>&nbsp;at org.hsqldb.lib.HsqlTimer.nextTask(Unknown Source)<br>&nbsp;at org.hsqldb.lib.HsqlTimer$TaskRunner.run(Unknown Source)<br>&nbsp;at java.lang.Thread.run(Unknown Source)<br></font></p>
<p><font face=Arial>===============================<br>2007-01-16 14点<br>===============================<br>1) 当使用&#8220;列表内部滚动条&#8221;时，可以使用<font color=#ff9900><strong>百分比</strong></font>来设置列表的宽度了。<br>(但还是建议您使用像素（px）作为列表和列的宽度单位,因为百分还有一些小bug)<br>还有个建议 不管是使用什么样的宽度，建议都要使用一个&#8220;自动宽度&#8221;的column，<br>就是说不要给所有的ec:column都指定width，给其中一个点&#8220;自由&#8221;，这样很多已知的关于列宽调整的问题都可以解决。<br>2) 对eccn.js进行了大量的修改，提供了<font color=#ff9900><strong>更好(但不完美)的IE和FF兼容（一致）性</strong></font>（这个工作差点把我累吐血）.<br>ff和ie 在取得对象坐标和宽度的算法不同 太郁闷了<br>3) 修正了一些<font color=#ff9900><strong>bug</strong></font>。</font></p>
<p><br><font face=Arial>===============================<br>2007-01-12 以及之前的一些更新日志</font><br>===============================<br>1) 为&#8220;列表内部滚动条&#8221;增加了对鼠标滚轮的支持(只在ie6和ff2下测试过,其他版本没有测试)<br>2) 将部分&#8220;列表内部滚动条&#8221;相关的代码从java中提出,改用js实现.<br>3) 对js文件做了一些调整。<br>4) 修正了一些小bug。 </p>
<p>===============================<br>1) 修正了一个&#8220;列表内部滚动条&#8221;的bug<br>该bug表现为在 IE里 有些windows的主题下，纵向滚动条不可用。FT!!!!!<br>2) eccn.js做了一点小小的改动，为将来做过编码支持打下了一点点基础.</p>
<p>===============================<br>1) 修正了改变页面大小时&#8220;列表内部滚动条&#8221;错乱的bug<br>2) 重构了&#8220;列表内部滚动条&#8221;相关的js和java代码</p>
<p>===============================<br>1) 修正了使用ajax翻页时&#8220;列表内部滚动条&#8221;错乱的bug<br>2) 增加了当列表内容的实际宽度和高度小于设置的宽度和高度的时候，<br>&nbsp;&nbsp; 自动调整区域大小,同时自动隐藏滚动条（只隐藏横向的）的功能。</p>
<p>===============================<br>增加了&#8220;固定列表头，滚动列表体&#8221;(&#8220;列表内部滚动条&#8221;)的功能<br>这个功能实现起来比我一开始想像的复杂<br>不是简单的使用一个 div overflow:scroll就可以搞定的<br>虽然功能是支持了 但是代码肯定还有很多bug或者是可以改进的地方<br>欢迎大家积极的提出宝贵的意见 谢谢了</p>
<p>使用方法：<br>ec:table标签内 增加<br>listHeight="数字" 属性 （指定列表体的高度）<br>同时把要指定 width="数字" 不能省略 同时要使用绝对大小 而不要使用百分比<br></p>
<p>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</p>
<p>部分增强功能简介：<br>（详见help.txt）</p>
<p>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br></p>
<p><font face=Arial color=#3366ff><strong>我们有自己的圈子了 <br>以后大家有 ecside相关的问题 可以去<font color=#ff0000>圈子里</font><br>我的 <font color=#ff0000>blog里问</font>( http://fins.javaeye.com/blog/48723 )&nbsp; <br>别在发消息了 因为发消息别人看不到 而有些问题可能别人也遇到过 或者是我回答的不对 别人也可以帮忙 <br>对吧? <br>谢谢大家</strong></font></p>
<p><font face=Arial><font color=#3366ff><strong>ecside发布地址：<br>http://fins.javaeye.com/blog/40190 <br>ecside圈子:<br>http://ecside.javaeye.com/<br>ecside综合讨论专用帖<br>http://fins.javaeye.com/blog/48723</strong></font>&nbsp; <br></font></p>
<p>&nbsp;</p>
<p>我申请了<font face=Arial><font color=#ff0000><strong>javascud</strong></font>项目 而且也申请了svn 但是<strong><font color=#ff0000>不会用啊&nbsp; :'( 谁来教教我啊</font></strong></font></p>
<p>&nbsp;</p>
<p>&nbsp;<font face=Arial color=#ff0000 size=4><strong>依赖包已经上传到 圈子的共享空间里了</strong></font></p>
<p>共3个 请解压缩后放到 WEB-INF/lib下 如果不导出pdf可以不下载pdf相关的包 和 字体文件 这两个比较大&nbsp;<font face=Arial></font>&nbsp;</p>
</font>
<div style="PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 15px 0px 0px 10px; PADDING-TOP: 10px">
<table class=attach cellSpacing=0 cellPadding=2 width="95%" align=center border=1>
    <tbody>
        <tr>
            <td class=attachrow style="BACKGROUND: #d1d7dc" align=middle width="100%" colSpan=3><strong><span class=gen>ecside_1.0_rc1_20070121b.zip</span></strong></td>
        </tr>
        <tr>
            <td class=attachrow width="15%"><span class=genmed>&nbsp;描述:</span></td>
            <td class=attachrow width="75%">&nbsp;完整版，但不包括所依赖的WEB-INF/lib下的文件.依赖文件可以去圈子里下载, 也可以去javaeye ftp下载,也可以按照WEB-INF/lib下的filelist.txt文件所列,自行下载. </td>
            <td class=attachrow align=middle width="10%" rowSpan=4><img alt="" src="http://fins.javaeye.com/images/forum/icon_clip.gif" border=0><br><a href="http://fins.javaeye.com/topics/download/4e97cc37-095c-4528-9909-90846eea9b71"><strong><u><font color=#0000ff>下载</font></u></strong></a> </td>
        </tr>
        <tr>
            <td class=attachrow width="15%"><span class=genmed>&nbsp;文件名:</span></td>
            <td class=attachrow width="75%"><span class=genmed>&nbsp;ecside_1.0_rc1_20070121b.zip</span></td>
        </tr>
        <tr>
            <td class=attachrow width="15%"><span class=genmed>&nbsp;文件大小:</span></td>
            <td class=attachrow width="75%"><span class=genmed>&nbsp;697 KB</span></td>
        </tr>
        <tr>
            <td class=attachrow width="15%"><span class=genmed>&nbsp;下载过的:</span></td>
            <td class=attachrow width="75%"><span class=genmed>&nbsp;文件被下载或查看 774 次</span></td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/135464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-09 13:20 <a href="http://www.blogjava.net/i369/articles/135464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>收集的非常不错的js脚本</title><link>http://www.blogjava.net/i369/articles/134639.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 06 Aug 2007 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/134639.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/134639.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/134639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/134639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/134639.html</trackback:ping><description><![CDATA[<p><strong>1&nbsp;&gt;屏蔽功能类</strong></p>
<div>
<p><font color=#ff0000>1.1&nbsp;屏蔽键盘所有键</font><br>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;document.onkeydown(){<br>&nbsp;&nbsp;&nbsp;event.keyCode&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;event.returnvalue&nbsp;=&nbsp;false;<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p><font color=#ff0000>1.2&nbsp;屏蔽鼠标右键</font></p>
<p>在body标签里加上oncontextmenu=self.event.returnvalue=false</p>
<p><font color=#ff0000>或者</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;document.oncontextmenu()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;return&nbsp;false;&nbsp;<br>}&nbsp;<br>--&gt;<br>&lt;/script&gt;</p>
<p>function&nbsp;nocontextmenu()<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;if(document.all)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.cancelBubble=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.returnvalue=false;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</p>
<p><font color=#ff0000>或者</font></p>
<p>&lt;body&nbsp;onmousedown="rclick()"&nbsp;oncontextmenu=&nbsp;"nocontextmenu()"&gt;</p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;rclick()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(document.all)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(event.button&nbsp;==&nbsp;2){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.returnvalue=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p><br><font color=#ff0000>1.3&nbsp;屏蔽&nbsp;Ctrl+N、Shift+F10、F5刷新、退格键</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>&nbsp;&nbsp;//屏蔽鼠标右键、Ctrl+N、Shift+F10、F5刷新、退格键<br>function&nbsp;window.onhelp(){return&nbsp;false}&nbsp;//屏蔽F1帮助<br>function&nbsp;KeyDown(){<br>&nbsp;&nbsp;if&nbsp;((window.event.altKey)&amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((window.event.keyCode==37)||&nbsp;&nbsp;&nbsp;//屏蔽&nbsp;Alt+&nbsp;方向键&nbsp;&#8592;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(window.event.keyCode==39))){&nbsp;&nbsp;//屏蔽&nbsp;Alt+&nbsp;方向键&nbsp;&#8594;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("不准你使用ALT+方向键前进或后退网页！");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.returnvalue=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;注：这还不是真正地屏蔽&nbsp;Alt+&nbsp;方向键，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为&nbsp;Alt+&nbsp;方向键弹出警告框时，按住&nbsp;Alt&nbsp;键不放，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用鼠标点掉警告框，这种屏蔽方法就失效了。以后若<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有哪位高手有真正屏蔽&nbsp;Alt&nbsp;键的方法，请告知。*/</p>
<p>&nbsp;&nbsp;if&nbsp;((event.keyCode&nbsp;==&nbsp;8)&nbsp;&amp;&amp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(event.srcElement.type&nbsp;!=&nbsp;"text"&nbsp;&amp;&amp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.srcElement.type&nbsp;!=&nbsp;"textarea"&nbsp;&amp;&amp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.srcElement.type&nbsp;!=&nbsp;"password")&nbsp;||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//屏蔽退格删除键&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(event.keyCode==116)||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//屏蔽&nbsp;F5&nbsp;刷新键<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(event.ctrlKey&nbsp;&amp;&amp;&nbsp;event.keyCode==82)){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Ctrl&nbsp;+&nbsp;R<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.keyCode=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.returnvalue=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;if&nbsp;((event.ctrlKey)&amp;&amp;(event.keyCode==78))&nbsp;&nbsp;&nbsp;//屏蔽&nbsp;Ctrl+n<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.returnvalue=false;<br>&nbsp;&nbsp;if&nbsp;((event.shiftKey)&amp;&amp;(event.keyCode==121))&nbsp;//屏蔽&nbsp;shift+F10<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.returnvalue=false;<br>&nbsp;&nbsp;if&nbsp;(window.event.srcElement.tagName&nbsp;==&nbsp;"A"&nbsp;&amp;&amp;&nbsp;window.event.shiftKey)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.event.returnvalue&nbsp;=&nbsp;false;&nbsp;&nbsp;//屏蔽&nbsp;shift&nbsp;加鼠标左键新开一网页<br>&nbsp;&nbsp;if&nbsp;((window.event.altKey)&amp;&amp;(window.event.keyCode==115)){&nbsp;//屏蔽Alt+F4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;}<br>&nbsp;&nbsp;}<br>&nbsp;/*&nbsp;另外可以用&nbsp;window.open&nbsp;的方法屏蔽&nbsp;IE&nbsp;的所有菜单<br>第一种方法：<br>&nbsp;&nbsp;window.open("你的.htm",&nbsp;"","toolbar=no,location=no,directories=no,menubar=no,scrollbars=no,resizable=yes,status=no,top=0,left=0")<br>第二种方法是打开一个全屏的页面：<br>&nbsp;&nbsp;window.open("你的.asp",&nbsp;"",&nbsp;"fullscreen=yes")<br>&nbsp;*/<br>//--&gt;<br>&lt;/script&gt;</p>
<p><font color=#ff0000>1.4屏蔽浏览器右上角"最小化""最大化""关闭"键</font></p>
<p>&lt;script&nbsp;language=javascript&gt;<br>function&nbsp;window.onbeforeunload()<br>{<br>&nbsp;&nbsp;if(event.clientX&gt;document.body.clientWidth&amp;&amp;event.clientY&lt;0||event.altKey)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;window.event.returnvalue&nbsp;=&nbsp;"";<br>&nbsp;&nbsp;}<br>}<br>&lt;/script&gt;</p>
<p><font color=#ff0000>或者使用全屏打开页面</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>window.open(<a href="http://www.32pic.com/"><font color=#000000>www.32pic.com</font></a>,"32pic","fullscreen=3,height=100,&nbsp;width=400,&nbsp;top=0,&nbsp;left=0,&nbsp;toolbar=no,&nbsp;menubar=no,&nbsp;scrollbars=no,&nbsp;resizable=no,location=no,&nbsp;status=no");<br>--&gt;<br>&lt;/script&gt;</p>
<p>注：在body标签里加上onbeforeunload="javascript:return&nbsp;false"（使不能关闭窗口）</p>
<p><font color=#ff0000>1.5屏蔽F5键</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;document.onkeydown()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;event.keyCode==116)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.keyCode&nbsp;=&nbsp;0;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.cancelBubble&nbsp;=&nbsp;true;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p><font color=#ff0000>1.6屏蔽IE后退按钮</font></p>
<p>在你链接的时候用&nbsp;&lt;a&nbsp;href="javascript:location.replace(url)"&gt;</p>
<p><font color=#ff0000>1.7屏蔽主窗口滚动条</font></p>
<p>在body标签里加上&nbsp;style="overflow-y:hidden"</p>
<p><font color=#ff0000>1.8&nbsp;屏蔽拷屏,不断地清空剪贴板</font></p>
<p>在body标签里加上onload="setInterval('clipboardData.setData(\'Text\',\'\')',100)"</p>
<p><font color=#ff0000>1.9&nbsp;屏蔽网站的打印功能</font></p>
<p>&lt;style&gt;<br>@media&nbsp;print&nbsp;{<br>&nbsp;&nbsp;&nbsp;*&nbsp;{&nbsp;display:&nbsp;none&nbsp;}<br>}<br>&lt;/style&gt;</p>
<p><font color=#ff0000>1.10&nbsp;屏蔽IE6.0&nbsp;图片上自动出现的保存图标</font></p>
<p>方法一：<br>&lt;META&nbsp;HTTP-EQUIV="imagetoolbar"&nbsp;CONTENT="no"&gt;<br>方法二：<br>&lt;img&nbsp;galleryimg="no"&gt;</p>
<p><font color=#ff0000>1.11&nbsp;屏蔽页中所有的script</font></p>
<p>&lt;noscrript&gt;&lt;/noscript&gt;</p>
<p><strong>2&nbsp;&gt;表单提交验证类</strong> </p>
<p>&nbsp;</p>
<p><font color=#ff0000>2.1&nbsp;表单项不能为空</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;CheckForm()<br>{<br>if&nbsp;(document.form.name.value.length&nbsp;==&nbsp;0)&nbsp;{<br>&nbsp;&nbsp;&nbsp;alert("请输入您姓名!");<br>&nbsp;&nbsp;&nbsp;document.form.name.focus();<br>&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>}<br>&nbsp;&nbsp;&nbsp;return&nbsp;true;<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p><font color=#ff0000>2.2&nbsp;比较两个表单项的值是否相同</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;CheckForm()<br>if&nbsp;(document.form.PWD.value&nbsp;!=&nbsp;document.form.PWD_Again.value)&nbsp;{<br>&nbsp;&nbsp;&nbsp;alert("您两次输入的密码不一样！请重新输入.");<br>&nbsp;&nbsp;&nbsp;document.ADDUser.PWD.focus();<br>&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>}<br>&nbsp;&nbsp;&nbsp;return&nbsp;true;<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p><font color=#ff0000>2.3&nbsp;表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;isNumber(String)<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;Letters&nbsp;=&nbsp;"1234567890-";&nbsp;//可以自己增加可输入值<br>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(String.charAt(&nbsp;0&nbsp;)=='-')<br>&nbsp;return&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;String.charAt(&nbsp;String.length&nbsp;-&nbsp;1&nbsp;)&nbsp;==&nbsp;'-'&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;String.length;&nbsp;i&nbsp;++&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;String.charAt(&nbsp;i&nbsp;);<br>&nbsp;&nbsp;&nbsp;if&nbsp;(Letters.indexOf(&nbsp;c&nbsp;)&nbsp;&lt;&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;<br>}<br>function&nbsp;CheckForm()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(!&nbsp;isNumber(document.form.TEL.value))&nbsp;{<br>&nbsp;&nbsp;alert("您的电话号码不合法！");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.form.TEL.focus();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>}<br>return&nbsp;true;<br>}<br>--&gt;<br>&lt;/script&gt;</p>
<p><br><font color=#ff0000>2.4&nbsp;表单项输入数值/长度限定</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--<br>function&nbsp;CheckForm()&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(document.form.count.value&nbsp;&gt;&nbsp;100&nbsp;||&nbsp;document.form.count.value&nbsp;&lt;&nbsp;1)<br>{<br>&nbsp;alert("输入数值不能小于零大于100!");<br>&nbsp;document.form.count.focus();<br>&nbsp;return&nbsp;false;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(document.form.MESSAGE.value.length&lt;10)<br>{<br>&nbsp;alert("输入文字小于10!");<br>&nbsp;document.form.MESSAGE.focus();<br>&nbsp;return&nbsp;false;<br>}<br>return&nbsp;true;<br>}<br>//--&gt;<br>&lt;/script&gt;</p>
<p><font color=#ff0000>2.5&nbsp;中文/英文/数字/邮件地址合法性判断</font></p>
<p>&lt;SCRIPT&nbsp;LANGUAGE="javascript"&gt;<br>&lt;!--</p>
<p>function&nbsp;isEnglish(name)&nbsp;//英文值检测<br>{<br>&nbsp;if(name.length&nbsp;==&nbsp;0)<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;name.length;&nbsp;i++)&nbsp;{<br>&nbsp;&nbsp;if(name.charCodeAt(i)&nbsp;&gt;&nbsp;128)<br>&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;}<br>&nbsp;return&nbsp;true;<br>}</p>
<p>function&nbsp;isChinese(name)&nbsp;//中文值检测<br>{<br>&nbsp;if(name.length&nbsp;==&nbsp;0)<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;name.length;&nbsp;i++)&nbsp;{<br>&nbsp;&nbsp;if(name.charCodeAt(i)&nbsp;&gt;&nbsp;128)<br>&nbsp;&nbsp;&nbsp;return&nbsp;true;<br>&nbsp;}<br>&nbsp;return&nbsp;false;<br>}</p>
<p>function&nbsp;isMail(name)&nbsp;//&nbsp;E-mail值检测<br>{<br>&nbsp;if(!&nbsp;isEnglish(name))<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;i&nbsp;=&nbsp;name.indexOf("@");<br>&nbsp;j&nbsp;=&nbsp;name.lastIndexOf("@");<br>&nbsp;if(i&nbsp;==&nbsp;-1)<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;if(i&nbsp;!=&nbsp;j)<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;if(i&nbsp;==&nbsp;name.length)<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;return&nbsp;true;<br>}</p>
<p>function&nbsp;isNumber(name)&nbsp;//数值检测<br>{<br>&nbsp;if(name.length&nbsp;==&nbsp;0)<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;name.length;&nbsp;i++)&nbsp;{<br>&nbsp;&nbsp;if(name.charAt(i)&nbsp;&lt;&nbsp;"0"&nbsp;||&nbsp;name.charAt(i)&nbsp;&gt;&nbsp;"9")<br>&nbsp;&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;}<br>&nbsp;return&nbsp;true;<br>}</p>
<p>function&nbsp;CheckForm()<br>{<br>&nbsp;if(!&nbsp;isMail(form.Email.value))&nbsp;{<br>&nbsp;&nbsp;alert("您的电子邮件不合法！");<br>&nbsp;&nbsp;form.Email.focus();<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;}<br>&nbsp;if(!&nbsp;isEnglish(form.name.value))&nbsp;{<br>&nbsp;&nbsp;alert("英文名不合法！");<br>&nbsp;&nbsp;form.name.focus();<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;}<br>&nbsp;if(!&nbsp;isChinese(form.cnname.value))&nbsp;{<br>&nbsp;&nbsp;alert("中文名不合法！");<br>&nbsp;&nbsp;form.cnname.focus();<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;}<br>&nbsp;if(!&nbsp;isNumber(form.PublicZipCode.value))&nbsp;{<br>&nbsp;&nbsp;alert("邮政编码不合法！");<br>&nbsp;&nbsp;form.PublicZipCode.focus();<br>&nbsp;&nbsp;return&nbsp;false;<br>&nbsp;}<br>&nbsp;return&nbsp;true;<br>}<br>//--&gt;<br>&lt;/SCRIPT&gt;</p>
<p><font color=#ff0000>2.6&nbsp;限定表单项不能输入的字符</font></p>
<p>&lt;script&nbsp;language="javascript"&gt;<br>&lt;!--</p>
<p>function&nbsp;contain(str,charset)//&nbsp;字符串包含测试函数<br>{<br>&nbsp;&nbsp;var&nbsp;i;<br>&nbsp;&nbsp;for(i=0;i&lt;charset.length;i++)<br>&nbsp;&nbsp;if(str.indexOf(charset.charAt(i))&gt;=0)<br>&nbsp;&nbsp;return&nbsp;true;<br>&nbsp;&nbsp;return&nbsp;false;<br>}</p>
<p>function&nbsp;CheckForm()<br>{<br>&nbsp;if&nbsp;(<font color=#ff0000>(contain(document.form.NAME.value,&nbsp;"%\(\)&gt;&lt;"))</font>&nbsp;||&nbsp;<font color=#ff0000>(contain(document.form.MESSAGE.value,&nbsp;"%\(\)&gt;&lt;"))</font>)<br>{<br>&nbsp;&nbsp;alert("输入了非法字符");<br>&nbsp;&nbsp;document.form.NAME.focus();<br>&nbsp;&nbsp;return&nbsp;false;<br>}<br>&nbsp;&nbsp;return&nbsp;true;<br>}<br>//--&gt;<br>&lt;/script&gt;<br><br>2.7 <font color=#ff0000>屏蔽右键、刷新、退格等功能</font><br>&lt;SCRIPT language=JavaScript&gt; <br>&lt;!-- </p>
<p>if (window.Event) <br>document.captureEvents(Event.MOUSEUP); </p>
<p>function nocontextmenu() <br>{ <br>event.cancelBubble = true <br>event.returnValue = false; </p>
<p>return false; <br>} </p>
<p>function norightclick(e) <br>{ <br>if (window.Event) <br>{ <br>if (e.which == 2 || e.which == 3) <br>return false; <br>} <br>else <br>if (event.button == 2 || event.button == 3) <br>{ <br>event.cancelBubble = true <br>event.returnValue = false; <br>return false; <br>} </p>
<p>} </p>
<p>document.oncontextmenu = nocontextmenu; // for IE5+ <br>document.onmousedown = norightclick; // for all others <br>//--&gt; <br>&lt;/SCRIPT&gt;</p>
<p>&lt;SCRIPT language=javascript id=clientEventHandlersJS&gt;<br>&lt;!--</p>
<p>function document_onkeydown() {<br>&nbsp;if(((event.ctrlKey)&amp;&amp;(event.keyCode==69))&nbsp;&nbsp;&nbsp;//Ctrl + E<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==70))&nbsp;&nbsp;//Ctrl + F<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==72))&nbsp;&nbsp;//Ctrl + H<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==73))&nbsp;&nbsp;//Ctrl + I<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==78))&nbsp;&nbsp;//Ctrl + N<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==79))&nbsp;&nbsp;//Ctrl + O<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==80))&nbsp;&nbsp;//Ctrl + P<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==67))&nbsp;&nbsp;//Ctrl + F<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==86))&nbsp;&nbsp;//Ctrl + F<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==65))&nbsp;&nbsp;//Ctrl + F<br>&nbsp;&nbsp;||((event.ctrlKey)&amp;&amp;(event.keyCode==83))){&nbsp;&nbsp;//Ctrl + S<br>&nbsp;&nbsp;&nbsp;event.keyCode=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;event.returnValue=false;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;if(event.keyCode==8){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//BackSpace<br>&nbsp;&nbsp;if(!((event.srcElement.type=="text")||(event.srcElement.type=="password")||(event.srcElement.type=="textarea"))){<br>&nbsp;&nbsp;&nbsp;event.keyCode=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;event.returnValue=false;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;if((event.keyCode==116)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//F5<br>&nbsp;&nbsp;||(event.keyCode==122)){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//F11<br>&nbsp;&nbsp;&nbsp;event.keyCode=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;event.returnValue=false;<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;if(event.altKey){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Alt + Left ; Alt + Right<br>&nbsp;&nbsp;if(((event.keyCode==37)||(event.keyCode==39))){<br>&nbsp;&nbsp;&nbsp;window.alert("不能进行此操作");<br>&nbsp;&nbsp;&nbsp;event.keyCode=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;event.returnValue=false;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}</p>
<p>}<br>//--&gt;<br>&lt;/SCRIPT&gt;</p>
<p>&lt;SCRIPT language=javascript event=onkeydown for=document&gt;<br>&lt;!--<br>&nbsp;document_onkeydown()<br>//--&gt;<br>&lt;/SCRIPT&gt;<br><br><font color=#ff0000>2.8 今天做系统时，用来判断radiobox选择的问题.(1.29)<br></font><br>&lt;script language="javascript"&gt;<br>function Detect()<br>{<br>&nbsp;total = examResultForm.sz.value ;<br>&nbsp;for(i=1;i&lt;=total;i++)<br>&nbsp;{<br>&nbsp;&nbsp;var c = false;<br>&nbsp;&nbsp;var o = eval("document.all.op"+i);<br>&nbsp;&nbsp;for(j=0;j&lt;o.length;j++)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(o[j].checked)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;c = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;if(!c)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;document.all.lblWarning.innerHTML="第"+i+"题没有做完";<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;document.all.lblWarning.innerHTML="全部题目已经做完";<br>&nbsp;return true;<br>}<br>&lt;/script&gt;</p>
<p><font color=#ff0000>2.9 全屏打开窗口、最大化窗口...<br>//全屏<br></font><font color=#000000>function fullScrn(url)<br>{<br>&nbsp;if(confirm("?"))<br>&nbsp;{<br>&nbsp;&nbsp;var win = window.open (url,"","fullscreen=yes,toolbar=no,scrollbars=yes");<br>&nbsp;&nbsp;win.focus();&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;return win;<br>}</font></p>
<p><font color=#ff0000>//最大化<br><font color=#000000>&lt;script language="JavaScript"&gt;<br>&lt;!--<br>self.moveTo(0,0)<br>self.resizeTo(screen.availWidth,screen.availHeight)<br>&lt;/script&gt;<br><br><font color=#ff0000>//鼠标移动</font><br>function mouseovertd (o){<br>&nbsp;o.style.backgroundColor='#f2f2f2';<br>&nbsp;o.style.cursor='hand';<br>}<br>function mouseouttd (o){<br>&nbsp;o.style.backgroundColor='#FFFFFF';<br>&nbsp;o.style.cursor='hand';<br>}</font><br></font></p>
</div>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=273019</p>
<img src ="http://www.blogjava.net/i369/aggbug/134639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-06 10:55 <a href="http://www.blogjava.net/i369/articles/134639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Js实现Map对象 </title><link>http://www.blogjava.net/i369/articles/134638.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 06 Aug 2007 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/134638.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/134638.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/134638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/134638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/134638.html</trackback:ping><description><![CDATA[<strong><font color=#ff0000>&lt;script&gt;&nbsp;<br>function Map() {<br>&nbsp;var struct = function(key, value) {<br>&nbsp;&nbsp;this.key = key;<br>&nbsp;&nbsp;this.value = value;<br>&nbsp;}<br>&nbsp;<br>&nbsp;var put = function(key, value){<br>&nbsp;&nbsp;for (var i = 0; i &lt; this.arr.length; i++) {<br>&nbsp;&nbsp;&nbsp;if ( this.arr[i].key === key ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;this.arr[i].value = value;<br>&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp; this.arr[this.arr.length] = new struct(key, value);<br>&nbsp;}<br>&nbsp;<br>&nbsp;var get = function(key) {<br>&nbsp;&nbsp;for (var i = 0; i &lt; this.arr.length; i++) {<br>&nbsp;&nbsp;&nbsp;if ( this.arr[i].key === key ) {<br>&nbsp;&nbsp;&nbsp;&nbsp; return this.arr[i].value;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return null;<br>&nbsp;}<br>&nbsp;<br>&nbsp;var remove = function(key) {<br>&nbsp;&nbsp;var v;<br>&nbsp;&nbsp;for (var i = 0; i &lt; this.arr.length; i++) {<br>&nbsp;&nbsp;&nbsp;v = this.arr.pop();<br>&nbsp;&nbsp;&nbsp;if ( v.key === key ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;this.arr.unshift(v);<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;<br>&nbsp;var size = function() {<br>&nbsp;&nbsp;return this.arr.length;<br>&nbsp;}<br>&nbsp;<br>&nbsp;var isEmpty = function() {<br>&nbsp;&nbsp;return this.arr.length &lt;= 0;<br>&nbsp;}</font></strong>
<p><strong><font color=#ff0000>&nbsp;this.arr = new Array();<br>&nbsp;this.get = get;<br>&nbsp;this.put = put;<br>&nbsp;this.remove = remove;<br>&nbsp;this.size = size;<br>&nbsp;this.isEmpty = isEmpty;<br>}<br>&lt;/script&gt;</font></strong></p>
<p><strong><font color=#ff0000>&lt;script&gt;<br>&nbsp;var map = new Map();<br>&nbsp;map.put("re","redhacker");<br>&nbsp;map.put("do","douguoqiang");<br>&nbsp;map.put("gq","dougq");<br>&nbsp;alert("map的大小为：" + map.size())<br>&nbsp;alert("key为re的map中存储的对象为：" + map.get("re"));<br>&nbsp;map.remove("re");<br>&nbsp;alert("移除key为re的对象后，获取key为re的map中存储的对象为：" + map.get("re"));<br>&nbsp;alert("map移除一个元素后的大小为：" + map.size());<br>&nbsp;alert("map是否是一个空map:" + map.isEmpty());<br>&lt;/script&gt;</font></strong></p>
&nbsp;<br>
<script src="http://www.itsrc.cn/ads/ads_text_728x90_csdn.js"></script>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1550098</p>
<img src ="http://www.blogjava.net/i369/aggbug/134638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-06 10:54 <a href="http://www.blogjava.net/i369/articles/134638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript 的 BASE64 算法</title><link>http://www.blogjava.net/i369/articles/131446.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 20 Jul 2007 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/131446.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/131446.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/131446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/131446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/131446.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>*&nbsp;我在网上看到过很多BASE64的JavaScript算法，都觉得不满意，于是自己写了一个，在这里分享一下。<br>*&nbsp;我的代码在质量的效率都较高，没有一些冗余的操作。总体来讲我觉得非常不错。<br>*&nbsp;如果大家有什么不懂的地方可以问我。<br></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;BASE64</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;此变量为编码的key，每个字符的下标相对应于它所代表的编码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;enKey:&nbsp;'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</span><span style="COLOR: #000000">+/</span><span style="COLOR: #000000">',<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;此变量为解码的key，是一个数组，BASE64的字符的ASCII值做下标，所对应的就是该字符所代表的编码值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;deKey:&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Array(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">62</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">63</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">52</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">53</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">54</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">55</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">56</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">57</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">58</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">59</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">61</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">17</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">18</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">19</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">21</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">22</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">23</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">24</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">27</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">28</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">29</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">31</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">33</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">34</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">35</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">36</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">37</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">38</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">39</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">41</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">42</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">43</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">44</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">45</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">46</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">47</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">49</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">51</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;编码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;encode:&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(src){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用一个数组来存放编码后的字符，效率比用字符串相加高很多。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;str</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Array();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;ch1,&nbsp;ch2,&nbsp;ch3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;pos</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">每三个字符进行编码。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(pos</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">src.length){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch2</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch3</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(ch1</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(((ch1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch2</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(((ch2</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch3</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(ch3</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">给剩下的字符进行编码。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pos</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">src.length){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch1</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(ch1</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pos</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">src.length){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch2</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">src.charCodeAt(pos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(((ch1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch2</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(ch2</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">),&nbsp;'</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.enKey.charAt(ch1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x3f</span><span style="COLOR: #000000">),&nbsp;'</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">组合各编码后的字符，连成一个字符串。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;str.join('');<br>&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;decode:&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(src){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用一个数组来存放解码后的字符。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;str</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Array();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;ch1,&nbsp;ch2,&nbsp;ch3,&nbsp;ch4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;pos</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">过滤非法字符，并去掉'='。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">src.replace(</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">^</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">Za</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">z0</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">g,&nbsp;'');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">decode&nbsp;the&nbsp;source&nbsp;string&nbsp;in&nbsp;partition&nbsp;of&nbsp;per&nbsp;four&nbsp;characters.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(pos</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">src.length){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch1</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.deKey[src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch2</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.deKey[src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch3</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.deKey[src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch4</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.deKey[src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(String.fromCharCode(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ch1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch2</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">),&nbsp;(ch2</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch3</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">),&nbsp;(ch3</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">ch4));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">给剩下的字符进行解码。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pos</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">src.length){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch1</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.deKey[src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch2</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.deKey[src.charCodeAt(pos</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pos</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">src.length){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch3</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.deKey[src.charCodeAt(pos)];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(String.fromCharCode((ch1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch2</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">),&nbsp;(ch2</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch3</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.push(String.fromCharCode((ch1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(ch2</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">组合各解码后的字符，连成一个字符串。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;str.join('');<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</span></div>
<p>使用方法：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;str</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'hello&nbsp;world</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">';<br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;enstr</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">BASE64.encode(str);<br>alert(enstr);<br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;destr</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">BASE64.decode(enstr);<br>alert(destr);</span></div>
<img src ="http://www.blogjava.net/i369/aggbug/131446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-07-20 13:00 <a href="http://www.blogjava.net/i369/articles/131446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用FileUpload组件实现文件上传 </title><link>http://www.blogjava.net/i369/articles/125608.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 21 Jun 2007 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/125608.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/125608.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/125608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/125608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/125608.html</trackback:ping><description><![CDATA[<p>文件上传在web应用中非常普遍，要在servlet/jsp环境中实现文件上传功能非常容易，因为网上已经有许多用java开发的组件用于文件上传，本文以commons-fileupload组件为例，为servlet/jsp应用添加文件上传功能。</p>
<p>common-fileupload组件是apache的一个开源项目之一，可以从<a href="http://jakarta.apache.org/commons/fileupload/">http://jakarta.apache.org/commons/fileupload/</a>下载。该组件简单易用，可实现一次上传一个或多个文件，并可限制文件大小。</p>
<p>下载后解压zip包，将commons-fileupload-1.0.jar复制到tomcat的webapps\你的webapp\WEB-INF\lib\下，如果目录不存在请自建目录。</p>
<p>新建一个servlet: Upload.java用于文件上传：</p>
<p><font face="Courier New">import java.io.*;<br>import java.util.*;<br>import javax.servlet.*;<br>import javax.servlet.http.*;<br>import org.apache.commons.fileupload.*;<br><br>public class Upload extends HttpServlet {</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; private String uploadPath = "C:\\upload\\"; // 用于存放上传文件的目录<br>&nbsp;&nbsp;&nbsp; private String tempPath = "C:\\upload\\tmp\\"; // 用于存放临时文件的目录</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; public void doPost(HttpServletRequest request, HttpServletResponse response)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ServletException<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; }<br>}</font></p>
<p>当servlet收到浏览器发出的Post请求后，在doPost()方法中实现文件上传。以下是示例代码：</p>
<p><font face="Courier New">public void doPost(HttpServletRequest request, HttpServletResponse response)<br>&nbsp;&nbsp;&nbsp; throws IOException, ServletException<br>{<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskFileUpload fu = new DiskFileUpload();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置最大文件尺寸，这里是4MB<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setSizeMax(4194304);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置缓冲区大小，这里是4kb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setSizeThreshold(4096);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置临时目录：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setRepositoryPath(tempPath);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到所有的文件：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List fileItems = fu.parseRequest(request);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator i = fileItems.iterator();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 依次处理每一个文件：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(i.hasNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem fi = (FileItem)i.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获得文件名，这个文件名包括路径：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = fi.getName();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fileName!=null) {</font><font face="Courier New"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 在这里可以记录用户和文件信息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; // ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 写入文件a.txt，你也可以从fileName中提取文件名：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi.write(new File(uploadPath + "a.txt"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;跳转到上传成功提示页面<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch(Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可以跳转出错页面<br>&nbsp;&nbsp;&nbsp; }<br>}</font></p>
<p>如果要在配置文件中读取指定的上传文件夹，可以在init()方法中执行：</p>
<p><font face="Courier New">public void init() throws ServletException {<br>&nbsp;&nbsp;&nbsp; uploadPath = ....<br>&nbsp;&nbsp;&nbsp; tempPath = ....<br>&nbsp;&nbsp;&nbsp; // 文件夹不存在就自动创建：<br>&nbsp;&nbsp;&nbsp; if(!new File(uploadPath).isDirectory())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new File(uploadPath).mkdirs();<br>&nbsp;&nbsp;&nbsp; if(!new File(tempPath).isDirectory())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new File(tempPath).mkdirs();<br>}</font></p>
<p>编译该servlet，注意要指定classpath，确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar。</p>
<p>配置servlet，用记事本打开tomcat\webapps\你的webapp\WEB-INF\web.xml，没有的话新建一个。典型配置如下：</p>
<p><font face="Courier New"><?xml version="1.0" encoding="ISO-8859-1"?>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br>&lt;!DOCTYPE web-app<br>&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br>&nbsp;&nbsp;&nbsp; "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;</font></p>
<p><font face="Courier New">&lt;web-app&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Upload&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;Upload&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Upload&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/fileupload&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br>&lt;/web-app&gt;</font><font face="Courier New"></servlet-mapping><br></p>
</web-app></font>
<p>配置好servlet后，启动tomcat，写一个简单的html测试：</p>
<p><font face="Courier New">
<form name=form1 action="" color="#0000ff">
    &lt;form action="fileupload" method="post"<br>enctype="multipart/form-data" name="form1"&gt;<br>&nbsp; &lt;input type="file" name="file"&gt;<br>&nbsp; &lt;input type="submit" name="Submit" value="upload"&gt;<br>&lt;/form&gt;</font></font></p>
    <p>注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。</p>
    <br><br>
    <p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=15991</p>
</form>
<img src ="http://www.blogjava.net/i369/aggbug/125608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-06-21 16:44 <a href="http://www.blogjava.net/i369/articles/125608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript弹出窗口总结 </title><link>http://www.blogjava.net/i369/articles/120198.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sat, 26 May 2007 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/120198.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/120198.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/120198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/120198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/120198.html</trackback:ping><description><![CDATA[注:<br>//关闭,父窗口弹出对话框,子窗口直接关闭<br>this.Response.Write("&lt;script&nbsp;language=javascript&gt;window.close();&lt;/script&gt;");<br><br>//关闭,父窗口和子窗口都不弹出对话框,直接关闭<br>this.Response.Write("&lt;script&gt;");<br>this.Response.Write("{top.opener&nbsp;=null;top.close();}");<br>this.Response.Write("&lt;/script&gt;");<br><br>//弹出窗口刷新当前页面width=200&nbsp;height=200菜单。菜单栏,工具条,地址栏,状态栏全没有<br>this.Response.Write("&lt;script&nbsp;language=javascript&gt;window.open('rows.aspx','newwindow','width=200,height=200')&lt;/script&gt;");<br><br>//弹出窗口刷新当前页面<br>this.Response.Write("&lt;script&nbsp;language=javascript&gt;window.open('rows.aspx')&lt;/script&gt;");<br>this.Response.Write("&lt;script&gt;window.open('WebForm2.aspx','_blank');&lt;/script&gt;");<br><br>//弹出提示窗口跳到webform2.aspx页(在一个IE窗口中)<br>this.Response.Write("&nbsp;&lt;script&nbsp;language=javascript&gt;alert('注册成功');window.window.location.href='WebForm2.aspx';&lt;/script&gt;&nbsp;");<br><br>//关闭当前子窗口,刷新父窗口<br>this.Response.Write("&lt;script&gt;window.opener.location.href=window.opener.location.href;window.close();&lt;/script&gt;");<br>this.Response.Write("&lt;script&gt;window.opener.location.replace(window.opener.document.referrer);window.close();&lt;/script&gt;");<br><br>//子窗口刷新父窗口<br>this.Response.Write("&lt;script&gt;window.opener.location.href=window.opener.location.href;&lt;/script&gt;");<br>this.Response.Write("&lt;script&gt;window.opener.location.href='WebForm1.aspx';&lt;/script&gt;");<br><br>//弹出提示窗口.确定后弹出子窗口(WebForm2.aspx)<br>this.Response.Write("&lt;script&nbsp;language='javascript'&gt;alert('发表成功！');window.open('WebForm2.aspx')&lt;/script&gt;");<br><br>//弹出提示窗口,确定后,刷新父窗口<br>this.Response.Write("&lt;script&gt;alert('发表成功！');window.opener.location.href=window.opener.location.href;&lt;/script&gt;");<br><br>//弹出相同的一页<br>&lt;INPUT&nbsp;type="button"&nbsp;value="Button"&nbsp;onclick="javascript:window.open(window.location.href)"&gt;<br><br>//<br>Response.Write("parent.mainFrameBottom.location.href='yourwebform.aspx?temp="&nbsp;+str+"';");<br><br><br>&lt;SCRIPT&nbsp;LANGUAGE="javascript"&gt;&nbsp;<br>&lt;!--&nbsp;<br>window.open&nbsp;('page.html',&nbsp;'newwindow',&nbsp;'height=100,&nbsp;width=400,&nbsp;top=0,&nbsp;left=0,&nbsp;toolbar=no,&nbsp;menubar=no,&nbsp;scrollbars=no,&nbsp;resizable=no,location=n&nbsp;o,&nbsp;status=no')&nbsp;//这句要写成一行<br>--&gt;&nbsp;<br>&lt;/SCRIPT&gt;&nbsp;&nbsp;<br>　　<br>　　参数解释：&nbsp;<br>　　<br>　　&lt;SCRIPT&nbsp;LANGUAGE="javascript"&gt;&nbsp;js脚本开始；&nbsp;<br>　　window.open&nbsp;弹出新窗口的命令；&nbsp;<br>　　'page.html'&nbsp;弹出窗口的文件名；&nbsp;<br>　　'newwindow'&nbsp;弹出窗口的名字（不是文件名），非必须，可用空''代替；&nbsp;<br>　　height=100&nbsp;窗口高度；&nbsp;<br>　　width=400&nbsp;窗口宽度；&nbsp;<br>　　top=0&nbsp;窗口距离屏幕上方的象素值；&nbsp;<br>　　left=0&nbsp;窗口距离屏幕左侧的象素值；&nbsp;<br>　　toolbar=no&nbsp;是否显示工具栏，yes为显示；&nbsp;<br>　　menubar，scrollbars&nbsp;表示菜单栏和滚动栏。&nbsp;<br>　　resizable=no&nbsp;是否允许改变窗口大小，yes为允许；&nbsp;<br>　　location=no&nbsp;是否显示地址栏，yes为允许；&nbsp;<br>　　status=no&nbsp;是否显示状态栏内的信息（通常是文件已经打开），yes为允许；&nbsp;<br>　　&lt;/SCRIPT&gt;&nbsp;js脚本结束<br><br>'newwin':隐藏菜单栏地址栏工具条<br>width=50:宽度<br>height=50:高度<br>scrollbars=yes/n滚动条<br>top=50:窗口距离屏幕上方<br>left=50:窗口距离屏幕左侧<br>例:window.open('detail.aspx?ID="+e.Item.Cells[1].Text+"','newwin','width=750,height=600,scrollbars=yes,top=50,left=50');");&nbsp;<br>this.Response.Write("&lt;Script&gt;window.open('WebForm2.aspx','','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=750,height=470,left=80,top=40');&lt;/script&gt;");<br><br>例:<br>this.Response.Write("&lt;script&gt;alert('发表成功！');window.opener.location.href=window.opener.location.href;&lt;/script&gt;");<br>this.Response.Write("&lt;script&gt;");<br>this.Response.Write("{top.opener&nbsp;=null;top.close();}");<br>this.Response.Write("&lt;/script&gt;");<br><br>例:&nbsp;linkcolumn1.DataNavigateUrlFormatString="javascript:varwin=window.open('edit_usr.aspx?actid={0}','newwin','width=750,height=600,scrollbars=yes,top=50,left=50');window.close()";&nbsp; <br>
<img src ="http://www.blogjava.net/i369/aggbug/120198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-05-26 18:10 <a href="http://www.blogjava.net/i369/articles/120198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>