【转】Struts2.1.6 annotation写法的注意事项

struts2.1.6这个版本出来有一段时间了,这个版本在比2.0.11版本改变很多,关于annotation的写法本在在2.0.11的时候就一直在项目中使用。首先介绍这个2个版本的不同之处和2.0.11 annotation升级到2.1.6会出现那先问题。 

第一:版本不同
1、annotation所在的包不同
2.0.11的时候是在核心包里,但是在2.1.6就不是这样的它以插件形式存在了。包名是struts2-convention-plugin-2.1.6.jar 在升级的时候可以修改。 
2、增加新的annotation元素
在原来的基础上2.1.6提供了@Action、@InterceptorRefs、@InterceptorRef等具体的自己看官方文档。 
3、关于@Result的改变
原来的@Result(name="success",value="/index.jsp") 新版的是@Result(name="success",location="/index.jsp")。有所改变 
以上是新版和老版本在写法上的不同。 

第二:升级注意哪些问题
现在的2.1.6资料确实很少,网上有也都是一些肤浅的没有太具体的,而且对于大多数的开发人员来说还是比较习惯使用 
XML格式来配置struts2的,那么如果是使用XML问题就不会很大。无非改下web.xml把原来过时的过滤器换成现在的:

<filter> 
<filter-name>struts2</filter-name> 
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>struts2</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 
但是如果你要是使用annotation改的就多了。

1、拦截器:
关于拦截器这块我用红色字体标识出来,以前我们用2.0.11的时候是没有拦截器的我们只能用包: 
例如:2.0.11版本中:

<package name="struts-interceptor-common-params" extends="struts-interceptor">
   <!-- 由于使用了零配置他只能指定到那个包下所以还要配置一个默认的拦截器表示被使用 -->
   <default-interceptor-ref name="common-params" />
</package>

只能这样指定拦截器然后在代码中使用@ParentPackage("struts-interceptor-common-params")来配置。 
其中common-params是自己定义的拦截。 
在2.1.6版本中 自己定义拦截器的时候 必须要在你的struts.xml里加上

<constant name="struts.convention.default.parent.package" value="struts-interceptor"/>

value值:这个是写你自己定义的拦截器的包名。

<package 
name="struts-interceptor" extends="struts-default"> 
<interceptors> 
<interceptor-stack name="common-params"> 
<interceptor-ref 
name="check-para" /> 
<interceptor-ref name="rightsInterceptor" /> 
<interceptor-ref name="basicStack" /> 
</interceptor-stack> 
</interceptor-stack> 
</interceptors> 
</package> 
关于上述问题网上有很多人在问。现在我已经给出了答案,以上是正确答案并且在项目里也被使用了。 

2、@Action 
@Action ("/url")和@Action ("actionname")两种写法都行。但是一般情况我们都是在一个action里写很多个方法。
例如:一个用户的action他可能有增加、修改、删除我们喜欢把他们3个放在一个action里。那么原来的2.0.11版本是怎么做的呢?
老版本annotation方式你的action类必须是XXXAction也就是说必须是以action结束的一个类 而且你访问的时候必须是访问 
XXX这是老版本的规则,但是新版本不是了,因为2.1.6加入了@Action元素嘛!!可是也有不好的地方就是你所有的action必须要有execute方法,就算你没有用也要加因为这个方法表示actionName的入口,所以你必须要有这个。 
举个例子:

@InterceptorRefs({
@InterceptorRef("common-params-upload")
}
)
@Namespace("/manage/convertmodel/user/usergroup")
public class ExportUserGroupModelAction{
@Action("/exportUserGroupModel!exportUserGroupXML")
/**用户组的XML文件导出*/
public String exportUserGroupXML() {
       。。。。。。
       return null;
}
@Action("/exportUserGroupModel")
public String execute(){
   return null;
}
}

就算不用这个execute方法,也要写上。否则S2.1.6就会找不到Action。 

 

转自:http://blog.csdn.net/oathevil/article/details/7087778

你可能感兴趣的:(annotation)