




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Struts2中的零配置与CoC(Convention over Configration)关键字: struts2中的零配置与coc(convention over configration) Struts2中的零配置与CoC(Convention over Configration)摘要:介绍Struts2中的零配置(Zero Configuration),以及如何用COC来更好地简化Struts2的配置。在第一章,我使用Maven来创建一个起点项目;第二章,以该项目为例,讲解如何使用Struts2的零配置;第三章,论述第二章中的实现方式的缺陷,然后讲解如何使用COC来改进这些缺陷,并进一步简化Struts2的配置。附件是这篇文章用到的示例代码。一、从零开始这里,我将建立一个新的示例项目,作为讲解的起点。我使用JDK 6、Maven 2、Eclipse 3.3来建立这个示例,如果读者对Maven2不熟也没关系,这只是个示例。首先,运行下边的命令: mvn archetype:create -DgroupId=demo.struts -DartifactId=demo-struts-coc -DarchetypeArtifactId=maven-archetype-webapp这会建立如下的目录结构:|- POM.xml|- src |- main |- resources |- webapp |- index.jsp |- WEB-INF |- web.xml然后我们在src/main目录下新建一个名为java的目录,用来放置java代码。在src下建立test目录,并在test目录下建立java目录,用来放置测试代码。另外,我这个示例不想使用JSP,所以我将src/main/webapp目录下的index.jsp改为index.html。现在,需要配置该项目要用到哪些lib。在POM.xml中加入struts2-core:xml 代码 org.apache.struts struts2-core 2.0.9 另外,我想在Eclipse里使用jetty来启动项目并进行测试,所以在POM.xml中再加入jetty、jetty-util、servlet-api等的依赖,详情见附件。我希望使用Eclipse来作为这个项目的IDE,所以,我在命令行状态下,进入这个项目所在的目录,运行: mvn eclipse:eclipse然后使用Eclipse导入这个项目。如果你是第一次用Eclipse导入用Maven生成的项目,那你需要在Eclipse里配置一个名叫M2_REPO的Variable,指向你的Maven 2的repository目录。缺省情况下,它应该位于$user.home/.m2/repository。OK!现在我们已经可以在Eclipse中进行工作了。修改src/main/webapp/WEB-INF/web.xml,加入struts2的FilterDispatcher并设置filter-mapping。在这个示例中我将url-pattern设为/app/*,也就是说,url的匹配是基于路径来做的。这只是我的个人喜好而已,你也可以将它设成*。既然是在讲struts2的零配置,当然是可以不要任何配置文件的。但是为了更好地进行“配置”,我还是建立了struts.xml文件(在src/main/resources目录下)。我不喜欢url最后都有个action后缀,现在,我在struts.xml中配置struts.action.extension,将这个后缀去掉:xml 代码 然后我在src/test/java下建立demo/RunJetty.java文件,main方法如下:java 代码public static void main(String args) throws Exception Server server = new Server(8080); /也可以改成其它端口 File rootDir = new File(RunJetty.class.getResource(/).getPath().getParentFile().getParentFile(); String webAppPath = new File(rootDir, src/main/webapp).getPath(); new WebAppContext(server, webAppPath, /); server.start(); 现在,在Eclipse里运行或调试这个RunJetty.java,用浏览器打开http:/localhost:8080/看看吧。如果不出问题,应该可以访问到webapp目录下的index.html了。有了Jetty,你还在用MyEclipse或其它插件么?二、零配置首先要澄清一点,这里说的零配置并不是一点配置都没有,只是说配置很少而已。Struts2(我只用过Struts 2.0.6和2.0.9,不清楚其它版本是否支持零配置)引入了零配置的新特性,元数据可以通过规则和注解来表达:A Zero Configuration Struts application or plugin uses no additional XML or properties files. Metadata is expressed through convention and annotation.目前,这个新特性还在测试阶段,但经过一段时间的使用,我觉得这个特性已经可用。下面我讲一下如何使用它。1. Actions的定位以前需要在xml配置文件中配置Action的name和class,如果使用零配置,所带来的一个问题就是如何定位这些Action。我们需要在web.xml中找到struts2的filter的配置,增加一个名为actionPackages的init-param,它的值是一个以逗号分隔的Java包名列表,比如:demo.actions1,demo.actions2。struts2将会扫描这些包(包括这些包下边的子包),在这些包下,所有实现了Action接口的或者是类名以“Action”结尾的类都会被检查到,并被当做Action。以前,我们写Action必须要实现Action接口或者继承ActionSupport。但是,上面提到的类名以Action结尾的类并不需要这样做,它可以是一个POJO,Struts2支持POJO Action!下面是actionPackages的配置示例:xml 代码 struts2 org.apache.struts2.dispatcher.FilterDispatcher actionPackages demo.actions1,demo.actions2 2. 示例现在我们建立demo.actions1.app.person和demo.actions2.app.group两个包,在demo.actions1.app.person包下建立ListPeopleAction.java,在demo.actions2.app.group下建立ListGroupAction.java。作为示例,这两个类只是包含一个execute方法,返回success或error,其它什么都不做:java 代码public String execute() return success; 在Filter的配置中,我指定actionPackages为demo.actions1,demo.actions2,当系统启动时,Struts2就会在这两个包下扫描到demo.actions1.app.person.ListPeopleAction和demo.actions2.app.group.ListGroupAction。3. Action and Package nameStruts2扫描到Action后,从actionPackages指定的包开始,子包名会成为这个Action的namespace,而Action的name则由这个Action的类名决定。将类名首字母小写,如果类名以Action结尾,则去掉Action后缀,形成的名字就是这个Action的名字。在如上所述的示例中,actionPackages指定为demo.actions1,demo.actions2,那么你可以这样访问demo.actions1.app.person.ListPeopleAction: http:/localhost:8080/app/person/listPeople4. ResultsStruts2是通过Result和Results两个类级别的annotations来指定Results的。作为示例,我们在webapp目录下建两个html文件:success.html和error.html,随便写点什么内容都可以。现在假设我们访问/app/person/listPeople时,或Action返回success就转到success.html页面,若是error就转到error.html页面,这只需要在ListPeopleAction类上加上一段注解就可以了:java 代码Results( Result(name=success, type=NullResult.class, value = /success.html, params = ), Result(name=error, type=NullResult.class, value = /error.html, params = ) ) public class ListPeopleAction public String execute() return success; 同上,我们给ListGroupAction也加上注解。现在,我们已经完成了一个零配置的示例。我们并没有在xml文件里配置ListPeopleAction和ListGroupAction,但它们已经可以工作了!用Eclipse运行RunJetty,然后用浏览器访问http:/localhost:8080/app/person/listPeople和http:/localhost:8080/app/group/listGroup看看,是不是正是success.html(或error.html)的内容?5. Namespaces如上所述,namespace由包名所形成,但我们可以使用Namespace注解来自己指定namespace。6. Parent Package这个配置用得较少。Struts2提供一个ParentPackage注解来标识Action应该是属于哪个package。三、使用COC如上所述,Struts2用注解来实现零配置。然而,这不是我喜欢的方式。在我看来,这不过是将配置从XML格式换成了注解方式,并不是真的零配置。而且,这种方式也未必比XML形式的配置更好。另外,对元数据的修改必然会导致项目的重新编译和部署。还有,现在的Struts2版本似乎对Result注解中的params的处理有些问题。其实,Struts2的actionPackages配置已经使用了COC,那为什么不能为Results也实现COC,从而去除这些每个Action都要写的注解?在严谨的项目中,package、action的名称和页面的路径、名称一定存在着某种关系。比如,页面的路径可能和package是对应的,页面的名称可能和action的名称是对应的,或是根据某种法则运算得到。我们知道webwork2和struts2有个配置叫global-results。我们为什么不能根据这些对应规则写个Result,将它配到global-results中,从而真正免去result的配置?事实上,我推荐Struts2的使用者只用Struts2输出XML或JSON,放弃UI,页面这层还是使用标准的HTML、CSS和一些JS组件来展现。许多人反映Struts2慢,确实,Struts2是慢,很慢!慢在哪儿?很大一部分因素是UI这层引起的,特别是使用了过多的Struts2的tag,并使用了ajax theme。但是,如果我们放弃了Struts2的笨拙的UI,Result只输出XML或JSON,UI则使用标准的HTML+CSS,使用JS组件(DOJO、Adobe Spry Framework、YUI-Ext等)来操作Struts2的输出数据,情况将会如何?我们会得到一个高性能、高可配的、UI和应用服务器的职责分割更为明确、合理的、更易于静态化部署的开发组合。这似乎是阉割了Struts2,但是这样阉割过的Struts2摆脱了性能低下的包袱,更轻、更现代化。有些扯远了,言归正传,不管是让Struts2输出XML或JSON,还是输出页面,我们都有办法根据项目的规则写一个Result,将它配到global-results中,从而大大减少Result的配置。假设我们让Struts2只输出JSON,有个jsonplugin可以做这件事。使用JsonResult时,不再需要知道页面的位置、名称等信息,它仅仅是数据输出,那么我们就可以将这个Result配成全局的,大部分Action将不再需要Result的配置。作为示例,我假设我的例子中输出的两个html页面(success.html和error.html)是JSON,我们看看怎么免去我例子中的两个Action的Result注解。首先,我们删去ListPeopleAction和ListGroupAction两个Action的注解,并修改struts.xml文件,加入:xml 代码 /success.html 请记住这只是一个示例,为了方便,我没在项目中加入jsonplugin来作真实的演示,我只是假设这个success是json输出,读者可以自行使用jsonplugin来作实验。现在,离成功不远了,但是项目仍然不能正常运行。我们的Action返回success,但并不会匹配到global-results中配置。为什么呢?因为,我们这里是把global-results配置到demo-default这个package下的,而Struts2根据actionPackages找到的Action不会匹配到这个package上。解决办法也很简单,还记得上面讲到的Parent Package吧?给Action加个注解,指定ParentPackage为demo-default。但这样可不是我喜欢的,其实有更好的办法,我们在struts.xml中加个constant就好了:xml 代码 现在,大功告成!运行RunJetty来测试下吧!你可以访问/app/person/listPeople,可以访问/app/grou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微项目1 探索数据表格构建说课稿-2025-2026学年初中信息技术泰山版2019第3册-泰山版2019
- 2025聘请副校长合同
- 2025猪肉交易合同模板
- 2025年上海市企业劳动合同范本
- 《2025企业雇佣合同范本》
- 包头事业单位笔试真题2025
- 2023三年级英语上册 Unit 7 Would you like a pie第3课时说课稿 牛津译林版
- 电池厂职业健康防护管理规定
- 2025新进员工劳动合同模板
- 东营事业单位笔试真题2025
- 河南豫信电科所属公司招聘笔试题库2025
- GB/T 45345-2025金属及其他无机覆盖层工程用直流磁控溅射银镀层镀层附着力的测量
- 无人机教员聘用协议书
- 药物非临床研究质量管理规范
- 脑科生理病理图谱解读
- 全国青少年科技辅导员专业水平认证笔试考题
- (行业)常用表面处理工艺详解(行业讲座教学培训课件)
- 《STEMI再灌注治疗策略》课件
- 配电网安健环设施标准
- 2025年物产中大集团股份有限公司招聘笔试参考题库含答案解析
- 家校合作下的学生心理问题预防与干预
评论
0/150
提交评论