今天闲来无事浏览了下Struts的官方文档,发现Annotation这个特性一直没用到,于是就想简单搭建一下,根据官方给的链接下载了个example。 打开一看傻眼了,配置也太简单了吧,就仅仅是在RegisterAction 类的Input方法上添加了@Action 注解,这也彻底颠覆了我的观念,好多都没想通,比如系统根据什么规则来定义action的路径?方法调用完成之后系统会根据什么规则来跳转?如何安排自己的结构... 一大堆问题。后来查阅文档发现还是有许多办法的。但是在我实施的过程中却被一个小小的细节耽搁了,我觉得大部分人都会遇到,特此写下。

上代码(其余无用代码省略) 

 
  
  1. @Namespace("/"
  2. public class BasicTestAction extends ActionSupport { 
  3.     private static final long serialVersionUID = 1L; 
  4.     private MessageStore messageStore; 
  5.     @Action(value="basic"
  6.             results={@Result(name="success",location="/BasicTest.jsp")} 
  7.             ) 
  8.     //@Action(value="/basic", ...)       
  9.     public String execute() throws Exception{ 
  10.         messageStore = new MessageStore(); 
  11.         return SUCCESS; 
  12.     }    
  13.     public MessageStore getMessageStore() { 
  14.         return messageStore; 
  15.     } 
  16.     public void setMessageStore(MessageStore messageStore) { 
  17.         this.messageStore = messageStore; 
  18.     }    

不知道大伙注意到没有,我对代码中注释部分用红色高亮了value 值的设置,对,没错,就是这个不起眼的小细节让我搞了一个小时,杯具呀...

在我们之前XML 文件定义中,对于action的定义一般都不会添加 “/” 这个根路径符,因为我们都在Namespace中写好全局路径,即使根路径也同样会定义。这就间接造成了我的错误,都是官方例子热得祸呀,忒尼玛坑爹。 在官方例子中的RegisterAction 的 input 方法上是:@Action("register-input") 这样定义,而且在类上也未有@Namespace定义。咱也来造一个吧,调试了半天都没出结果,始终说 no action mapping 错误,我那个心碎呀。经过N+1次测试后才发现这个问题,我容易吗我。特此写下,给那些迷惑中的人员。要么你加@Namespace,要么在@Action中写全路径,不要只是写一个action名字而已。

附(一下规则不完全):

1、Struts 2 Annotation概念

Struts 2注解是由Struts 2 convention plugin所支持的。因此,我们必须理解“扫描方式”和“命名转换”机制背后的东西。

 

1.1 Struts 2对注解的扫描顺序

Struts 2 只扫描名为struts、struts2、action或actions的特定目录。 扫描的工作顺序如下:

  • 先扫描位于名为“struts、struts2、action或actions”的包中的注解类;
  • 接下来,扫描匹配如下条件的文件:
    • 实现com.opensymphony.xwork2.Action接口;
    • 继承自com.opensymphony.xwork2.ActionSupport类;
    • 文件名以Action结尾(比如UserAction、LoginAction)

1.2 命名转换

Struts 2 convention插件将所有的注解action文件名称转换为特定的格式。 例如:LoginAction.java

  • 首先,移除文件名末尾的”Action”单词,如果存在的话;
  • 接下来,将文件名的第一个字母转换为小写。

这样,在移除末尾的action和转换第一个字母的大小写以后,LoginAction.action将转变为login.action。(不完全是这样,例如BasicTestAction 则使用 basic-test 访问)

Struts 2 convention插件的“扫描算法”和“命名转换”特性带来了很多便利和好处,不过这要求在我们的Struts 2项目中必须正确地遵循命名约定。否则,这将会造成极大的麻烦。