




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Struts2 Convention Plugin中文文档(一)Introduction从struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。 包命名习惯来指定Action位置 命名习惯制定结果(支持JSP,FreeMarker等)路径 类名到URL的约定转换 包名到命名空间(namespace)的约定转换 遵循SEO规范的链接地址(即:使用my-action 来替代 MyAction) 基于注解的Action名 基于注解的拦截机(Interceptor) 基于注解的命名空间(Nameespace) 基于注解的XWork包 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products 或 ducts.Index进行处理)无需配置Convention即可使用Convention,Convention的某些约束习惯可以通过配置属性来控制,您也可以在类中覆写其中的方法来达到扩展目地。安装使用Convention插件,你需要将其JAR文件放到你应用的WEB-INF/lib目录中,你也可以在你Maven项目的POM文件中添加下面包依赖1. 2. org.apache.struts3. struts2-convention-plugin4. 2.1.65. 转换基于Codebehind项目到Convention跳转到此页面,查看需要修改的变化和小提示如果你想在你系统中结合Convention插件使用REST。需要在你项目的struts.xml中添加如下配置1. 2. 3. Hello world到目前为止,你已经在你项目中添加了Convention插件支持,首先我们从一个非常简单的例子开始入手。本例中,我们将演示根据访问URL来访问固定的Action,默认情况下,Convention会默认所有的结果页面都存储在WEB-INF/content下,你也可以在struts的properties文件中设定struts.convention.result.path的值到一个新的路径。路径最后“/”是不必要的,Convention会自动进行处理。以下是本例的JSP文件WEB-INF/content/hello-world.jsp1. 2. 3. Helloworld!4. 5. 启动Tomcat或其他你所使用的JEE容器,在浏览器访问http:/localhost:8080/hello-world , 你可看到以下信息:Hello world!这表明,Convention已经能正常运行,并找到了结果。即使在没有action存在情况下,convention也会根据URL规则来找到结果页面。Code behind hello world我们继续扩展本例并添加代码实现类。为了实现本功能,首先需要Convention能正确找到我们的Action 类,默认情况下,Convention会找到com.opensymphony.xwork2.Action 的实现类,或制定包中以Action 结尾的类 actionConvention使用以下方法来搜索类路径,首先,Convention会从根package中寻找包名含有struts, struts2, action or actions 的任意packages。下一部,Convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类,下面为Convention寻找的类1. com.example.actions.MainAction2. ducts.Display(implementscom.opensymphony.xwork2.Action)3. pany.details.ShowCompanyDetailsAction4. com.example.actions.MainAction5. ducts.Display(implementscom.opensymphony.xwork2.Action)6. pany.details.ShowCompanyDetailsAction每一个被Convention找到action都会对应一个明确的URL地址,URL以package的名字以及Action类名为基础。首先Convention从根package以及类所在的package名来确定对应的URL中的路径(namespace),以下就是根据package确定的URL namespace1. com.example.actions.MainAction-/2. ducts.Display-/products3. pany.details.ShowCompanyDetailsAction-/company/details接下来Convention需要确定URL的具体资源部分。第一步取消类名中的Action,并以”-”来分割类名的其他部分,且将每个分部的首字母转为小写。如下所示1. com.example.actions.MainAction-/main2. ducts.Display-/products/display3. pany.details.ShowCompanyDetailsAction-/company/details/show-company-details你也可以通过配置struts.convention.exclude.packages 来告诉Convention忽略某些包,也可以设置struts.convention.package.locators 用来更改Convention默认的根packages,最后你还可以设置 struts.convention.action.packages. 来让Convention只搜索特定package下的Action以下就是action类的实现代码:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. 5. publicclassHelloWorldextendsActionSupport6. privateStringmessage;7. 8. publicStringgetMessage()9. returnmessage;10. 11. 12. publicStringexecute()13. message=HelloWorld!;14. returnSUCCESS;15. 16. 编译以上代码,并将其class放到 WEB-INF/classes中,Convention将会将 /hello-world 映射到这个Action. 部署上面的类以后,我们在JSP文件中添加打印message的语句,具体代码如下:1. 2. 3. Themessageis$message4. 5. 启动应用服务器,在浏览器访问 http:/localhost:8080/hello-world 地址,我们看到如下结果界面:The message is Hello World!原文:/WW/convention-plugin.html翻译:石太祥Struts2 Convention Plugin中文文档(二Results and result codesStruts启动后,Convention将预设好应用中的所有的action,默认情况下,配置将包含在你应用中能找到的所有JSP文件。同时您也可在Action代码中设置与习惯不同的结果页面。通常Action方法返回一个字符串,通过返回的字符串找到结果页面,而使用Convention允许你在action代码中指定和返回字符串不同的结果页面。编译下面的例子。我们希望在action中返回zero 而不是success,第一步,我们更新action类,返回zero。1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. 5. publicclassHelloWorldextendsActionSupport6. privateStringmessage;7. 8. publicStringgetMessage()9. returnmessage;10. 11. 12. publicStringexecute()13. if(System.currentTimeMillis()%2=0)14. message=Its0;15. returnzero;16. 17. 18. message=Its1;19. returnSUCCESS;20. 21. 接下来,我们添加一个新的JSP页面 WEB-INF/content/hello-world-zero.jsp 。需要注意的是,文件名的第一部分和action名是对应的,后面的部分和action返回的字符串对应。这就是convention确定具体使用那个页面来渲染结果。下面是修改后的JSP代码:1. 2. 3. Theerrormessageis$message4. 5. 现在,你可以编辑你的程序,重启应用,刷新页面,根据当前时间不通,会看到不通的渲染结果页面结果页面的类型会自动匹配文件,支持的渲染页面的格式为:jsp.ftl,vm,html,htm.下面是actiong和结果模版的映射关系:URLResultFile that could matchResult Type/hellosuccess/WEB-INF/content/hello.jspDispatcher/hellosuccess/WEB-INF/content/hello-success.htmDispatcher/hellosuccess/WEB-INF/content/hello.ftlFreeMarker/hello-worldinput/WEB-INF/content/hello-world-input.vmVelocity/test1/test2/helloerror/WEB-INF/content/test/test2/hello-error.htmlDispatcherAction链如果在一个action结果中调用另外一个action ,他们俩将被链接到一起,如果在第一个action代码中未定义result,如下代码:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.Action;4. importcom.opensymphony.xwork2.ActionSupport;5. 6. publicclassHelloActionextendsActionSupport7. Action(foo)8. publicStringfoo()9. returnbar;10. 11. 12. Action(foo-bar)13. publicStringbar()14. returnSUCCESS;15. 16. “foo”action执行时候,由于找不到结果,convention尝试在同一个包下寻找action名为“foo-bar”的action。如果找到这样的action,convention将会调用并返回相关联的result。XWork packages为了避免冲突,可将action放在一个自定义XWORK的package下。package命名由action所在的Java包,action对应的URL中namespace部分以及action的parent XWork package三个部分组成。parent XWork package 值在属性 struts.convention.default.parent.package 中指定(默认为conventionDefault),package的属性值须继承于 strutsDefault因此,Convention插件中XWORK packages 采用如下命名规则:1. #Using our example from above, the XWork package for our action would be:上例中,action对应的 XWORK package如下:1. com.example.actions#/#conventionDefaultStruts2 Convention Plugin中文文档(三)Annotation 参考Convention使用某些注解语句来覆写插件默认的action到url的映射和自动搜索渲染到的页面。此外,你还可以修改action配置文件中定义的父XWORK的包信息Action annotationConvention 插件可以使用Action注解语句来修改action返回的URL地址。本注解同时也允许包含在Actions语句中,用来使一个action对应于多个URL。在action 方法中使用本注解语句,可以参考以下代码:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. 6. publicclassHelloWorldextendsActionSupport7. Action(/different/url)8. publicStringexecute()9. returnSUCCESS;10. 11. 现在我们action类中将使用 /different/url 来替代默认的 /hello-world,如果未指定Result(参考下节),result的路径将会使用action的namespace,上面的例子中将会返回一下路径 /WEB-INF/content/different/url.jsp。Action类中的单个方法可以使用Actions 注解来映射多个地址。1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Actions;6. 7. publicclassHelloWorldextendsActionSupport8. Actions(9. Action(/different/url),10. Action(/another/url)11. )12. publicStringexecute()13. returnSUCCESS;14. 15. 另外的 Action 或 Actions 的使用方法是,在单个action类中定义多个action方法,每个方法对应一个不同的地址。下面是多个action方法的范例:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Actions;6. 7. publicclassHelloWorldextendsActionSupport8. Action(/different/url)9. publicStringexecute()10. returnSUCCESS;11. 12. 13. Action(url)14. publicStringdoSomething()15. returnSUCCESS;16. 17. 前面的例子中,第二个URL地址是不推荐的,上面url将使用java 包名作为namespace,而不会直接使用Action注解的地址。Interceptor 和 interceptor stacks 同样可以使用interceptorRefs 注解来指定。下例演示了在action中同时添加validation和defaultStack拦截器。1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Actions;6. 7. publicclassHelloWorldextendsActionSupport8. Action(interceptorRefs=InterceptorRef(validation),InterceptorRef(defaultStack)9. publicStringexecute()10. returnSUCCESS;11. 12. 13. Action(url)14. publicStringdoSomething()15. returnSUCCESS;16. 17. 可以通过params属性来将参数传递给结果。属性的值是一个偶数个元素的String的数组,由形如key0, value0, key1, value1 . keyN, valueN所组成,举个例子:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Actions;6. 7. publicclassHelloWorldextendsActionSupport8. Action(interceptorRefs=InterceptorRef(value=validation,params=programmatic,false,declarative,true)9. publicStringexecute()10. returnSUCCESS;11. 12. 13. Action(url)14. publicStringdoSomething()15. returnSUCCESS;16. 17. 如果未指定interceptors,将会使用默认的。InterceptorRef annotationInterceptors 可以在方法级进行指定,使用Action 注解或在类上使用InterceptorRefs注解。Class级别的拦截会被应用到类包含的所有action上。可以参考下面例子:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Actions;6. 7. InterceptorRefs(8. InterceptorRef(interceptor-1),9. InterceptorRef(defaultStack)10. )11. publicclassHelloWorldextendsActionSupport12. Action(value=action1,interceptorRefs=InterceptorRef(validation)13. publicStringexecute()14. returnSUCCESS;15. 16. 17. Action(value=action2)18. publicStringdoSomething()19. returnSUCCESS;20. 21. 下面的拦截机将会应用到“action1”中:interceptor-1,defaultStack中的所有拦截机, validationdefaultStack中的所有拦截机也会对”action2”生效Result annotationConvention 允许action类为每个action定义不同的results,results分为两类,全局的(global)和本地的(local),全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。本地results只能在action方法上进行声明。下面是两种results注解的例子:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Actions;6. importorg.apache.struts2.convention.annotation.Result;7. importorg.apache.struts2.convention.annotation.Results;8. 9. Results(10. Result(name=failure,location=fail.jsp)11. )12. publicclassHelloWorldextendsActionSupport13. Action(value=/different/url,14. results=Result(name=success,location=,type=redirect)15. )16. publicStringexecute()17. returnSUCCESS;18. 19. 20. Action(/another/url)21. publicStringdoSomething()22. returnSUCCESS;23. 24. 参数同样可以在results中通过params属性进行传递,和上面一样,由形如key0, value0, key1, value1 . keyN, valueN所组成。可参考下例:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Actions;6. importorg.apache.struts2.convention.annotation.Result;7. importorg.apache.struts2.convention.annotation.Results;8. 9. publicclassHelloWorldextendsActionSupport10. Action(value=/different/url,11. results=Result(name=success,type=httpheader,params=status,500,errorMessage,InternalError)12. )13. publicStringexecute()14. returnSUCCESS;15. 16. 17. Action(/another/url)18. publicStringdoSomething()19. returnSUCCESS;20. 21. Namespace annotationnamespace注解允许action使用指定的路径替代默认的以package包名作为路径。本注解可以在action类或Java 包中的package-info.java类中进行设置。设置在action类中的namespace注解,对本action类中所有的action都有效,这是不完全合乎规范的action URL处理地址。设置在package-info.java中的namespace注解,将会改变本java包下所有的action的默认namespace。下面是此注解的例子:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.Namespace;6. 7. Namespace(/custom)8. publicclassHelloWorldextendsActionSupport9. Action(/different/url)10. publicStringexecute()11. returnSUCCESS;12. 13. 14. Action(url)15. publicStringdoSomething()16. returnSUCCESS;17. 18. 在上例中的action 会对2个不同的地址响应:/different/url 和 /custom/url下面是一个在package-info.java中使用namespace注解的例子:1. org.apache.struts2.convention.annotation.Namespace(/custom)2. packagecom.example.actions;这会改变com.example.actions包下所有action的默认namespace。请注意一点,本注解不会应用到子一级的包中。ResultPath annotationResultPath 注解用来更改默认的results存储路径,注解可以放到action的类中,也可以放到package-info.java 文件夹中。参考下例:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.ResultPath;6. 7. ResultPath(/WEB-INF/jsps)8. publicclassHelloWorldextendsActionSupport9. publicStringexecute()10. returnSUCCESS;11. 12. 上面的result将以 WEB-INF/jsps 替换默认的 WEB-INF/contentParentPackage annotationParentPackage注解用来定义具体action类的父XWork包或java包,下面例子演示了在action类上使用本注解:1. packagecom.example.actions;2. 3. importcom.opensymphony.xwork2.ActionSupport;4. importorg.apache.struts2.convention.annotation.Action;5. importorg.apache.struts2.convention.annotation.ParentPackage;6. 7. ParentPackage(customXWorkPackage)8. publicclassHelloWorldextendsActionSupport9. publicStringexecute()10. returnSUCCESS;11. 12. ExceptionMapping AnnotationExceptionMapping 注解用来影射action抛出的异常。可以参考exception mapping documentation 获得详细信息。注解用类级别,在这种情况下,注解会应用到类里面的所有action1. ExceptionMappings(2. ExceptionMapping(exception=java.lang.NullPointerException,result=success,params=param1,val1)3. )4. publicclassExceptionsActionLevelAction5. 6. publicStringexecute()throwsException7. returnnull;8. 9. 可以在ExceptionMapping注解中使用params 属性来传递具体值给结果渲染页。ExceptionMapping注解同样可以在action级别进行设置:1. publicclassExceptionsMethodLevelAction2. Action(value=exception1,exceptionMappings=3. ExceptionMapping(exception=java.lang.NullPointerException,result=success,params=param1,val1)4. )5. publicStringrun1()throwsException6. returnnull;7. 8. Actions in jar files默认情况下,Convention 插件不会从jar文件中寻找action。如果想实现这一功能,jar文件必须被struts.convention.action.includeJars 所定义的正则 匹配到。在例子中 myjar1.jar和 myjar2.jar 将被插件检测到:1. 提示:正则表达式只针对jar文件的路径进行匹配,而不是文件名。jar的URL应该包含jar文件的路径并以!/结尾。Automatic configuration reloadingConvention插件可以自动重新加载配置的功能,无需重启容器,就可以刷新类中包含的action。这自动加载automatic xml 配置文件类似。你必须在struts.xml 中添加以下代码来启用本功能:1. 2. 此功能没有在所有容器中进行过测试,强力建议不要在生产环境中使用。全篇完Struts2 零配置 by convention-plugin最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置。配置文件精简了,的确是简便了开发过程,但是,我们熟悉的配置突然disappear了,真是一下很不适应。跟着潮流走吧,看看该怎样来搞定convention-plugin。使用Convention插件,你需要将其JAR文件放到你应用的WEB-INF/lib目录中,你也可以在你Maven项目的POM文件中添加下面包依赖 org.apache.struts struts2-convention-plugin 2.1.6零配置并不是没有配置,而是通过约定大于配置的方式,大量通过约定来调度页面的跳转而使得配置大大减少。所以,首先应该了解下convention-plugin的约定:1. 默认所有的结果页面都存储在WEB-INF/content下,你可以通过设置struts.convention.result.path这个属性的值来改变到其他路径。如:Xml代码则将路径配置到了WEB-INF/page 下。2. 默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置。如:则定义了在项目中,包路径包含web和action的将被视为Action存在的路径来进行搜索。Com.ustb.web.*/com.ustb.action.*都将被视为含有Action的包路径而被搜索。3. 接着,Convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类:com.example.actions.MainAducts.Display (implements com.opensymphony.xwork2.Action)pany.details.ShowCompanyDetailsAction4. 命名空间。从定义的.package.locators标示开始到包结束的部分,就是命名空间。举个例子:Com.ustb.web.user.user
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 不锈钢表面除蜡施工方案
- 2025北京东城高二(上)期末生物(教师版)
- 突发事件处置方案
- 地下室不锈钢水池施工方案
- 紫叶矮樱嫁接繁育技术关键要点全面深入探讨与阐述
- 四川省眉山市洪雅县洪雅县2024-2025学年九年级上学期期末考试物理试题(原卷版+解析版)
- 室外弱电整修施工方案
- 绿色金融与可持续投资的策略
- 工业碳减排与绿色制造的策略及实施路径
- 思维可视化视域下高中英语课堂读后续写教学策略研究
- 河南2025年河南职业技术学院招聘30人笔试历年参考题库附带答案详解
- IATF16949:2024标准质量手册
- 一把手讲安全课件:提升全员安全意识
- 南非醉茄产业发展规划(十四五)
- 复古简约中国古典名著导读三国演义培训PPT模板
- 不锈钢排烟风管施工实施方案
- PMC部门工作流程图
- IPC-4101刚性多层印制线路板的基材规范
- Oracle-EBS模块讲解
- 浆砌条石砖项施工方案
- 带你领略渊海子平
评论
0/150
提交评论