今天闲来无事浏览了下Struts的官方文档,发现Annotation这个特性一直没用到,于是就想简单搭建一下,根据官方给的链接下载了个example。 打开一看傻眼了,配置也太简单了吧,就仅仅是在RegisterAction 类的Input方法上添加了@Action 注解,这也彻底颠覆了我的观念,好多都没想通,比如系统根据什么规则来定义action的路径?方法调用完成之后系统会根据什么规则来跳转?如何安排自己的结构... 一大堆问题。后来查阅文档发现还是有许多办法的。但是在我实施的过程中却被一个小小的细节耽搁了,我觉得大部分人都会遇到,特此写下。
上代码(其余无用代码省略)
- @Namespace("/")
- public class BasicTestAction extends ActionSupport {
- private static final long serialVersionUID = 1L;
- private MessageStore messageStore;
- @Action(value="basic",
- results={@Result(name="success",location="/BasicTest.jsp")}
- )
- //@Action(value="/basic", ...)
- public String execute() throws Exception{
- messageStore = new MessageStore();
- return SUCCESS;
- }
- public MessageStore getMessageStore() {
- return messageStore;
- }
- public void setMessageStore(MessageStore messageStore) {
- this.messageStore = messageStore;
- }
- }
不知道大伙注意到没有,我对代码中注释部分用红色高亮了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项目中必须正确地遵循命名约定。否则,这将会造成极大的麻烦。
转载于:https://blog.51cto.com/coldplay/784888