struts 2读书笔记-----Convention插件与“约定”支持
Convention插件的主要特点是“约定优于配置”。
Action的搜索和映射约定
为了能够使用Convention插件,必须在Struts 2 应用中安装Convention插件,即将Struts2-convention-plugin.jar文件复制到Struts 2应用的WEB-INF/lib路径下。
对于convention插件而言,他会对以下两种java类的Action处理:
1、 所有实现了com.opensymphony.xwork2.Action的java类
2、 所有类名以Action结尾的java类
Struts 2的convention插件还允许设置如下三个常量
常量 |
说明 |
Struts.convention.exclude.packages |
指定不扫描那些包的java类,位于这些包结构下的java类将不会被自动映射成Action |
Struts.convention.package.locators |
Convention插件使用该常量指定的包作为搜索Action的根包。如:对于action.user.LoginAction类,按约定本应映射到/user/login; 如果将该常量设置为user,则该Action将会映射到/login |
Struts.convention.action.packages |
Convention插件以该常量指定包作为根包来搜索Action类。 |
当找到合适的Action类后,Convention插件将会按照约定部署这些Action。部署Action时,actions、action、struts、struts2包会映射成根命名空间,而这些包下的子包则会被映射成对应的命名空间。 如:
Com.app.action.books.GetBooks 映射到/books
Com.app.action.RegistAction 映射到/
Com.app.action.struts.manage.user.UserAction 映射到/manage/user
按约定映射name属性
Action的name属性(即该action所要处理的URL),根据该Action的类名映射,映射Action的name时,需要遵循如下两个步骤:
1、 如果该Action类名包含Action后缀,就将该Action类名的Action后缀去掉。否则就不会做任何处理
2、 将Action类名的写法(每个单词首字母大写、其他字幕小写)转成中划线写法(有字母小写,单词与单词之间用中划线隔开)。
如:
Com.app.action.LoginAction 映射到:/login.action
Com.app.action.user.loginAction 映射到:user/login.action
Com.app.action.user.loginRegistAction 映射到:user/login-regist.action
对于Action类的代码依然不需要做任何的改变。
按约定映射result
Action处理用户请求后会返回一个字符串作为逻辑视图,该逻辑视图必须映射到实际的物理视图。Convention默认也作为逻辑视图和物理视图之间的映射提供了约定
默认情况下,convention总会到Web应用的WEB-INF\content路径下定位物理资源。故定位资源约定为、:actionName+resultCode+suffix。当某个逻辑视图找不到对应的视图资源是,convention会自动试图使用actionName+suffix作为物理视图资源
如:假定所有的结果类型全部为:Dispatcher
Action的URL |
返回的逻辑视图名 |
对应的物理视图 |
/login |
success |
\WEB-INF\content\login-success.jsp |
/user/login |
success |
\WEB-INF\content\user\login-success.jsp |
/user/regist |
error |
\WEB-INF\content\user\regist-error.jsp |
Action键的约定
如果想一个Action处理结束后不是进入视图页面,而是进入另一个Action形成Action链。则只需要遵守下面三个约定:
1、第一个Action返回的逻辑视图字符串没有对应的视图资源。
2、第二个Action与第一个Action处于同一个包下。
3、第三个Action映射的URL为:firstactionname+resultcode
下面是一个实例:
第一个Action处理用户请求后、转到第二个Action继续处理。再由第二个Action转到视图页面,并打印相应的信息
第一个Action:FirstActionjava
1 public class FirstAction extends ActionSupport{ 2 private String tip1; 3 4 public String getTip1() { 5 return tip1; 6 } 7 8 public void setTip1(String tip1) { 9 this.tip1 = tip1; 10 } 11 12 public String execute(){ 13 setTip1("第一个action提示"); 14 return "second"; 15 } 16 }
该Action处理用户请求后返回“second”字符串,为了让该Action处理结束后进入第二个Action。对于这个返回的字符串,第二个Action的映射的URL应为:first-second。
所以第二个Action的类名为:FirstSecondAction。
下面是第二个Action:FirstSecondAction.jsp
1 public class FirstSecondAction extends ActionSupport { 2 3 private String tip2; 4 5 public String getTip2() { 6 return tip2; 7 } 8 9 public void setTip2(String tip2) { 10 this.tip2 = tip2; 11 } 12 13 public String execute() throws Exception { 14 setTip2("第二个action 提示...."); 15 return SUCCESS; 16 } 17 18 }
当firstAction处理用户请求之后,系统将会自动调用FirstSecondAction处理用户请求。然后转到视图资源。
第一个jsp页面:thefirst.jsp点击按钮后,转到第一个action处理用户请求 该Action=”first“
1 <form action="first"> 2 <input type="submit" value="点击链接第二个action"> 3 </form>
第二个jsp页面:第二个视图资源。当第二个Action处理用户请求完后,转到该视图资源。并打印相应的信息 。
由于第二个Actiond的result的映射是:first-second-success。所以该视图资源的名字为:first-second-success.jsp
1 ${tip1 }<Br /> 2 ${tip2 }<br />
将会得到下面的显示页面:
读李刚《轻量级java EE企业应用实战(第三版)—struts 2+Spring 3+Hibernate整合开发》
-
作者:chenssy。一个专注于【死磕 Java】系列创作的男人
出处:https://www.cnblogs.com/chenssy/archive/2012/07/13/2589712.html
作者个人网站:https://www.cmsblogs.com/。专注于 Java 优质系列文章分享,提供一站式 Java 学习资料
目前死磕系列包括:
1. 【死磕 Java 并发】:https://www.cmsblogs.com/category/1391296887813967872(已完成)
2.【死磕 Spring 之 IOC】:https://www.cmsblogs.com/category/1391374860344758272(已完成)
3.【死磕 Redis】:https://www.cmsblogs.com/category/1391389927996002304(已完成)
4.【死磕 Java 基础】:https://www.cmsblogs.com/category/1411518540095295488
5.【死磕 NIO】:https://www.cmsblogs.com/article/1435620402348036096
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。