1、Struts2 的零配置实现Struts 2 里面开始使用 convention-plugin 实现零配置,将所有的配置文件删除,用约定大于配置的方法来实现 URL 的跳转。 Struts 规定了一套默认的约定,只要遵守这些约定,就可以实现无需配置文件的 URL 跳转。Struts2 里的 convention-plugin 插件使用,需要引入 convention-plugin 的 jar 包。Struts2 的约定: Convention 怎样寻找 Action。首先,Convention 会搜索所有的 Action 类,搜索方法是从 package 的根目录开始搜索,搜索所有含有 Str
2、uts, Struts2,Action,actions 的 packages,然后开始搜索这些包及其子包下面所有的实现了 com.opensymphony.xwork2.Action 的类和名字中含有 Action 结尾的类,每一个找到的类都会被映射到一个 URL。上面是 Convention 的默认约定,可以通过配置文件来改变这些约定。在 struts.xml 中通过配置 struts.convention.exclude.packages 来告诉 Convention 忽略扫描某些包,通过配置 struts.convention.package.locators 配置搜索包的关键词,通过配
3、置 struts.convention.action.packages 配置只搜索哪个包下的类。例如: Convention 怎样将 Action 映射成 URLConvention 会将找到的 Action 映射成 URL,映射的 URL 名以 Action 类的名为基础,如 UserAction 类将会被映射成 user。URL 的路径将根据类的包名来转换,如下面的类:Com.boco.actions.UserAction 类的 URL 地址为 /Com.boco.actions.demo.UserAction 的 URL 将会为 /demo/Com.boco.actions.demo.d
4、etails.UserAction 的 URL 将会为 /demo/details/具体资源的名字将根据 Action 类名来进行转化,首先取出 Action,其次根据驼峰命名法的类名将大写子母小写,并用“-”进行分割。如:UserAction 将会被映射为 userUserDetailsAction 将会被映射为 user-details上面是 Convention 的默认约定,可以通过配置文件来改变这些约定。资源文件将会被出去 Action,用”-” 来分割,可以通过 struts.convention.action.name.separator来改变分隔符,配置如下:URL 的路径也就是
5、命名空间不能在配置文件中修改,但是可以在类中通过 annotation 进行自定义,加上namespace(“你的路径”)可以自定义命名空间。Convention 的映射很灵活化,和模板的映射也支持好几种文件,如下表。URL Result File that could match Result Type/hello success /WEB-INF/content/hello.jsp Dispatcher/hello success /WEB-INF/content/hello-success.htm Dispatcher/hello success /WEB-INF/content/hel
6、lo.ftl FreeMarker/hello-world input /WEB-INF/content/hello-world-input.vm Velocity/test1/test2/hello error /WEB-INF/content/test/test2/hello-error.html Dispatcher通过上面的列表可知 URL 对应的模板默认存放在 /WEB-INF/content/ 下面,当然这个content 文件夹又可以通过配置文件进行自定义。通过可以指定模板文件的位置。 除此以外,Convention 的 URL 映射还非常的灵活化,可以在 Class 中的通过A
7、nnotation 进行最大程度的自定义化。网上摘抄一些简单的配置说明:通过Action 注释 对如下例子:Java 代码 1. package com.example.web; 2. 3. import com.opensymphony.xwork2.Action; 4. import com.opensymphony.xwork2.ActionSupport; 5. 6. public class HelloAction extends ActionSupport 7. Action(“action1“) 8. public String method1() 9. return SUCCE
8、SS; 10. 11. 12. Action(“/user/action2“) 13. public String method2() 14. return SUCCESS; 15. 16. 方法名 默认调用路径 默认映射路径method1 /hello!method1.action . /WEB-INF/content/hello.jspmethod2 /hello!method2.action. /WEB-INF/content/hello.jsp通过Action 注释后方法名 Action 注释后调用路径 Action 注释 后映射路径method1 /action1!method1.a
9、ction. /WEB-INF/content/action1.jspmethod1 /user/action2!method2.action /WEB-INF/content/user/action2.jsp通过Actions 注释Java 代码 1. package com.example.web; 2. 3. import com.opensymphony.xwork2.ActionSupport; 4. import org.apache.struts2.convention.annotation.Action; 5. import org.apache.struts2.convent
10、ion.annotation.Actions; 6. 7. public class HelloAction extends ActionSupport 8. Actions( 9. Action(“/different/url“), 10. Action(“/another/url“) 11. ) 12. public String method1() 13. return “error”; 14. 我们可以通过:/different/url!method1.action 或 /another/url!method1.action来调用 method1 方法。对应的映射路径分别是/WEB-I
11、NF/content/different/url-error.jsp; /WEB-INF/content/another/url-error.jsp 可能误导了大家,一个方法被Action 注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。比如对于如下例子:Java 代码 1. package com.example.web; 2. 3. import com.opensymphony.xwork2.ActionSupport; 4. import org.apache.struts2.convention.annotation.Action; 5. import org.apach
12、e.struts2.convention.annotation.Actions; 6. 7. public class HelloAction extends ActionSupport 8. Action(“/another/url“) 9. public String method1() 10. return “error”; 11. 我们调用 method1 方法可以通过两种方式:1 /hello!method1.action 映射 url:/WEB-INF/content/hello-error.jsp 2 /another/url!method1.action 映射 url:/WEB
13、-INF/content/another/url-error.jsp 可见,两种方式均可对 method1 方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择。通过Namespace 注释Java 代码 1. package com.example.web; 2. 3. import com.opensymphony.xwork2.ActionSupport; 4. import org.apache.struts2.convention.annotation.Action; 5. import org.apache.struts2.conv
14、ention.annotation.Actions; 6. Namespace(“/other“) 7. public class HelloWorld extends ActionSupport 8. 9. public String method1() 10. return “error”; 11. 12. Action(“url“) 13. public String method2() 14. return “error”; 15. 16. 17. Action(“/different/url“) 18. public String method3() 19. return “erro
15、r”; 20. 21. 通过 /other/hello-world!method1.action 访问 method1 方法。通过 /other/url!method2.action 访问 method2 方法通过 /different /url!method3.action 访问 method3 方法 与Action 注释不同的是,该注释覆盖了默认的 namespace(这里是/),此时再用hello!method1.action 已经不能访问 method1 了.Results 和Result 1 全局的(global)。 全局 results 可以被 action 类中所有的 actio
16、n 分享,这种 results 在 action 类上使用注解进行声明。Java 代码 1. package com.example.actions; 2. 3. import com.opensymphony.xwork2.ActionSupport; 4. import org.apache.struts2.convention.annotation.Action; 5. import org.apache.struts2.convention.annotation.Actions; 6. import org.apache.struts2.convention.annotation.Re
17、sult; 7. import org.apache.struts2.convention.annotation.Results; 8. 9. Results( 10. Result(name=“failure“, location=“/WEB-INF/fail.jsp“) 11. ) 12. public class HelloWorld extends ActionSupport 13. public String method1() 14. return “failure”; 15. 16. Action(“/different/url“) 17. public String metho
18、d2() 18. return “failure”; 19. 20. 21. 当我们访问 /hello -world !method1.action 时,返回 /WEB-INF/fail.jsp 当我们访问 /hello -world !method2.action 时,返回 /WEB-INF/fail.jsp 当我们访问 /different/url!method2.action 时,返回 /WEB-INF/fail.jsp 2 本地的(local)。 本地 results 只能在 action 方法上进行声明。Java 代码 1. package com.example.actions;
19、2. 3. import com.opensymphony.xwork2.ActionSupport; 4. import org.apache.struts2.convention.annotation.Action; 5. import org.apache.struts2.convention.annotation.Actions; 6. import org.apache.struts2.convention.annotation.Result; 7. import org.apache.struts2.convention.annotation.Results; 8. 9. publ
20、ic class HelloWorld extends ActionSupport 10. Action(value=“/other/bar“,results=Result(name = “error“, location = ““,type=“redirect“) 11. public String method1() 12. return “error”; 13. 14. 当我们调用 /hello -world !method1.action 时,返回 /WEB-INF/content/hello-error.jsp 当我们调用 /other/bar!method1.action 时,返回 重要参考:给出一些重要的参考文件,可以访问这些网站http:/