分享
 
 
 

克服Struts开发障碍(二)

王朝other·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

目录:

五、Back之痛!

六、你是谁,在这做什么?

七、我们去往何处?

八、犯错乃人之常情...我们不是圣贤

九、测试,就是用户想要的!

十、简化Struts 开发

五、Back之痛!

设计演示层,有一个好方法就是按照功能设计。例如:在一个预订系统中预订的时候,将所有的相关动作类封装到一个包装内如

com.companyname.productname.presentation.

reservation.mak

就是一个不错的方法。深度封装也可以应用到ActionForm类中。表格应该处在功能周期的会话期内。这就保证了该完整功能所需的数据放在表格对象本身之内。这样用户就能够前进到功能的任何页面并且找到该页上显示的正确数据。接着用户还能够在最终保存该数据之前更新数值。因此,就会产生一个有趣的两难局面:当用户确认数据、按下浏览器中的Back 按钮、修改并再次提交的话会发生什么事情?例如,在创建了数据库中的预定后,用户返回并试图再次提交同样的数据。演示层必须在应用层有机会抱怨之前先捕捉到这个错误。处理这种情况的方法之一就是在提交之前创建一个令牌,提交之后检查令牌的有效性,并立即修改令牌值??这样用户就不能够再次使用Back 按钮来提交同样的值。

这个方法的弊病之一就是需要管理令牌:例如,如果用户试图保存数据失败了,但是令牌值却已经修改了。如果这样的话,用户就不能够修改数据,和在不重新设置令牌的情况下重新提交。相应的Action 类也不会允许提交。那么到底什么时候才应该重置令牌呢?用户可以遍历六个页面,那么在确认它的修改时就会收到错误,然后定向到六个页面中的任何一个页面。

要管理这个问题,就需要在用户请求一个特别功能时创建一个表格并在会话期内存储一个默认的令牌值。在保存之前,用户可以多次使用Back按钮进行修改。一旦用户提交了这些修改,只有在保存成功之后才能重新设置令牌。如果确认失败,用户可以使用Back 按钮或者前进到产生失败的页面,修改数据然后重新提交数据。一旦确认成功的话,令牌值就会修改。ActionForm 对象本身也可以包含令牌值(令牌值可以通过程序设置)。还有一个方法就是,在第一次提交之后,Submit 按钮就变得无效、不允许用户再次提交直到有事情发生。我们建议每个ActionForm 处理他自己的令牌,应用至多是使用不止一个不同的ActionForm对象来处理一个特殊功能。

要了解另外一个复制表格提交的方法,请参考Romain Guay的 "Java Tip 136: Protect Web Application Control Flow" (JavaWorld, March 2003).

六、你是谁,在这做什么?

企业应用必须设计成能够同时支持多个认证模式。这对于来自ISVs(独立的软件开发商)的软件更为重要。例如,假设一个应用的认证要求是单一登录、询问用户密码、条形码认证或者指纹认证,甚至是将来有可能出现的声音认证。JAAS (Java 认证和授权服务),这个可插入的认证机制,证明可用于这个方面。默认的, Struts 1.1 支持JAAS。JAAS也可用在具有极好结果的Struts 1.0中。对于认证,一个很好的继承性设计将会推动使用不同的认证动作类,每个动作类都有他自己唯一的Action 映射。这种设计方法将会推动对不同认证的同时支持。如果需要添加新的认证机制,只要用一个支持该认证的Action类在struts-config.xml内创建一个新的动作映射即可。

七、我们去往何处?

流程控制器的设计目的是限制和引导用户通过应用程序,它在保证用户遵循特殊流程方面很实用。让流程控制器以系统的地位为基础证明是有用的。无论用户什么时候试图访问系统中的功能,流程控制器都可以确保用户有权进入到特殊流程中。而且,就算出现了意外情况,用户也能够被引导到恰当的页面。放置流程控制器最好的地方是在超类中。只有在流程控制器满意之后用户才允许执行特定动作。

图 2 给出了一个简单的继承性模型,它可用来使用合并到用户认证中的流程控制器。

Figure 2. Simple authentication class model

八、犯错乃人之常情...我们不是圣贤

Struts框架通过ActionError和ActionErrors类为我们提供了异常处理结构。 ActionError就是??存在于Action 或者ActionForm类中的错误,或者应用层给出的错误。ActionError 类典型地可通过使用简单的钥匙构造,或者通过使用钥匙/值对来构造。如果你的应用有国际化关系,那么该钥匙可用于查找国际化信息资源数据库。如果这些国际化关系不存在的话,那么取代值可用于显示错误信息。至多有四个占位符设置在对象排列中,每个占位符都包含整个错误信息的一个单独部分。这些值可构造得与MessageFormatter 类相似。

ActionErrors类,扩展了ActionMessage 类,它是具有单一公共方法的ActionError 类的集合,这个单一公共方法是add(java.lang.String property, ActionError error)。这个方法签名中的第二个参数是直接的:他指的是已经存在的真实错误(ActionError)。通过将错误信息与指定的域关联起来,属性参数可用于域级别的校验。既然错误信息与指定域关联,你可以轻易地将信息定位于有疑问的域附近或者定位于它能产生最大意义的任何地方。例如,如果你在用户的逻辑标记符之上进行域级别的校验,并且在类LoginAction 中出现错误,你可以使用下列代码片断:

ActionErrors errors = new ActionErrors();

errors.add("logiinID", new ActionError("loginID.invalid"));

saveErrors(_request, errors);

return (new ActionForward(_mapping.getInput()));

字符串"loginID.invalid"就是用于信息资源数据库中国际化字符串值的钥匙。为了显示错误信息,在你的login.jsp中,使用下列HTML:

<font color="red"><html:errors property="loginID"/></font>

有了对用于异常和异常链的Struts 框架设备的这个特别理解,要管理整个企业应用结构中的错误需要一个更加通用的方法。企业应用异常框架中最重要的宗旨有:

?开发异常类体系

?从系统异常中退耦用户异常

?给出异常的内容、类型和严重级别

?退耦异常处理和应用日志

?创建用于异常链的工具

?具体化用于国际化用途的异常字符串

许多文章和关于这个问题的完整书籍,都讨论了使用Java的异常处理。Brian Goetz,在他的JavaWorld 系列 "Exceptional Practices" 中提供了关于这个主题的非常好的建议。

九、测试,就是用户想要的!

尽管许多开发者都把测试看作是软件开发的最不吸引人的部分,测试企业应用对于它的整体成功还是很关键的。许多灵活的方法,如极限程序设计(XP),将测试放在企业应用开发的最前部。这种强调实际上是相当爽的。为了简洁起便,我们只讨论用于Struts 类的单元和集成测试策略。

两个原始策略可用于服务器端的测试:模拟对象(MO)测试和容器内(IC)测试。模拟对象测试从本质上扩展了"多树桩的"行为,并且它是自我说明的。从本质上说,开发者负责模拟定义接口的类,这些接口归进行测试的类使用。使用这个方法,开发者可以模拟容器。模拟对象测试也被叫做endotesting ,因为设置测试的动作是在受限环境中的类的内部进行的。

容器内测试这个策略应用于下列情况:在产品环境中将要使用的实际容器也用于整个单元测试过程中。这些测试案例必须至少合并到使用Ant的每夜建立过程中。单元测试Java类的有效方法之一就是使用JUnit。他是用来测试普通JavaBeans 的一件极好的工具。另外一个重要的开源工具就是Cactus。Cactus,JUnit框架的扩展,可以在单元级别上测试服务器端的代码。Cactus 支持用于服务器端测试的容器内方法。这两个测试工具都是很有用的,它是任何追求品质的企业应用开发团队的基石。

对于测试Struts来说,普遍接受的策略就是通过应用层测试演示层。你选择模拟对象测试方法还是容器内测试方法,主要取决于你们团队的需要和安慰级别。要自动执行Struts 测试,需要创建一个名为StrutsTestCase 的、对于JUnit测试方法的扩展,它对MO 和 IC都支持。使用StrutsTestCase 测试Action 和ActionForm 类,是整个测试策略的一部分,它应该包括这里讨论的回归测试工具。其他工具如Apache JMeter 提供了应力/负载测试。

十、简化Struts 开发

总的来说,我们讨论了你应该如何简化struts-config.xml文件的设计和维护,定义了错误处理和测试策略,简化了常见问题如处理Web浏览器的Back按钮,基于会话期的表格管理以及用户认证。最后,我们还清楚的文档化了用户界面控制流程的管理。我们的经历告诉我们:开发高品质的企业应用是困难的。当你使用Struts框架创建企业应用时,融合我们的建议到你的开发计划中,你就能够使你的设计、开发和维护费用减至最低。

关于作者 Michael Coen 是AgilQuest Corporation的软件结构师。在AgilQuest时, Mike成为了OnBoard的基于J2EE的企业软件应用程序开发团队中的一员。Mike 从事专业软件开发已有11年多。

Amarnath Nanduri 是AgilQuest Corporation的资深软件开发工程师。 Amar在过去六年内一直从事企业软件应用程序的设计和开发,特别是在用户界面设计和开发方面。Amar 使用Struts框架进行开发已有两年。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有