??xml version="1.0" encoding="utf-8" standalone="yes"?>久久一区二区三区电影,国产无套粉嫩白浆在线2022年,日本中文字幕中出在线http://www.aygfsteel.com/atiger06/category/24406.htmlzh-cnFri, 27 Jul 2007 00:42:29 GMTFri, 27 Jul 2007 00:42:29 GMT60starting struts2 译 W??架构的目?/title><link>http://www.aygfsteel.com/atiger06/archive/2007/07/25/132352.html</link><dc:creator>leefoo</dc:creator><author>leefoo</author><pubDate>Wed, 25 Jul 2007 09:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/atiger06/archive/2007/07/25/132352.html</guid><wfw:comment>http://www.aygfsteel.com/atiger06/comments/132352.html</wfw:comment><comments>http://www.aygfsteel.com/atiger06/archive/2007/07/25/132352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/atiger06/comments/commentRss/132352.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/atiger06/services/trackbacks/132352.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family: 宋体;">对基于特定代码的应用来说Q其架构目标很难定下来。在开始开发之前制定文档化的目标,q种情况只是I想Q因Z旦开始开发,代码通常׃(x)朝一个与架构目标不同的方向前q,q样实际上最后的应用特征是基于代码而不是架构。这U情况很隑֏现ƈ且是开发过E中逐步形成的物而不是计划的产物Q其l果׃(x)造成不同的程序包?qing)特性之间的不一致?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">本章我们会(x)讨论</span><span lang="EN-US">5</span><span style="font-family: 宋体;">U基?/span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">代码的特征。从</span><span lang="EN-US">2002</span><span style="font-family: 宋体;">q以来,q些架构元素随着代码的发展仍然存?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">从开始的</span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">Q经q?/span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">分解?/span><span lang="EN-US">WebWork2</span><span style="font-family: 宋体;">?/span><span lang="EN-US">XWork</span><span style="font-family: 宋体;">Q一直到最后{变ؓ(f)</span><span lang="EN-US">Struts2.</span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><strong><span lang="EN-US">4</span></strong><strong><span style="font-family: 宋体;">?/span><span lang="EN-US">1 </span></strong><strong><span style="font-family: 宋体;">概念的分?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal"><span style="font-family: 宋体;">作ؓ(f)一?/span><span lang="EN-US">web</span><span style="font-family: 宋体;">应用开发h员,有多U别的功能需要进行阐qͼ(x)</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">1</span><span style="font-family: 宋体;">Q在</span><span lang="EN-US">request/response</span><span style="font-family: 宋体;">周期期间Q需要对作ؓ(f)其核心目标的每个</span><span lang="EN-US">action</span><span style="font-family: 宋体;">的逻辑q行说明Q?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">2</span><span style="font-family: 宋体;">Q访问或拥有可以用来执行</span><span lang="EN-US">action</span><span style="font-family: 宋体;">逻辑或访问资源的业务对象Q?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">3</span><span style="font-family: 宋体;">Q编译、映和转换Q以便把</span><span lang="EN-US">HTML</span><span style="font-family: 宋体;">中基于字W的D{化ؓ(f)原始cdQ以?qing)把视图对象转换Z务对象或数据表来q行表示Q?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">4</span><span style="font-family: 宋体;">Qؓ(f)应用中分l的</span><span lang="EN-US">action</span><span style="font-family: 宋体;">或所有的</span><span lang="EN-US">action</span><span style="font-family: 宋体;">提供功能的横切关注点?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">?/span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">架构中,每一个概念都是独立的。功能和逻辑不需要放|在专门?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">里。我们来看看上面所提到的概念以?qing)它们是如何处理的?x)</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">1</span><span style="font-family: 宋体;">Q每?/span><span lang="EN-US">Action</span><span style="font-family: 宋体;">逻辑</span><span lang="EN-US">--</span><span style="font-family: 宋体;">q是最单的概念。每?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">负责它需要提供的逻辑或功能;</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">2</span><span style="font-family: 宋体;">Q编译、映和转换</span><span lang="EN-US">--3</span><span style="font-family: 宋体;">者是各自有所不同的概念,但是有一个相同点是它们都是作ؓ(f)核心</span><span lang="EN-US">action</span><span style="font-family: 宋体;">逻辑的补充。编译和cd转换由框架本w进行处理。来自于</span><span lang="EN-US">HTML</span><span style="font-family: 宋体;">的字W值在</span><span lang="EN-US">action</span><span style="font-family: 宋体;">开始处理之前被转换为基本类型或被注入到</span><span lang="EN-US">action</span><span style="font-family: 宋体;">?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">所有需要的都在此处。映由一个特定的拦截器进行处理。通过对一?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">q行配置Q说明其所拥有的域模型Qƈ准确指明其在</span><span lang="EN-US">HTML</span><span style="font-family: 宋体;">中所对应的域Q框架将?x)?/span><span lang="EN-US">UI</span><span style="font-family: 宋体;">映射到该域模型上。它甚至?x)生成对象图?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">3</span><span style="font-family: 宋体;">Q横切关注点</span><span lang="EN-US">--</span><span style="font-family: 宋体;">拦截器是提供横切功能的主要角艌Ӏ开发者可以实现拦截器Q然后把它们应用到所?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">、某个特定包中的所?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">或者选择某些指定?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">中去。另一个横切关注点是用h口层?/span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">可以使用其所提供的称?#8220;主题Q?/span><span lang="EN-US">themes</span><span style="font-family: 宋体;">Q?#8221;的标{来为此提供帮助。不同的主题可以被开发来提供不同的层选项Qƈ被应用到单个标签或整个应用(通过把它设ؓ(f)默认|(j)?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><strong><span lang="EN-US">4</span></strong><strong><span style="font-family: 宋体;">?/span><span lang="EN-US">2 </span></strong><strong><span style="font-family: 宋体;">松耦合</span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal"><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">的早期目标之一是提供一个松耦合的框架。其</span><span lang="EN-US">2.0</span><span style="font-family: 宋体;">版更加强调了q点Q把代码分成了两个项目,一个是</span><span lang="EN-US">XWork--</span><span style="font-family: 宋体;">提供普通的命o(h)模式</span><span lang="EN-US">(generic command-pattern)</span><span style="font-family: 宋体;">框架Q另一个是</span><span lang="EN-US">WebWork--</span><span style="font-family: 宋体;">?/span><span lang="EN-US">XWork</span><span style="font-family: 宋体;">提供明确?/span><span lang="EN-US">web</span><span style="font-family: 宋体;">接口。这?/span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">架构基础上的变化创徏了二者的q关系。原来赖以成名的“</span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">”现在实际上是</span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">?/span><span lang="EN-US">XWork</span><span style="font-family: 宋体;">的结合体?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">作ؓ(f)一个独立的目Q?/span><span lang="EN-US">XWork</span><span style="font-family: 宋体;">现在可以被用于其它项目的一部分?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">实际上也实是这栗?/span><span lang="EN-US">Swingwork</span><span style="font-family: 宋体;">是一个这L(fng)目</span><span lang="EN-US">--</span><span style="font-family: 宋体;">它是一个基?/span><span lang="EN-US">Swing</span><span style="font-family: 宋体;">的、底层?/span><span lang="EN-US">XWork</span><span style="font-family: 宋体;">?/span><span lang="EN-US">MVC</span><span style="font-family: 宋体;">框架。另外一个例子就?/span><span lang="EN-US">JMS</span><span style="font-family: 宋体;">前端</span><span lang="EN-US">--</span><span style="font-family: 宋体;">执行或共享与</span><span lang="EN-US">web UI</span><span style="font-family: 宋体;">相关?/span><span lang="EN-US">XWork action</span><span style="font-family: 宋体;">。这些例子提供了高水qx耦合的典型案例?/span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">是又一个采?/span><span lang="EN-US">XWork</span><span style="font-family: 宋体;">的项目?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">松耦合思想已经更近一步,集成到整个框?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">从处?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">的第一步直到最后一步。实际上Q在</span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">里几乎没有什么不可配|的</span><span lang="EN-US">--</span><span style="font-family: 宋体;">个h认ؓ(f)q个特点既是</span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">发展的极大原动力之一Q但同时也是光大缺陷之一?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">松耦合配置的一般案例包括:(x)</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">1</span><span style="font-family: 宋体;">Q把</span><span lang="EN-US">URL</span><span style="font-family: 宋体;">映射?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">Q?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">2</span><span style="font-family: 宋体;">Q把一?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">的不同结果映到提交的页面;</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">3</span><span style="font-family: 宋体;">Q把处理期间产生的异常映到提交的异帔R面;</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">不常使用?/span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">特定的案例包括:(x)</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">1</span><span style="font-family: 宋体;">Q如果你不想使用</span><span lang="EN-US">Sping</span><span style="font-family: 宋体;">框架Q就得配|业务对象工厂;</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">2</span><span style="font-family: 宋体;">Q改?/span><span lang="EN-US">URL</span><span style="font-family: 宋体;">映射C?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">cȝ方式Q?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">3</span><span style="font-family: 宋体;">Qؓ(f)</span><span lang="EN-US">action</span><span style="font-family: 宋体;">l果增加新的l果cdQ?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">4</span><span style="font-family: 宋体;">Qؓ(f)新的框架功能增加插gQ?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">Q?/span><span lang="EN-US">5</span><span style="font-family: 宋体;">Q通过拦截器配|框架功能Q?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">松耦合pȝ的好处是众所周知?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">增强了可试性、易于扩展框架特征等。但有一个缺P׃可置配的灉|性(其是与拦截器相关的Q,D一个特?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">的处理\径不易被开发者所理解。这一点在q行调试的时候比较明显。由于不理解发生了什么事Q一个不了解pȝ的开发h员将不能快速高效的q行调试。问题本w可能比较简单,比如׃个没有进行正配|的拦截器引L(fng)Q或者甚臛_是因为拦截器的顺序不对引L(fng)。只要理解处理\径上的每一个细节,很快׃(x)扑ֈ问题的解军_法?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><strong><span lang="EN-US">4</span></strong><strong><span style="font-family: 宋体;">?/span><span lang="EN-US">3 </span></strong><strong><span style="font-family: 宋体;">易测试性(</span><span lang="EN-US">Testability</span></strong><strong><span style="font-family: 宋体;">Q?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal"><span style="font-family: 宋体;">在过dq中Q单元测试已l成Y件开发过E中事实上的标准。它不仅保证了类逻辑的一致性,而且通过在类开发过E中甚至开发之前实现单元测试,会(x)减少设计的复杂性,q且?x)设计更?f)健壮?/span></p> <p class="MsoNormal"><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">的前w,</span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">是建立在这U环境之上的。由于框架元素的松散耦合Q测试很Ҏ(gu)q行。在</span><span lang="EN-US">web</span><span style="font-family: 宋体;">应用开发过E中Q?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">、拦截器、结果、对象工厂及(qing)其它被开发的lg能够独立地进行测试。由?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">和拦截器最为常用,我们对q两U组件进行详l的探讨?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span lang="EN-US">Actions</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">通常在框架中是通过执行“</span><span lang="EN-US">execute()</span><span style="font-family: 宋体;">”Ҏ(gu)来调?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">的,或者在配置时调用Q何一个返回gؓ(f)字符|</span><span lang="EN-US">String</span><span style="font-family: 宋体;">Q的Ҏ(gu)来进行调用的。从易测性的角度来看Q这再简单不q了?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">我们来看一个例子。下面是一个数字篏加的</span><span lang="EN-US">action</span><span style="font-family: 宋体;">c:(x)</span></p> <p class="MsoNormal"><span lang="EN-US">public class MyAction {</span></p> <p class="MsoNormal"><span lang="EN-US">private int number;</span></p> <p class="MsoNormal"><span lang="EN-US">public int getnumber() { return number; }</span></p> <p class="MsoNormal"><span lang="EN-US">public void setNumber( int n ) { number = n; }</span></p> <p class="MsoNormal"><span lang="EN-US">public String execute() {</span></p> <p class="MsoNormal"><span lang="EN-US">number += 10;</span></p> <p class="MsoNormal"><span lang="EN-US">return “success”;</span></p> <p class="MsoNormal"><span lang="EN-US">}</span></p> <p class="MsoNormal"><span lang="EN-US">}</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">׃?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">?/span><span lang="EN-US">POJO</span><span style="font-family: 宋体;">Q单元测试只需?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">实例化、调用方法,q在断点出得到预期的l果可以了。所有搜数据和资源都通过</span><span lang="EN-US">setter</span><span style="font-family: 宋体;">Ҏ(gu)提供l?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">。因?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">需要的M数据都能够直接在</span><span lang="EN-US">action</span><span style="font-family: 宋体;">里进行设|?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">在本例中我们需要两个断?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">一个ؓ(f)“</span><span lang="EN-US">execute</span><span style="font-family: 宋体;">”Ҏ(gu)的输行设|,另一个则是ؓ(f)验证</span><span lang="EN-US">action</span><span style="font-family: 宋体;">的状态是否是我们预期的。单元测试如下所C:(x)</span></p> <p class="MsoNormal"><span lang="EN-US">public class myActionTest extends TestCase {</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">…</span></p> <p class="MsoNormal"><span lang="EN-US">public void testExecute() {</span></p> <p class="MsoNormal"><span lang="EN-US">MyAction action = new MyAction();</span></p> <p class="MsoNormal"><span lang="EN-US">Action.setNumber(5);</span></p> <p class="MsoNormal"><span lang="EN-US">assertEquals("success", action.execute());</span></p> <p class="MsoNormal"><span lang="EN-US">assertEquals(15,action.getNumber());</span></p> <p class="MsoNormal"><span lang="EN-US">}</span></p> <p class="MsoNormal"><span lang="EN-US">}</span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">对于资源E微有点ȝ(ch)Q类?/span><span lang="EN-US">jMock</span><span style="font-family: 宋体;">q样的库可以被用来提供资源的模拟实现Q测试在</span><span lang="EN-US">action</span><span style="font-family: 宋体;">和资源之间的交互是否正确?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">管本例是用</span><span lang="EN-US">JUnit</span><span style="font-family: 宋体;">写成的,但是</span><span lang="EN-US">TestNG</span><span style="font-family: 宋体;">或其它Q何框枉可以使用?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">拦截?/span><span lang="EN-US">(Interceptors)</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">当你~译拦截器的时候,试?x)稍微有点复杂。不q也有一些额外的帮助可以利用。用拦截器q行工作有两U情景?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">W一U情景是使用在调用时?/span><span lang="EN-US">ActionInvocation</span><span style="font-family: 宋体;">对象q行交互的拦截器。在执行后,你能够通过在断点出得到拦截器本w的状态来验证逻辑的正性。在q种情景下,你能够利用与试</span><span lang="EN-US">action</span><span style="font-family: 宋体;">同样的方法来试拦截器。实例化拦截器、创Z?/span><span lang="EN-US">ActionInvocation</span><span style="font-family: 宋体;">对象的模拟实?/span><span lang="EN-US">(</span><span style="font-family: 宋体;">该对象带有在试拦截器时会(x)用到的?/span><span lang="EN-US">)</span><span style="font-family: 宋体;">、调?/span><span lang="EN-US">intercept</span><span style="font-family: 宋体;">Ҏ(gu)、在断点处得到预期的l果。这些可能发生在拦截器本w、被调用Ҏ(gu)的返回结果或是由pȝ抛出的异常?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">W二U情景是使用与其环境或拦截器堆栈中的其它拦截器发生交互的拦截器。在q种情况下,试需要通过</span><span lang="EN-US">ActionProxy</span><span style="font-family: 宋体;">cM</span><span lang="EN-US">action</span><span style="font-family: 宋体;">q行交互Q还会(x)需要访问拦截器本n不能讉K的其它环境对象?/span></p> <p class="MsoNormal"><span lang="EN-US">XWork</span><span style="font-family: 宋体;">库通过提供</span><span lang="EN-US">XWorkTestCase</span><span style="font-family: 宋体;">cL?/span><span lang="EN-US">JUnit</span><span style="font-family: 宋体;">试提供帮助、通过提供</span><span lang="EN-US">TestNGStrutsTestCase </span><span style="font-family: 宋体;">?/span><span lang="EN-US">TestNGXWorkTestCase</span><span style="font-family: 宋体;">cL?/span><span lang="EN-US">TestNG</span><span style="font-family: 宋体;">试提供帮助。这些ؓ(f)</span><span lang="EN-US">ConfigurationManager,Configuration, Container </span><span style="font-family: 宋体;">?/span><span lang="EN-US"> ActionProxyFactory</span><span style="font-family: 宋体;">cȝ实例提供了测试实现。涉?qing)到的类q有</span><span lang="EN-US">XWorkTestCaseHelper </span><span style="font-family: 宋体;">?/span><span lang="EN-US"> MockConfiguration.</span><span style="font-family: 宋体;">{?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">现在我们已经具备了安装环境的基础Q测试本w变得容易了</span><span lang="EN-US">--</span><span style="font-family: 宋体;">遵@在第一U情景里所描述的步骤即可。唯一的不同点在于Q不是调用拦截器?/span><span lang="EN-US">intercept()</span><span style="font-family: 宋体;">Ҏ(gu)Q而是需要调?/span><span lang="EN-US">ActionProxy</span><span style="font-family: 宋体;">cȝ</span><span lang="EN-US">execute()</span><span style="font-family: 宋体;">Ҏ(gu)。如下述代码所C:(x)</span></p> <p class="MsoNormal"><span lang="EN-US">ActionProxy proxy =</span></p> <p class="MsoNormal"><span lang="EN-US">actionProxyFactory.createActionProxy(NAMESPACE,NAME,null);</span></p> <p class="MsoNormal"><span lang="EN-US">assertEquals("success", proxy.execute());</span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">在这U情况下Q测试将?x)设|断Ҏ(gu)获取预期?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">l果倹{?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">值或值堆栈的倹{被执行?/span><span lang="EN-US">action</span><span style="font-family: 宋体;">能够在执行前或执行后通过下面的调用进行访问:(x)</span></p> <p class="MsoNormal"><span lang="EN-US">MyAction action=(MyAction)proxy.getInvocation().getAction();</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">而值堆栈则可以通过下面的调用进行访问:(x)</span></p> <p class="MsoNormal"><span lang="EN-US">proxy.getInvocation().getStack();</span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><strong><span lang="EN-US">4</span></strong><strong><span style="font-family: 宋体;">?/span><span lang="EN-US">4 </span></strong><strong><span style="font-family: 宋体;">模块?/span><span lang="EN-US">(Modularization)<o:p></o:p></span></strong></p> <p class="MsoNormal"><span style="font-family: 宋体;">随着应用pȝ来庞大,?/span><span lang="EN-US">web</span><span style="font-family: 宋体;">应用分离多模块就变得来重要。模块化允许在一个项目中开发的功能或新的框架特征能够独立打包,q可以在其它目中进行重用?/span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">已经把模块化作ؓ(f)其架构的基础部分Q允许开发者独立工作和~译彼此的项目?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">下面是一些对应用q行模块化的Ҏ(gu)Q?/span></p> <p class="MsoNormal"><span lang="EN-US">(1)</span><span style="font-family: 宋体;">配置信息能够被分为多个文?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">qƈ不媄(jing)响应用的打包Q由于配|信息根据功能界限进行逻辑分离而易于查找,从而简化的开发h员的工作?/span></p> <p class="MsoNormal"><span lang="EN-US">(2)</span><span style="font-family: 宋体;">独立的应用模块可以以插g的Ş式进行创?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">Z提供怸特定特征所需的一切都可以打包在一起ƈ作ؓ(f)插g独立发布。这包括</span><span lang="EN-US">action</span><span style="font-family: 宋体;">、拦截器、拦截器堆栈、视图模板(</span><span lang="EN-US">JSP</span><span style="font-family: 宋体;">除外Q等。浏览器插g的配|就是一个例子,该插件提供了一个完整的模块Q当你把该模块添加到你的应用中时Q其提供了一?/span><span lang="EN-US">web</span><span style="font-family: 宋体;">接口来查看配|信息?/span></p> <p class="MsoNormal"><span lang="EN-US">(3)</span><span style="font-family: 宋体;">可以创徏新的框架功能插g</span><span lang="EN-US">-</span><span style="font-family: 宋体;">非特定应用的新功能可以以插g形式捆绑q在不同的应用中使用?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">从技术角度来_(d)所有这些对应用q行模块化的方式都是一L(fng)</span><span lang="EN-US">--</span><span style="font-family: 宋体;">都具有同L(fng)配置元素Q除了名UC同之外,“</span><span lang="EN-US">struts-plugin.xml</span><span style="font-family: 宋体;">”是系l自动加载插件时的配|文Ӟ(j)、具有相同的目录l构Qƈ且它们也包含同样的框架和应用元素?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">插g的两U类型之间的唯一不同是你在概念上如何看待它们,以及(qing)哪些元素和配|被攑օ分发包中?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><strong><span lang="EN-US">4.4.1</span></strong></st1:chsdate><strong><span lang="EN-US"> </span></strong><strong><span style="font-family: 宋体;">其它配置元素</span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal"><span style="font-family: 宋体;">׃插g为核心框架功能提供了可选实玎ͼ所以有一些额外的配置元素。尽在“</span><span lang="EN-US">struts.xml</span><span style="font-family: 宋体;">”?#8220;</span><span lang="EN-US">struts-default.xml</span><span style="font-family: 宋体;">”配置文g中可以用这些元素,但是通常情况下它们还是在插g配置文g中进行配|?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">对于插g来说Q可选实现的配置分ؓ(f)两步Q?/span></p> <p class="MsoNormal"><span lang="EN-US">1</span><span style="font-family: 宋体;">、?/span><span lang="EN-US"><bean .../></span><span style="font-family: 宋体;">标签中来提供可选接口的实现Q用一个唯一的键来识别它?/span></p> <p class="MsoNormal"><span lang="EN-US">2</span><span style="font-family: 宋体;">、?/span><span lang="EN-US"><constant </span><span style="font-family: 宋体;">…</span><span lang="EN-US"> /></span><span style="font-family: 宋体;">标签在已配置的接口实C选择一个?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">我们来更详细地看一下这两个步骤?/span></p> <p class="MsoNormal"><span lang="EN-US"><bean .../></span><span style="font-family: 宋体;">标签允许插g提供扩展点的实现信息。下面的例子是一个展C在</span><span lang="EN-US">"struts-default.xml"</span><span style="font-family: 宋体;">文g中ؓ(f)一个对象工厂进行配|的情况Q?/span></p> <p class="MsoNormal"><span lang="EN-US"><bean name="struts"</span></p> <p class="MsoNormal"><span lang="EN-US">type="com.opensymphony.xwork2.ObjectFactory"</span></p> <p class="MsoNormal"><span lang="EN-US">class="org.apache.struts2.impl.StrutsObjectFactory" /></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">属性提供了?/span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">中创建和使用一个可选对象实现的所有信息。可以用的属性如下所C:(x)</span></p> <p class="MsoNormal"><span lang="EN-US">class--</span><span style="font-family: 宋体;">提供cȝ全名Q?/span></p> <p class="MsoNormal"><span lang="EN-US">type--</span><span style="font-family: 宋体;">指明c需要实现的接口Q?/span></p> <p class="MsoNormal"><span lang="EN-US">name--</span><span style="font-family: 宋体;">Ҏ(gu)个类q行唯一识别的简Uͼ</span></p> <p class="MsoNormal"><span lang="EN-US">static--</span><span style="font-family: 宋体;">指明是否把静态类Ҏ(gu)注入到类的实例;</span></p> <p class="MsoNormal"><span lang="EN-US">scope--</span><span style="font-family: 宋体;">指明所用实例的范围Q其值可能ؓ(f)Q?/span><span lang="EN-US">"default"</span><span style="font-family: 宋体;">?/span><span lang="EN-US">"request"</span><span style="font-family: 宋体;">?/span><span lang="EN-US">"session"</span><span style="font-family: 宋体;">?/span><span lang="EN-US"> "singleton"</span><span style="font-family: 宋体;">?/span><span lang="EN-US">"thread"</span><span style="font-family: 宋体;">?/span></p> <p class="MsoNormal"><span lang="EN-US">optional--</span><span style="font-family: 宋体;">如果gؓ(f)“</span><span lang="EN-US">true</span><span style="font-family: 宋体;">”Q既是在创徏cd例时出现错误Q将仍然l箋加蝲?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体;">接下来,</span><span lang="EN-US"><constant </span><span style="font-family: 宋体;">…</span><span lang="EN-US"> /></span><span style="font-family: 宋体;">标签允许开发h员选择使用哪个配置。只有两个属?/span><span lang="EN-US">--</span><span style="font-family: 宋体;">一个属?#8220;</span><span lang="EN-US">name</span><span style="font-family: 宋体;">”提供了你的新实现所改变的扩展点的名Uͼ另一个属?#8220;</span><span lang="EN-US">value</span><span style="font-family: 宋体;">”是?/span><span lang="EN-US"><bean </span><span style="font-family: 宋体;">…</span><span lang="EN-US"> /></span><span style="font-family: 宋体;">标签中配|的“</span><span lang="EN-US">name</span><span style="font-family: 宋体;">”名称?/span></p> <p class="MsoNormal"><span lang="EN-US"><constant name="struts.objectFactory" value="plexus" /></span></p> <p class="MsoNormal"><span lang="EN-US"><constant </span><span style="font-family: 宋体;">…</span><span lang="EN-US"> /></span><span style="font-family: 宋体;">标签是把一个新Dl一个已知属性的一U方式。该g可以?/span><span lang="EN-US">"web.xml"</span><span style="font-family: 宋体;">配置文g中?#8220;</span><span lang="EN-US">init-param</span><span style="font-family: 宋体;">”q行修改Q或者在““</span><span lang="EN-US">struts.properties</span><span style="font-family: 宋体;">”配置文g中作Z个名值对Q?/span><span lang="EN-US">name-value pair</span><span style="font-family: 宋体;">Q进行修攏V?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">如果你没在开发一个插Ӟ而只是用常?/span><span lang="EN-US">"struts-xml"</span><span style="font-family: 宋体;">配置文g中的q些技巧,q里q有一个捷径。在</span><span lang="EN-US"><constant ... /></span><span style="font-family: 宋体;">标签里,使用你通常攑֜</span><span lang="EN-US"><bean ... /></span><span style="font-family: 宋体;">标签里的cd?/span><span lang="EN-US">---</span><span style="font-family: 宋体;">q样做可以避免对</span><span lang="EN-US"><bean ... /></span><span style="font-family: 宋体;">标签的需求?/span></p> <p class="MsoNormal"><span style="font-family: 宋体;">下面q张表列Z可配|扩展点的接口和属性名Uͼ(x)Q表省略Q?/span></p> <p class="MsoNormal" style="text-align: left;" align="left"><st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><strong><span style="font-size: 10pt;" lang="EN-US">4.4.2</span></strong></st1:chsdate><strong><span style="font-size: 10pt;" lang="EN-US"> </span></strong><strong><span style="font-size: 10pt; font-family: 宋体;">惯例优先原则</span></strong><strong><span style="font-size: 10pt;" lang="EN-US">(</span></strong><span style="font-size: 12pt; font-family: times-roman;" lang="EN-US">Convention over configuration</span><strong><span style="font-size: 10pt;" lang="EN-US">)<o:p></o:p></span></strong></p> <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;">惯例优先配置</span><span style="font-size: 10pt; font-family: 宋体;">的原则是</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">Rails</span><span style="font-size: 10pt; font-family: 宋体;">带给L应用开发的一个概c(din)不是提供在很多应用中都很类似的配置文gQ而是假定在多数情况下开发h员将?x)遵从一个特定的模式。这个模式非常普遍以至于可以被认为是一个惯例,q样可以在框架中提供一个默认的配置而不是ؓ(f)每个新的应用提供一个配|。默认情况下Q开发h员不需要提供配|信息。但是如果有与惯例配|信息不同的需要,得提供相应的配|信息来代替默认配置信息?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">Struts2</span><span style="font-size: 10pt; font-family: 宋体;">已经采用了这U理c(din)松耦合l?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">Struts2</span><span style="font-size: 10pt; font-family: 宋体;">提供大的Ҏ(gu),但是同时q也意味着该框架很难进行配|。?/span><span style="font-size: 10pt; font-family: 宋体;">惯例优先配置</span><span style="font-size: 10pt; font-family: 宋体;">原则则ؓ(f)</span><span style="font-family: 宋体;">q两U对立的力量提供了^衡,使开发h员的开发可以更加简单和高效?/span></p> <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;">?/span><span style="font-size: 10pt;" lang="EN-US">Struts2</span><span style="font-size: 10pt; font-family: 宋体;">中,惯例优先配置</span><span style="font-size: 10pt; font-family: 宋体;">的例子包括:(x)</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"><!--[if !supportLists]--><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><span>Q?Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><!--[endif]--><span style="font-size: 10pt; font-family: 宋体;">隐式配置文g加蝲</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">?/span><span style="font-size: 10pt; font-family: 宋体;">配置文g</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">“Struts-default.xml”</span><span style="font-size: 10pt; font-family: 宋体;">?#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">struts-plugin.xml</span><span style="font-size: 10pt; font-family: 宋体;">”是自动加载而不是显式加载的?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"><!--[if !supportLists]--><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><span>Q?Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><!--[endif]--><span style="font-size: 10pt; font-family: 宋体;">插g中的代码</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">?/span><span style="font-size: 10pt; font-family: 宋体;">当利用插件中的代码时Q?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">action</span><span style="font-size: 10pt; font-family: 宋体;">名称和结果字W二者的l合来自动搜索结果模板,所以对?#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">/user/add.action</span><span style="font-size: 10pt; font-family: 宋体;">”来说Q将?x)?f)一?#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">success</span><span style="font-size: 10pt; font-family: 宋体;">”的结果返?#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">/user/add-success.jsp</span><span style="font-size: 10pt; font-family: 宋体;">”模板Q而ؓ(f)一?#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">error</span><span style="font-size: 10pt; font-family: 宋体;">”的结果返?#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">/user/add-error.jsp</span><span style="font-size: 10pt; font-family: 宋体;">”模板?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"><!--[if !supportLists]--><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><span>Q?Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><!--[endif]--><span style="font-size: 10pt; font-family: 宋体;">默认l果?qing)结果类?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">?/span><span style="font-size: 10pt; font-family: 宋体;">当对</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">action</span><span style="font-size: 10pt; font-family: 宋体;">q行配置Ӟ当用默认的“</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">success</span><span style="font-size: 10pt; font-family: 宋体;">”?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">JSP</span><span style="font-size: 10pt; font-family: 宋体;">Ӟ不必指明l果和类型?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"><!--[if !supportLists]--><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><span>Q?Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><!--[endif]--><span style="font-size: 10pt; font-family: 宋体;">l定</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">Spring</span><span style="font-size: 10pt; font-family: 宋体;">业务服务</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">?/span><span style="font-size: 10pt; font-family: 宋体;">当安装了</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">Spring</span><span style="font-size: 10pt; font-family: 宋体;">框架插g后,不必为每?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">action</span><span style="font-size: 10pt; font-family: 宋体;">配置其所需的基?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">Spring</span><span style="font-size: 10pt; font-family: 宋体;">提供的业务,因ؓ(f)q些业务?x)自动?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">action</span><span style="font-size: 10pt; font-family: 宋体;">q行l定?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;">在前面的章节中,我们已经看到了几个默认配|,以及(qing)如何通过配置使用新值来代替默认倹{?/span><span style="font-family: 宋体;">更多的配|选项</span><span lang="EN-US">,</span><span style="font-family: 宋体;">以及(qing)更多的惯例将?x)在接下来的章节中进行探讨?/span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p><img src ="http://www.aygfsteel.com/atiger06/aggbug/132352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/atiger06/" target="_blank">leefoo</a> 2007-07-25 17:23 <a href="http://www.aygfsteel.com/atiger06/archive/2007/07/25/132352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2配置文g说明(译自startingstruts2online)http://www.aygfsteel.com/atiger06/archive/2007/06/22/125748.htmlleefooleefooFri, 22 Jun 2007 02:09:00 GMThttp://www.aygfsteel.com/atiger06/archive/2007/06/22/125748.htmlhttp://www.aygfsteel.com/atiger06/comments/125748.htmlhttp://www.aygfsteel.com/atiger06/archive/2007/06/22/125748.html#Feedback0http://www.aygfsteel.com/atiger06/comments/commentRss/125748.htmlhttp://www.aygfsteel.com/atiger06/services/trackbacks/125748.html一、struts.properties文g说明
       struts.properties配置文g提供了一U改变框枉认行为的机制。一般来讲我们没必要修改q个文gQ除非你x有一个更加友好的开发调试环境。struts.properties文g中所包含的所有属性都可以在web.xml配置文g中?init-param"标签q行配置Q或者在struts.xml文g中?#8220;constant”标签q行配置?br> 可以被修改的属性允许改变Freemarker选项Q-改变“action-mapping”cR决定是否允许XML配置文g重蝲?qing)确定默认用h口主题等行ؓ(f)?/p>

        一个名?#8220;default.properties”的属性文件包含在“Struts2-Core”JAR文g中。你可以在你目源文件\径的根目录下创徏一个名?#8220;struts.properties”的文Ӟ来对某个属性进行修攏V这样你可以增加你惌修改的属性。新的属性值将?x)覆盖默认倹{?/p>

       在开发环境下Q你可能?x)考虑修改下面一些属性:(x)
 (1) struts.i18n.reload = true  Q-允许国际化文仉载;
 (2) struts.devMode = true Q-允许开发模式以提供更方便的调试功能Q?br> (3) struts.configuration.xml.reload = true Q-允许XML配置文g重蝲功能Q以便在有变化时可以重蝲而不需重蝲servlet容器中的整个web应用Q?br> (4) struts.url.http.port = 8080 Q-讄服务器允许端口,以便正确创徏生成的URL?/p>

二、struts.xml文g说明
       struts.xml文g包含了当你开发action旉要修改的配置信息。下面我们来看一下该文g的固定结构?br>       Ҏ(gu)你所开发应用的功能不同Q有可能在你的应用中完全用不着“struts.xml”配置文g。我们这里所说的配置能够被包含注释的替代Ҏ(gu)?#8220;web.xml”中的初始化参数及(qing)可替换URL映射配置q行处理。需?#8220;struts.xml”文gq行配置的属性有全局l果、异常处理及(qing)自定义拦截器堆栈?/p>

       q是一个XML文gQ所以第一个元素是XML版本和解码信息。接下来是该XML的文档类型定义(DTDQ,提供该文档所包含元素的结构信息,以便被XML解析器和~辑器用?/p>

leefoo 2007-06-22 10:09 发表评论
]]>
վ֩ģ壺 Ȫ| ʼ| ԭ| | | | ·| ͭ| | | ¬| | | | IJ| ̨| | ľ| ˮ| ¬| Dz| | ˰| Ͽ| | Ͽ| | | | ÷ӿ| | ʼ| | Ͻ| | | | ǭ| ³| ʲ| |