??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品亚洲人成在线观看麻豆,亚洲欧洲久久av,亚洲精品无码av人在线观看http://www.tkk7.com/lucky/category/7495.htmlzh-cnTue, 27 Feb 2007 23:48:06 GMTTue, 27 Feb 2007 23:48:06 GMT60MediaWikihttp://www.tkk7.com/lucky/articles/33839.htmlLuckyLuckyMon, 06 Mar 2006 05:02:00 GMThttp://www.tkk7.com/lucky/articles/33839.htmlhttp://www.tkk7.com/lucky/comments/33839.htmlhttp://www.tkk7.com/lucky/articles/33839.html#Feedback0http://www.tkk7.com/lucky/comments/commentRss/33839.htmlhttp://www.tkk7.com/lucky/services/trackbacks/33839.html

如何~辑面

WikipediaQ自q癄全书


~辑一?a title="Wiki">Wiki面十分Ҏ。只要点击页面上方的“编辑本”或右侧的[~辑]链接卛_修改该页Q或点击“讨论本”然后再点击“编辑页面”来讨论该页面。点d您就会看C个包含那个Wiki面的可~辑的文字区域?

输入文字Q再在文字区域下的栏中输入编辑摘要,完成后点几Z保存本”就可以了!您也可以在保存前先预览您的修攏V?

先将文字复制到您最喜欢的文字编辑器Q编辑ƈ查后再脓回浏览器预览往往更方ѝ这样做方便你断U后用您的备份档做修攏V?

wiki标记

下面表格的左ҎC浏览效果。也是_要文字实现像左边列一L效果Q输入右边列的文字就行了?

您或许想在另一个窗口打开本页以做参考。如果您希望实验一下,您可以在沙盒中实验?

参见: Wiki格式指南?a class="new" title="Wiki使用表格">Wiki使用表格

章节、段落,列表及线?/h3>
您所看到? 您所输入?

用下列格式表C?a class="new" title="Help:~辑章节">章节Q?

一U标?/h2>

二标题

三标题

  • 请用(==Q表CZU标题,而不要用这个(=Q?
  • 不要跌下一U标题(例如一U标题下直接使用三标题Q而没有用二U标题)
==一U标?=
asdfasdf
===二标题===
asdfasdfasdfasdf
====三标题====

另v一? 会变成一个空根{?

但一个空行开始一个新D落?

  • 在用列表时Q换行会影响版面效果?
另v一?br>会变成一个空根{?br>
但一个空行开始一个新D落?/pre>
您可以在不开始新一D늚情况?br>

另v一行?

  • 请尽量不要用这U方式?
您可以在不开始新一D늚情况?lt;br>
另v一行?/pre>
  • W号列表很不错:
    • 每一行用一个星P*Q开?
      • 星号多Q表C列表的层更深?
        • 新v一行表C列表结?
  • 注意W号必须是新一行的W一个字W?
*W号列表很不错:
**每一行用一个星P*Q开?br>***星号多Q表C列表的层更深?br>****新v一行表C列表结?br>
  1. 数字列表也不?
    1. 很整?
    2. Ҏ理解
#数字列表也不?br>##很整?br>##Ҏ理解
  • 您甚臛_以用؜合列?
    1. q有层次?
      • 像这?
*您甚臛_以用؜合列?br>*#q有层次?br>*#*像这?/pre>
定义列表 
包含许多定义的列?
条目 
条目的定?
另外一?
其它的定?
;定义列表 : 包含许多定义的列?br>;条目 : 条目的定?br>;另外一?br>:其它的定?br>
每一行都可以
~进
好几层呢
:每一行都可以
::~进
:::好几层呢
如果一行的开始是I格那么
它将会以其原始Ş?br>出现Q?br>在一个这L字体中;
文字不会自动换行Q?br>如果l束

q在以下情况下会十分有用Q?

  • _脓格式化文字;
  • 数学公式Q?
  • 文字艺术Q?

注意: q可能会拉长面Q媄响阅诅R?

 如果一行的开始是I格那么
它将会以其原始Ş?br> 出现;
在一个这L字体中;
文字不会自动换行
如果l束
q在一下情况下会十分有?
*_脓格式化文?
*数学公式;
*文字艺术;
居中文字?/div>
<center>居中文字?lt;/center>
一条水q线页面分隔成了上?

和下面?

一条水q线页面分隔成了上?br>----
和下面?/pre>
当您在对话页d评语Ӟ您应当签名。您可以输入三条~添加用户名Q?

Foolevery

或四条~d用户名及日期旉Q? Foolevery 08:24 2004q??1?(UTC)

当输入五条~时只昄旉Q? 08:26 2004q?0?5?(UTC)

你可以参?a class="new" title="Help:{֐">help:{֐获得更多的关于签名的信息?

当您在对话页d评语Ӟ您应当签名?br>您可以输入三条~d用户名: 
~~~

或四条添加用户名及日期时_
~~~~

当输入五条时只显C时_
~~~~~

链接QURL和图?/h3>
您所看到? 您所输入?
q接?a class="extiw" title="Wikipedia:常见问题解答">Wikipedia:常见问题解答.
  • 英文名中W一个字母自动大?
  • I格用下划线代替?
  • 如果要创建新面Q?
    1. 用这个方法创Z个连接?
    2. 再保存您的页面?
    3. 点击您所创徏的连接。编辑新面H口׃打开?
  • 请参?a class="extiw" title="Wikipedia:命名常规">Wikipedia:命名常规?
q接到[[Wikipedia:常见问题解答]].
同样q接目标Q不同的名字Q?a class="extiw" title="Wikipedia:常见问题解答">解答?
同样q接目标Q不同的名字Q[[Wikipedia:常见问题解答|解答]]?br>
链接C个页面的某一章节Q?a class="extiw" title="Wikipedia:帮助">Wikipedia:帮助#联系与讨?/a>?
链接C个页面的某一章节Q[[Wikipedia:帮助#联系与讨论]]?br>
自动隐藏圆括P?

自动隐藏名字I间帮助

自动隐藏圆括P[[译 (消歧?|]]?br>
自动隐藏名字I间[[Wikipedia:帮助|]]
  • 类DD|字放在一条条目的W一行就会复位向该条目到另一条条目。注意该D|字之后不应有其它M文字Q否?a class="extiw" title="Wikipedia:复位?>复位?/a>不会成功?
#REDIRECT [[中华人民共和国]]
外部q接Q?a class="external text" title="http://www.nupedia.com" rel="nofollow">Nupedia
外部q接Q?br>[http://www.nupedia.com Nupedia]
或者直接提供URLQ?a class="external free" title="http://www.nupedia.com" rel="nofollow">http://www.nupedia.com.
或直接提供URLQ?br>http://www.nupedia.com.

也可以这P比较ȝQ:http://www.nupedia.com.

一个直接用外部连接的问题是?http://" 之后的整D|字都是连接的一部分直到一个空gؓ止?<p> 输入[http://www.nupedia.com]会出C个意料不到的l果Q?[1].<p> 解决之道是重复URL两次Q生下面的l果Q?br>http://www.nupedia.com.

解决之道是重复URL两次Q?br>[http://www.nupedia.com http://www.nupedia.com].
一q图片:Image:Wiki.png


只有上蝲到维基百U的囑փ才可以用。请?a title="Special:Upload">上蝲上载图?/a>。您可以?a title="Special:Imagelist">囑փ列表上查看已l上载的囑փ。详l的使用Ҏ请参?a class="extiw" title="Wikipedia:囑փ标记">Wikipedia:囑փ标记?

一q图片:[[Image:Wiki.png]]


最新格式的一q图片:Image:Wiki.png
一q图片:[[Image:Wiki.png|thumb|Wiki]]


  • 点击一q上载的囑փ后会出现一个描q页。您可以通过使用下面的方法直接连接到该描q页Q?

Image:Wiki.png


[[:Image:Wiki.png]]
  • 要包括非囑փ上蝲文gQ例如音像等Q或要图像以q接的方式而不是图像本w显C,使用"media"q接?


声音

囑փq接


[[media:Sg_mrob.ogg|声音]]

[[media:China_flag_medium.png|囑փq接]]

要链接一本书Q你可以使用ISBN链接Q例如:ISBN 0123456789X


ISBN 0123456789X

字符格式

参看Q?a class="extiw" title="Wikipedia:数学公式">Wikipedia:数学公式

您所看到? 您所输入?

, 强烈, 很强?/b>.

  • q些是两个及三个单引P不是双引受?
'''', '''强烈''', 
'''''很强?''''.

您也可以使用斜体?b>_体Q? 如果您希望的效果是某U字体风D不是强调,例如在下面的数学公式中:

F = ma
  • 然而,q两U方法的差别很小Q大多数人选择忽略它?
您也可以使用<i>斜体</i>?lt;b>_体</b>Q?br>如果您希望的效果是某U字体风D不是强调,例如在下面的数学公式中:

:<b>F</b> = <i>m</i><b>a</b>
您可?strike>删除字体

?u>字体下划?

  • 对编辑很有帮助?
您可?lt;strike>删除字体</strike><br>
?lt;u>字体下划</u>?/pre>

变音及重音符P (参见wikipedia:Ҏ字符)
À Á Â Ã Ä Å
Æ Ç È É Ê Ë
Ì Í Î Ï Ñ Ò
Ó Ô Õ Ö Ø Ù
Ú Û Ü ß à ֙
â ã ä å æ

ç
؈ é ^ ë ì T
î ï ñ ò Q ô
õ ö ø ù ú ]
ü ÿ


&Agrave; &Aacute; &Acirc; &Atilde; &Auml; &Aring;
&AElig; &Ccedil; &Egrave; &Eacute; &Ecirc; &Euml;
&Igrave; &Iacute; &Icirc; &Iuml; &Ntilde; &Ograve;
&Oacute; &Ocirc; &Otilde; &Ouml; &Oslash; &Ugrave;
&Uacute; &Ucirc; &Uuml; &szlig; &agrave; &aacute;
&acirc; &atilde; &auml; &aring; &aelig; &ccedil;
&egrave; &eacute; &ecirc; &euml; &igrave; &iacute;
&icirc; &iuml; &ntilde; &ograve; &oacute; &ocirc;
&oelig; &otilde; &ouml; &oslash; &ugrave; &uacute;
&ucirc; &uuml; &yuml;

标点W号Q?/b>
H ¡ J ¶
????

&iquest; &iexcl; &laquo; &raquo; &sect; &para;
&dagger; &Dagger; &bull; &mdash;

商业W号Q?/b>
?© ] ?
n ]

&trade; &copy; &reg; &cent; &euro; &yen; 
&pound; &curren;
下标Qx2

上标Qx2 或?x̔

  • 上标的后一U方法可能在多数情况下无法用,但情况许可下请用因使文章看h较顺眹{?

ε0 = 8.85 × 10?2 C̔ / J m.

下标: x<sub>2</sub>
上标: x<sup>2</sup> 或?x&sup2;

&epsilon;<sub>0</sub> =
8.85 × 10<sup>?2</sup>
C̔ / J m.
希腊字母Q?/b>

β δ ε ζ
η θ ι κ λ μ ^
ξ ο π ρ σ ς
τ υ φ χ ψ ω
Γ Δ Θ Λ Ξ Π
Σ Φ Ψ Ω

&alpha; &beta; &gamma; &delta; &epsilon; &zeta; 
&eta; &theta; &iota; &kappa; &lambda; &mu; &nu;
&xi; &omicron; &pi; &rho; &sigma; &sigmaf;
&tau; &upsilon; &phi; &chi; &psi; &omega;
&Gamma; &Delta; &Theta; &Lambda; &Xi; &Pi;
&Sigma; &Phi; &Psi; &Omega;

数学W号Q?/b> (参见Wikipedia:ҎW号)
?????u ?br> ???????br> × · ÷ ???br> ?? ??ø
????????br> R ???∀ ??

&int; &sum; &prod; &radic; &minus; &plusmn; &infin;
&asymp; &prop; &equiv; &ne; &le; &ge; &rarr;
&times; &middot; &divide; &part; &prime; &Prime;
&nabla; &permil; &deg; &there4; &alefsym; &oslash;
&isin; &notin; &cap; &cup; &sub; &sup; &sube; &supe;
&not; &and; &or; &exist; &forall; &rArr; &hArr;
&rarr; &harr;
x2   ?nbsp;  0 true.
  • 要分开文字Q用非分隔I格 - &nbsp;.
  • &nbsp;也防止在文字中间换行。这在方E式中十分有用?
<i>x</i><sup>2</sup>&nbsp;&nbsp;&ge;&nbsp;&nbsp;0 true.

Ascii文字艺术Q每行开始处留空Q:

?-x̔
?e dx = √π
-?
 
&infin; -x&sup2;
&int; e dx = &radic;&pi;
-&infin;

表格

目录功能

在当前版本的l基癄中用了“目录”功能,该功能是自动启用的。当文中包含多个D落Ӟ会在文章的开头自动生成目录。你可以在标题的开始用一个__NOTOC__ 标记止q个功能?

HTML表格

您可以在l基癄中用HTML表格Q但是我们提供了更简单的表格~辑ҎQ详悉内容请参见Wikipedia:使用表格?

变量

以下是维基百U定义的变量Q?

变量解释l果
{{CURRENTMONTH}}当前月䆾03
{{CURRENTMONTHNAME}}当前月䆾3?
{{CURRENTDAY}}当前?/td>6
{{CURRENTDAYNAME}}今天星期?/td>星期一
{{CURRENTYEAR}}当前q䆾2006
{{CURRENTTIME}}当前旉Q?a class="new" title="UTC">UTCQ?/td>04:52
{{NUMBEROFARTICLES}}目前的条目数57
{{PAGENAME}}当前面标题如何~辑面
{{NAMESPACE}}当前面的名字空?/td>
{{localurl:Wikipedia:沙盒|edit}}~辑面的urlhttp://en.wikipedia.org/wiki/%E6%B2%99%E7%9B%92
{{SERVER}}当前的服务器http://wiki.mambochina.net

另请参看Help:变量

定制消息

Wikipedia:MediaWiki定制消息?

参看

   ׃eXtremeComponents采用MediaWikiQ学习?本文档摘?h1 class="firstHeading">如何~辑面如有版权问题Q请和我联系Q立卛_除!



Lucky 2006-03-06 13:02 发表评论
]]>
eXtremeComponents参考文?/title><link>http://www.tkk7.com/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.tkk7.com/lucky/articles/33380.html</guid><wfw:comment>http://www.tkk7.com/lucky/comments/33380.html</wfw:comment><comments>http://www.tkk7.com/lucky/articles/33380.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/lucky/comments/commentRss/33380.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/lucky/services/trackbacks/33380.html</trackback:ping><description><![CDATA[     摘要: eXtremeComponents 参考文? Jeff Johnston 版本1.0.0 本文档允许在遵守以下两条原则的条件下被用和传播Q?1Q不能凭借本文档索取M费用 2Q以M方式Q印L或电子版Q用和传播时本文档Ӟ必须包含本版权申? (更新?..) Table of Contents 前言 1. 配置 1.1...  <a href='http://www.tkk7.com/lucky/articles/33380.html'>阅读全文</a><img src ="http://www.tkk7.com/lucky/aggbug/33380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/lucky/" target="_blank">Lucky</a> 2006-03-03 10:14 <a href="http://www.tkk7.com/lucky/articles/33380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>extremeComponents指南http://www.tkk7.com/lucky/articles/32470.htmlLuckyLuckySun, 26 Feb 2006 02:00:00 GMThttp://www.tkk7.com/lucky/articles/32470.htmlhttp://www.tkk7.com/lucky/comments/32470.htmlhttp://www.tkk7.com/lucky/articles/32470.html#Feedback24http://www.tkk7.com/lucky/comments/commentRss/32470.htmlhttp://www.tkk7.com/lucky/services/trackbacks/32470.html

eXtremeComponents指南

eXtremeComponents指南

Jeff Johnston

版本1.0.0

本文档允许在遵守以下两条原则的条件下被用和传播Q?1Q不能凭借本文档索取M费用 2Q以M方式Q印L或电子版Q用和传播时本文档Ӟ必须包含本版权申?

(更新?..)


定制FilterCell


1. 引言

列的filterCell属性控制过滤器如何昄Q它和cell属性非常相像ƈ且也是实现Cell接口。马上要定义的是默认的和droplistq两个过滤器cells? 默认的是一个输入框元素而droplist是一个下拉列表元素。当Ӟ如果你需要进行一些定制你可以插接自己的实现?/p>

最q,我被问到是否能够实现一个过滤器cellQ显C已l通过别的qo器过滤得到数据子集。答案当然是肯定的,而且q是我将在这里示范的。通常定制? cell可以很容易被创徏Q这个示例将印证q点。在q个CZ里last name列里昄的将是通过first nameqo后的子集。如果没有通过 first nameqo那么所有值都被昄?/p>

1.1. 定制Droplistqo器CellCZ

通常你只需要ؓqo器cell实现Cell接口。然而,因ؓ我们要创建的qo器cell是一个下拉列表,我们可以通过扩展 FilterDroplistCell来获得它已经提供的很多功能,FilterDroplistCell是发行包已经提供的cells之一?/p>

我们需要覆盖FilterDroplistCell的唯一Ҏ是getFilterDropList()。这是整个类的全部代码:

public class FilteredDroplistCell extends FilterDroplistCell {
private static Log logger = LogFactory.getLog(FilterDroplistCell.class);

protected List getFilterDropList(TableModel model, Column column) {
List droplist = new ArrayList();

String firstNameFilter = model.getLimit().getFilterSet().getValue("firstName");

Collection beans = model.getCollectionOfBeans();
for (Iterator iter = beans.iterator(); iter.hasNext();) {
Object bean = iter.next();
try {
String firstName = BeanUtils.getProperty(bean, "firstName");
if (StringUtils.isNotBlank(firstNameFilter) && !firstName.equals(firstNameFilter)) {
continue;
}

String lastName = BeanUtils.getProperty(bean, column.getProperty());
if ((lastName != null) && !droplist.contains(lastName)) {
droplist.add(lastName);
}
} catch (Exception e) {
logger.debug("Problems getting the droplist.", e);
}
}

Collections.sort(droplist);

return droplist;
}
}

如果你比较这个类和父c,你会发现它们只有微小的区别?/p>

首先需要注意的是我们需要找出first name是否已经被过滤了?/p>

String firstNameFilter = model.getLimit().getFilterSet().getValue("firstName");

然后我们需要判断当前bean的first name值是否和first nameqo器值相同。如果相同,当前的last name? d到droplist中?/p>

String firstName = BeanUtils.getProperty(bean, "firstName");
if (StringUtils.isNotBlank(firstNameFilter) && !firstName.equals(firstNameFilter)) {
continue;
}

如果last name添加到droplist中,我们需要检查droplist中是否已l包含了q个倹{如果没有,我们把它添加到droplist中?

String lastName = BeanUtils.getProperty(bean, column.getProperty());
if ((lastName != null) && !droplist.contains(lastName)) {
droplist.add(lastName);
}

Z使用q个Cell你应该在Preferences中声明一个别名?当然Q你可以省略q步而在JSP中提供这个Cell实现cȝ全\径,但是使用Preferences更简z?/em>

column.filterCell.filteredDroplist=org.extremesite.cell.FilteredDroplistCell

在ColumnTag通过讄filterCell属性来使用FilteredDroplistCell?/p>

<ec:column property="lastName" filterCell="filteredDroplist"/>

如果不清楚Preferences和ColumnTag定义语法请参考Preferences指南?

定制FilterRowsCallback


1. 引言

FilterRowsCallback被用来过滤传leXtremeTable的Beans的Collection? FilterRowsCallback的默认实现是得到Beans或Maps的CollectionQ然后通过实现jakarta Predicate接口来进行过滤。当Ӟ如果你需要进行一些定制你可以插接自己的实现?/p>

首先声明Q本CZ代码包含一些从原包中剪切、粘贴的代码(虽然不是很多)。在 最初的最l发行包之后QD滤得到进一步改善得更具复用性ƈ更容易实玎ͼ可能和定制cell代码行数相同? 当然Q我被要求ƈ非常乐意C如何在当前代码基上实现定制过滤。这有非常清晰的hooks实现Qƈ且很Ҏ实现?/p>

本示例示范了如何调整代码滤器提供一个精的比较功能。当前的实现是通过使用StringUtils.contains()Ҏq行模糊比较? 本示例将使用StringUtils.equals()Ҏ。你可以按照你的需要来调整代码q行更多定制?/p>

1.1. 定制FilterRowsCallbackCZ

首先你需要做的是创徏一个实现Predicate接口的定制类。Predicate要求我们实现evaluate()Ҏ来判断是否包? 当前bean。因Z仅仅调整现在已有的功能,首先得到filterPredicate的源代码Q在发行包的callback包下Q, 拯C的工E里。然后向下面展示的一样将 StringUtils.contains()Ҏ修改为StringUtils.equals()ҎQ?/p>

public final class ExactMatchFilterPredicate implements Predicate {
private boolean isSearchMatch(String value, String search) {

...

else if (StringUtils.equals(value, search)) {
return true;
}

...

}
}

然后我们需要实现和Predicate共同作用的FilterRowsCallback接口。再一ơ从发行包的callback包下拯ProcessRowsCallback源代码到你的工程里? 请参照我们创建的定制的ExactMatchFilterPredicate cL认仅仅实现了FilterRowsCallback和修改Predicate?/p>

public class ExactMatchFilterRows implements FilterRowsCallback {
public Collection filterRows(TableModel model, Collection rows) throws Exception {

...

if (filtered) {
Collection collection = new ArrayList();
Predicate filterPredicate = new ExactMatchFilterPredicate(model);
CollectionUtils.select(rows, filterPredicate, collection);

return collection;
}

...

}
}

Z使用q个FilterRowsCallback你应该在Preferences中声明一个别名?span class="emphasis">当然Q你可以省略q步而在JSP中提供这个FilterRowsCallback实现cȝ全\径,但是使用Preferences更简z?/em>

table.filterRowsCallback.exactMatch=org.extremesite.callback.ExactMatchFilterRows

在TableTag通过讄filterRowsCallback属性来使用ExactMatchFilterRows?/p>

<ec:table filterRowsCallback="exactMatch"/>

如果不清楚Preferences和ColumnTag定义语法请参考Preferences指南?/em>

Form指南


1. 引言

eXtremeTable本质上是一个formlgQ所以我假定表被包在form里,所有的功能都被认ؓ是对form元素的操作。如果你惛_表体中包含一些定制的form元素Q? 或者想eXtremeTable嵌入到另外的form中,那么你就要用表标签的form属性用来参照最q的form?/p>

ZCformҎ,我们要做的工作将分解为JSPQCell和Controller?/p>

1.1. JSP

下面列出的是checkboxCZ的完整代码。想要强调的主要事情是表标签form属性设|ؓpresFormQ它参照被称为presForm的form元素?

同时h意表标签的autoIncludeParameters属性。进行排序、过滤、分|Q默认的eXtremeTable保持所有传至JSP面的参数? q个Ҏ对于内部其他的formq行排序、过滤、分|Q用于高效复制form元素同样有效。可以设|? autoIncludeParameters属性ؓfalse来固定它?/p>

在这个form使用id属性是因ؓxhtm标准的要求,同时你也可以使用form的name属性?

<form id="presForm" action="<c:url value="selectedPresidentsListedController.run"/>" method="post">

Enter your name:
<input
type="text"
name="userName"
style="font-family:verdana,arial,helvetica,sans-serif;font-size:11px;"
value="<c:out value="${param.userName}"/>"
/>

<ec:table
items="presidents"
action="${pageContext.request.contextPath}/selectedPresidentsController.run"
view="compact"
imagePath="${pageContext.request.contextPath}/images/table/compact/*.gif"
rowsDisplayed="8"
autoIncludeParameters="false"
form="presForm"
>
<ec:exportPdf
fileName="output.pdf"
tooltip="Export PDF"
headerColor="black"
headerBackgroundColor="#b6c2da"
headerTitle="Presidents"
/>
<ec:row>
<ec:column
alias="checkbox"
title=" "
width="5px"
filterable="false"
sortable="false"
viewsAllowed="compact"
cell="selectedPresident"
/>
<ec:column property="fullName" title="Name"/>
<ec:column property="nickName" />
<ec:column property="term" />
</ec:row>
</ec:table>

<input
type="button"
name="sel"
class="button"
value="List Selected Presidents"
onclick="document.forms.presForm.submit();"
/>

<script type="text/javascript">
function setPresidentState(chkbx) {
//make sure that always know the state of the checkbox
if (chkbx.checked) {
eval('document.forms.presForm.chkbx_' + chkbx.name).value='SELECTED';
} else {
eval('document.forms.presForm.chkbx_' + chkbx.name).value='UNSELECTED';
}
}
</script>

</form>

1.1.1. FormҎ的技术说?/h4>

表标{form属性参照最q的form是你使用q个Ҏ所必须知道的,Z更好的理解这个特性,介绍更多的关于内部实现技术的l节是值得的?/p>

如果您不Ҏ指定form属性,eXtremeTable自动在表附近包上一个form。所有表的动作例如:排序、过滤、分将自动l一些隐藏的input元素赋|然后提交q个form到表标签action属性设|的Aciton? q非常有效,除非您想要将自己的form元素讄到表体,或者想这个表攑ֈ别的form里?

表标{form属性参照最q的formQ所有表的动作例如:排序、过滤、分将自动l一些隐藏的input元素赋|但是现在 最qform的action属性将要改变表标签的动作。这非常重要Q因为:当排序、过滤、分|QeXtremeTable能够从一个controller得到数据集合 Q但是提交这个form到别的controller来处理这个form旉要对用户的输入进行处理。然而,q些对于你用表标签来说都是透明的? 像你现在做的那L单地讄表标{action属性,然后讄相关的formCx交的位置?/p>

1.1.2. Checkbox

CZ的第一列是checkbox。因列不需要参照bean的属性,alias属性用来唯一地标识这列。你可以使用property 属性,但是alias属性ɘq列如何使用更清楚。alias属性还被用来当同样的属性被多列使用时唯一地标识一列?/p>

1.1.3. Custom Cell

您也许想知道定制的cell是如何通过名称selectedPresident被参照的(cell="selectedPresident")。这是一? 对eXtremeTable的preferencesҎ更强的使用。所有要做的是在extremecomponents.properties文g中添加一个属性? 请参考Preferences来了解更多的信息

column.cell.selectedPresident=org.extremesite.cell.SelectedPresidentCell

column.cell.selectedPresident是你定义的用来参照q个cell的名U?/p>

当然你也可以使用q个Cell的全名来q行参照?/p>

<ec:column 
alias="checkbox"
title=" "
width="5px"
filterable="false"
sortable="false"
viewsAllowed="compact"
cell="org.extremesite.cell.SelectedPresidentCell"
/>

在属性文件中定义参照更方便,它可以被MJSP文g引用。如果类名或包名改变的话你只需要对一个地方进行修攏V?/p>

1.1.4. JavaScript

JavaScript的setPresidentState()Ҏ被定制cell用来讄每个checkbox元素的是否被选中? 讄一个隐藏元素的原因是ؓ了获得浏览器的动作而不提交没有选中的checkbox。通过q个Controller一直知道一个元素是否别选中?/p>

1.2. Cell

定制的cell被用来生成checkboxQ另外它也创Z个隐藏元素用来表C个checkbox元素是否被选中? 当用戯行排序、过滤、分|Q被选中的数据集合将被放到session里?/p>

getExportDisplay()Ҏ没有q回|因ؓȝ只需要Html昄?/p>

public class SelectedPresidentCell implements Cell {
public String getExportDisplay(TableModel model, Column column) {
return null;
}

public String getHtmlDisplay(TableModel model, Column column) {
HtmlBuilder html = new HtmlBuilder();

CellBuilder.tdStart(html, column);

try {
Object bean = model.getCurrentRowBean();
String presidentId = BeanUtils.getProperty(bean, "presidentId");

Collection selectedPresidentsIds = (Collection)model.getContext().getSessionAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);
if (selectedPresidentsIds != null && selectedPresidentsIds.contains(presidentId)) {
html.input("hidden").name("chkbx_" + presidentId).value(SelectedPresidentsConstants.SELECTED).xclose();
html.input("checkbox").name(BeanUtils.getProperty(bean, "presidentId"));
html.onclick("setPresidentState(this)");
html.checked();
html.xclose();
} else {
html.input("hidden").name("chkbx_" + presidentId).value(SelectedPresidentsConstants.UNSELECTED).xclose();
html.input("checkbox").name(BeanUtils.getProperty(bean, "presidentId"));
html.onclick("setPresidentState(this)");
html.xclose();
}
} catch (Exception e) {}

CellBuilder.tdEnd(html);

return html.toString();
}
}

1.3. Controller

提示QSpring框架的Controller和Struts框架的Action非常相像?/em>

当在另外的form中用eXtremeTableӞ你可能有1个或2个controllers。当form被提交时Q你需要一个controller 来处理用L输入q新定向到另外的JSP面。当排序、过滤、分|Q你可能有另外的controller来得到表使用的数据集合ƈ重定向会本页。或者你可以在同一个controller中分别处理?

checkboxCZ里我使用一个controller来关联表标签的action属性。我也用另外一个controller来关联form元素的动作?/p>

1.3.1. 表标{֊作Controller

q个controller负责调用SelectedPresidentsUtils来保存被选中的presidentIds到session里ƈ回到同一c?

SelectedPresidentsUtils.saveSelectedPresidentsIDs(request);
Collection presidents = presidentsService.getPresidents();
request.setAttribute("presidents", presidents);

1.3.2. Form动作Controller

q个controller负责通过presidentIds得到数据集ƈ重定向到下一个Jsp面

Collection selectedPresidentsIds = SelectedPresidentsUtils.saveSelectedPresidentsIDs(request);
Collection selectedPresidents = SelectedPresidentsUtils.getSelectedPresidents(presidentsService.getPresidents(), selectedPresidentsIds);
request.setAttribute("selected", selectedPresidents);
request.getSession().removeAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);

1.3.3. 重新得到Checkbox的?/h4>

我将列出保存presidentIds到session的代码。我l常被问到如何重新得到eXtremeTable中form元素的倹{? 它的原理是设|form输入元素名字属性值前面加上一些东西来唯一标识元素

本示例中我关心的是以chkbx开头参数的元素。chkbx后面是唯一的关联到checkbox的presidentId。它被用来判断这个checkbox是否别选中?/p>

public static Collection saveSelectedPresidentsIDs(HttpServletRequest request) {
Collection presidents = (Collection) request.getSession().getAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);

if (presidents == null) {
presidents = new ArrayList();
request.getSession().setAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS, presidents);
}

Enumeration parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = (String) parameterNames.nextElement();
if (parameterName.startsWith("chkbx_")) {
String presidentId = StringUtils.substringAfter(parameterName, "chkbx_");
String parameterValue = request.getParameter(parameterName);
if (parameterValue.equals(SelectedPresidentsConstants.SELECTED)) {
if (!presidents.contains(presidentId)) {
presidents.add(presidentId);
}
} else {
presidents.remove(presidentId);
}
}
}

return presidents;
}

Html视图定制指南


1. 引言

eXtremeTable使用View接口来生成HTML。你可以使用发行包已l提供的视图Q或者你可以插入自己的视囑֮现? 现在Q创Z自己的视囄Ҏ较简单,但讨Z些设计想法和如何着手实C个定制的视图q是有h值的?/p>

我想使创建定制视囄单,但不是想构造一个更复杂的类似swing的模型,原因是那需要创建大量的对象来处理对应的内部工作? eXtremeTable以高效ؓ目标Q我也想在视囄实现上诏彻这U想法,所以我军_创徏一pd的静态构造器cL实现分解的最功能。你可以通过l合q些功能来实C的定制视图?

学习定制视图的最好途径是阅dl存在的视图的源代码Q修改它来满你的需求。如果我C所有东西的话,q篇指南变的非常冗ѝ取而代之的是我直接修攚w认视囄工具条作为定制视囄一个示例? 对于不同构造器的具体细节我你阅L代码。我也将量更新javadocs来提供更好的帮助?/p>

1.1. View接口

实现View接口的类?ơ插入内容的Z。beforeBody()Ҏ会被立刻调用Qbody()Ҏ在每一行的每一列处理的时候调用? afterBody()Ҏ是被eXtremeTable调用的最后方法,它将q回代表视图的一个对象。在q个HTML视图CZ里,它将是一个字W串?/p>

public interface View {
public void beforeBody(TableModel model);
public void body(TableModel modelQ?Column column);
public Object afterBody(TableModel model);
}

1.2. MessagesCZ

在这指南里我将直接修改工具条来实现q网站上MessagesCZ的定制视图?/p>

public class MessagesView extends AbstractHtmlView { 
protected void toolbar(TableModel model) {
TwoColumnTableLayout toolbar = new MessagesToolbar();
toolbar.layout(getHtmlBuilder()Q?model);
}

protected void statusBar(TableModel model) {
TwoColumnRowLayout statusBar = new MessagesStatusBar();
statusBar.layout(getHtmlBuilder()Q?model);
}
}

q里使用的是默认视图Q因此它扩展了虚拟视图来修改工具条和状态条。如何修改工h和(或)状态条也是开发h员问的最多问题?

默认视图的工h位于表的上方包括页链接和标题。工h使用TwoColumnTableLayoutQ它是一个用于提供在自己表中实现左右两列布局的虚拟类? 它将实现能够在表上方的完美布局。下面就是你需要关心的虚拟ҎQ在实际的html视图中已lؓ你完成了q个布局?/p>

public abstract class TwoColumnTableLayout {
protected abstract boolean showLayout(TableModel model);
protected abstract void columnLeft(HtmlBuilder htmlQ?TableModel model);
protected abstract void columnRight(HtmlBuilder htmlQ?TableModel model);
}

showLayout()Ҏ用来L或导致布局的展现。在我的定制视图中如果翻|Q和Q导出显C那么工h展现?/p>

protected boolean showLayout(TableModel model) {
boolean showPagination = BuilderUtils.showPagination(model);
boolean showExports = BuilderUtils.showExports(model);
if (!showPagination && !showExports) {
return false;
}

return true;
}

下面昄了左列和叛_的部分代码。注意在我的定制视图中首和前一用了文字来替代图片显C。我真正希望C的是你需要做的:扑ֈ正确的构造器cdƈ且仅仅是扩展HtmlBuilder的标{? 构造器cd于示范如何找到模型里的信息(以便你能够做比他们能够提供的更多的定制工作)也非常有用,?/em>

protected void columnLeft(HtmlBuilder htmlQ?TableModel model) {
html.td(2).close();
TableBuilder.title(htmlQ?model);
html.tdEnd();
}

protected void columnRight(HtmlBuilder htmlQ?TableModel model) {
boolean showPagination = BuilderUtils.showPagination(model);
...
if (showPagination) {
html.td(4).close();
ToolbarBuilder.firstPageItemAsText(htmlQ?model);
html.tdEnd();

html.td(4).close();
ToolbarBuilder.prevPageItemAsText(htmlQ?model);
html.tdEnd();
...
}
...
}

Z使用q个视图你需要在Preferences定义一个别名?你可以省略这部而在JSP直接l出q个视图的完整有效的cdQ不qPreferences更ؓz?/em>

table.view.messages=org.extremesite.view.MessagesView

TableTag也将讄视图属性来使用MessagesView视图?/p>

<ec:table view="messages">

如果不清楚Preferences和TableTag定义语法请参考Preferences指南?/em>

拦截器用指?/h2>


1. 引言

拦截Ҏ被用在q行旉要修改属性值的时候,它得改变基于数据的eXtremeTable的行为成为可能。在阅读扩展标签属性时Q你会发现它和扩展标{ֱ性具有同L概念和方法标识? 区分使用他们的首要准则是Q如果需要向TLD里已l定义的q且能够在JSP中访问的标签d新的属性时Q应该用扩展标{ֱ性;如果仅仅是需要修改已l定义好的属性的值的时候,应该使用拦截器?

你可能需要了解更多的eXtremeTable如何q作的技术背景才能完全理解这U特性? eXtremeTable首先做的是遍历所有标{ƈ创徏对应的模型beans (pojos)。beans是具有和标签一样属性,但是使用真实cd来替换仅仅用字W串cd的对象。beans是被模型使用q且是你需要用拦截特性修改的对象? 所有的拦截器接口都定义了一个addҎQ?addҎ被用来处理模型beanW一ơ创建时的属性。行和列的拦截器q有一个modify Ҏ。modifyҎ可以在当行和c进行处理是对属性D行操作?/p>

1.1. 拦截器列?/h3>

下面列出了具有拦截特性的标签和他们需要被实现的接口,Bean栏显CZ被模型创建的Bean?/p>

标签 接口 Bean
TableTag org.extremecomponents.table.intercept.InterceptTable org.extremecomponents.table.bean.Table
RowTag org.extremecomponents.table.intercept.InterceptRow org.extremecomponents.table.bean.Row
ColumnTag org.extremecomponents.table.intercept.InterceptColumn org.extremecomponents.table.bean.Column
ExportTag org.extremecomponents.table.intercept.InterceptExport org.extremecomponents.table.bean.Export

1.2. 行拦截器CZ

C拦截Ҏ的完美CZ是Ҏ一定的标准来对行进行高亮显C,q也是我们将要完成的CZ。它很短也很单,不过它实现的概念同样适用于每一个拦截器接口?

我们需要做的第一件事是实现InterceptRow接口。你会注意到q个接口有两个方法:addRowAttributes() 和modifyRowAttributes()。addRowAttributesҎ在行bean创徏的时候被调用Q? modifyRowAttributesҎ在表处理当前面行的时候被调用?/p>

public class MarkerIntercept implements InterceptRow {
public void addRowAttributes(TableModel tableModel, Row row) {
}

public void modifyRowAttributes(TableModel model, Row row) {
President president = (President) model.getCurrentRowBean();
String career = president.getCareer();
if (StringUtils.contains(career, "Soldier")) {
row.setStyle("background-color:#fdffc0;");
} else {
row.setStyle("");
}
}
}

在Preferences里你应该定义q个行拦截器的别名?/p>

row.intercept.marker=org.extremesite.intercept.MarkerIntercept

q样可以在行标{中使用拦截器MarkerIntercept了?/p>

<ec:row intercept="marker">

如果不清楚Preferences和TableTag定义语法请参考Preferences指南?/em>

Limit指南


1. 引言

在你需要处理大量数据时你应该考虑使用eXtremeTable的LimitҎ。Limitq个名字来自MySQL的limit 命oQLimit接口的目的就是如何对表的l果集进行limit处理。Limit实现知道当排序、过滤、分c导出时Q用户如何与表互怽用。有了这些信息你 能够用可能是最有效的方式显C正的qo、排序后的请求页面?/p>

ZCLimitҎ,我将要做的工作将分解为JSP、Controller、Service和DAO。这C了一U用分层的方式来处? Limit。你可以Ҏ自己的需要来增加或减层。本CZ也用了Spring框架来重新得C用Spring的JDBC取得的数据,因此你的代码看v来可能有点不同。eXtremeTable的一个特点就是不依赖M框架和容器?

1.1. JSP

Z使用LimitҎ,eXtremeTable需要用limit特定的RetrieveRowsCallback? FilterRowsCallback和SortRowsCallback接口。eXtremeComponents提供了每个接口的一个实玎ͼ可以单地通过讄每个属性gؓlimit来简单来使用?

<ec:table 
items="presidents"
retrieveRowsCallback="limit"
filterRowsCallback="limit"
sortRowsCallback="limit"
view="limit"
>
...

另外视图属性参照一个名为limit的定制视图。这是一个简单修攚w认eXtremeTable视图Q不包含最后页工具条的实现。这仅仅关系C是否能取得确切需要的行? 一些数据库例如Oracle和MySQL都提供了一U得到确定行的特性,但是Q其他的数据库例如:Sybase没有提供Ҏ。在我的CZ中我考虑最坏的情况你的数据库不支持q种Ҏ?/p>

即你的数据库不提供取得特定行的Ҏ,当你考虑用户如何和表协同工作ӞLimit仍然非常有意义。用户通常会对一些数据进行排序、过滤和分页? q个例子?5条数据构成一,W一需?5条数据,W二需?0条数据,W三需?5条数据,以此cL。在l过一D|间分后Q他们常怋用过滤来提炼数据? 即他们不这样做Q他们也必须在此之前对大量的数据q行分页Q这媄响效率。当然如果允许用LL后页Q那么所有的数据都将被取出,q将非常影响效率?/p>

1.2. Controller

提示QSpring框架的Controller和Struts框架的Action非常相像?/em>

controller首先需要创Z个Limit。ؓ了完成这个你需要得C些关于Context和LimitFactory的帮助?/p>

Context context = new HttpServletRequestContext(request);
LimitFactory limitFactory = new TableLimitFactory(context);
Limit limit = new TableLimit(limitFactory);

Context是一个处理取得属性的接口QLimitFactory使用Context来找出用户如何和eXtremeTable交互? 然后Limit使用LimitFactory来组装自己?/p>

Z初始化LimitQ它包含所有的有用的信息。这些信息包括数据将被如何排序和qoQ哪一将被显C和是否允许被导出?/p>

然而,Limit仍然需要得到行的信息,q样正确的信息页面才能被昄l用戗行信息包括开始行、结束行、当前显C? controller必须从service得到q些信息Q而Service从dao中得到这些信息。这里我只给出Controller端的代码?/p>

int totalRows = presidentsService.getTotalPresidents(limit.getFilterSet(), limit.isExported());
limit.setRowAttributes(totalRows, defaultRowsDisplayed);

limit需要得到所有的行来得到行的信息。service需要知道那些被qoQ不这些数据是否要导出。ؓ了设|行信息Q默认的一|C的行数需要被讄? q可以通过对TableTag的rowsDisplayed属性设|一个确定的数值来实现?/p>

现在我们只需要从services得到Collection数据?/p>

Collection presidents = presidentsService.getPresidents(limit.getFilterSet(), limit.getSort(), limit.getRowEnd());

因ؓlimit已经包含所有信息,q将十分Ҏ。所有需要做的就是传入过滤器Q排序和最后行的信息? 最后要做的是将Collections和totalRowq些信息传送回JSP以便eXtremeTable知道如何昄q些信息?/p>

request.setAttribute("presidents", presidents);
request.setAttribute("totalRows", new Integer(totalRows));

1.3. Service

service需要和daoq行交互来得到总行数和Collection?/p>

1.3.1. 取得总行?/h4>

controller需要到W一条信息就是总行数?/p>

public int getTotalPresidents(FilterSet filterSet, boolean isExported) {
String totalQuery = presidentsDao.getTotalPresidentsQuery();
String modTotalQuery = filterQuery(filterSet, totalQuery);
int totalRows = presidentsDao.getTotalPresidents(modTotalQuery);
if (isExported && totalRows > maxExportRows) {
totalRows = maxExportRows;
}
return totalRows;
}

service和dao一hqol果集,它的工作方式是在Where语句后面增加更多的AND语句来修Ҏ询字W串。ؓ此,你需要和Limit FilterSet一起工作?/p>

FilterSet是一个过滤器对象数组Q一个过滤器包括一个bean property和这个过滤器的倹{或者,单的说就是用h要过滤的行和他们输入的倹{这使得它非常容易交互。service只需要P代所有的 FilterSetq调用dao来拼接查询语句。(译者注Q过滤的实现方式是:在Where后面增加And语句来改变查询语句以辑ֈҎ据进行过滤的效果Q?/p>

private String filterQuery(FilterSet filterSet, String query) {
if (!filterSet.isFiltered() || filterSet.isCleared()) {
return query;
}

Filter filters[] = filterSet.getFilters();
for (int i = 0; i < filters.length; i++) {
Filter filter = filters[i];
String property = filter.getProperty();
String value = filter.getValue();
query = presidentsDao.filterQuery(query, property, value);
}

return query;
}

query修改包括了filter信息Q总行数。在一些情况下q就_Q但是当用户导出数据时仍然存在一个潜在的问题。ؓ了保持高? service不允许导Z个最大行数的数据?/p>

1.3.2. 取得Collection

controller需要到W二条信息就是Collection?/p>

public Collection getPresidents(FilterSet filterSet, Sort sort, int rowEnd) {
String patientsQuery = presidentsDao.getPresidentsQuery();
String modPatientsQuery = filterQuery(filterSet, patientsQuery);
modPatientsQuery = sortQuery(sort, modPatientsQuery);
modPatientsQuery = presidentsDao.limitQuery(rowEnd, modPatientsQuery);
return presidentsDao.getPresidents(modPatientsQuery);
}

和前面一Pservice和dao一hqol果集?/p>

另外query字符串需要扩展ORDER BY语句以便数据按照正确的方式进行排序。Sort包含一个bean property? sortOrder|正序q是逆序Q。service仅仅需要用Sort来调用dao?/p>

private String sortQuery(Sort sort, String query) {
if (!sort.isSorted()) {
String defaultSortOrder = presidentsDao.getDefaultSortOrder();
if (StringUtils.isNotBlank(defaultSortOrder)) {
return query + defaultSortOrder;
}

return query;
}

String property = sort.getProperty();
String sortOrder = sort.getSortOrder();

return presidentsDao.sortQuery(query, property, sortOrder);
}

query字符串最后需要的修改是增加数据库特别的指o来limit要被返回的l果集。这是limitQuery() Ҏ的作用?/p>

1.4. DAO

dao为service负责底层数据工作?/p>

1.4.1. 定义Query字符?/h4>

Z真正理解daoQquery字符串需要被展示?/p>

q就是得到数据的presidents query字符Ԍ

private final static String presidentsQuery = 
" SELECT " +
" president_id presidentId, " +
" first_name firstName, " +
" last_name lastName, " +
" nick_name nickName, " +
" concat(first_name, ' ',last_name) fullName, " +
" term, " +
" born, " +
" died, " +
" education, " +
" career, " +
" political_party politicalParty " +
" FROM presidents ";

q是得到总行数的query字符Ԍ

private final static String totalPresidentsQuery = 
" SELECT count(*) FROM presidents ";

1.4.2. Filter ?Sort Query 字符?/h4>

两个最有趣的方法就是过滤和排序?/p>

filter看v来像q样Q?/p>

public String filterQuery(String query, String property, String value) {
StringBuffer result = new StringBuffer(query);

if (query.indexOf("WHERE") == -1) {
result.append(" WHERE 1 = 1 "); //stub WHERE clause so can just append AND clause
}

if (property.equals("fullName")) {
result.append(" AND concat(first_name, ' ',last_name) like '%" + value + "%'");
} else if (property.equals("nickName")) {
result.append(" AND nick_name like '%" + value + "%'");
} else {
result.append(" AND " + property + " like '%" + value + "%'");
}

return result.toString();
}

filterQuery()Ҏ需要增加正的AND语句到query字符丌Ӏ?/p>

sort看v来非常类|

public String sortQuery(String query, String property, String sortOrder) {
StringBuffer result = new StringBuffer(query + " ORDER BY ");

if (property.equals("fullName")) {
result.append("concat(first_name, ' ',last_name) " + sortOrder);
} else {
result.append(property + " " + sortOrder);
}

return result.toString();
}

sortQuery()Ҏ需要增加正的ORDER BY语句到query字符丌Ӏ?/p>

1.4.3. Limit Query String

现在query字符串修改能够正的q行filter和sortQ它q需要修改以便只取页面显C相关的数据。MySQL为s the limit命o?/p>

public String limitQuery(int rowEnd, String query) {
return query + " limit " + rowEnd;
}

1.4.4. 取回总行数和Collection.

service需要的唯一东西是Q总行数和Collection?/p>

public Collection getPresidents(final String query) {
return jdbcTemplate.query(query, new ResultReader() {
List results = new ArrayList();
public List getResults() {
return results;
}

public void processRow(ResultSet rs)
throws SQLException {
President president = new President();
president.setPresidentId(new Integer(rs.getInt("presidentId")));
president.setFirstName(rs.getString("firstName"));
president.setLastName(rs.getString("lastName"));
president.setNickName(rs.getString("nickName"));
president.setFullName(rs.getString("fullName"));
president.setTerm(rs.getString("term"));
president.setBorn(rs.getDate("born"));
president.setDied(rs.getDate("died"));
president.setEducation(rs.getString("education"));
president.setCareer(rs.getString("career"));
president.setPoliticalParty(rs.getString("politicalParty"));
results.add(president);
}
});
}

public int getTotalPresidents(final String query) {
return jdbcTemplate.queryForInt(query);
}

ResultReader是一个帮助处理JDBC查询的SpringҎc,作ؓ一个callback来处理JDBC ResultSet。jdbcTemplate是对JDBCq接的抽象?/p>

1.4.5. 默认的Sort序

最后,q是service需要的默认sort序Q?/p>

public String getDefaultSortOrder() {
return " ORDER BY concat(first_name, ' ', last_name) ";
}

Preferences 指南


1. 引言

Z讄全局属性和讄Q你需要用PreferencesҎ,它现在用一个属性文件来实现。本文档很好地介绍如何在web.xml里设|PreferencesQ? 以及一些需要被定义的通用属性。在q里我非怹意介l一些关于Preferences的进一步用法?/p>

所有标{ֱ性表CZ个可插接的接口,它可以通过l出实现的全路径来设|。这为插接实现提供了一条便利的途径。当然这存在一些ؓq长术语的设计和l护的考虑? W一Q对你的接口实现q行编码;W二Q如果你需要在别的JSP中用到同一个接口实玎ͼ你需要拷贝你全\径。解册两个问题的有效办法就是在Preferences中声明一切?/p>

1.1. Preferences?/h3>

下面列出的是可以在Preferences中申明的所有接口。Tag列展C的是eXtremeTable的标{,Attribute 列展C的是相x{对应属性。Interface列展C的是需要被实现的Java接口。Preference Key列展C的? Preferences里对应的健?/p>

Tag Attribute Interface Preference Key
TableTag filterRowsCallback org.extremecomponents.table.callback.FilterRowsCallback table.filterRowsCallback
TableTag intercept org.extremecomponents.table.intercept.InterceptTable table.intercept
TableTag retrieveRowsCallback org.extremecomponents.table.callback.RetrieveRowsCallback table.retrieveRowsCallback
TableTag sortRowsCallback org.extremecomponents.table.callback.SortRowsCallback table.sortRowsCallback
TableTag state org.extremecomponents.table.state.State table.state
TableTag view org.extremecomponents.table.view.View table.view
RowTag intercept org.extremecomponents.table.intercept.InterceptRow row.intercept
ColumnTag calc org.extremecomponents.table.calc.Calc column.calc
ColumnTag cell org.extremecomponents.table.cell.Cell column.cell
ColumnTag filterCell org.extremecomponents.table.cell.Cell column.filterCell
ColumnTag headerCell org.extremecomponents.table.cell.Cell column.headerCell
ColumnTag intercept org.extremecomponents.table.intercept.InterceptColumn column.intercept
ExportTag intercept org.extremecomponents.table.intercept.InterceptExport export.intercept
ExportTag view org.extremecomponents.table.view.View export.view
ExportTag viewResolver org.extremecomponents.table.filter.ViewResolver export.viewResolver

提示Q当在写作本指南的时候,我意识到我忘C让标{ColumnsTag的autoGenerateColumns 属性和Preferences协同工作。这在下一版修正?/em>

1.2. 指定Preference别名

上表展示了如何声明preference键,但是没有解释如何指定有意义的别名。如果你注意到preference键提供了一致的语法 tag.attributeQ指定键的别名仅仅是在它的基上进行扩展。它的语法ؓQ?tag.attribute.alias?/p>

eXtremeTable提供了一个名为RowCountCell定制的cellQ它的作用是现实当前的行数。我在Preferences里用ColumnTag cell声明来示范RowCountCell的用?/p>

首先通过实现Cell接口或者扩展AbstractCell来编写具体的实现cR?/p>

public class RowCountCell extends AbstractCell {
protected String getCellValue(TableModel model, Column column) {
int rowcount = ((model.getLimit().getPage() - 1)
* model.getLimit().getCurrentRowsDisplayed())
+ model.getRowHandler().getRow().getRowCount();
return String.valueOf(rowcount);
}
}

然后在Preferences (属性文?q行声明q给出别名?span class="emphasis">eXtremeTable在一个Preferences里保存所有的配置信息Q你可以通过使用本地 Preferences的来覆盖M的这些属性?/em>

RowCountCell默认的别名是rowCountQ?/p>

column.cell.rowCount=org.extremecomponents.table.cell.RowCountCell

在ColumnTag中通过别名引用CellQ?/p>

<ec:column alias="count" cell="rowCount"/>

现在你可以通过rowCount来引用这个CellQ如果包名改变了你只需要对Preferencesq行修改?/p>

提示Q本CZ中我使用了ColumnTag的别名属性。别名属性应用在有两列用同LpropertyQ也应用在列不直接和列的 bean property兌的情况下。本CZ属于这U情c?/em>



Lucky 2006-02-26 10:00 发表评论
]]>
վ֩ģ壺 ŮɫŷŮ| ޾Ʒ99þ| һѵӰ| vaþþþ| þøԴվѿ| ޾Ʒ˳߲va| ޾ƷA߹ۿ| þùѸ| ŮˬƵѲ| ۺ߹ۿƵ| ҹվѰ߹ۿ| ɫƵվ| av뾫Ʒ4| avһ߹ۿ| ѵȫһ¼| ޹ƷŮþþþ| avƷ| ѹۿһëƬ| 2021Ƶ| ϸëƬ| ޹Ʒպ߹ۿ| ĻþþƷ1| պƷר| ѾƷ99þùۺϾƷ| һ| ޹պ߳ѿ| ˾޾ƷӰwww| ԸŮƵվҹ | ձɫƵ| ޾Ʒ| ˾þô߽| ޾Ʒmv߹ۿվ| ڵĤѿ| | ˬˬƵ߹ۿ| ձaƵ| ޾Ʒר߲| Ƶ߹ۿ| ޸Ƶһ| ¶ۺɫ| ޾ƷһۺϾԴ |