《struts2零配置Action路径到Result页面路径的自动映射.docx》由会员分享,可在线阅读,更多相关《struts2零配置Action路径到Result页面路径的自动映射.docx(10页珍藏版)》请在三一办公上搜索。
1、struts2零配置Action路径到Result页面路径的自动映射Struts2约定优于配置 (Action路径到Result页面路径的自动映射) 1 Convention插件 1.1 需要的jar包struts2-convention-plugin-2.2.1.jar 1.2 设置Convention结果result页面存放路径目录 struts-plugin.xml文件中: 默认配置所有的结果result页面都存储在WEB-INF/content下,通过设置struts.convention.result.path属性的值改变结果result页面到其他路径。 如:Xml代码 则将resu
2、lt路径配置到了WEB-INF/page 下; 则将result路径配置到了/page下。 1.3 设置Convention的Action类存在路径搜索包 struts-plugin.xml文件中: 默认配置包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。通过设置struts.convention.package.locators属性来修改这个配置。 如:Xml代码 则定义了在项目中,包路径包含web和action的将被视为Action存在的路径来进行搜索。 com.xxx.web.*/com.xxx.actio
3、n.*都将被视为含有Action的包路径而被搜索。 接着,Convention从前一步找到的package以及其子package包中寻找 com.opensymphony.xwork2.Action 的实现以及以Action结尾的类: com.example.actions.MainAction com.example.actions.products.Display (implements com.opensymphony.xwork2.Action) pany.details.ShowCompanyDetailsAction 1.4 命名空间 从定义的struts.convention.p
4、ackage.locators的部分,就是命名空间。 如:配置 com.xxx.web.user.userAction的命名空间是:“/user”; com.xxx.web.user.detail.UserAction的命名空间是:“/user/detail”。 1.5 Actin类名路径分割 Convention通过如下规则确定URL的具体资源部分:去掉类名的Action部分。然后将将每个分部的首字母转为小写,用-分割,你可以设置struts.convention.action.name.separator 如: 如: UserAction-user UserDetailAction -us
5、er-detail。 结合上面配置,对于com.xxx.web.user.detail.UserDetailAction, 映射的url就是/WEB-INF/content/user/detail/user-detail.jsp 1.6 支持jsp、html、htm、vm等格式 struts支持.jsp, .html, .htm, .vm格式的文件。下面是action和结果模版的映射关系: URL /hello /hello /hello /hello /hello-world /test/test1/hello /test/test2/hello /test/test2/hello Resu
6、lt success update success success input error new detail File that could match /WEB-INF/content/hello.jsp /WEB-INF/content/hello-update.jsp /WEB-INF/content/hello-success.htm /WEB-INF/content/hello.ftl /WEB-INF/content/hello-world-input.vm /WEB-INF/content/test/test1/hello-error.html /WEB-INF/conten
7、t/test/test2/hello-new.html /WEB-INF/content/test/test3/hello- detail.html Result Type Dispatcher Dispatcher Dispatcher FreeMarker Velocity Dispatcher Dispatcher Dispatcher 以上的内容来自struts2的文档http:/struts.apache.org/2.1.6/docs/convention-plugin.html 当然,简单的通过默认的方式来进行配置不能完全满足实际项目的需要。所幸,convention的零配置是非常
8、灵活的。 1.7 Action注解 通过Action注释 对如下例子: Java代码 package com.example.web; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; public class HelloAction extends ActionSupport Action(action1) public String method1 return SUCCESS; Action(/user/action2) public String method2 re
9、turn SUCCESS; 方法名 method1 method2 通过Action注释后 方法名 method1 method1 Action注释后调用路径 /action1!method1.action /user/action2!method2.action Action注释 后映射路径 /WEB-INF/content/action1.jsp /WEB-INF/content/user/action2.jsp 默认调用路径 /hello!method1.action /hello!method2.action 默认映射路径 /WEB-INF/content/hello.jsp /WEB
10、-INF/content/hello.jsp 1.8 Actions注解 通过Actions注释 Java代码 package com.example.web; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; public class HelloAction extends ActionSupport Actions( Acti
11、on(/different/url), Action(/another/url) ) public String method1 return “error”; 我们可以通过:/different/url!method1.action 或 /another/url!method1.action 来调用method1 方法。 对应的映射路径分别是/WEB-INF/content/different/url-error.jsp; /WEB-INF/content/another/url-error.jsp 可能误导了大家,一个方法被Action注释后,只是多了一种调用方式,而不是说覆盖了原来的调用
12、方式。比如对于如下例子: Java代码 com.example.web; import com.opensymphony.xwork2.ActionSupport; import org.apache.convention.annotation.Action; import org.apache.convention.annotation.Actions; public class HelloAction extends ActionSupport Action(/another/url) public String method1 return “error”; 我们调用method1方法可
13、以通过两种方式: 1、 /hello!method1.action 映射 url:/WEB-INF/content/hello-error.jsp 2 、/another/url!method1.action 映射 url:/WEB-INF/content/another/url-error.jsp 可见,两种方式均可对method1方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择。 1.9 Namespace注解 通过Namespace 注释 package com.example.web; import com.opensymphony
14、.xwork2.ActionSupport; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; Namespace(/other) public class HelloWorld extends ActionSupport public String method1 return “error”; Action(url) public String method2 return “error”; Action(/diff
15、erent/url) public String method3 return “error”; 通过 /other/hello-world!method1.action 访问method1 方法。 通过 /other/url!method2.action 访问method2 方法 通过 /different /url!method3.action 访问method3 方法 与Action 注释不同的是,该注释覆盖了默认的namespace(这里是/),此时再用hello!method1.action 已经不能访问method1 了. 1.10 Results和Result注解 Results
16、和Result 1 全局的。 全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。 package com.example.actions; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; import org.apache.struts2.convention.
17、annotation.Result; import org.apache.struts2.convention.annotation.Results; Results( Result(name=failure, location=/WEB-INF/fail.jsp) ) public class HelloWorld extends ActionSupport public String method1 return “failure”; Action(/different/url) public String method2 return “failure”; 当我们访问 /hello -w
18、orld !method1.action 时,返回 /WEB-INF/fail.jsp 当我们访问 /hello -world !method2.action 时,返回 /WEB-INF/fail.jsp 当我们访问 /different/url!method2.action 时,返回 /WEB-INF/fail.jsp 2 本地的。 本地results只能在action方法上进行声明。 Java代码 package com.example.actions; import com.opensymphony.xwork2.ActionSupport; import org.apache.stru
19、ts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; import org.apache.convention.annotation.Result; import org.apache.convention.annotation.Results; public class HelloWorld extends ActionSupport Action(value=/other/bar,results=Result(name = error, location = ,t
20、ype=redirect) public String method1 return “error”; 当我们调用 /hello -world !method1.action 时,返回 /WEB-INF/content/hello-error.jsp 当我们调用 /other/bar!method1.action 时,返回 1.11 ParentPackage 注解 ParentPackage注解用来定义具体action类的父XWork包或java包,下面例子演示了在action类上使用本注解: package com.example.actions; import com.opensymph
21、ony.xwork2.ActionSupport; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.ParentPackage; ParentPackage(customXWorkPackage) public class HelloWorld extends ActionSupport public String execute return SUCCESS; 1.12 异常注解配置 ExceptionMapping 注解用来影射ac
22、tion抛出的异常。可以参考exception mapping documentation 获得详细信息。注解用类级别,在这种情况下,注解会应用到类里面的所有action ExceptionMappings( ExceptionMapping(exception = java.lang.NullPointerException, result = success, params = param1, val1) ) public class ExceptionsActionLevelAction public String execute throws Exception return null
23、; 可以在ExceptionMapping注解中使用params 属性来传递具体值给结果渲染页。ExceptionMapping注解同样可以在action级别进行设置: public class ExceptionsMethodLevelAction Action(value = exception1, exceptionMappings = ExceptionMapping(exception = java.lang.NullPointerException, result = success, params = param1, val1) ) public String run1 thro
24、ws Exception return null; 1.13 自动加载无需启动服务 Convention插件可以自动重新加载配置的功能,无需重启容器,就可以刷新类中包含的action。这自动加载automatic xml 配置文件类似。你必须在struts.xml 中添加以下代码来启用本功能: 此功能没有在所有容器中进行过测试,强力建议不要在生产环境中使用。 1.14 扫描Action的Jar包 默认情况下,Convention 插件不会从jar文件中寻找action。如果想实现这一功能,jar文件必须被struts.convention.action.includeJars 所定义的正则 匹配到。在例子中 myjar1.jar和 myjar2.jar 将被插件检测到: 提示:正则表达式只针对jar文件的路径进行匹配,而不是文件名。jar的URL应该包含jar文件的路径并以!/结尾。