﻿<?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-Asktalk-随笔分类-Struts/JSF</title><link>http://www.blogjava.net/asktalk/category/2808.html</link><description>&lt;span class="STYLE3"&gt;天行健，君子以自强不息！&lt;/span&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 27 Dec 2007 08:57:29 GMT</lastBuildDate><pubDate>Thu, 27 Dec 2007 08:57:29 GMT</pubDate><ttl>60</ttl><item><title>高性能分页标签extremeTable的Limit设计架构思想剖析</title><link>http://www.blogjava.net/asktalk/archive/2007/12/26/170625.html</link><dc:creator>Asktalk</dc:creator><author>Asktalk</author><pubDate>Wed, 26 Dec 2007 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/asktalk/archive/2007/12/26/170625.html</guid><wfw:comment>http://www.blogjava.net/asktalk/comments/170625.html</wfw:comment><comments>http://www.blogjava.net/asktalk/archive/2007/12/26/170625.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/asktalk/comments/commentRss/170625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/asktalk/services/trackbacks/170625.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">这是一个目前最好的一个开源分页标签的实现</span>---extremeTable<span style="font-family: 宋体">标签。今天谈谈它的</span>Limit<span style="font-family: 宋体">的设计架构思想。</span></p>
<p><span style="font-family: 宋体">这个设计很通用，经过作者的多次重构，现在extremeTable的架构非常漂亮。这个标签现在缺点是有些参数对mvc控制器屏蔽了，应提供一致的对外接口。不过整体上设计还是很精致的，面向对象来处理 html元素，与spring非常的默契</span><span style="font-family: 宋体">，非常便于开发和测试。</span></p>
<h1><span style="font-family: 宋体">类图关系<br />
<img height="680" alt="" src="http://www.blogjava.net/images/blogjava_net/asktalk/limit.png" width="776" border="0" /><br />
</span></h1>
<h1 style="margin-left: 18pt; text-indent: -18pt">1，&nbsp;<span style="font-family: 宋体">工厂</span>LimitFactory</h1>
<p>TableLimitFactory<span style="font-family: 宋体">，</span>AbstractLimitFactory<span style="font-family: 宋体">，</span>LimitFactory</p>
<p>TableLimitFactory<span style="font-family: 宋体">是最终实现的工厂，它</span>extends<span style="font-family: 宋体">了</span>AbstractLimitFactory<span style="font-family: 宋体">抽象类，</span>AbstractLimitFactory <span style="font-family: 宋体">类</span>implements<span style="font-family: 宋体">了</span>LimitFactory<span style="font-family: 宋体">接口。</span></p>
<p>TableLimitFactory<span style="font-family: 宋体">主要是用来实例化，通过构造函数传入参数。同时创建</span>Registry<span style="font-family: 宋体">来完成</span>jsp<span style="font-family: 宋体">页面参数传入</span>Registry<span style="font-family: 宋体">。当然还有一个功能就是从</span>web.xml<span style="font-family: 宋体">的配置文件读取一些全局参数。首先读取配置文件参数，然后根据参数创建</span>LimitRegistry<span style="font-family: 宋体">对象。</span></p>
<p>this.registry = new LimitRegistry(context, tableId, prefixWithTableId, state, stateAttr);</p>
<p>AbstractLimitFactory<span style="font-family: 宋体">主要是用来获取</span>jsp<span style="font-family: 宋体">页面上设置的参数，比如分页的信息（第几页，起始行，结束行，每页显示行数，查询条件，排序条件等），当然他是通过工具类</span>Registry<span style="font-family: 宋体">来实现。</span></p>
<h1 style="margin-left: 18pt; text-indent: -18pt">2，&nbsp;Limit</h1>
<p>TableLimit<span style="font-family: 宋体">，</span>Limit<span style="font-family: 宋体">。其主要作用是一个参数参数器，就是把</span>Registry<span style="font-family: 宋体">对象的参数传入</span>TableLimit<span style="font-family: 宋体">，考虑到分层吧，</span>TableLimit<span style="font-family: 宋体">是该标签和</span>action<span style="font-family: 宋体">通信的桥梁。就像我们的</span>j2ee<span style="font-family: 宋体">项目</span>vo<span style="font-family: 宋体">是</span>dao<span style="font-family: 宋体">和</span>struts<span style="font-family: 宋体">等</span>view<span style="font-family: 宋体">等数据传输工具。</span></p>
<h1 style="margin-left: 18pt; text-indent: -18pt">3，&nbsp;Preferences</h1>
<p>TableProperties<span style="font-family: 宋体">，</span>Properties <span style="font-family: 宋体">主要是来实现从</span>web.xml<span style="font-family: 宋体">配置的文件中读取配置的一些全局参数。</span></p>
<p>InputStream input = this.getClass().getResourceAsStream(preferencesLocation);</p>
<p>if (input != null) {</p>
<p style="text-indent: 15.75pt">properties.load(input);</p>
<p>}</p>
<p><span style="font-family: 宋体">其中</span>preferencesLocation<span style="font-family: 宋体">是路径，在</span>TableLimitFactory<span style="font-family: 宋体">初始化时候，</span><span style="font-family: 宋体">通过工具类</span>TableModelUtils.getPreferencesLocation(context)<span style="font-family: 宋体">获取。</span></p>
<p><span style="font-family: 宋体">这个设计也是大多数需要配置文件的系统常用的方法。</span></p>
<h1 style="margin-left: 18pt; text-indent: -18pt">4，&nbsp;Registry</h1>
<p>LimitRegistry<span style="font-family: 宋体">，</span>AbstractRegistry<span style="font-family: 宋体">，</span>Registry</p>
<p><span style="font-family: 宋体">这个体系结构和上面的工厂模式一样，就是</span>LimitRegistry<span style="font-family: 宋体">主要是用来实例化，通过构造函数传入参数。</span>AbstractRegistry<span style="font-family: 宋体">是实际实现类，获取</span>jsp<span style="font-family: 宋体">表单提交的参数，并提供</span>getter<span style="font-family: 宋体">方法供</span>Limit<span style="font-family: 宋体">来使用。</span>Registry<span style="font-family: 宋体">是一个接口。</span></p>
<p><span style="font-family: 宋体">所以这设计模式，我们可以来学习，</span></p>
<p><span style="font-family: 宋体">经典表述：<span style="color: red">类</span></span><span style="color: red">—</span><span style="color: red; font-family: 宋体">抽象类</span><span style="color: red">—</span><span style="color: red; font-family: 宋体">接口</span></p>
<p style="margin-left: 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">类：初始化，定义构造函数，传入参数。</span></p>
<p style="margin-left: 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">抽象类：定义业务方法在此。</span></p>
<p style="margin-left: 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l&nbsp;</span><span style="font-family: 宋体">接口：定义接口方法，这个不用多说。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">（作者：asktalk&nbsp;&nbsp; 来自&nbsp;<a href="http://www.blogjava.net/askltak">http://www.blogjava.net/askltak</a> 原创文章，转载请注明出处）</p>
<img src ="http://www.blogjava.net/asktalk/aggbug/170625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/asktalk/" target="_blank">Asktalk</a> 2007-12-26 16:17 <a href="http://www.blogjava.net/asktalk/archive/2007/12/26/170625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>