Convention 零配置及其在springside3 mini-web中的使用

从struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。零配置并不是没有配置,而是通过约定大于配置的方式,大量通过约定来调度页面的跳转而使得配置大大减少,我们也可以在类中复写其中的方法来达到扩展的目的。

使用Convention插件,需要将其JAR文件放到你应用的WEB-INF/lib目录中,你也可以在你maven项目的POM文件中添加下面包依赖

  1. <dependency>
  2. <groupId>org.apache.struts</groupId>
  3. <artifactId>struts2-convention-plugin</artifactId>
  4. <version>2.1.6</version>
  5. </dependency

convention-plugin的约定

1.默认情况下,Convention会默认所有的结果页面都存储在WEB-INF/content下,你也可以在struts的配置文件中设定struts.convention.result.path的值到一个新的路径。如

  1. <constantname="struts.convention.result.path"value="/WEB-INF/page"/>

这样的话所有结果页面的会存储在WEB-INF/page下了,把jsp放在WEB-INF下有一个好处,别人就没有办法直接访问了,这样就可以简化spring security的配置工作。

2. 默认情况下,包的路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置,如springside的struts.xml中是这样配置的,

  1. <constantname="struts.convention.package.locators"value="web"/>

则在项目中,包的路径含有web的将被视为Action存在的路径来进行搜索。

3. 接着,Convention从前一步找到的package以及其子package中寻找com.opensymphony.xwork2.Action 的实现以及以Action结尾的类,如:

com.courseonline.test.web.account.UserAction 就会被扫描到。

4. 命名空间。从定义的.package.locators标示开始到包结束的部分,就是命名空间。举个例子,上面我们定义了

  1. <constantname="struts.convention.package.locators"value="web"/>

所以 com.courseonline.test.web.account.UserAction的命名空间是:“/account”。

5. Convention通过如下规则确定URL的具体资源部分:去掉类名的Action部分。然后将每个分部的首字母转为小写,用‘-’分割,你可以设置struts.convention.action.name.separator如

  1. <constantname="struts.convention.action.name.separator"value="-"/>

比如上面的例子com.courseonline.test.web.account.UserAction对应的jsp为/WEB-INF/content/account/use.jsp

如果是com.courseonline.test.web.account.UserDetailAction 对应的jsp为/WEB-INF/content/account/use-detail.jsp

下面是convention的一些常用注解

1.@Action 注解

  1. publicclassUserActionextendsActionSupport{
  2. @Action("url1")
  3. publicStringmethod1(){
  4. returnSUCCESS;
  5. }
  6. @Action("/account/url2")
  7. publicStringmethod2(){
  8. returnSUCCESS;
  9. }
  10. }

未用@Action注解前

默认调用路径

访问方法

默认映射路径

/user!method1.action

method1

/WEB-INF/content/user.jsp

/user!method2.action

method2

/WEB-INF/content/user.jsp

使用@Action注解后

@Action注解后调用的路径

访问方法

@Action注解后映射的路径

/url1!method1.action

method1

/WEB-INF/content/url1.jsp

/account/url2!method2.action

method2

/WEB-INF/content/account/url2.jsp

2.@Namespace 注释

  1. @Namespace("/account")
  2. publicclassUserDetailActionextendsActionSupport{
  3. publicStringmethod1(){
  4. return"error";
  5. }
  6. @Action("url")
  7. publicStringmethod2(){
  8. return“error”;
  9. }
  10. @Action("/different/url2")
  11. publicStringmethod3(){
  12. return“error”;
  13. }
  14. }

调用路径

访问方法

映射路径

/account/user-detail!method1.acton

method1

/WEN-INF/content/account/user-detail-error.jsp

/account/url!method2.acton

method2

/WEN-INF/content/account/url.jsp

/different/url2!method3.action

method3

/WEN-INF/content/different/url2.jsp

与@Action 注释不同的是,该注释覆盖了默认的namespace(默认的是’/’),此时再用user-detail!method1.action 已经不能访问method1了.

3.@Result

Convention允许action类为每个action定义不同的results,results分为两类,全局的(global)和本地的(local),全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。本地results只能在action方法上进行声明。下面是两种results注解的例子.

1)全局的(global)。

  1. @Results({@Result(name="failure",location="/WEB-INF/fail.jsp")})
  2. publicclassUserActionextendsActionSupport{
  3. Stringmethod1(){
  4. return“failure”;
  5. }
  6. @Action("/different/url")
  7. publicStringmethod2(){
  8. return“failure”;
  9. }
  10. }

调用路径

访问方法

映射路径

/user!method1.action

method1

/WEB-INF/fail.jsp

/different/url!method2.action

method2

/WEB-INF/fail.jsp

2 本地的(local)。

  1. publicclassUserActionextendsActionSupport{
  2. @Action(value="/other/url",results={@Result(name="error",location="/WEB-INF/fail",type="redirect")})
  3. publicStringmethod1(){
  4. return“error”;
  5. }
  6. }

调用路径

访问方法

映射路径

/user!method1.action

method1

/WEB-INF/content/user-error.jsp

/other/url!method2.action

method1

/WEB-INF/fail.jsp

有了上面的知识,现在来看看springside 3 的mini-web项目中部分用到的convention插件的地方,理解起来就不难了。

比较典型的是UserAction.java。

[c-sharp] view plain copy
  1. @Namespace("/account")
  2. @Results({@Result(name=CrudActionSupport.RELOAD,location="user.action",type="redirect")})
  3. publicclassUserActionextendsCrudActionSupport<User>{
  4. ………………
  5. @Override
  6. publicStringlist()throwsException{
  7. …………
  8. returnSUCCESS;
  9. }
  10. @Override
  11. publicStringinput()throwsException{
  12. …………
  13. returnINPUT;
  14. }
  15. @Override
  16. publicStringsave()throwsException{
  17. …………
  18. returnRELOAD;
  19. }
  20. ………………
  21. }

这里我只选了三个返回结果分别为SUCCESS、INPUT、和RELOAD的方法来做例子。

调用路径

访问方法

映射路径

/account/user!list.action

list

/WEB-INF/content/account/user.jsp

/account/user!input.action

input

/WEB-INF/content/account/user-input.jsp

/account/user!save.action

save

/WEB-INF/content/account/user.jsp

在调用save方法后,为什么会返回/WEB-INF/content/account/user.jsp这个页面 呢?因为在全局的Result定义名为reload的result重定向到user.action, 其他result则按照convention默认,所以当调用完save方法后,返回的是RELOAD,又被重定向到user.action,然后返回到/WEB-INF/content/account/user.jsp 了;同理,访问input方法时,返回的是INPUT,所以会返回/WEB-INF/content/account/user-input.jsp

@Namespace("/account") 表示定义URL映射对应/account/user.action

@Results( {@Result(name = CrudActionSupport.RELOAD, location = "user.action",type = "redirect") })

定义名为reload的result重定向到user.action,其他result则按照convention默认.

以上说的不一定都是正确的,如有错误请指正,谢谢。

参考资料:http://www.blogjava.net/libin2722/articles/256525.html



以上:blog.youkuaiyun.com/javaer617/article/details/6413055

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值