??xml version="1.0" encoding="utf-8" standalone="yes"?>
和C/Sl构相比QB/Sl构受限于网l带宽不利于q行大数据量的统计分析,|络传输存在潜在的安全问题,q有用户界面不及C/Sl构友好{等Q但随着|络带宽和网l应用的发展Q加上AJAX技术的行Q得现在越来越多的MISpȝ或基于MISpȝ的专业化应用pȝ都开始們于采用B/Sl构q行设计Q充分利用B/Sl构的优炏V但是,要充分发挥Web应用的内在潜力,挖掘应用深度和扩大适应能力Q需要采用先q的应用架构和以实用为根本准则,使得pȝ既能满业务需求,又能适应来发展需要。因此,在开发Web应用pȝ旉要尽量遵循Web应用pȝ设计原则?br />
实用性原则:q是所有应用Y件最基本的原则,直接衡量pȝ的成败,每一个提交到用户手中的系l都应该是实用的Q能解决用户的实际问题,否则该设计就是垃圾?br />
适应性和可扩展性原则:pȝ需要具备一定的适应能力Q特别是Web应用要能适应于多U运行环境,来应Ҏ来变化的环境和需求。可扩展性主要体现在pȝ易于扩展Q例如可以采用分布式设计、系l结构模块化设计Q系l架构可以根据网l环境和用户的访问量而适时调整Q从某种E度上说Q这也是pȝ的适应性?br />
可靠性原则:pȝ应该是可靠的Q在出现异常的时候应该有人性化的异怿息方便用L解原因,或采取适当的应Ҏ案,在设计业务量比较大的时候可采用先进的嵌入式技术来保证业务的流畅运行?br />
可维护性和可管理性原则:Webpȝ应该有一个完善的理机制Q而可l护性和可管理性是重要的两个指标?br />
安全性原则:现在的计机病毒几乎都来自于|络QWeb应用应尽量采用五层安全体p,即网l层安全、系l安全、用户安全、用L序的安全和数据安全。系l必d备高可靠性,对用信息进行严格的权限理Q技术上Q应采用严格的安全与保密措施Q保证系l的可靠性、保密性和数据一致性等?br />
M规划、分层实施原则:在开始设计之前应该对Webpȝq行M设计Q然后在M设计指导下分步开发。基于J2EE技术的应用pȝ是一个融合了多元信息的集成系l,现在一般都采用分层开发:表现层、控制层、业务逻辑层、模型层、数据访问层{,在适应pȝ需求的准则下,设计低耦合的分层结构,利于团队成员的分工协作,提高开发效率,降低目风险Q实现各个模块的功能设计Q完成整个系l的开发?/font>
]]>
ActionForm
?span lang="EN-US">Struts设计中比较有争议的一个概念,在某些情况下也许不会使用?span lang="EN-US">ActionFormQ具体可以参?span lang="EN-US" style="COLOR: navy">《Struts Action的多U角?/span>?/span>一文。尽如此,ActionForm在许多应用的开发中都实C重要的功能,它是Struts框架提供?span lang="EN-US">DTOQ用于在视图层和控制层之间传?span lang="EN-US">HTML表单数据Q控制层可以?span lang="EN-US">ActionForm Bean中读取用戯入的表单数据Q也可以把来自模型层的数据存攑ֈActionForm Bean中,q回l视图,即用它的主要目的是字段采集、类型{换器、以及传输对象等。对?span lang="EN-US">ActionForm Bean?span lang="EN-US">MVC中所处层ơ结构的理解Q可以参?span lang="EN-US" style="COLOR: navy">《剖析MVC中的各种Object?/span>?span lang="EN-US">
ActionForm
的基本功?span lang="EN-US">
1.
字段采集
?span lang="EN-US">Web应用E序开发过E中Q数据的采集是最基本的一个环节,?span lang="EN-US">html定义的数据输入控件和http定义的数据传输协议非常简单,因此?span lang="EN-US">Struts中设计了ActionForm来I补这U不?span lang="EN-US">Struts?span lang="EN-US">http参数处理的方法是输入参C递到JavaBean属性来q行处理Q当ActionForm的属性与某个h参数匚wQ框架自动以参数的D|属性?span lang="EN-US">
2.
数据校验?span lang="EN-US">
Html
没有在数据提交之前对数据q行校验的能力,使用javascript可以做到q些Q优点在于可以减L务器负担Q但javascriptl常会被览器禁止,因此Q在Struts?span lang="EN-US">ActionForm实现了部分数据校验的功能Q当输入数据不符合要求时Q页面将被返回到数据数据面Q要求用户重新输入。一般情况下Q?span lang="EN-US">ActionForm属性定义ؓStringcdQ以便对各种输入q行捕获。另外,q可以用ActionForm?span lang="EN-US">Action对输入数据进行双重校验,ActionForm校验数据cd是否正确Q?span lang="EN-US">Action校验该数据是否满业务层的其他要求?span lang="EN-US">
3.
cd转换
HTML
表单中的数据cd一般是String?span lang="EN-US">booleancdQ通过?span lang="EN-US">ActionForm Bean中实?span lang="EN-US">HelperҎQ可以实现属性类型的转换?span lang="EN-US">
4.
传输对象
ActionForm
可以作ؓ其他Bean的数据蝲体,它装载的数据通常对应着持久层中的不止一个实体?span lang="EN-US">
Struts标签提供了大部分应用来满_?/SPAN>MVC架构表现面的所有功能。在一?/SPAN>MVC应用中,hq不是直接到达表现页面,而是首先l过控制器,仅当业务数据被获取,q且业务规则被应用后Q控制器才处理表现页面。页面的职责是输出l果和捕L戯入,Struts标签的功能目的就在于此?/SPAN>
虽说Struts标签库能满我们大多数情况下的需要,但不是唯一可用的标{,例如JSTL标签?/SPAN>DisplayTag{等?/SPAN>Struts标签和其他各U标{基本使用Ҏ在各U书本上都有介绍Q这里ȝ一下标{用中的个Z会,q不断更新?/SPAN>
1. Struts中包含三个标{ֺQ?/SPAN>Bean?/SPAN>HTML?/SPAN>LogicQ其?/SPAN>HTML标签库依赖于框架Q其他大部分标签不依赖于框架Q可以在其他应用中用?/SPAN>
2. Struts HTML标签和一?/SPAN>HTML标签h一定的对应关系Q但也存在一点不同。?/SPAN>Scriptlet?/SPAN>HTML标签需要在使用前在面中将Form Bean声明Z个脚本变量,Struts标签则不需要声明就能找到该Bean。在默认情况下,Struts标签对剩下的表单用同一?/SPAN>BeanQ所以不需要对每一个控仉q行指定。例如:
<input type=“text?name=“username?value=?lt;%=user.getUsername()%>?>
使用Struts HTML标签
<html:text property=“username?gt;
3. Struts HTML标签和一?/SPAN>HTML标签h一定的对应关系Q但存在几个特例Q在Struts HTML标签中,Messages / errors / rewrite分别用来表示昄一l消息、显CZl错误消息、输Z个编码的URL路径Q而这些在一?/SPAN>HTML标签中就不存在?/SPAN>
4. HTML有时需要处理特D的字符Q包括标{括号?/SPAN>&W号以及其他的内容,如果q些字符作ؓ文本字段的一部分Q可能会出现错误q成HTML崩溃。如果确实需要在数据中存储这些字W,可以在网中q行讄Q得这些字W不被页面过滤成为特D字W,例如Q?/SPAN>
<bean:write name=“UserForm?property=“username?filter=“false?>
5. 使用<html:password>Ӟ如果面校验错误Q?/SPAN>password属性将?/SPAN>Form Bean中读回,q放|在password标签中。虽然密码会被浏览器用符号隐藏,但在HTML源代码中仍然可以看到Q存在安全上的隐患,因此可以在标{中加入redisplay=false来保?/SPAN>passwordL以空白状态显C给用户?/SPAN>
6. 提供一?/SPAN>Javascript的返回按钮,可以定义一个没有属性的单表单,Struts配置文gQ?/SPAN>
<action path=?adduser?BR> type=“org.apache.struts.ForwardAction?BR> name=“BlankForm?BR> scope=“request?BR> validate=“false?BR> parameter=?user.do?gt;
JSP面Q?/SPAN>
<html:form action=?adduser?gt;
<html:button property=“page?onClick=“history.go(-1)?gt;here</html:button>
</html:form>
今天要回儡?/SPAN>Validator?/SPAN>Tiles以及单的Plugin实现Q刚刚登?/SPAN>blogjava发?/SPAN>Mustang已经发了两篇好文《在Struts中?/SPAN>Validator实现可配|的信息校验(一) (?/SPAN>)》,本文则从实现程来ȝValidator的用方法,q?/SPAN>Validator?/SPAN>Tiles{?/SPAN>Struts PlugIn插g略谈一些个人心得?/SPAN>
Validator
在?/SPAN>ActionFormӞ数据的验证工作攑֜validator()Ҏ中虽说是一个可行的ҎQ但?/SPAN>ActionForm中编写特定的验证逻辑会降?/SPAN>ActionForm的重用性,q给pȝ的维护带来麻烦?/SPAN>Validator框架可以验证逻辑U至ActionForm之外Q实?/SPAN>Javascript客户端验证或服务器段验证。具体实?/SPAN>Validator验证步骤如下Q?/SPAN>
1. Validator是以plugin的方式来扩充ActionServlet功能的,需要在Struts-config.xml中声明这?/SPAN>plugin?/SPAN>
2. 导入Validator中的资源信息Q用来向用户提示验证中出现的异常消息?/SPAN>Validator可以支持国际化信息,为每一个国际化信息提供对应的资源信息?/SPAN>
3. 利用validaton.xml文g来定义用户需要验证的每一?/SPAN>JSP表单中的每一个字D늚验证规则Q其中可以利?/SPAN>validator-rules.xml中已l设计好了的验证器,也可以自定义验证方式?/SPAN>
4. 客户端验证需?/SPAN>validator-rules.xml中已提供的验证规则,或是自定义规则,然后?/SPAN>jsp面中声?/SPAN><html:form action=?action.do?onsubmit=“return validateActionForm(this);?gt;Q加上可以生成实现验证的Javascript代码<html:javascript formName=?I style="mso-bidi-font-style: normal">ActionForm?staticJavascript=“true?>。服务器端验证同样需?/SPAN>validator-rules.xml中已提供的验证规则,或是自定义规则,另外Q实现验证的ActionForm需要是DynaActionForm的子c,和客L验证不同的是Q在捕获服务器端错误消息Ӟjsp面中需要嵌入代?/SPAN>
<html:messages id=“error?gt;
<bean:write name=“error?>
</html:messages>
在配|和设计Webpȝ验证功能的时候,需要注意的是要理解?/SPAN>validaton.xml中定义验证规则的时候每个参数的具体功能Q我最初?/SPAN>Validator的时候就因ؓ参数h而验证失败,费了一Ҏ间。还有就是自定义验证规则Ӟ需要注意每个参数的具体含义Q例如在某种情况下,validaton.xml?/SPAN><var-name>myproperty</var-name>中自定义的属?/SPAN>myproperty需要和自己~写的验证器cM的代码一致等{?/SPAN>
Tiles
Tiles是一个模板机Ӟ它可以让|页的配|框架和内容分离Q提供一个版面管理机制。通常有两U方式管?/SPAN>Tiles配置资源Q一U?/SPAN>XMLQ另一U?/SPAN>JSP面直接理?/SPAN>
使用XML配置?/SPAN>Tiles可以支持国际化,例如可以另存?/SPAN>tiles-defs.xmlq命名ؓtiles-defs_zh.xmlQ将encoding改ؓGB2312Q这样可以在配置中用中文。?/SPAN>XML配置文g可以方便的实现版面配|和内容的分,q且能扩充某个定义,辑ֈ重新定义其中所理面资源的目的。?/SPAN>JSP面直接定义理版面的配|资源更为简单和灉|Q同样可以和xml一样重新定义网늚地址。不使用JSP框架面而是直接?/SPAN>JSP面中用配|页面,可以不用额外d义管理文Ӟ但缺Ҏ无法重用q个面定义的内宏V?/SPAN>
?/SPAN>Tiles?/SPAN>CSSl合hQ基本上能满一般页面控制的需要?/SPAN>
PlugIn插g
通过l承ActionSerlvetQ重写它?/SPAN>init()ҎQ修Ҏ增减它的初始化资源来辑ֈ改变ActionServlet功能的方法,q从软g架构角度上来讲ƈ不是一个好Ҏ?/SPAN>Struts1.1之后Q可以通过PlugIn接口来实现动态增?/SPAN>ActionServlet功能的目的?/SPAN>ActionServlet加蝲后,会执行实?/SPAN>PlugIn接口的类?/SPAN>init()ҎQ在ActionServletl止前,执行实现PlugIn接口的类?/SPAN>destroy()Ҏ?/SPAN>Validator?/SPAN>Tiles是利用q种方式来扩?/SPAN>Struts功能的?/SPAN>
写到q里Q感觉用好Validator?/SPAN>Tiles{?/SPAN>PlugIn插g最重要的就是对配置元素的理解,和程序调用流E的掌握Q了解到Struts的插件机制是如何q{的,以此来扩?/SPAN>Web应用E序的功能,提供更好的用户体验?/SPAN>
?/SPAN>Struts中,ActionServlet担Q分配工作的控制器角色Q实际的工作是交l?/SPAN>Action对象来进行的?/SPAN>Action?/SPAN>Struts框架的核心类之一Q它主要用来讉K业务层、ؓ表现层准备数据对象和处理错误异常?/SPAN>
Action?/SPAN>Struts框架中基本上属于控制器的角色Q通常不徏议在Action中加入过多的业务逻辑Q将业务逻辑装在其他的cMQ然后在Action中徏立这些类的对象,调用对象的方法来实现业务功能。比较遗憄是,当业务逻辑中出现异常的时候没有办法将异常说明在页面中直接反应出来Q展现给用户Q在Action中控制这些异常可以做到这炏V?/SPAN>
要更详细的了?/SPAN>Action的工作机理,p剖析ActionServlet控制器的工作程及其核心Ҏ。在Struts中,担Q控制器角色的核心?/SPAN>ActionServletQ所有的h都必d通过它,而对所有请求的处理是交付给RequestProcessor来完成的Q既然处理请求的d是交l?/SPAN>RequestProcessor来完成,那么可以直接查看org.apche.struts.action.RequestProcessorc,看其process()Ҏ实现了哪些功能,从源代码中的英文注释我们可以更深入了解到整个处理q程Q很多书c和|上不少文章都描qCq个q程Q还有典型的处理q程囄Q这里就不再详述。只是从q个q程可以看出Q通过l承ActionServlet来定义自q控制器请求意义不大,重写init()Ҏ倒是可以修改初始化工作,如果需要定义自q控制器,可以l承RequestProcessorq修改其中的process()Ҏ来实现?/SPAN>
?/SPAN>Struts应用中,除了直接l承org.apache.struts.action.Actioncd?/SPAN>Action功能外,Strutsq提供了其他几种ActioncL满某种特定需要,q些书本上已l写了很多,q里只是照葫芦画瓢略作ȝQ?/SPAN>
ForwardAction?/SPAN>当需要从一个页面{到另一个页面或资源Ӟ不提倡直接用页面或资源路径调用Q除了与MVC/Model2架构向背之外Q有时还会带来其他的问题Q前几天在网上看C个帖子就是因为直接调用资源出C异常Q具体出自于哪里没有C。这里,应该通过控制器?/SPAN>ForwardAction来完成链接的跌{Q用属?/SPAN>parameter讑֮forward的链接地址?/SPAN>
IncludeAction?/SPAN>?/SPAN>ForwardActioncMQ当需要引入一个资源时Q可以?/SPAN>IncludeAction来实玎ͼ属?/SPAN>parameter讑֮include的链接地址?/SPAN>
SwitchAction?/SPAN>用于从一个模块{换至另一个模块,一U方法是使用相对?/SPAN>Context的\径来q行forward查找Q另外一U就是?/SPAN>SwithActionQ它需要在h中带两个参数Q一个是prefix用来指定模块前缀名称Q一个是page用来指定相对于模块的资源路径?/SPAN>
DispatchAction?/SPAN>随着Struts Web应用规模扩大Q维?/SPAN>Action复杂度提高,可以使用模块化来理Action。另一斚wQ当一个页面需要多?/SPAN>ActionӞ我们可以?/SPAN>DispatchAction来将一个页面中所有相关的动作攑֜一?/SPAN>actioncM实现Q此时不需要重定义execute()ҎQ它已经?/SPAN>DispatchAction抽象cM定义Q我们需要编写自qҎ来响应一个页面上不同的动作。它的关键属性是parameter?/SPAN>
LookupDispatchAction?/SPAN>它是DispatchAction的子c,不同的是Q当面按钮?/SPAN>property属性相同的时候,它可以通过查询资源文g来确定相应的动作Q这个功能主要是通过重写getKeyMethodMap()Ҏ实现的?/SPAN>
前段旉?SPAN lang=EN-US>Struts完成一个小目Q当时还没有来到blogjavaQ很多东西也没有记录。现在花一Ҏ_整?SPAN lang=EN-US>Struts
应用重新温习一遍,重新挖掘目开发过E中没有注意到的知识点,q写下自q一些心得与体会?SPAN lang=EN-US>ActionMapping
ActionMapping对Struts应用中有效的业务逻辑q行分类Q当一个请求到达时Q?/SPAN>ActionSevlet?/SPAN>ActionMapping目录中查扑֯应的信息?/SPAN>ActionMapping?/SPAN>Struts应用的一个核心设计,当需要了解一?/SPAN>Struts应用Q或~写一个新?/SPAN>Struts应用的时候,都应该从ActionMapping入手?/SPAN>ActionMapping有较多的属性信息,具体参考相x档?/SPAN>
ActionForward
ActionForward?/SPAN>Struts的核心类之一Q其基类仅有4个属性:name / path / redirect / classname。在ZStruts?/SPAN>Web应用E序开发过E中Q?/SPAN>Action操作完毕后程序会通过Struts的配|文?/SPAN>struts-config.xml链接到指定的ActionForwardQ传?/SPAN>Struts的核心类ActionServletQ?/SPAN>ActionServlet使用ActionForward提供的\径,控制传递给下一个步骤?/SPAN>ActionForward控制接下来程序的走向?/SPAN>ActionForward代表一个应用的URIQ它包括路径和参敎ͼ例如Q?/SPAN>
path=?modify.do?method=edit&id=
ActionForward的参数除了在struts-config.xml和页面中讄外,q可以通过?/SPAN>ActioncMd参数Q或重新?/SPAN>Action中创Z?/SPAN>ActionForward?/SPAN>
?/SPAN>ActionForward中有一个重要的属?/SPAN>redirectQ当redirect=falseӞ保存存储在httph和请求上下文中的所有内容,仅在同一个应用中可用。当redirect=trueӞWeb客户端进行一ơ新?/SPAN>httphQ请求的资源可以在同一个应用中Q也可以不在Q原来的h参数不再保存Q原来的h上下文也被清除,新的httph仅包?/SPAN>ActionForward?/SPAN>path属性里所包含的参数。如果在同一个应用中Q用户会话的上下文会被维护?/SPAN>
ActionForward分ؓ全局转发和局部{发,Action?/SPAN>Mapping对象?/SPAN>findForwardҎ首先会检查局部{发列表,查找p|׃到全局转发列表中查找。书写格式中Q我们一般将全局变量定义?/SPAN>String常数Q避免误解,使得转发列表l构清晰易读?/SPAN>
在项目开发过E中l常到一U情况,当页面已l改变了Q浏览器中的地址?/SPAN>/modify.do?/SPAN>/modify.jsp却没有变化,当时没有考虑q么l,虽然存在疑问Q但没有影响到程序功能的实现Q因此忽略过MQ今天查找了一些资料才弄清楚。客L览器显C的是浏览器最后被l定?/SPAN>URLQ当URL被提交后Q在某个lgq回一个响应给览器之前,Web应用可能已经转发h多次Q而这些过E都发生在服务器端,客户端浏览器q不知道有什么变化。当一?/SPAN>http响应被返回时Q它q没有包含地址栏的|所以浏览器仅仅昄其用来作为初始请求的地址。通过使用redirect可以改变览器地址的显C,因ؓq样可以向浏览器提交一个新的请求,但付出的代h是数据不能通过h上下文传递到面Q这也是使用forward?/SPAN>redirect的差异之一?/SPAN>
Web标准日渐行
当Jeffrey Zeldman?003q出版《Designing With Web Standards》的时候,CSS已经被主浏览器支持?q之久。Web标准其实分三斚w:l构化标准语a主要包括XHTML和XMLQ表现标准语a主要包括CSSQ行为标准主要包括对象模?如W3C DOM)、ECMAScript{。他的的主要好处在于~小了页面大、布局更加随意、也有利于页面和代码的分,正是q些好处让微软MSN、网易、阿里巴巴和CSDN{网站在2005q陆l按照Web标准q行了重构?/font>
Ajax:用户体验型的富客L技?/strong>
用过微YLive服务的用户都为网l程序能随意拖动和放|页面栏目、无h更新|页数据、渐变的颜色处理感到吃惊Q这些“酷”的技术被冠名为AjaxQ这Ҏ术最早由Google应用在GoogleMap和GoogleMail中,其实Ajaxq不奇Q原理是通过调用XmlHttpRequest实现与服务器的异步通讯Qƈ使用对应q_的XmlDom对返回的Xml消息q行处理Q然后再通过DOM寚w面中的HTML元素的操作实C富的、友好的用户界面。这和当初微软推q的Remote Scripting几乎如出一辙。不q,和当初不同的事,q项技术得C_的重视,相关开发包源源不断Q成?005最具亮丽的一道风景线Q微软也耐不住寂寞,卛_推出Atlas是用来帮助开发者更Ҏ地构建Ajax站点。Ajax的风行说明用户对于丰富的Web体验的需求日益增长,q种势不可逆{?/font>
RoR预示d开发框架的行
RoR是基于Ruby语言的轻型Web开发框Ӟ不仅开发效率高(部vҎ)、功能丰?支持Ajax{流行应? Q不可思议的是Q他的性能比基于Struts和Hibernate的Java应用q高15%-30%。目前,其他语言也已l有cM的框Ӟ如基于Python的Django、PHP的Cake、ASP.NET的Castle{等。Web应用特点是需求变化非常快QRails提倡的“约定强于配|”的理念正好q合了这U发展潮。不q,使用RoR的大型网站还不多见,是否l得赯验Q还?006q?/font>
Web开发的2005q_我们q应当关注的是:
ASP.NET 2.0随NET Framework 2.0发布
每个ASP.NETE序员需要关注的产品。虽然不是一个革命性的升Q很多新Ҏ还是够让开发者心动。有?.0Q谁q愿意?.x?微Y的品L让h对他产生依赖?/font>
Jdon Framework
q个由国人彭晨阳开发的中小型J2EE应用pȝ的快速开发框架已l发布了1.3版本Q和RoRcMQJdon框架? Action的CRUD功能实现是由配置文g实现的,一般情况下无需~码。支持日本的RubyQ不如支持中国的JdonQ你们觉得呢?