﻿<?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学习</title><link>http://www.blogjava.net/atiger06/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 06:35:18 GMT</lastBuildDate><pubDate>Tue, 21 Apr 2026 06:35:18 GMT</pubDate><ttl>60</ttl><item><title>未来网站策划五大趋势</title><link>http://www.blogjava.net/atiger06/archive/2007/07/26/132424.html</link><dc:creator>leefoo</dc:creator><author>leefoo</author><pubDate>Thu, 26 Jul 2007 00:21:00 GMT</pubDate><guid>http://www.blogjava.net/atiger06/archive/2007/07/26/132424.html</guid><wfw:comment>http://www.blogjava.net/atiger06/comments/132424.html</wfw:comment><comments>http://www.blogjava.net/atiger06/archive/2007/07/26/132424.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/atiger06/comments/commentRss/132424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/atiger06/services/trackbacks/132424.html</trackback:ping><description><![CDATA[网站策
划是成功网站平台建设成败的关键内容之一。在中国真正普及全职的网站策划人员严格讲是2002年，在之前更多是由技术性人才（软件项目经理、网站美工等）
担任此项职位，随着中国互联网环境转晴，网站的高竞争使网站策划的地位突显。我们可以看到，许多真正处于领军性地位的网站平台90%具有一个特点——网站
策划思路清晰合理，界面友好，网站营销作用强；因此专业的网站策划是未来网站成功的重要条件之一。　　在未来，网站策划呈现以下5大趋势：<br>　　1．具备市场/销售意识，且掌握扎实技术的专业网站策划人才成抢手货<br>
网站定位决定了网站策划思想的宽度和深度，网站客户决定了网站策划思维形式，网站页面和程序的实现决定了优秀网站策划思想的表现力，网站市场/销售再次
验证网站策划水平的高低；如果需要深入并运用上句的思想，就必须具备市场、销售、和扎实技术于一身，这种复合性网站策划人才则是现今大网站品牌竞争中不可
或缺的人力资源，随着国家2001年开设电子商务专业，这种人才真正成熟须要再等5年以上；但由于网站越来越多，优秀的网站竞争越来越难，这种人才在5年
内将从从事网站销售、市场、技术这三方面的人才中产生，其中当前网站竞争实力不高的情况下，技术人才转型是网站策划是当前现状，不过未来以市场/销售为主
的人才转型，才能真正推动网站策划走向专业化。<br>　　2．人机工程学思想将大行其道<br>　　人机工程学又称人机工效学
(Ergonomics)，是一门让技术人性化的科学，一门关于技术和人的协调关系的科学。即如何让技术的发展围绕人的需求来展开，把人作为产品和环境设
计的出发点，使其性能、色彩等更好地适应和满足人类的生理和心理的需要，从而使人们在工作中更安全、便捷和舒适，工作效率更高。其研究方法和评价手段涉及
心理学、生理学、医学、人体测量学、美学和工程技术等多个领域。<br>　　人机工程学已渗透至我们生活的每一个部分，例如：喝水的杯子，洗口的牙膏，使
用的电脑&#8230;等各方面，人机工程学更是利于产品销售的优化剂，那么我们从专业网站策划看，更需要人机工程学帮助我们使网站平台更容易推销给目标客户。在未来
人机工程学将使网站在以下方面得到质的提升：<br>人性化：通过引导性文字语言、图形语言、个性互动等方式，使网站平台更利于客户浏览，以吸引并留住客户。<br>　　方便性：网站操作简便、易用，内容分布合理，符合客户的行为习惯。<br>　　逻辑性：整体网站策划流程符合客户心理，且在充分分析客户行业特征的基础上，建立网站内部功能之间的逻辑转换，让客户享受整个访问过程。<br>　　科学性：网站栏目策划、定位具备科学性，其既充分代表了网站的意图，又能充分调动访客继续点击，引导客户购买产品。<br>　　控制性：网站在建立客户行为权限控制方面，必须符合公司业务规则，根据不同的客户类型产生不同的权限。<br>　　交互性：建立异步沟通系统（帮助中心、留言板、操作指南&#8230;）方便客户与网站之间沟通；建立同步沟通系统（即时聊天、电话反馈&#8230;）达到即时双向沟通目标。<br>　　界面友好性：心理学表明，适合的界面对于客户点击欲望的提升和印象指数的提升效果明显，网站界面是客户与网站交流的重要载体，在这点上网站策划师需要与网站设计师协作实现。但思想方法确保以下内容您做到了：<br>　　a、同样的界面对象是否具有一致性、连续性的行为？<br>　　b、各种提示信息是否简单、清晰？<br>　　c、色彩是否统一、协调？是否避免了同时使用太多的颜色？<br>　　d、文字内容是否简洁、重点突出？字体、字号、字型是否合适？<br>　　e、界面对象的动静处理是否得当？<br>　　f、布局是否合理、简洁、协调、美观，画面是否均衡等等？<br>　　3．文化理念全面渗透网站策划实战<br>　　网站竞争从技术竞争、平台竞争，以及现在的市场竞争，经过几年的发展，未来将上升至&#8220;文化竞争&#8221;的高度，例如：新浪网络媒体、网易虚拟社区、阿里商人文化&#8230;..<br>　　从历史的角度来看，经济可以推动文化的发展，文化却能够决定经济、政治的走势；<br>
从网站经营的角度来看，好的网站经营能够促使网站的客户不断的聚集、交流，逐步建立以网站或网站行业或网站性质为核心的文化；但网站或网络文化的建立却
能够带动网站从量变至质变的转换，并且能够形成&#8220;马太效应&#8221;，对网站资本运作、市场运作、技术运作、人力资源运作等综合方面产生催化作用，使网站经营真正
走向成功。<br>　　从现有已形成文化的网站案例来看，新浪已成为中国甚至华人世界最具权威性质的网络媒体，它形成了与电视媒体、杂志媒体、报刊媒体、
广播媒体并列的第五大媒体，其文化力量可见一斑；以网易为代表的社区交流型网站更是如此，网络游戏文化、网络交友文化更是深入人心，并对中国互联网普及进
程产生决定性的推动作用；以阿里、当当、易趣、淘宝为代表的商人文化，对中国走向世界，世界了解中国，商人上网做生意的普及的贡献有目共睹；以前程无忧、
CJOL、卓博、中华英才为代表的网上人力资源文化更是加速了全国人力资源高效互动。<br>　　因此，高层面的网站竞争是文化的竞争，而形成文化网站品牌，专业网站策划必不可以，如何有效整合公司资源、客户资源，行业资源，形成文化，是网站策划人员需要思考、实践的难点。<br>　　4．系统网站策划理论在五年内产生<br>
网站策划是一门有趣的学问，它涉及心理学、美学、人机工程学、工程技术、网络知识&#8230;&#8230;等多项学科，在国外，已逐渐有这方面的专业理论；在国内则没有，但
随着中国高质量的网站竞争愈发激烈，从而加剧了网站策划的专业化进程，在未来5年内，专业网站策划的理论书籍会出现，但我们更期待在具备丰富网站策划经验
的这群队伍，将自己的实战经验提升至理论知识，使网站策划理论更贴近市场，推动中国网站经营专业化。<br>　　5．网站策划的专业化导致网站设计风格整合：简约与个性成主流；<br>
在国内许多谈及网站策划与网站设计的区别，许多人讲不出，主要是因为两者之间重叠的区域很多，网站策划需要考虑到思想如何通过设计、程序去体现，网站设
计需要在充分理解网站策划思路的基础之上才能灵活设计。随着网站策划的专业化进程加速，将使整体网站策划，网站设计，网站开发变得复杂，我们需要考虑到许
多技术以外的市场、客户因素，因此，未来大型网站设计表现风格应该会有所整合，并走向：极至简约、个性十足两个方面。<br>　　极至简约风格：指以最简约的方式，分配、表现页面内容，以引导客户直抵目标内容，避免了因内容过多而产生的焦点分散问题，它对于网站策划和设计内容的分布合理性要求非常高，在国内做得最好的当属阿里、新浪、CJOL、卓博人才网&#8230;&#8230;。<br>
个性十足风格：指以多样化的表现方式，设计网站。它主要针对一些以娱乐性质为主的大型网站或企业网站，它具备高强度的眼球吸引力、丰富的图片或文字表现
形式，使客户能够愉悦地享受网站内容及服务，以这种风格为代表的大型网站暂时没有发现，但企业网站当属可口可乐，SONY娱乐站&#8230;&nbsp;                         <br><br>转自：http://tb.blog.csdn.net/TrackBack.aspx?PostId=1683119<img src ="http://www.blogjava.net/atiger06/aggbug/132424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/atiger06/" target="_blank">leefoo</a> 2007-07-26 08:21 <a href="http://www.blogjava.net/atiger06/archive/2007/07/26/132424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>starting struts2 翻译 第4章 架构的目标</title><link>http://www.blogjava.net/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.blogjava.net/atiger06/archive/2007/07/25/132352.html</guid><wfw:comment>http://www.blogjava.net/atiger06/comments/132352.html</wfw:comment><comments>http://www.blogjava.net/atiger06/archive/2007/07/25/132352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/atiger06/comments/commentRss/132352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/atiger06/services/trackbacks/132352.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family: 宋体;">对基于特定代码的应用来说，其架构目标很难确定下来。在开始开发之前制定文档化的目标，这种情况只是空想，因为一旦开始开发，代码通常就会朝一个与架构目标不同的方向前进，这样实际上最后的应用特征是基于代码而不是架构。这种情况很难发现并且是开发过程中逐步形成的产物而不是计划的产物，其结果就会造成不同的程序包及特性之间的不一致。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">本章我们将会讨论</span><span lang="EN-US">5</span><span style="font-family: 宋体;">种基于</span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">代码的特征。从</span><span lang="EN-US">2002</span><span style="font-family: 宋体;">年以来，这些架构元素随着代码的发展仍然存在</span><span lang="EN-US">--</span><span style="font-family: 宋体;">从开始的</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">WebWork2</span><span style="font-family: 宋体;">和</span><span lang="EN-US">XWork</span><span style="font-family: 宋体;">，一直到最后转变为</span><span lang="EN-US">Struts2.</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</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: 宋体;">作为一个</span><span lang="EN-US">web</span><span style="font-family: 宋体;">应用开发人员，有多种级别的功能需要进行阐述：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）在</span><span lang="EN-US">request/response</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">2</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">3</span><span style="font-family: 宋体;">）编译、映射和转换，以便把</span><span lang="EN-US">HTML</span><span style="font-family: 宋体;">中基于字符的值转化为原始类型，以及把视图对象转换为业务对象或数据表来进行表示；</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">4</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: 宋体;">提供功能的横切关注点。</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: 宋体;">里。我们来看看上面所提到的概念以及它们是如何处理的：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</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: 宋体;">负责它需要提供的逻辑或功能；</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">2</span><span style="font-family: 宋体;">）编译、映射和转换</span><span lang="EN-US">--3</span><span style="font-family: 宋体;">者是各自有所不同的概念，但是有一个相同点就是它们都是作为核心</span><span lang="EN-US">action</span><span style="font-family: 宋体;">逻辑的补充。编译和类型转换由框架本身进行处理。来自于</span><span lang="EN-US">HTML</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: 宋体;">中</span><span lang="EN-US">--</span><span style="font-family: 宋体;">所有需要的都在此处。映射由一个特定的拦截器进行处理。通过对一个</span><span lang="EN-US">action</span><span style="font-family: 宋体;">进行配置，说明其所拥有的域模型，并准确指明其在</span><span lang="EN-US">HTML</span><span style="font-family: 宋体;">中所对应的域，框架将会把</span><span lang="EN-US">UI</span><span style="font-family: 宋体;">映射到该域模型上。它甚至会生成对象图。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">3</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: 宋体;">、某个特定包中的所有</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">Struts2</span><span style="font-family: 宋体;">可以使用其所提供的称为&#8220;主题（</span><span lang="EN-US">themes</span><span style="font-family: 宋体;">）&#8221;的标签来为此提供帮助。不同的主题可以被开发来提供不同的层选项，并被应用到单个标签或整个应用（通过把它设为默认值）。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</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: 宋体;">版更加强调了这点：把代码分成了两个项目，一个是</span><span lang="EN-US">XWork--</span><span style="font-family: 宋体;">提供普通的命令模式</span><span lang="EN-US">(generic command-pattern)</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><span lang="EN-US">web</span><span style="font-family: 宋体;">接口。这个</span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">架构基础上的变化创建了二者的共生关系。原来赖以成名的&#8220;</span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">&#8221;现在实际上是</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: 宋体;">作为一个独立的项目，</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: 宋体;">就是一个这样的项目</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: 宋体;">。这些例子提供了高水平松耦合的典型案例。</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: 宋体;">的第一步直到最后一步。实际上，在</span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">里几乎没有什么不可配置的</span><span lang="EN-US">--</span><span style="font-family: 宋体;">个人认为这个特点既是</span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">发展的极大原动力之一，但同时也是其重大缺陷之一。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">松耦合配置的一般案例包括：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）把</span><span lang="EN-US">URL</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">2</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">3</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></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）如果你不想使用</span><span lang="EN-US">Sping</span><span style="font-family: 宋体;">框架，就得配置业务对象工厂；</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">2</span><span style="font-family: 宋体;">）改变</span><span lang="EN-US">URL</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">3</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">4</span><span style="font-family: 宋体;">）为新的框架功能增加插件；</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">（</span><span lang="EN-US">5</span><span style="font-family: 宋体;">）通过拦截器配置框架级功能；</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></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: 宋体;">的处理路径不易被开发者所理解。这一点在进行调试的时候比较明显。由于不理解发生了什么事，一个不了解系统的开发人员将不能快速高效的进行调试。问题本身可能比较简单，比如由一个没有进行正确配置的拦截器引起的，或者甚至只是因为拦截器的顺序不对引起的。只要理解处理路径上的每一个细节，很快就会找到问题的解决办法。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</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: 宋体;">）</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在过去几年中，单元测试已经成为软件开发过程中事实上的标准。它不仅保证了类逻辑的一致性，而且通过在类开发过程中甚至开发之前实现单元测试，将会减少设计的复杂性，并且会使设计更为健壮。</span></p>
<p class="MsoNormal"><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">的前身，</span><span lang="EN-US">WebWork</span><span style="font-family: 宋体;">就是建立在这种环境之上的。由于框架元素的松散耦合，测试很容易进行。在</span><span lang="EN-US">web</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: 宋体;">和拦截器最为常用，我们就对这两种组件进行详细的探讨。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Actions</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">通常在框架中是通过执行&#8220;</span><span lang="EN-US">execute()</span><span style="font-family: 宋体;">&#8221;方法来调用</span><span lang="EN-US">action</span><span style="font-family: 宋体;">的，或者在配置时调用任何一个返回值为字符值（</span><span lang="EN-US">String</span><span style="font-family: 宋体;">）的方法来进行调用的。从易测性的角度来看，这再简单不过了。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">我们来看一个例子。下面是一个数字累加的</span><span lang="EN-US">action</span><span style="font-family: 宋体;">类：</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 &#8220;success&#8221;;</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: 宋体;">，单元测试只需把</span><span lang="EN-US">action</span><span style="font-family: 宋体;">实例化、调用方法，并在断点出得到预期的结果就可以了。所有搜数据和资源都通过</span><span lang="EN-US">setter</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: 宋体;">需要的任何数据都能够直接在</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: 宋体;">一个为&#8220;</span><span lang="EN-US">execute</span><span style="font-family: 宋体;">&#8221;方法的输出进行设置，另一个则是为验证</span><span lang="EN-US">action</span><span style="font-family: 宋体;">的状态是否是我们预期的。单元测试如下所示：</span></p>
<p class="MsoNormal"><span lang="EN-US">public class myActionTest extends TestCase
{</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&#8230;</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>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">对于资源稍微有点麻烦，类似</span><span lang="EN-US">jMock</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">JUnit</span><span style="font-family: 宋体;">写成的，但是</span><span lang="EN-US">TestNG</span><span style="font-family: 宋体;">或其它任何框架都可以使用。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</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: 宋体;">当你编译拦截器的时候，测试会稍微有点复杂。不过也有一些额外的帮助可以利用。使用拦截器进行工作有两种情景。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">第一种情景是使用在调用时与</span><span lang="EN-US">ActionInvocation</span><span style="font-family: 宋体;">对象进行交互的拦截器。在执行后，你能够通过在断点出得到拦截器本身的状态来验证逻辑的正确性。在这种情景下，你能够利用与测试</span><span lang="EN-US">action</span><span style="font-family: 宋体;">同样的方法来测试拦截器。实例化拦截器、创建一个</span><span lang="EN-US">ActionInvocation</span><span style="font-family: 宋体;">对象的模拟实现</span><span lang="EN-US">(</span><span style="font-family: 宋体;">该对象带有在测试拦截器时将会用到的值</span><span lang="EN-US">)</span><span style="font-family: 宋体;">、调用</span><span lang="EN-US">intercept</span><span style="font-family: 宋体;">方法、在断点处得到预期的结果。这些可能发生在拦截器本身、被调用方法的返回结果或是由系统抛出的异常。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">第二种情景是使用与其环境或拦截器堆栈中的其它拦截器发生交互的拦截器。在这种情况下，测试需要通过</span><span lang="EN-US">ActionProxy</span><span style="font-family: 宋体;">类与</span><span lang="EN-US">action</span><span style="font-family: 宋体;">进行交互，还将会需要访问拦截器本身不能访问的其它环境对象。</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: 宋体;">类来为</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: 宋体;">类来为</span><span lang="EN-US">TestNG</span><span style="font-family: 宋体;">测试提供帮助。这些为</span><span lang="EN-US">ConfigurationManager,Configuration,
Container </span><span style="font-family: 宋体;">和</span><span lang="EN-US">
ActionProxyFactory</span><span style="font-family: 宋体;">类的实例提供了测试实现。涉及到的类还有</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: 宋体;">现在我们已经具备了安装环境的基础，测试本身变得容易了</span><span lang="EN-US">--</span><span style="font-family: 宋体;">遵循在第一种情景里所描述的步骤即可。唯一的不同点在于，不是调用拦截器的</span><span lang="EN-US">intercept()</span><span style="font-family: 宋体;">方法，而是需要调用</span><span lang="EN-US">ActionProxy</span><span style="font-family: 宋体;">类的</span><span lang="EN-US">execute()</span><span style="font-family: 宋体;">方法。如下述代码所示：</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>&nbsp;</o:p></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">action</span><span style="font-family: 宋体;">值或值堆栈的值。被执行的</span><span lang="EN-US">action</span><span style="font-family: 宋体;">能够在执行前或执行后通过下面的调用进行访问：</span></p>
<p class="MsoNormal"><span lang="EN-US">MyAction
action=(MyAction)proxy.getInvocation().getAction();</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">而值堆栈则可以通过下面的调用进行访问：</span></p>
<p class="MsoNormal"><span lang="EN-US">proxy.getInvocation().getStack();</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</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: 宋体;">随着应用系统越来越庞大，把</span><span lang="EN-US">web</span><span style="font-family: 宋体;">应用分离为许多模块就变得越来越重要。模块化允许在一个项目中开发的功能或新的框架特征能够独立打包，并可以在其它项目中进行重用。</span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">已经把模块化作为其架构的基础部分，允许开发者独立工作和编译彼此的项目。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">下面是一些对应用进行模块化的方法：</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: 宋体;">这并不影响应用的打包，由于配置信息根据功能界限进行逻辑分离而易于查找，从而简化的开发人员的工作。</span></p>
<p class="MsoNormal"><span lang="EN-US">(2)</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: 宋体;">、拦截器、拦截器堆栈、视图模板（</span><span lang="EN-US">JSP</span><span style="font-family: 宋体;">除外）等。浏览器插件的配置就是一个例子，该插件提供了一个完整的模块，当你把该模块添加到你的应用中时，其提供了一个</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: 宋体;">可以创建新的框架功能插件</span><span lang="EN-US">-</span><span style="font-family: 宋体;">非特定应用的新功能可以以插件形式捆绑并在不同的应用中使用。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">从技术角度来说，所有这些对应用进行模块化的方式都是一样的</span><span lang="EN-US">--</span><span style="font-family: 宋体;">都具有同样的配置元素（除了名称不同之外，&#8220;</span><span lang="EN-US">struts-plugin.xml</span><span style="font-family: 宋体;">&#8221;是系统自动加载插件时的配置文件）、具有相同的目录结构，并且它们也包含同样的框架和应用元素。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">插件的两种类型之间的唯一不同就是你在概念上如何看待它们，以及哪些元素和配置被放入分发包中。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</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: 宋体;">由于插件为核心框架功能提供了可选实现，所以有一些额外的配置元素。尽管在&#8220;</span><span lang="EN-US">struts.xml</span><span style="font-family: 宋体;">&#8221;和&#8220;</span><span lang="EN-US">struts-default.xml</span><span style="font-family: 宋体;">&#8221;配置文件中可以使用这些元素，但是通常情况下它们还是在插件配置文件中进行配置。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">对于插件来说，可选实现的配置分为两步：</span></p>
<p class="MsoNormal"><span lang="EN-US">1</span><span style="font-family: 宋体;">、使用</span><span lang="EN-US">&lt;bean .../&gt;</span><span style="font-family: 宋体;">标签中来提供可选接口的实现，使用一个唯一的键来识别它。</span></p>
<p class="MsoNormal"><span lang="EN-US">2</span><span style="font-family: 宋体;">、使用</span><span lang="EN-US">&lt;constant </span><span style="font-family: 宋体;">&#8230;</span><span lang="EN-US"> /&gt;</span><span style="font-family: 宋体;">标签在已配置的接口实现中选择一个。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">我们来更详细地看一下这两个步骤。</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;bean .../&gt;</span><span style="font-family: 宋体;">标签允许插件提供扩展点的实现信息。下面的例子就是一个展示在</span><span lang="EN-US">"struts-default.xml"</span><span style="font-family: 宋体;">文件中为一个对象工厂进行配置的情况：</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;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"
/&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">属性提供了在</span><span lang="EN-US">Struts2</span><span style="font-family: 宋体;">中创建和使用一个可选对象实现的所有信息。可以使用的属性如下所示：</span></p>
<p class="MsoNormal"><span lang="EN-US">class--</span><span style="font-family: 宋体;">提供类的全名；</span></p>
<p class="MsoNormal"><span lang="EN-US">type--</span><span style="font-family: 宋体;">指明类需要实现的接口；</span></p>
<p class="MsoNormal"><span lang="EN-US">name--</span><span style="font-family: 宋体;">对每个类进行唯一识别的简称；</span></p>
<p class="MsoNormal"><span lang="EN-US">static--</span><span style="font-family: 宋体;">指明是否把静态类方法注入到类的实例；</span></p>
<p class="MsoNormal"><span lang="EN-US">scope--</span><span style="font-family: 宋体;">指明所用实例的范围，其值可能为：</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: 宋体;">如果值为&#8220;</span><span lang="EN-US">true</span><span style="font-family: 宋体;">&#8221;，既是在创建类实例时出现错误，将仍然继续加载。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">接下来，</span><span lang="EN-US">&lt;constant
</span><span style="font-family: 宋体;">&#8230;</span><span lang="EN-US"> /&gt;</span><span style="font-family: 宋体;">标签允许开发人员选择使用哪个配置。只有两个属性</span><span lang="EN-US">--</span><span style="font-family: 宋体;">一个属性&#8220;</span><span lang="EN-US">name</span><span style="font-family: 宋体;">&#8221;提供了你的新实现所改变的扩展点的名称，另一个属性&#8220;</span><span lang="EN-US">value</span><span style="font-family: 宋体;">&#8221;就是在</span><span lang="EN-US">&lt;bean </span><span style="font-family: 宋体;">&#8230;</span><span lang="EN-US"> /&gt;</span><span style="font-family: 宋体;">标签中配置的&#8220;</span><span lang="EN-US">name</span><span style="font-family: 宋体;">&#8221;名称。</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;constant name="struts.objectFactory"
value="plexus" /&gt;</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;constant </span><span style="font-family: 宋体;">&#8230;</span><span lang="EN-US"> /&gt;</span><span style="font-family: 宋体;">标签是把一个新值赋给一个已知属性的一种方式。该值也可以在</span><span lang="EN-US">"web.xml"</span><span style="font-family: 宋体;">配置文件中使用&#8220;</span><span lang="EN-US">init-param</span><span style="font-family: 宋体;">&#8221;进行修改，或者在&#8220;&#8220;</span><span lang="EN-US">struts.properties</span><span style="font-family: 宋体;">&#8221;配置文件中作为一个名值对（</span><span lang="EN-US">name-value pair</span><span style="font-family: 宋体;">）进行修改。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">如果你没在开发一个插件，而只是使用常规</span><span lang="EN-US">"struts-xml"</span><span style="font-family: 宋体;">配置文件中的这些技巧，这里还有一个捷径。在</span><span lang="EN-US">&lt;constant ... /&gt;</span><span style="font-family: 宋体;">标签里，使用你通常放在</span><span lang="EN-US">&lt;bean ... /&gt;</span><span style="font-family: 宋体;">标签里的类值</span><span lang="EN-US">---</span><span style="font-family: 宋体;">这样做可以避免对</span><span lang="EN-US">&lt;bean
... /&gt;</span><span style="font-family: 宋体;">标签的需求。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">下面这张表列出了可配置扩展点的接口和属性名称：（表省略）</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: 宋体;">带给主流应用开发的一个概念。不是提供在很多应用中都很类似的配置文件，而是假定在多数情况下开发人员将会遵从一个特定的模式。这个模式非常普遍以至于可以被认为是一个惯例，这样就可以在框架中提供一个默认的配置而不是为每个新的应用提供一个配置。默认情况下，开发人员不需要提供配置信息。但是如果有与惯例配置信息不同的需要，就得提供相应的配置信息来代替默认配置信息。</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: 宋体;">已经采用了这种理念。松耦合给</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">Struts2</span><span style="font-size: 10pt; font-family: 宋体;">提供大的弹性，但是同时这也意味着该框架很难进行配置。而</span><span style="font-size: 10pt; font-family: 宋体;">惯例优先配置</span><span style="font-size: 10pt; font-family: 宋体;">原则则为</span><span style="font-family: 宋体;">这两种对立的力量提供了平衡，使开发人员的开发可以更加简单和高效。</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: 宋体;">的例子包括：</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>（1）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><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">&#8220;Struts-default.xml&#8221;</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: 宋体;">&#8221;是自动加载而不是显式加载的。</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>（2）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><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">action</span><span style="font-size: 10pt; font-family: 宋体;">名称和结果字符二者的结合来自动搜索结果模板，所以对于&#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: 宋体;">&#8221;来说，将会为一个&#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">success</span><span style="font-size: 10pt; font-family: 宋体;">&#8221;的结果返回&#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: 宋体;">&#8221;模板，而为一个&#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">error</span><span style="font-size: 10pt; font-family: 宋体;">&#8221;的结果返回&#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: 宋体;">&#8221;模板。</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>（3）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><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">action</span><span style="font-size: 10pt; font-family: 宋体;">进行配置时，当使用默认的&#8220;</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">success</span><span style="font-size: 10pt; font-family: 宋体;">&#8221;和</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US">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>（4）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><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: 宋体;">业务服务</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: 宋体;">框架插件后，不必为每个</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: 宋体;">提供的业务，因为这些业务会自动与</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"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;">在前面的章节中，我们已经看到了几个默认配置，以及如何通过配置使用新值来代替默认值。</span><span style="font-family: 宋体;">更多的配置选项</span><span lang="EN-US">,</span><span style="font-family: 宋体;">以及更多的惯例将会在接下来的章节中进行探讨。</span><span style="font-size: 10pt; font-family: times-roman;" lang="EN-US"><o:p></o:p></span></p><img src ="http://www.blogjava.net/atiger06/aggbug/132352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/atiger06/" target="_blank">leefoo</a> 2007-07-25 17:23 <a href="http://www.blogjava.net/atiger06/archive/2007/07/25/132352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2配置文件说明(翻译自startingstruts2online)</title><link>http://www.blogjava.net/atiger06/archive/2007/06/22/125748.html</link><dc:creator>leefoo</dc:creator><author>leefoo</author><pubDate>Fri, 22 Jun 2007 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/atiger06/archive/2007/06/22/125748.html</guid><wfw:comment>http://www.blogjava.net/atiger06/comments/125748.html</wfw:comment><comments>http://www.blogjava.net/atiger06/archive/2007/06/22/125748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/atiger06/comments/commentRss/125748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/atiger06/services/trackbacks/125748.html</trackback:ping><description><![CDATA[<p>一、struts.properties文件说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts.properties配置文件提供了一种改变框架默认行为的机制。一般来讲我们没必要修改这个文件，除非你想拥有一个更加友好的开发调试环境。struts.properties文件中所包含的所有属性都可以在web.xml配置文件中使用"init-param"标签进行配置，或者在struts.xml文件中使用&#8220;constant&#8221;标签进行配置。<br>&nbsp;可以被修改的属性允许改变Freemarker选项－－改变&#8220;action-mapping&#8221;类、决定是否允许XML配置文件重载及确定默认用户接口主题等行为。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个名为&#8220;default.properties&#8221;的属性文件包含在&#8220;Struts2-Core&#8221;JAR文件中。你可以在你项目源文件路径的根目录下创建一个名为&#8220;struts.properties&#8221;的文件，来对某个属性进行修改。这样你就可以增加你想要修改的属性。新的属性值将会覆盖默认值。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在开发环境下，你可能会考虑修改下面一些属性：<br>&nbsp;(1) struts.i18n.reload = true&nbsp; －－允许国际化文件重载；<br>&nbsp;(2) struts.devMode = true －－允许开发模式以提供更方便的调试功能；<br>&nbsp;(3) struts.configuration.xml.reload = true －－允许XML配置文件重载功能，以便在有变化时可以重载而不需重载servlet容器中的整个web应用；<br>&nbsp;(4) struts.url.http.port = 8080 －－设置服务器允许端口，以便正确创建生成的URL。</p>
<p>二、struts.xml文件说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts.xml文件包含了当你开发action时需要修改的配置信息。下面我们来看一下该文件的固定结构。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据你所开发应用的功能不同，有可能在你的应用中完全用不着&#8220;struts.xml&#8221;配置文件。我们这里所说的配置能够被包含注释的替代方法、&#8220;web.xml&#8221;中的初始化参数及可替换URL映射配置进行处理。需要&#8220;struts.xml&#8221;文件进行配置的属性有全局结果、异常处理及自定义拦截器堆栈。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个XML文件，所以第一个元素是XML版本和解码信息。接下来是该XML的文档类型定义（DTD），提供该文档所包含元素的结构信息，以便被XML解析器和编辑器使用。</p><img src ="http://www.blogjava.net/atiger06/aggbug/125748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/atiger06/" target="_blank">leefoo</a> 2007-06-22 10:09 <a href="http://www.blogjava.net/atiger06/archive/2007/06/22/125748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>