﻿<?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-JAVA梦想-文章分类-extremeComponents</title><link>http://www.blogjava.net/lucky/category/7495.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 23:48:06 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 23:48:06 GMT</pubDate><ttl>60</ttl><item><title>MediaWiki</title><link>http://www.blogjava.net/lucky/articles/33839.html</link><dc:creator>Lucky</dc:creator><author>Lucky</author><pubDate>Mon, 06 Mar 2006 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/lucky/articles/33839.html</guid><wfw:comment>http://www.blogjava.net/lucky/comments/33839.html</wfw:comment><comments>http://www.blogjava.net/lucky/articles/33839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lucky/comments/commentRss/33839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lucky/services/trackbacks/33839.html</trackback:ping><description><![CDATA[
    <div id="globalWrapper">
      <div id="column-content">
	<div id="content">
	  <a name="top" id="top"></a>
	  	  <h1 class="firstHeading">如何编辑页面</h1>
	  <div id="bodyContent">
	    <h3 id="siteSub">Wikipedia，自由的百科全书</h3>
	    
	    	    	    <!-- start content -->
	    <p><br>
</p><p>编辑一个<a href="http://wiki.mambochina.net/index.php/Wiki" title="Wiki">Wiki</a>页面十分容易。只要点击页面上方的“编辑本页”或右侧的[编辑]链接即可修改该页，或点击“讨论本页”然后再点击“编辑页面”来讨论该页面。点击后您就会看到一个包含那个Wiki页面的可编辑的文字区域。
</p><p>输入文字，再在文字区域下的栏中输入编辑摘要，完成后点击“保存本页”就可以了！您也可以在保存前先预览您的修改。 
</p><p>先将文字复制到您最喜欢的文字编辑器，编辑并检查后再贴回浏览器预览往往更方便。这样做方便你断线后用您的备份档做修改。
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=1" title="如何编辑页面">编辑</a>]</div><a name="wiki.E6.A0.87.E8.AE.B0"></a><h2>wiki标记</h2>
<p>下面表格的左边显示浏览效果。也就是说，要使文字实现像左边列一样的效果，输入右边列的文字就行了。
</p><p>您或许想在另一个窗口打开本页以做参考。如果您希望实验一下，您可以在<a href="http://en.wikipedia.org/wiki/%E6%B2%99%E7%9B%92" class="extiw" title="wikipedia:沙盒">沙盒</a>中实验。
</p><p>参见: <a href="http://wiki.mambochina.net/index.php/Wiki%E6%A0%BC%E5%BC%8F%E6%8C%87%E5%8D%97" title="Wiki格式指南">Wiki格式指南</a>、<a href="http://wiki.mambochina.net/index.php?title=Wiki%E4%BD%BF%E7%94%A8%E8%A1%A8%E6%A0%BC&amp;action=edit" class="new" title="Wiki使用表格">Wiki使用表格</a>
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=2" title="如何编辑页面">编辑</a>]</div><a name=".E7.AB.A0.E8.8A.82.E3.80.81.E6.AE.B5.E8.90.BD.EF.BC.8C.E5.88.97.E8.A1.A8.E5.8F.8A.E7.BA.BF.E6.9D.A1"></a><h3>章节、段落，列表及线条</h3>
<table border="1" cellpadding="2" cellspacing="0">

<tbody><tr>
<th> 您所看到的
</th><th> 您所输入的
</th></tr>
<tr>
<td>
<p>用下列格式表示<a href="http://wiki.mambochina.net/index.php?title=Help:%E7%BC%96%E8%BE%91%E7%AB%A0%E8%8A%82&amp;action=edit" class="new" title="Help:编辑章节">章节</a>：
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=3" title="如何编辑页面">编辑</a>]</div><a name=".E4.B8.80.E7.BA.A7.E6.A0.87.E9.A2.98"></a><h2>一级标题</h2>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=4" title="如何编辑页面">编辑</a>]</div><a name=".E4.BA.8C.E7.BA.A7.E6.A0.87.E9.A2.98"></a><h3>二级标题</h3>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=5" title="如何编辑页面">编辑</a>]</div><a name=".E4.B8.89.E7.BA.A7.E6.A0.87.E9.A2.98"></a><h4>三级标题</h4>
<ul><li>请使用（==）表示一级标题，而不要使用这个（=）
</li><li>不要跳过下一级标题（例如一级标题下直接使用三级标题，而没有使用二级标题）
</li></ul>
</td><td valign="top"> <pre>==一级标题==<br>asdfasdf<br>===二级标题===<br>asdfasdfasdfasdf<br>====三级标题====<br></pre>
</td></tr>
<tr>
<td>
<p>另起一行
会变成一个空格。
</p><p>但一个空行开始一个新段落。
</p>
<ul><li>在使用列表时，换行会影响版面效果。
</li></ul>
</td><td valign="top"> <pre>另起一行<br>会变成一个空格。<br><br>但一个空行开始一个新段落。</pre>
</td></tr>
<tr valign="top">
<td> 您可以在不开始新一段的情况下<br>
<p>另起一行。
</p>
<ul><li>请尽量不要使用这种方式。
</li></ul>
</td><td valign="top"> <pre>您可以在不开始新一段的情况下&lt;br&gt;<br>另起一行。</pre>
</td></tr>
<tr>
<td>
<ul><li>符号列表很不错：
<ul><li>每一行用一个星号（*）开始
<ul><li>星号越多，表示列表的层级更深入
<ul><li>新起一行表示列表结束
</li></ul>
</li></ul>
</li></ul>
</li><li>注意符号必须是新一行的第一个字符。
</li></ul>
</td><td valign="top"> <pre>*符号列表很不错：<br>**每一行用一个星号（*）开始<br>***星号越多，表示列表的层级更深入<br>****新起一行表示列表结束<br></pre>
</td></tr>
<tr>
<td>
<ol><li>数字列表也不错
<ol><li>很整齐
</li><li>容易理解
</li></ol>
</li></ol>
</td><td> <pre>#数字列表也不错<br>##很整齐<br>##容易理解</pre>
</td></tr>
<tr>
<td>
<ul><li>您甚至可以使用混合列表
<ol><li>还有层次哦
<ul><li>像这样
</li></ul>
</li></ol>
</li></ul>
</td><td> <pre>*您甚至可以使用混合列表<br>*#还有层次哦<br>*#*像这样</pre>
</td></tr>
<tr>
<td>
<dl><dt>定义列表&nbsp;</dt><dd> 包含许多定义的列表
</dd><dt>条目&nbsp;</dt><dd> 条目的定义
</dd><dt>另外一条
</dt><dd>其它的定义
</dd></dl>
</td><td> <pre>;定义列表 : 包含许多定义的列表<br>;条目 : 条目的定义<br>;另外一条<br>:其它的定义<br></pre>
</td></tr>
<tr>
<td>
<dl><dd>每一行都可以
<dl><dd>缩进
<dl><dd>好几层呢
</dd></dl>
</dd></dl>
</dd></dl>
</td><td> <pre>:每一行都可以<br>::缩进<br>:::好几层呢</pre>
</td></tr>
<tr valign="top">
<td>
<pre>如果一行的开始是空格那么<br>它将会以其原始形式<br>出现；<br>在一个这样的字体中；<br>文字不会自动换行；<br>如果结束<br></pre>
<p>这在以下情况下会十分有用：
</p>
<ul><li>粘贴格式化文字；
</li><li>数学公式；
</li><li>文字艺术；
</li></ul>
<p>注意: 这可能会拉长页面，影响阅读。
</p>
</td><td> <pre> 如果一行的开始是空格那么<br> 它将会以其原始形式<br> 出现;<br> 在一个这样的字体中；<br> 文字不会自动换行<br> 如果结束<br>这在一下情况下会十分有用:<br>*粘贴格式化文字;<br>*数学公式;<br>*文字艺术;</pre>
</td></tr>
<tr valign="top">
<td> <div class="center">居中文字。</div>
</td><td> <pre>&lt;center&gt;居中文字。&lt;/center&gt;</pre>
</td></tr>
<tr>
<td> 一条水平线将页面分隔成了上面
<hr>
<p>和下面。
</p>
</td><td> <pre>一条水平线将页面分隔成了上面<br>----<br>和下面。</pre>
</td></tr>
<tr>
<td> 当您在对话页添加评语时，您应当签名。您可以输入三条～添加用户名：
<p><a href="http://wiki.mambochina.net/index.php?title=User:Foolevery&amp;action=edit" class="new" title="User:Foolevery">Foolevery</a>
</p><p>或四条～添加用户名及日期时间：
<a href="http://wiki.mambochina.net/index.php?title=User:Foolevery&amp;action=edit" class="new" title="User:Foolevery">Foolevery</a> 08:24 2004年7月31日 (UTC)
</p><p>当输入五条～时只显示时间：
08:26 2004年10月25日 (UTC)
</p><p>你可以参看<a href="http://wiki.mambochina.net/index.php?title=Help:%E7%AD%BE%E5%90%8D&amp;action=edit" class="new" title="Help:签名">help:签名</a>获得更多的关于签名的信息。
</p>
</td><td> <pre>当您在对话页添加评语时，您应当签名。<br>您可以输入三条～添加用户名： <br>~~~<br><br>或四条添加用户名及日期时间：<br>~~~~<br><br>当输入五条时只显示时间：<br>~~~~~<br></pre>
</td></tr></tbody></table>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=6" title="如何编辑页面">编辑</a>]</div><a name=".E9.93.BE.E6.8E.A5.EF.BC.8CURL.E5.92.8C.E5.9B.BE.E5.83.8F"></a><h3>链接，URL和图像</h3>
<table border="1" cellpadding="2" cellspacing="0">

<tbody><tr>
<th> 您所看到的
</th><th> 您所输入的
</th></tr>
<tr valign="top">
<td> 连接到<a href="http://en.wikipedia.org/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94" class="extiw" title="Wikipedia:常见问题解答">Wikipedia:常见问题解答</a>.
<ul><li>英文名中第一个字母自动大写
</li><li>空格用下划线代替。
</li><li>如果要创建新页面： 
<ol><li>用这个方法创建一个连接。
</li><li>再保存您的页面。
</li><li>点击您所创建的连接。编辑新页面窗口就会打开。
</li></ol>
</li><li>请参见<a href="http://en.wikipedia.org/wiki/%E5%91%BD%E5%90%8D%E5%B8%B8%E8%A7%84" class="extiw" title="Wikipedia:命名常规">Wikipedia:命名常规</a>。
</li></ul>
</td><td> <pre>连接到[[Wikipedia:常见问题解答]].</pre>
</td></tr>
<tr valign="top">
<td> 同样连接目标，不同的名字：<a href="http://en.wikipedia.org/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94" class="extiw" title="Wikipedia:常见问题解答">解答</a>。
</td><td> <pre>同样连接目标，不同的名字：[[Wikipedia:常见问题解答|解答]]。<br></pre>
</td></tr>
<tr valign="top">
<td> 链接到一个页面的某一章节：<a href="http://en.wikipedia.org/wiki/%E5%B8%AE%E5%8A%A9#.E8.81.94.E7.B3.BB.E4.B8.8E.E8.AE.A8.E8.AE.BA" class="extiw" title="Wikipedia:帮助">Wikipedia:帮助#联系与讨论</a>。
</td><td> <pre>链接到一个页面的某一章节：[[Wikipedia:帮助#联系与讨论]]。<br></pre>
</td></tr>
<tr valign="top">
<td> 自动隐藏圆括号：<a href="http://wiki.mambochina.net/index.php?title=%E7%BF%BB%E8%AF%91_%28%E6%B6%88%E6%AD%A7%E4%B9%89%29&amp;action=edit" class="new" title="翻译 (消歧义)">翻译</a>。
<p>自动隐藏名字空间<a href="http://en.wikipedia.org/wiki/%E5%B8%AE%E5%8A%A9" class="extiw" title="Wikipedia:帮助">帮助</a>
</p>
</td><td> <pre>自动隐藏圆括号：[[翻译 (消歧义)|]]。<br><br>自动隐藏名字空间[[Wikipedia:帮助|]]<br></pre>
</td></tr>
<tr valign="top">
<td> <a href="http://wiki.mambochina.net/index.php/%E4%BC%A6%E6%95%A6%E7%9A%84%E5%A4%A9%E6%B0%94" title="伦敦的天气">伦敦的天气</a>是一个还不存在的页面。
<ul><li>您可以点击它来创建。
</li><li>完成后搜索该题目来确定所有人都正确连接到它。
</li></ul>
</td><td> <pre>[[伦敦的天气]]是一个还不存在的页面。 </pre>
</td></tr>
<tr valign="top">
<td>
<ul><li>将类似这段文字放在一条条目的第一行就会复位向该条目到另一条条目。注意该段文字之后不应有其它任何文字，否则<a href="http://en.wikipedia.org/wiki/%E5%A4%8D%E4%BD%8D%E5%90%91" class="extiw" title="Wikipedia:复位向">复位向</a>不会成功。
</li></ul>
</td><td> <pre>#REDIRECT [[中华人民共和国]]</pre>
</td></tr>
<tr valign="top">
<td> 外部连接：<a href="http://www.nupedia.com/" class="external text" title="http://www.nupedia.com" rel="nofollow">Nupedia</a>
</td><td> <pre>外部连接：<br>[http://www.nupedia.com Nupedia]</pre>
</td></tr>
<tr valign="top">
<td> 或者直接提供URL：<a href="http://www.nupedia.com/" class="external free" title="http://www.nupedia.com" rel="nofollow">http://www.nupedia.com</a>. </td><td> <pre>或直接提供URL：<br>http://www.nupedia.com.</pre>
</td></tr>
<tr valign="top">
<td>
<p>也可以这样（比较麻烦）：<a href="http://www.nupedia.com/" class="external free" title="http://www.nupedia.com" rel="nofollow">http://www.nupedia.com</a>.
</p>
<p>
一个直接使用外部连接的小问题是在"http://" 之后的整段文字都是连接的一部分直到一个空格为止。 &lt;p&gt;

输入[http://www.nupedia.com]会出现一个意料不到的结果： <a href="http://www.nupedia.com/" class="external autonumber" title="http://www.nupedia.com" rel="nofollow">[1]</a>.&lt;p&gt;

解决之道是重复URL两次，产生下面的结果：<br><a href="http://www.nupedia.com/" class="external free" title="http://www.nupedia.com" rel="nofollow">http://www.nupedia.com</a>.
</p></td><td> <pre>解决之道是重复URL两次：<br>[http://www.nupedia.com http://www.nupedia.com].</pre>
</td></tr>
<tr valign="top">
<td> 一幅图片：<a href="http://wiki.mambochina.net/index.php/Image:Wiki.png" title="Image:Wiki.png">Image:Wiki.png</a><br>
<p><br>
只有上载到维基百科的图像才可以使用。请到<a href="http://wiki.mambochina.net/index.php/Special:Upload" title="Special:Upload">上载页上载图像</a>。您可以在<a href="http://wiki.mambochina.net/index.php/Special:Imagelist" title="Special:Imagelist">图像列表</a>上查看已经上载的图像。详细的使用方法请参看<a href="http://en.wikipedia.org/wiki/%E5%9B%BE%E5%83%8F%E6%A0%87%E8%AE%B0" class="extiw" title="Wikipedia:图像标记">Wikipedia:图像标记</a>。
</p>
</td><td> <pre>一幅图片：[[Image:Wiki.png]]<br><br><br></pre>
</td></tr>
<tr valign="top">
<td> 最新格式的一幅图片：<a href="http://wiki.mambochina.net/index.php/Image:Wiki.png" title="Image:Wiki.png">Image:Wiki.png</a>
</td><td> <pre>一幅图片：[[Image:Wiki.png|thumb|Wiki]]<br><br><br></pre>
</td></tr>
<tr>
<td>
<ul><li>点击一幅上载的图像后会出现一个描述页。您可以通过使用下面的方法直接连接到该描述页：
</li></ul>
<p><a href="http://wiki.mambochina.net/index.php/Image:Wiki.png" title="Image:Wiki.png">Image:Wiki.png</a>
</p>
</td><td> <pre><br>[[:Image:Wiki.png]]<br></pre>
</td></tr>
<tr>
<td>
<ul><li>要包括非图像上载文件，例如音像等，或要图像以连接的方式而不是图像本身显示，使用"media"连接。
</li></ul>
<p><br><a href="http://wiki.mambochina.net/index.php?title=Special:Upload&amp;wpDestFile=Sg_mrob.ogg" class="new" title="Sg mrob.ogg">声音</a>
<br>
<br><a href="http://wiki.mambochina.net/index.php?title=Special:Upload&amp;wpDestFile=Wiki.png" class="new" title="Wiki.png">图像连接</a>
</p>
</td><td>
<pre><br>[[media:Sg_mrob.ogg|声音]]<br><br>[[media:China_flag_medium.png|图像连接]]<br><br></pre>
</td></tr>
<tr>
<td>
<p>要链接一本书，你可以使用<a href="http://en.wikipedia.org/wiki/ISBN" class="extiw" title="Wikipedia:ISBN">ISBN</a>链接，例如：<a href="http://wiki.mambochina.net/index.php?title=Special:Booksources&amp;isbn=0123456789X" class="internal">ISBN 0123456789X</a> 
</p>
</td><td>
<pre><br>ISBN 0123456789X <br></pre>
</td></tr></tbody></table>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=7" title="如何编辑页面">编辑</a>]</div><a name=".E5.AD.97.E7.AC.A6.E6.A0.BC.E5.BC.8F"></a><h3>字符格式</h3>
<p>参看：<a href="http://en.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F" class="extiw" title="Wikipedia:数学公式">Wikipedia:数学公式</a>
</p>
<table border="1" cellpadding="2" cellspacing="0">

<tbody><tr>
<th> 您所看到的
</th><th> 您所输入的
</th></tr>
<tr valign="top">
<td>
<p><i>强调</i>, <b>强烈</b>, <i><b>很强烈</b></i>.
</p>
<ul><li>这些是两个及三个单引号，不是双引号。
</li></ul>
</td><td>
<pre>''强调'', '''强烈''', <br>'''''很强烈'''''.</pre>
</td></tr>
<tr valign="top">
<td>
<p>您也可以使用<i>斜体</i>和<b>粗体</b>，
如果您希望的效果是某种字体风格而不是强调，例如在下面的数学公式中：
</p>
<dl><dd><b>F</b> = <i>m</i><b>a</b>
</dd></dl>
<ul><li>然而，这两种方法的差别很小，大多数人选择忽略它。
</li></ul>
</td><td>
<pre>您也可以使用&lt;i&gt;斜体&lt;/i&gt;和&lt;b&gt;粗体&lt;/b&gt;，<br>如果您希望的效果是某种字体风格而不是强调，例如在下面的数学公式中：<br><br>:&lt;b&gt;F&lt;/b&gt; = &lt;i&gt;m&lt;/i&gt;&lt;b&gt;a&lt;/b&gt;</pre>
</td></tr>
<tr valign="top">
<td> 您可以<strike>删除字体</strike><br>
<p>或<u>字体下划</u>。
</p>
<ul><li>对编辑很有帮助。
</li></ul>
</td><td> <pre>您可以&lt;strike&gt;删除字体&lt;/strike&gt;&lt;br&gt;<br>或&lt;u&gt;字体下划&lt;/u&gt;。</pre>
</td></tr>
<tr valign="top">
<td>
<p><b>变音及重音符号：</b> (参见<a href="http://en.wikipedia.org/wiki/%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6" class="extiw" title="wikipedia:特殊字符">wikipedia:特殊字符</a>)<br>
À Á Â Ã Ä Å <br>
Æ Ç È É Ê Ë <br>
Ì Í
Î Ï Ñ Ò <br>
Ó Ô Õ
Ö Ø Ù <br>
Ú Û Ü ß
à á <br>
â ã ä å æ
</p><p>ç <br>
è é ê ë ì í<br>
î ï ñ ò ó ô <br>
õ
ö ø ù ú û <br>
ü ÿ
</p>
</td><td> <pre><br>&amp;Agrave; &amp;Aacute; &amp;Acirc; &amp;Atilde; &amp;Auml; &amp;Aring; <br>&amp;AElig; &amp;Ccedil; &amp;Egrave; &amp;Eacute; &amp;Ecirc; &amp;Euml; <br>&amp;Igrave; &amp;Iacute; &amp;Icirc; &amp;Iuml; &amp;Ntilde; &amp;Ograve; <br>&amp;Oacute; &amp;Ocirc; &amp;Otilde; &amp;Ouml; &amp;Oslash; &amp;Ugrave; <br>&amp;Uacute; &amp;Ucirc; &amp;Uuml; &amp;szlig; &amp;agrave; &amp;aacute; <br>&amp;acirc; &amp;atilde; &amp;auml; &amp;aring; &amp;aelig; &amp;ccedil; <br>&amp;egrave; &amp;eacute; &amp;ecirc; &amp;euml; &amp;igrave; &amp;iacute;<br>&amp;icirc; &amp;iuml; &amp;ntilde; &amp;ograve; &amp;oacute; &amp;ocirc; <br>&amp;oelig; &amp;otilde; &amp;ouml; &amp;oslash; &amp;ugrave; &amp;uacute; <br>&amp;ucirc; &amp;uuml; &amp;yuml;</pre>
</td></tr>
<tr valign="top">
<td>
<p><b>标点符号：</b><br>
¿ ¡ « » § ¶<br>
† ‡ • —
</p>
</td><td> <pre>&amp;iquest; &amp;iexcl; &amp;laquo; &amp;raquo; &amp;sect; &amp;para;<br>&amp;dagger; &amp;Dagger; &amp;bull; &amp;mdash;</pre>
</td></tr>
<tr valign="top">
<td>
<p><b>商业符号：</b><br>
™ © ® ¢ € ¥ <br>
£ ¤
</p>
</td><td> <pre>&amp;trade; &amp;copy; &amp;reg; &amp;cent; &amp;euro; &amp;yen; <br>&amp;pound; &amp;curren;<br></pre>
</td></tr>
<tr valign="top">
<td> 下标：x<sub>2</sub><br>
<p>上标：x<sup>2</sup> 或者 x²
</p>
<ul><li>上标的后一种方法可能在多数情况下无法使用，但情况许可下请使用因为这使文章看起来较顺眼。
</li></ul>
<p>ε<sub>0</sub> =
8.85 × 10<sup>−12</sup>
C² / J m.
</p>
</td><td> <pre>下标: x&lt;sub&gt;2&lt;/sub&gt;<br>上标: x&lt;sup&gt;2&lt;/sup&gt; 或者 x&amp;sup2;<br><br>&amp;epsilon;&lt;sub&gt;0&lt;/sub&gt; =<br>8.85 × 10&lt;sup&gt;−12&lt;/sup&gt;<br>C² / J m.</pre>
</td></tr>
<tr valign="top">
<td> <b>希腊字母：</b> <br>
<p>α β γ δ ε ζ <br>
η θ ι κ λ μ ν <br>
ξ ο π ρ  σ ς <br>
τ υ φ χ ψ ω<br>
Γ Δ Θ Λ Ξ Π <br>
Σ Φ Ψ Ω
</p>
</td><td> <pre>&amp;alpha; &amp;beta; &amp;gamma; &amp;delta; &amp;epsilon; &amp;zeta; <br>&amp;eta; &amp;theta; &amp;iota; &amp;kappa; &amp;lambda; &amp;mu; &amp;nu; <br>&amp;xi; &amp;omicron; &amp;pi; &amp;rho;  &amp;sigma; &amp;sigmaf;<br>&amp;tau; &amp;upsilon; &amp;phi; &amp;chi; &amp;psi; &amp;omega;<br>&amp;Gamma; &amp;Delta; &amp;Theta; &amp;Lambda; &amp;Xi; &amp;Pi; <br>&amp;Sigma; &amp;Phi; &amp;Psi; &amp;Omega;<br></pre>
</td></tr>
<tr valign="top">
<td>
<p><b>数学符号：</b> (参见<a href="http://en.wikipedia.org/wiki/%E7%89%B9%E6%AE%8A%E7%AC%A6%E5%8F%B7" class="extiw" title="Wikipedia:特殊符号">Wikipedia:特殊符号</a>) <br>
∫ ∑ ∏ √ − ± ∞<br>
≈ ∝ ≡ ≠ ≤ ≥ →<br>
× · ÷ ∂ ′ ″<br>
∇ ‰ ° ∴ ℵ ø<br>
∈ ∉ ∩ ∪ ⊂ ⊃ ⊆ ⊇<br>
¬ ∧ ∨ ∃ ∀ ⇒ ⇔
</p>
</td><td valign="middle"> <pre>&amp;int; &amp;sum; &amp;prod; &amp;radic; &amp;minus; &amp;plusmn; &amp;infin;<br>&amp;asymp; &amp;prop; &amp;equiv; &amp;ne; &amp;le; &amp;ge; &amp;rarr;<br>&amp;times; &amp;middot; &amp;divide; &amp;part; &amp;prime; &amp;Prime;<br>&amp;nabla; &amp;permil; &amp;deg; &amp;there4; &amp;alefsym; &amp;oslash;<br>&amp;isin; &amp;notin; &amp;cap; &amp;cup; &amp;sub; &amp;sup; &amp;sube; &amp;supe;<br>&amp;not; &amp;and; &amp;or; &amp;exist; &amp;forall; &amp;rArr; &amp;hArr;<br>&amp;rarr; &amp;harr;</pre>
</td></tr>
<tr valign="top">
<td> <i>x</i><sup>2</sup>&nbsp;&nbsp;&nbsp;≥&nbsp;&nbsp;&nbsp;0 true.
<ul><li>要分开文字，使用非分隔空格 - <tt>&amp;nbsp;</tt>.
</li><li><tt>&amp;nbsp;</tt>也防止在文字中间换行。这在方程式中十分有用。
</li></ul>
</td><td> <pre>&lt;i&gt;x&lt;/i&gt;&lt;sup&gt;2&lt;/sup&gt;&amp;nbsp;&amp;nbsp;&amp;ge;&amp;nbsp;&amp;nbsp;0 true.<br></pre>
</td></tr>
<tr>
<td>
<p><b>Ascii文字艺术（每行开始处留空）：</b>
</p>
<pre>∞ -x²<br>∫ e   dx = √π<br>-∞ </pre>
</td><td> <pre> <br>&amp;infin; -x&amp;sup2;<br>&amp;int; e   dx = &amp;radic;&amp;pi;<br>-&amp;infin; </pre>
</td></tr></tbody></table>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=8" title="如何编辑页面">编辑</a>]</div><a name=".E8.A1.A8.E6.A0.BC"></a><h3>表格</h3>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=9" title="如何编辑页面">编辑</a>]</div><a name=".E7.9B.AE.E5.BD.95.E5.8A.9F.E8.83.BD"></a><h4>目录功能</h4>
<p>在当前版本的维基百科中使用了“目录”功能，该功能是自动启用的。当文中包含多个段落时，会在文章的开头自动生成目录。你可以在标题的开始用一个__NOTOC__ 标记禁止这个功能。
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=10" title="如何编辑页面">编辑</a>]</div><a name="HTML.E8.A1.A8.E6.A0.BC"></a><h4>HTML表格</h4>
<p>您可以在维基百科中使用HTML表格，但是我们提供了更简单的表格编辑方法，详悉内容请参见<a href="http://en.wikipedia.org/wiki/%E4%BD%BF%E7%94%A8%E8%A1%A8%E6%A0%BC" class="extiw" title="Wikipedia:使用表格">Wikipedia:使用表格</a>。
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=11" title="如何编辑页面">编辑</a>]</div><a name=".E5.8F.98.E9.87.8F"></a><h3> 变量 </h3>
<p>以下是维基百科定义的变量：
</p>
<table border="1" cellpadding="2" cellspacing="0">
<tbody><tr>
<th>变量</th><th>解释</th><th>结果
</th></tr>
<tr>
<td>{{CURRENTMONTH}}</td><td>当前月份</td><td>03
</td></tr>
<tr>
<td>{{CURRENTMONTHNAME}}</td><td>当前月份</td><td>3月
</td></tr>
<tr>
<td>{{CURRENTDAY}}</td><td>当前日</td><td>6
</td></tr>
<tr>
<td>{{CURRENTDAYNAME}}</td><td>今天星期几</td><td>星期一
</td></tr>
<tr>
<td>{{CURRENTYEAR}}</td><td>当前年份</td><td>2006
</td></tr>
<tr>
<td>{{CURRENTTIME}}</td><td>当前时间（<a href="http://wiki.mambochina.net/index.php?title=UTC&amp;action=edit" class="new" title="UTC">UTC</a>）</td><td>04:52
</td></tr>
<tr>
<td>{{NUMBEROFARTICLES}}</td><td>目前的条目数</td><td>57
</td></tr>
<tr>
<td>{{PAGENAME}}</td><td>当前页面标题</td><td>如何编辑页面
</td></tr>
<tr>
<td>{{NAMESPACE}}</td><td>当前页面的名字空间</td><td>
<br></td></tr>
<tr>
<td>{{localurl:Wikipedia:沙盒|edit}}</td><td>编辑页面的url</td><td><a href="http://en.wikipedia.org/wiki/%E6%B2%99%E7%9B%92" class="external free" title="http://en.wikipedia.org/wiki/沙盒" rel="nofollow">http://en.wikipedia.org/wiki/%E6%B2%99%E7%9B%92</a>
</td></tr>
<tr>
<td>{{SERVER}}</td><td>当前的服务器</td><td><a href="http://wiki.mambochina.net/" class="external free" title="http://wiki.mambochina.net" rel="nofollow">http://wiki.mambochina.net</a>
</td></tr></tbody></table>
<p>另请参看<a href="http://wiki.mambochina.net/index.php?title=Help:%E5%8F%98%E9%87%8F&amp;action=edit" class="new" title="Help:变量">Help:变量</a>
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=12" title="如何编辑页面">编辑</a>]</div><a name=".E5.AE.9A.E5.88.B6.E6.B6.88.E6.81.AF"></a><h3> 定制消息 </h3>
<p><a href="http://en.wikipedia.org/wiki/%E7%BB%B4%E5%9F%BA%E4%BA%BA" class="extiw" title="Wikipedia:维基人">维基人</a>也可以自定义一些命令，一般储存的是最常用的文字，参见<a href="http://en.wikipedia.org/wiki/MediaWiki%E5%AE%9A%E5%88%B6%E6%B6%88%E6%81%AF" class="extiw" title="Wikipedia:MediaWiki定制消息">Wikipedia:MediaWiki定制消息</a>。
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a href="http://wiki.mambochina.net/index.php?title=%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2&amp;action=edit&amp;section=13" title="如何编辑页面">编辑</a>]</div><a name=".E5.8F.82.E7.9C.8B"></a><h2>参看</h2>
<ul><li><a href="http://wiki.mambochina.net/index.php?title=%E9%A2%9C%E8%89%B2%E5%88%97%E8%A1%A8&amp;action=edit" class="new" title="颜色列表">颜色列表</a>
</li><li><a href="http://en.wikipedia.org/wiki/PHP_%E8%84%9A%E6%9C%AC" class="extiw" title="Wikipedia:PHP 脚本">Wikipedia:PHP_脚本</a>
</li><li><a href="http://en.wikipedia.org/wiki/%E4%BF%9D%E6%8A%A4%E9%A1%B5%E9%9D%A2" class="extiw" title="Wikipedia:保护页面">Wikipedia:保护页面</a>
</li><li> 另参见<a href="http://en.wikipedia.org/wiki/%E6%9D%A1%E7%9B%AE%E7%BC%96%E5%86%99%E5%BA%94%E6%B3%A8%E6%84%8F%E7%9A%84%E4%B8%BB%E8%A6%81%E4%BA%8B%E9%A1%B9" class="extiw" title="Wikipedia:条目编写应注意的主要事项">中文维基百科“条目编辑”应该注意的主要事项</a><a href="http://wiki.mambochina.net/index.php?title=Ar:%D9%88%D9%8A%D9%83%D9%8A%D8%A8%D9%8A%D8%AF%D9%8A%D8%A7:%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9_%D8%A7%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1&amp;action=edit" class="new" title="Ar:ويكيبيديا:مساعدة التحرير">ar:ويكيبيديا:مساعدة التحرير</a>
</li></ul>&nbsp;&nbsp; 由于eXtremeComponents采用MediaWiki，学习。 本文档摘自<h1 class="firstHeading"><a href="http://wiki.mambochina.net/index.php/%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2">如何编辑页面</a></h1>如有版权问题，请和我联系，立即删除！<br><br></div></div></div></div>
    <!-- Served by zs.zs in 0.86 secs. -->  
<div id="stickies-count" style="display: none;">0</div><div id="stickies-count" style="display: none;">0</div><img src ="http://www.blogjava.net/lucky/aggbug/33839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lucky/" target="_blank">Lucky</a> 2006-03-06 13:02 <a href="http://www.blogjava.net/lucky/articles/33839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eXtremeComponents参考文档</title><link>http://www.blogjava.net/lucky/articles/33380.html</link><dc:creator>Lucky</dc:creator><author>Lucky</author><pubDate>Fri, 03 Mar 2006 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/lucky/articles/33380.html</guid><wfw:comment>http://www.blogjava.net/lucky/comments/33380.html</wfw:comment><comments>http://www.blogjava.net/lucky/articles/33380.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lucky/comments/commentRss/33380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lucky/services/trackbacks/33380.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: eXtremeComponents参考文档 Jeff Johnston版本1.0.0本文档允许在遵守以下两条原则的条件下被使用和传播： 1）不能凭借本文档索取任何费用 2）以任何方式（印刷物或电子版）使用和传播时本文档时，必须包含本版权申明 (更新中...)Table of Contents前言1. 配置1.1...&nbsp;&nbsp;<a href='http://www.blogjava.net/lucky/articles/33380.html'>阅读全文</a><img src ="http://www.blogjava.net/lucky/aggbug/33380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lucky/" target="_blank">Lucky</a> 2006-03-03 10:14 <a href="http://www.blogjava.net/lucky/articles/33380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>extremeComponents指南</title><link>http://www.blogjava.net/lucky/articles/32470.html</link><dc:creator>Lucky</dc:creator><author>Lucky</author><pubDate>Sun, 26 Feb 2006 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/lucky/articles/32470.html</guid><wfw:comment>http://www.blogjava.net/lucky/comments/32470.html</wfw:comment><comments>http://www.blogjava.net/lucky/articles/32470.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.blogjava.net/lucky/comments/commentRss/32470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lucky/services/trackbacks/32470.html</trackback:ping><description><![CDATA[<div class="book" lang="en">
<div class="titlepage">
<div>
<div>
<h1 class="title"><a name="d0e1"></a>eXtremeComponents指南</h1></div>
<div>
<h2 class="subtitle">eXtremeComponents指南 </h2></div>
<div>
<div class="authorgroup">
<div class="author">
<h3 class="author"><span class="firstname">Jeff</span> <span class="surname">Johnston</span></h3></div></div></div>
<div>
<p class="releaseinfo">版本1.0.0</p></div>
<div>
<div class="legalnotice">本文档允许在遵守以下两条原则的条件下被使用和传播： 1）不能凭借本文档索取任何费用 
2）以任何方式（印刷物或电子版）使用和传播时本文档时，必须包含本版权申明 </div></div>
<div>
<p class="pubdate">(更新中...)</p></div></div>

<hr>
</div>
<div class="toc">
<p><b>Table of Contents</b></p>
<dl><dt><a href="#d0e19">定制FilterCell</a>
</dt><dd>
<dl><dt>1. <a href="#d0e22">引言</a>
</dt><dd>
<dl><dt>1.1. <a href="#d0e29">定制Droplist过滤器Cell示例</a></dt></dl></dd></dl>
</dd><dt><a href="#d0e67">定制FilterRowsCallback</a>
</dt><dd>
<dl><dt>1. <a href="#d0e70">引言</a>
</dt><dd>
<dl><dt>1.1. <a href="#d0e82">定制FilterRowsCallback示例</a></dt></dl></dd></dl>
</dd><dt><a href="#d0e108">Form指南</a>
</dt><dd>
<dl><dt>1. <a href="#d0e111">引言</a>
</dt><dd>
<dl><dt>1.1. <a href="#d0e118">JSP</a>
</dt><dd>
<dl><dt>1.1.1. <a href="#d0e132">Form特性的技术说明</a>
</dt><dt>1.1.2. <a href="#d0e141">Checkbox</a>
</dt><dt>1.1.3. <a href="#d0e146">Custom Cell</a>
</dt><dt>1.1.4. <a href="#d0e163">JavaScript</a></dt></dl>
</dd><dt>1.2. <a href="#d0e168">Cell</a>
</dt><dt>1.3. <a href="#d0e177">Controller</a>
</dt><dd>
<dl><dt>1.3.1. <a href="#d0e189">表标签动作Controller</a>
</dt><dt>1.3.2. <a href="#d0e196">Form动作Controller</a>
</dt><dt>1.3.3. <a href="#d0e203">重新得到Checkbox的值</a></dt></dl></dd></dl></dd></dl>
</dd><dt><a href="#d0e212">Html视图定制指南</a>
</dt><dd>
<dl><dt>1. <a href="#d0e215">引言</a>
</dt><dd>
<dl><dt>1.1. <a href="#d0e224">View接口</a>
</dt><dt>1.2. <a href="#d0e231">Messages示例</a></dt></dl></dd></dl>
</dd><dt><a href="#d0e269">拦截器使用指南</a>
</dt><dd>
<dl><dt>1. <a href="#d0e272">引言</a>
</dt><dd>
<dl><dt>1.1. <a href="#d0e279">拦截器列表</a>
</dt><dt>1.2. <a href="#d0e323">行拦截器示例</a></dt></dl></dd></dl>
</dd><dt><a href="#d0e345">Limit指南</a>
</dt><dd>
<dl><dt>1. <a href="#d0e348">引言</a>
</dt><dd>
<dl><dt>1.1. <a href="#d0e355">JSP</a>
</dt><dt>1.2. <a href="#d0e366">Controller</a>
</dt><dt>1.3. <a href="#d0e396">Service</a>
</dt><dd>
<dl><dt>1.3.1. <a href="#d0e401">取得总行数</a>
</dt><dt>1.3.2. <a href="#d0e416">取得Collection</a></dt></dl>
</dd><dt>1.4. <a href="#d0e431">DAO</a>
</dt><dd>
<dl><dt>1.4.1. <a href="#d0e436">定义Query字符串</a>
</dt><dt>1.4.2. <a href="#d0e449">Filter 和 Sort Query 字符串</a>
</dt><dt>1.4.3. <a href="#d0e466">Limit Query String</a>
</dt><dt>1.4.4. <a href="#d0e473">取回总行数和Collection.</a>
</dt><dt>1.4.5. <a href="#d0e482">默认的Sort顺序</a></dt></dl></dd></dl></dd></dl>
</dd><dt><a href="#d0e489">Preferences 指南</a>
</dt><dd>
<dl><dt>1. <a href="#d0e492">引言</a>
</dt><dd>
<dl><dt>1.1. <a href="#d0e499">Preferences表</a>
</dt><dt>1.2. <a href="#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="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="${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></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></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></div><img src ="http://www.blogjava.net/lucky/aggbug/32470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lucky/" target="_blank">Lucky</a> 2006-02-26 10:00 <a href="http://www.blogjava.net/lucky/articles/32470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>