duansky'weblog

统计

留言簿(3)

友情链接

阅读排行榜

评论排行榜

简述STRUTS2 Convention零配置

struts2.1 开始, struts2 不再推荐使用 Codebehind 作为零配置插件,而是改为使用 Convention 插件来支持零配置,和 Codebehind 相比, Convention 插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用 struts.xml 文件进行配置,甚至不需要使用 Annotation 进行配置,而是由 struts2 根据约定自动配置。

如何使用 Convention

1.        struts-Convention-plugin-2.1.6.jar 文件复制到 WEB-INF/lib 路径下

2.        对于 Convention 插件而言,它会自动搜索位于 action actions struts struts2 包下的所有 java 类, Convention 插件会把如下两种 java 类当成 Action 处理:

1)   所有实现了 com.opensymphony.xwork2.Action java

2)   所有类名以 Action 结尾的 java

3.        Convention 插件还允许设置如下三个常量:

1)   struts.Convention.exclude.packges: 指定不扫描哪些包下的 java 类,位于这些包结构下的 java 类将不会自动映射成 Action

2)   struts.convention.package.locators:Convention 插件使用该常量指定的包作为搜寻 Action 的根包。对于 actions.fore.LoginAction 类,按约定原本应映射到 /fore/login; 如果将该常量设为 fore ,则该 Action 将会映射到 /login

3)   struts.convention.action.packages:Convention 插件以该常量指定包作为根包来搜索 Action 类。 Convention 插件除了扫描 action,actions,struts,struts2 四个包的类以外,还会扫描该常量指定的一个或多个包, Convention 会试图从中发现 Action 类。

注意: struts.convention.package.locators struts.convention.action.packages 两个常量的作用比较微妙,开发者在利用这两个常量时务必小心。

如:下面 Action 所在包被映射的命名空间如下:

com.fun.actions.LoginAction 映射到    /

com.fun.actions.myoffice.CarInfoAction 映射到 /myoffice

com.fun.struts.myoffice.EntINfoAction 映射到 /myofiice

4.        映射 Action name 时,遵循如下两步规则

1)   如果该 Action 类名包含 Action 后缀,将该 Action 类名的 Action 后缀去掉。否则不做任何处理。

2)   Action 类名的驼峰写法(每个单词首字母大写、其他字母小写的写法)转成中画线写法(所有字母小写,单词与单词之间以中画线隔开)

如: LoginAction 映射的 Acion name 属性为 login GetBooks 映射的 Action name 的属性为 get-books AddEmployeeAction 映射的 Action name 属性为 add-employee

5.        默认情况下。 Convention 总会到 WEB 应用的 WEB-INF/content 路径下定位物理资源 ,定位资源的约定是: actionRUL+resultCODE+suffix 。当某个逻辑视图找不到对应的试图资源时, Convention 会自动视图使用 ActionURL+suffix 作为物理视图资源。

        如: actions.fore.LoginAction 返回 success 字符串时, Convention 优先考虑使用 WEB-INF/content/fore 目录下的 login-success.jsp 作为视图资源。如果找不到该文件, login.jsp 也可作为对应的试图资源。如果返回 input 字符串, Convention 会将 WEB-INF/content/fore 里面查找 login-input.jsp

6.        为了看到 struts2 应用里的 Action 等各种资源的影射情况, struts2 提供了 Config Browser 插件。 使用方法,将 struts2-config-browser-plugin-2.1.6.jar 文件复制到 struts2 应用的 WEB-INF\lib 目录中。

打开首页地址: http://localhost:8080/ 应用名字 /config-browser/actionNames.action 这里可以看到 Config Browser 插件的首页。

注意:这里不管开发者是否使用 struts.xml 文件进行配置,一样可以看到 struts 的配置信息。

7.Action 链的约定

如果希望一个 Action 处理结束后不是进入一个试图页面,而是进行另一个 Action 形成的 Action 链。通过 Convention 插件则只需遵守如下三个约定即可。

1)   第一个 Action 返回的逻辑视图字符串没有对应的视图资源

2)   第二个 Action 与第一个 Action 处在同一个包下

3)   第二个 Action 影射的 URL 为: firstActionURL+resultCODE

如,第一个 Action OneAction ,里面有个方法返回为“ two , 那么就得保证, WEB-INF/content/ 下没有 one.jsp one-two.jsp 对于第二个 action 它的名字应该是 OneTwoAction ,而对应的 url 应该是:“ one-two.action

注意:由于 Convention 插件根据 Action jsp 页面来动态生成映射的,因此不管是 Acion 的改变,还是 JSP 页面的改变都需要 Convention 插件重新加载映射。那么只要我们为 struts2 应用配置如下两个常量就可以了。

<!-- 配置 struts2 应用于开发模式 -- >

<constant name=”struts.devMode” value=”true”/>

<!— 配置 Convention 插件自动重加载映射 -- >

<constant name=”struts.convention.classes.reload” value=”true”/>

几个重要的常量

struts.convention.action.disableJarScanning--- 是否从包中搜索 Action

struts.convention.action.package--------Convention 插件以该常量指定包作为根包

struts.convention.result.path --- 设置 Convention 插件定位视图资源的根路径。默认值为 /WEB-INF/content

struts.convention.result.flatLayout— 如果是为 false 则可以将试图放置 Action 对应的目录下,无需放入 WEB-INF/content

7.        Convention Annotation

1)   Action 相关的两个 Annotation @Action @Actions

2)   @Action 中可指定一个 value 属性。类似于指定 <action name=””/> 属性值

3)   @Action 中还可以指定一个 params 属性,该属性是一个字符串数组,用于该 Acion 指定的参数名和参数值。 params 属性应遵守如下格式: {“name1”,”value1”,”name2”,”value2”}

4)   @Actions 也用于修饰 Action 类里的方法,用于将该方法映射到多个 URL.@Actions 用于组织多个 @Action. 因此它可将一个方法映射成多个逻辑 Action

如:

package com.fun.actions;

 

 

 

import org.apache.struts2.convention.annotation.Action;

import org.apache.struts2.convention.annotation.Actions;

 

import com.fun.service.LoginService;

import com.opensymphony.xwork2.ActionSupport;

 

public class LoginAction extends ActionSupport {

    private String str ;

    @Actions ({

       @Action (value= "login1" ,params={ "str" , " 这是已经注入的了! " }),

       @Action (value= "login2" )

      

    })

    public String login(){

       return "str" ;

    }

    @Action (value= "ggg" )

    public String abc(){

       return "abc" ;

    }

    public String getStr() {

       return str ;

    }

    public void setStr(String str) {

       this . str = str;

    }

   

}

我们可以通过 /login1.action 访问,而在访问时, str 这个属性已经有值,为 str=” 这是已经注入的! 返回的视图是 login1-str.jsp

当我们用 /login2.action 访问时, str 的值为 null 。返回的视图为 login2-str.jsp

而我们通过 /ggg.action 调用的是 abc ()方法,返回的视图为 /ggg-abc.jsp

8.        Result 配置相关的 Annotation

1 @ResultPath @Result Results

2 @Results 用于组织多个 @Result 因此它只需指定一个 value 属性值,该 value 属性值为多个 @Result

3 @Result 相当于 struts.xml 文件中的 <result/> 元素的做哟欧诺个。使用 @Result 必须指定一个 name 属性,相当于 <result name=””/> 另外,它还有几个可选的属性。

      type 相当于 <result type=””/> 指定返回视图资源的类型

     location 相当于 <result>…..</result> 中间部分,用于指定实际视图位置

     params :该属性相当于 <result/> 元素里多个 <param../> 子元素的作用,用于为该 Result 指定参数值。该属性应满足 {“name1”,”value1”,”name2”,”value2”} 格式

4)@Result 有以下两种用法

1 Action 级的 Result 映射:以 @Actions 组合多个 @Action 后修饰的 Action 类。这种 Result 映射对该 Action 里的所有方法都有效。

2 方法级 Result 映射:将多个 @Result 组成数组后作为 @Action results 属性值。这种 Result 映射仅对被修饰的方法有效。

5 @ResultPath 则用于修饰包和 Action 类,用于改变被修饰 Action 所对应的物理视图资源的根路径。举例说:默认情况下, Convention 都会到 WEB-INF/content 路径下找物理视图资源,一旦我们使用 @ResultPath(“/abc”) 修饰该 Action ,系统将回到 abc 目录下寻找物理视图资源。举例:在默认情况下, Convention 都会到 WEB-INF/content 路径下需找物理视图资源,一旦我们使用 @ResultPath(“/abc”) 修饰该 Action ,系统会到 abc 目录下寻找物理视图资源。

 

9 与包和命名空间相关的 Annotation

   @Namespace :修饰 Action 类或其所在的包。该 Annotation 中指定一个 value 属性值,用于指定被修饰的 Action 所在的命名空间

  @Namespaces :修饰 Action 类或其所在的包,用于组合多个 @Namespace

  @ParentPackage: 用于指定被修饰的 Action 所在包的夫包。

10 异常处理相关的 Annotation

  @ExceptionMappings 用于组织多个 @ExceptionMapping ,因此它只需指定一个 value 属性值,该 value 属性值为多个 @ExceptionMapping

 @ExceptionMapping 用于定义异常类和物理视图之间的对应关系,也相当于 struts.xml 文件里 <exception-mapping../> 元素的作用 使用时,必须注意以下两个属性:

  exception: 用于指定异常类

  result 用于指定逻辑视图

@ExceptionMpping 有如下两种用法

   Action 级的异常定义 : @ExceptionMappings 组合多个 @ExceptionMapping 后修饰的 Action 类。这种异常定义对 Action 中的所有方法有效

  方法级的异常定义: 将多个 @ExceptionMapping 组成数组后作为 @Action exceptionMappings 属性值,这种异常定义仅对被修饰的方法有效。

 

11. 拦截器配置相关的 Annotation

  与拦截器配置的 Annotation @InterceptorRef @InterceptorRefs @DefaultInterceptorRef

@InterceptorRefs 用于组织多个 @InterceptorRef ,因此它只需要指定一个 value 属性值,该 value 属性值为多个 @InterceptorRef

@InterceptorRef 用于为指定 Action 引用 lanjieq 或者是拦截器栈。也就相当于 strut.xml 中位于 <action../> 元素内部的 <interceptor-ref../> 子元素的作用。使用 @InterceptorRefAnnotation 时,必须制定一个 value 属性,用于指定所引用的拦截器或拦截器栈的名字。相当于 <interceptor-ref../> 子元素里 name 属性的作用。

转自: http://blog.csdn.net/Beacher_Ma/archive/2009/10/27/4733227.aspx

posted on 2010-11-23 21:02 duansky 阅读(573) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: