??xml version="1.0" encoding="utf-8" standalone="yes"?>
//排序
Map map = sortMyEntity(myList);
//得到排序后的List
myList = convertMapToList(map);
/**
*sortMyEntityҎ的实?br />
*/
public Map sortMyEntity(List myList) {
Map sortMap = new TreeMap();
for (int i = 0; i < myList.size(); i++) {
MyEntity entity = (MyEntity)myList.get(i);
String key = entity.getA().toString() + ":" + entity.getE().toString() + ":" + entity.getB().toString();
sortMap.put(key, entity);
}
return sortMap;
}
讄WEB应用E序描述Wweb.xml里的<session-timeout>元素。这个g分钟?br />单位Qƈ覆盖weblogic.xml中的TimeoutSecs属?br /> <session-config>
<session-timeout>54</session-timeout>
</session-config>
此例表示Session在54分钟后过?br />?lt;session-timeout>讄为-2Q表C将使用在weblogic.xml中设|的
TimeoutSecsq个属性倹{?br />?lt;session-timeout>讄为-1Q表CSession永不过期,而忽略在
weblogic.xml中设|的TimeoutSecs属性倹{?br />该属性值可以通过console控制台来讄
2 weblogic.xml
讄WebLogicҎ部v描述Wweblogic.xml?lt;session-descriptor>元素?br />TimeoutSecs属性。这个gUؓ单位
<session-descriptor>
<session-param>
<param-name>TimeoutSecs</param-name>
<param-value>3600</param-value>
</session-param>
</session-descriptor>
默认值是3600
Coofucoo http://blog.csdn.net/coofucoo/archive/2006/03/17/626909.aspx
RiA是Rich Internet Application的羃写?br />“Rich”代表功能强大,高交互性,高用户体验?br />“Internet”代表方ѝ应用程序部|方便,用户使用方便。跨pȝQ跨语言?/p>
其实RiA实际上一U基于Web的C/S架构Q我UC为C/B/SQ。由于有一个客LQ所以RiA应用可以提供强大的功能,让用户体验到高交互性,高用户体验。同ӞRiA又是ZInternet览器的应用Q所以,用户使用RiA非常方便。理x_用户使用RiA应当像现在用普通网一hѝ用户不需要安装Q何的客户端YӞ只要拥有览器。当用户通过览器发出指令,希望q行某种RiA应用E序Ӟ一切都会飞快的建立在客L机器上,像你在Web上点M个页面一栗?/p>
目前Q典型的RiA的代表有如下几种技术:
MS ClickOnce
Sun Java Web Start
Adobe Flash
Ajax
RiA实际上代表的是一U回归?/p>
最开始流行的C/Sl构Q因为功能强大,而且范围有限Q不需要害怕部|问题。之后随着用户的增加,部v问题来大Q导致B/S模式的生?br />B/S模式虽然功能有限Q但是却使用非常方便。从长期来看Q方便的作用q是非常巨大的。功能可以不断增强,但是如果不方便,吓走所有的客户。实际上观察一下Web的发展,׃发现Q如今百花齐攄Web开发技术,其目的都是ؓ了提高B/S架构的交互性,让他更能适应需要而已?br />不过Q随着目前来多的应用需要一直到Web上,Zl于发现B/S模式的缺炏V各U技术上的硬性问题均限制着B/S模式的发展。从最基本的请?相应模型QHTTP协议Q到所有负载均q行在服务器上的事实Q让我们q切需要一U方式来提高Web的交互能力,但同时又不能丧失它的使用方便性?br />于是QRiA诞生了。RiA是Z览器的C/Sl构。它部分的服务器负载{Ud客户端,同时又不会׃用和部v上的方便性?br />所以说QRiA是一ơ回归,只不q这ơ回归我们没有原C动,相反Q我们找C最佳结合点Q也是C/S和B/S的交集?/p>
?/span> ?/span> |
?/span> q?/span> |
/bin |
存放 windows ?/span> Linux q_上启动和关闭 Tomcat 的脚本文?/span> |
/conf |
存放 Tomcat 服务器的各种配置文gQ其中最重要的是 server.xml |
/server |
包含三个子目录: classes ?/span> lib ?/span> webapps |
/server/lib |
存放 Tomcat 服务器所需的各U?/span> jar 文gQ只能被Tomcat服务器访问) |
/server/webapps |
存放 Tomcat 自带的两?/span> WEB 应用Q?/span> admin 应用?/span> manager 应用 |
/common/lib |
存放 Tomcat 服务器以及所?/span> web 应用都可以访问的 jar 文g |
/shared/lib |
存放所?/span> web 应用都可以访问的 jar 文gQ但是不能被 Tomcat 服务器访问) |
/logs |
存放 Tomcat 的日志文?/span> |
/webapps |
当发?/span> Web 应用Ӟ默认情况下把 Web 应用文g放于此目?/span> |
/work |
Tomcat 把由 JSP 生成?/span> Servlet 放于此目录下 |
|
|
/helloapp |
Web 应用的根目录Q所有的 jsp 文g?/span> html 文g都在此目录下 |
/helloapp/WEB_INF |
存放 web 发布时的描述文g web.xml |
/helloapp/WEB_INF/class |
存放各种 class 文gQ?/span> Servlet 文g也存放于此目录下?/span> |
/helloapp/WEB_INF/lib |
存放各钟 Web 应用所需要的 jar 文g。比如可以存?/span> JDBC 驱动E序?/span> JAR 文g |
|
|
name |
指定虚拟L名字 |
debug |
指定日志U别 |
appBase |
指定虚拟L目录Q可以是l对目录Q也可以指定相对?/span> <CATALINA_HOME> 的相对目录。如果此Ҏ有设定则默认的是 <CATALINA_HOME>/webapps ?/span> |
unpackWARs |
如果此项讄?/span> true Q?/span> 表示把 Web 应用?/span> WAR 文g先展开为开攄录结构后再运行。如果ؓ false , 则直接运?/span> WAR 文g |
autoDeploy |
如果此项讄?/span> true Q?/span> 表示?/span> Tomcat 服务器处于运行状态时Q能够监?span style="FONT-SIZE: 9pt; COLOR: blue">appBase下的文gQ?/font> 如有新的 Web 加入q来Q则会自动发布这?/span> Web 应用?/span> |
alias |
指定虚拟L的别名,可以指定多个别名?/span> |
deployOnStarup |
如果此项设ؓ trueQ?/span> 则表C?/span> Tomcat 服务器启动时会自动发?/span> appBase 目录下的所?/span> Web 应用。如?/span> Web 应用?/span> server.xml 中没有相应的 <context> 元素 , 则将采用默认?/span> Context 配置?/span> deployOnStarup 的默认设|是 true |
|
|
path |
指定 Web 应用?/span> URL 入口 |
docBase |
指定 Web 应用的文件\径,可以l定l对路径Q也可以是相对于 Host ?/span> appBase 属性的相对路径Q?span style="COLOR: red">参见上面 Host ?/span> appBase 属?/span> Q。如?/span> Web 应用采用开攄录结构,则指?/span> Web 应用?/span> 根目录;如果 Web 应用是个 WAR 文gQ则指定 WAR 文g的\径?/span> |
reloadable |
如果?/span> true ,Tomcat 服务器在q行状态下会监视在 WEB-INF/class ?/span> WEB-INF/lib ?/span> class 文g的改动。如果检到?/span> class 文g更新Q服务器会自动蝲?/span> Web 应用?/span> |
|
|
<servlet-name> |
定义 Servlet 的名字?/span> |
<servlet-class> |
指定实现q个 Servlet 的类?/span> |
<init-param> |
定义 Servlet 的初始化参数Q包括参数名和参数|Q一?/span> <servlet> 元素中可以有多个 <init-param> 元素?/span> |
<load-on-startup> |
指定?/span> Web 应用启动Ӟ装蝲 Servlet 的次序。当q个gؓ正数或零Q?/span> Servlet 容器先加载数值小?/span> Servlet Q再依次加蝲其他数值大?/span> Servlet 。如果这个gؓ负数或没有设?/span>Q?/span> Servlet 在 Web 客户首次讉Kq个 Servlet 时加载它?/span> |
Tomcat
作ؓ
Servlet
容器
,
负责把客戯求传送给
Servlet
q把响应l果q回l客?/span>
.
当客戯求某?/span>
Servlet
?/span>
,
Servlet
容器首先创Z?/span>
ServletRequest
对象?/span>
ServletResponse
对象
(
?/span>
ServletRequest
对象中封装了客户h信息
),
然后
Servlet
容器?/span>
ServletRequest
对象?/span>
ServletResponse
对象传给客户所h?/span>
Servlet
,
Servlet
把响应结果写?/span>
ServletResponse
?/span>
,
最后由
Servlet
容器把响应结果传l客?/span>
.
所有配|元素分?/span>
4
c?/span>
:
1.
层cd?/span>
:
<
Server>
元素?/span>
<Service>
元素
.
2.
q接器类元素
:
<Connector/>
,
客户与服务器之间的通信接口
.
3.
容器cd?/span>
:
<Engine>
<Host>
<Context>
,
用于处理客户h
.
4.
嵌套cd?/span>
:
?/span>
<
Logger> <Valve> <Realm>,
代表可以加入到容器中的组?/span>
.
Tomcat
各个lg间的嵌套关系如下图所C?/span>
:
Tomcat各个lg间响应客戯求的q程如下图所C?/span>:
Tomcat
的工作模?/span>
.
1.
独立?/span>
Servlet
容器
.(
Tomcat
的默认工作模?/span>
)
2.
q程内的
Servlet
容器
.(
与其?/span>
Web
服务器集?/span>
)
3.
q程外的
Servlet
容器
.(
与其?/span>
Web
服务器集?/span>
)
现在很难说?br />jsf在各大家的支持下Q正在茁壮成长,tapestryq没有看到成Z的q象Qajax虽然热火Q但q不是非常成熟?/p>
q前趋势看,感觉jsf会成ؓL?br />
2006 q?1 ?04 ?/p>
本文中,作?Anand Joshi 使用 JSF 框架中的设计模式阐释?JavaServer?Faces (JSF) 体系l构。他讨论?JSF 体系l构中用的 GoF 设计模式Q以及这些模式在 JSF 框架 中的作用。Q何对设计模式?JSF 体系l构有一定了解的人都能从 Anand 详细的介l中有所收获?读者应该对 GoF 设计模式?JSF 技术有 很好的了解?/blockquote>设计模式可以帮助用户在更高层ơ上抽象l节Q更好地理解体系l构。如果比较熟?GoF 设计模式?JavaServer Faces (JSF) 框架Q本文可以帮助您z察 JSF 框架中用的设计模式Q深入理解其工作原理?/p>
本文探讨?JSF 框架中 用的设计模式。详l讨论的设计模式包括 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy 、Template Method ?Observer 模式?
设计模式?JavaServer Faces (JSF) 技?
首先要地介绍一下模式和 JSF 框架?/p>
- 模式?/b>设计模式是对问题和解x案进行抽象的普遍适用?Ҏ。因为模式是所有开发h员和架构师公认的Q所以模式可以节U时间和资源。用外行话来_模式是关于某个人所q的问题的l过?证的解决Ҏ。模式可以重用,重用使得解决Ҏ更健壮?
- Java Server Faces?/b> JSF 体系l构是一U?Web 应用E序框架?它是 Java Community Process (JCP) 推动的,有望成ؓ Web 应用E序开发的标准框架。目前用于开?Web 应用E序的框架有 50 多个Q这 说明q切需要实现框架的标准化,q正?JSF 框架的目标!
现在我们来讨?JSF 体系l构中的各种设计模式。本文将详细讨论 Singleton、Model-View-Controller?Factory Method、State、Composite、Decorator、Strategy、Template Method ?Observer 设计模式。我分析每U模式的用途及其在 JSF 框架中的作用?/p>
Singleton 模式的目的是保证cd有一个实例被加蝲Q该实例?供一个全局讉K炏V当启动h JSF 支持?Web 应用E序ӞWeb 容器初始化一?FacesServlet 实例。在q个阶段QFacesServlet Ҏ?Web 应用E序实例?Application ?LifeCycle 实例一ơ。这些实例就采用众所周知?Singleton 模式Q通常只需要该cd的一个实例?
使用 JSF ?Web 应用E序只需?Application ?LifeCycle cȝ一个实例。LifeCycle 理多个 JSF h的整个生命期。因为其 状态和行ؓ在所有请求之间共享,q些对象采用 Singleton 模式合情合理。LifeCycle l护?PhaseListeners 也是 Singleton 模式的?PhaseListeners 由所?JSF h׃n。在 JSF 框架中可以广泛?Singleton 模式Q以减少内存占用和提供对象的全局讉K?NavigationHandlerQ用于确定请求的逻辑l果Q和 ViewHandlerQ用于创图)也是使用 Singleton 模式的例子?/p>
MVC 模式的目的是从数据表C(ViewQ中数据( ?ModelQ分d来。如果应用程序有多种表示Q可以仅替换视图层而重用控制器和模型代码。类似的Q如果需要改变模型,可以在很大程?上不改变视图层。控制器处理用户动作Q用户动作可能造成模型改变和视图更新。当用户h一?JSF 面Ӟh发送到 FacesServlet?FacesServlet ?JSF 使用的前端控制器 servlet。和其他很多 Web 应用E序框架一PJSF 使用 MVS 模式消除视图和模型之间的耦合。ؓ 了集中处理用戯求,控制?servlet 改变模型q将用户D到视图?/p>
FacesServlet ?JSF 框架中所有用戯求都要经q的控制?元素。FacesServlet 分析用户hQ用托?bean Ҏ型调用各U动作。后収ͼbackingQ或托管QmanagedQbean 是该模型的例子。JSF 用户界面QUIQ组件是视图层的例子。MVC 模式把Q务分解给h不同技能的开发h员,使这些Q务能够同时进行,q样 GUI 设计人员可?使用丰富?UI lg创徏 JSF 面Q同时后端开发h员可以创建托?bean 来编写专门的业务逻辑代码?/p>
Factory Method 模式的目的是定义一个用于创建对象的接口Q但是把对象实例化推q到子类中。在 JSF 体系 l构中,Factory Method 模式被用于创建对象。LifeCycleFactory 是一个创建和q回 LifeCycle 实例的工厂对象。LifeCycleFactory ?getLifeCycle (String LifeCycleId) Ҏ采用 Factory Method 模式Q根?LifeCycleId 创徏Q如果需要)q返?LifeCycle 实例。自?义的 JSF 实现可以重新定义 getLifeCycle 抽象Ҏ来创定义?LifeCycle 实例。默认的 JSF 实现提供默认?LifeCycle 实例。此?Q对于每?JSF hQFacesServlet 都从 FacesContextFactory 得到 FacesContext。FacesContextFactory 是一个抽象类Q公开?getFacesContext APIQJSF 实现提供?FacesContextFactory ?getFacesContext API 的具体实现。这是另外一个?Factory Method ?式的例子Q具体的 FacesContextFactory 实现创徏 FacesContext 对象?/p>
State 模式的目的是在表C状态的不同cM间分配与状态有关的逻辑。FacesServlet ?LifCycle 实例调用 execute ?render Ҏ。LifeCycle 协调不同?Phrase 以便执行 JSF h。在q里 JSF 实现遵循了 State 模式。如果没有用这U模式, LifeCycle 实现׃被大量的条gQ即 “if?语句Q搅得一塌糊涂。JSF 实现为每个状态(或阶D)创徏单独的类q调?step。phase 是一 个抽象类Q定了每?step 的公共接口。在 JSF 框架中定义了六个 phraseQ即 stepQ:RestoreViewPhase、ApplyRequestValues?ProcessValidationsPhase、UpdateModelValuesPhase、InvokeApplicationPhase ?RenderResponsePhase?/p>
?State 模式中, LifeCycle ?FacesContext 对象传递给 phase。每个阶D|状态改变传递给它的上下文信息,然后讄 FacesContext 本n中的标志表明?一个可能的步骤。JSF 实现在每个步骤中改变其行为。每个阶D都可以作ؓ下一个阶D늚起因。FacesContext 有两U标?renderResponse ?responseComplete 可以改变执行的顺序。每个步骤执行完成后QLifeCycle 查上一阶段是否讄了这些标志。如果设|了 responseCompleteQLifeCycle 则完全放弃请求的执行。如果经q某个阶D后讄?renderResponse 标志QJSF ׃跌剩下的阶D而直?q入 Render Response 阶段。如果这两个标志都没有设|,LifeCycle ׃按顺序l执行下一步?/p>
Composite 模式让客户代码能够统一处理复合对象和基本对象。复合对象是基本对象的容器。在W一阶段QRestore View 阶段Q和最后一个阶D(Render Response 阶段Q,使用 JSF UI lg构?UI View。UIComponentBase 是 Composite 模式?Component 抽象cȝ一个例子。UIViewRoot ?Composite c,?UIOutputQ比方说Q就是叶子(或者基本类Q。UIComponentBase cd义了 叶子和复合对象的公共ҎQ如~码/解码值和子节点管理函数。子节点理函数Q如 getChildrenQ对于叶子节点返回空列表Q对于复合节?则返回其子节炏V?/p>
Decorator 模式的目的是不通过子类化动态扩展对象的行ؓ。JSF 框架有很多扩展点Q即可插入机Ӟ。JSF 实现可?Decorator 模式替换默认?PropertyResolver、VariableResolver、ActionListener 、NavigationHandler、ViewHandler ?StateManager。通常自定义实现接受通过构造函C递给它的默认实现的引用。自定义实现仅仅改写 功能的一个子集,而将其他功能委托l默认实现。如果希望实现自定义?ViewHandlerQ改写默?ViewHandler 实现?calculateLocale ?法,可以?清单 1 那样~写
CustomViewHandler
c:
清单 1. CustomViewHandler 片段
public class CustomViewHandler extends ViewHandler { public CustomViewHandler(ViewHandler handler) { super(); oldViewHandler = handler; } private ViewHandler oldViewHandler = null; public void renderView (facesContext context, UIViewRoot view) { //delegate method to oldViewHandler oldViewHandler.renderView(context, view); } //custom implementation of calculateLocale public Locale calculateLocale(FacesContext context) { } }
Strategy 模式的目的是装不同的概cJSF ?枉?Strategy 模式使用委托实现模型呈现 UI lg。JSF 技术支持两U呈现模型。在直接实现模型中,UI lgҎ到的h中的数据q行 解码Q然后编码这些数据进行显C。在委托实现模型中,解码和编码操作委托给和组建关联的专门呈现器。后一U模型利用了 Strategy 设计 模式Q比直接实现更灵zR在 Strategy 模式中,不同的法装在单独的对象中,从而可以动态地改变法。JSF 实现可以用已有的 renderkit 实例注册另外的呈现器Q当应用E序启动的时候,JSF 实现d配置文g这些呈现器?UI lg联系在一赗?/p>
Template Method 模式的目的是变化的步骤推迟到子c?中,而在父类中定义那些固定的法步骤。JSF 框架通过 PhraseListeners 展现?Template Method 模式提供的功能。采?Template MethodQ或?“hook”)使得 Web 作者可以ؓ不同阶段之间的可选步骤提供实玎ͼ而主要阶D仍然和 JSF 框架的定义一致。JSF 框架提供?PhaseListenersQ概念上cM?Template Method 模式中的可变步骤。JSF 框架有六个预定义的阶D,在每个阶D之_Web 作者可以实?PhaseListeners 来提供类g Template Method hook ?hook。事实上Q这U结构比 Template Method 模式更具有扩展性。可以通过注册 PhraseId ?ANY_PHRASE ?PhaseListener 在每个阶D后提供 hook。如?PhaseId ?ANY_PHASEQJSF 实现׃在每个阶D之前和之后?用该 PhaseListener。JSF 框架中的实现略有不同Q因为可以根本没?PhaseListenerQ但是在 Template Method 模式中,子类通常重新定义 父类中抽象的可变步骤?/p>
Observer 模式的目的是当目标对象的状态改变时自动通知所有依 赖的对象Q即观察器)。JSF ?UI lg中实C Observer 模式。JSF 有两cdZӞActionEvent ?ValueChangedEvent。ActionEvent 用于定用户界面lgQ如按钮Q的ȀzR当用户单击按钮ӞJSF 实现通知d到该按钮上的一个或多个动作监听E序。于是该按钮被激z?Q或者说按钮Q主体)的状态改变了。添加到按钮上的所有监听程序(卌察器Q都收到通知该主体状态已l改变。类似的Q当输入 UI lg 中的值改变时QJSF 实现通知 ValueChangeListener?/p>
JSF 框架利用?Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy?Template Method ?Observer 设计模式。因为它的体pȝ构徏立在已经验证的设计模式的基础上,q是一个健壮的框架Q模式在 JSF 框架?得到了很好的利用?
学习
- 您可以参阅本文在 developerWorks 全球?点上?英文原文?br />
- 误?Gang of Four Design Patterns q一步了解这些设计模式?
- 请阅??a >怀疑论者的 JSF: JSF 应用E序的生命周?/font>?q一步了?JavaServer Faces 框架QdeveloperWorksQ?005 q?3 月)?
- 误?developerWorks Java 技术专?/font>。这里专门发 表各U基?Web ?Java 的解x案的文章和教E?br />
获得产品和技?/b>
- ?Sun Developer Network 免费 下蝲 JSF?
- 下蝲 IBM Rational Software Architect 的免费试用版?
讨论
- 参与 developerWorks blogs q加?developerWorks C?br />
- 参与 Sun Developer Network 上的 Java 论坛 —?JavaServer Faces Technology?
Anand 是一?Sun 认证的企业架构师Q几q来一直研I?Web 技术。他?WebSphere 理控制 台应用程序的设计和开发做了多斚w的A献。Anand 曄?IBM 国工作q几q_目前?IBM 印度工作?/p>
]]>