加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

struts2中action及其配置详解

(2013-04-09 17:56:42)
标签:

struts2

action配置

详解

it

分类: java框架

1.1 action 映射配置

Action 映射中可以指定 result types 、异常处理器( exception handlers )及拦截器,但是,只有 Action name 属性是必需指定的,其他属性也可以在 package 范围内进行定义,供该 package 下配置的所有 Action 引用。如:

<!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)
       name
action名称
       class: 
对应的类的路径
       method: 
调用Action中的方法名
-->

<action name="hello" class="com.kay.struts2.Action.LoginAction">
<!-- 引用拦截器
       name:
拦截器名称或拦截器栈名称
-->

       
<interceptor-ref name="timer"></interceptor-ref>
       
<!-- 节点配置
               name result
名称 Action中返回的值相同
               type result
类型 不写则选用superpackagetype struts-default.xml中的默认为dispatcher
        -->

        
<result name="success" type="dispatcher">/talk.jsp</result>
        
<!-- 参数设置 
               name
:对应Action中的get/set方法 
         -->

        
<param name="url">http://www.sina.com</param>
</action>

1.2 action名称及命名

web 应用中, action name 属性用于匹配通过浏览器发送的请求地址或链接的一部分。框架将取主机地址、应用名称和扩展名之间的部分和 name 属性进行匹配,如:一个请求http://www.planetstruts.org/struts2-mailreader/Welcome.do将映射到 name属性为 Welcome Action 处理类。

在一个应用里边,通常通过在标签中指定 action name 来链接到相应的 action ,然后由框架自动追加 action 的扩展名和其它需要的内容。

注意:如果在你的 action name 中包含有斜线(如: <action name="admin/home" class="tutorial.Admin"/> ),你需要在 struts.xml 中进行如下配置: <constant name="struts.enable.SlashesInActionNames" value="true"/> ,但是,启用该配置也会产生一些副作用,具体详情可参考 https://issues.apache.org/struts/browse/WW-1383 上的讨论。

警告:谨慎使用在 action 名称中包含点 (eg:create.user) 、斜线 (create/user) 和横线 (create-user) 的情况,虽然 action 的名称定义非常灵活,但是,当在 action name 中使用点、斜线或横线时,应该谨慎。有时候,当点符号没有明显的副作用时,横线符号将会导致为某一个标签或主题( themes )生成 javascript 时的问题。因此,尽量使用软件工程中规范的或者带下划线的命名,如: createUser 或者 my_action

严重提示:Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action

1.3  action方法

缺省的处理类入口方法是在 Action 接口中进行定义的, Action 接口代码如下:

packagecom.opensymphony.xwork2;

public interface Action{

public abstract String execute() throws Exception;

public static final String SUCCESS = "success";

public static final String NONE = "none";

public static final String ERROR = "error";

public static final String INPUT = "input";

public static final String LOGIN = "login";

}

该接口的实现是可选的,如果编写的 action 没有实现该接口,框架将自动从 action 中通过反射去查找 execute 方法。

通常,开发人员习惯在一个 action 中创建多个入口方法,例如,在一个具有数据访问功能的 action 中,开发人员想分别实现添加、查询、更新和删除四个入口方法,入口方法可以通过 action 配置中的 method 属性来进行指定,如:

<action name="delete" class= "example.CrudAction" method= "delete" >

如果在一个 action 中没有 execute 方法,也没有其它方法在配置文件中进行配置,框架将抛出异常。

1.4 action通配符方法

大多数情况下,一组 action 映射拥有通用的模式,如:所有的 edit actions 可能都是以 edit 开头,并且在 action 类中的入口方法也被命名为editdelete actions 也将可能具有相同的模式,且在 action 类中的入口方法名被命名为 delete

这里,并非需要为每一个存在这种模式(或共性)的 action 类进行单独的映射配置,而是可直接通过通配符映射只需配置一次即可。代码如下:

<action name= "*Crud" class= "example.Crud" method= "{1}" >

在这里,当在应用中将 action 指定为“ editCrud ”时,将调用 editCrud Action 处理类实例中的 edit 方法。同样,“ deleteCrud ”将调用 deleteCrud Action 处理类实例中的 delete 方法。

另外一种方法是通过 action 的后缀来匹配方法名,并且通过感叹号、下划线或者其它特殊字符将其进行分开。

"action=Crud_input"

"action=Crud_delete"

下面的代码片断演示了在 action 名称的最后使用星号通配符的示例:

<action name= "Crud_*" class= "example.Crud" method= "{1}" >

从框架的角度看,通配符方式使用与常规的、静态映射同样的属性,创建了一个新的虚拟的映射配置。结果,你能够通过替换通配符来作为校验、类型转换及 message resource 文件,正象他作为 action name

Crud_input-validation.xml

Crud_delete-conversion.xml

下面的代码片段演示了通配符默认配置示例:

<action name=”*”>

    <result>{1}.jsp</result>

</action>

如果没有配置相应Action 会默认该配置。例如:addUser.action会返回到addUser.jsp页面

1.5 action动态方法的调用

WebWork2 中,可以使用感叹号(!)来指定要执行(或调用)非 execute 方法,但是还没有一个真正的术语该种方式的定义。在 s2 的讨论中,我们定义了“动态方法调用”这个术语来描述 webwork/s2 对感叹号的使用。

动态方法调用( DMI )通过在 action 名称和要调用的 Action 方法之间添加一个感叹号进行分割,以表示调用 action 中指定的方法(非 exeucte 方法)。如:“ Category create.action ”,表示调用 Category Action 中定义的 create 方法。

Struts2 中,让动态方法调用可配置,有两个原因: 1 )如果使用的是 POJO action ,动态方法调用可能会引起安全问题; 2 )动态方法调用和从 Struts 1 中引用过来的通配符方法有重叠;如果你的应用涉及到安全,或者习惯在 action 配置中使用感叹号作为通配符的话,需要在 struts 应用的 struts.properties 配置文件中将 struts.enable.DynamicMethodInvocation 设置为 false

1.6 ActionSupport 的缺省使用和配置

当在 Action 的配置中没有指定 class 属性时, Struts2 将默认使用 com.opensymphony.xwork.ActionSupport 类。

ActionSupport 类中有 execute input 方法,其中 execute 方法直接返回“ success

可通过在 package 内配置 default-action-ref ,将其 name 属性指定到缺省的 action 处理类,这时,当找不到对应的 action 处理类时,将默认去调用 default-action-ref 标签的 name 属性对应的 action 类。如下面的配置片断:

每个 package 内可以配置自己的缺省 action ,但是在每个命名空间下只能配置一个缺省的 action ,如果在多个具有相同命名空间的 package 内配置有多个缺省 action 时,框架就没法保证哪个 action 将被作为缺省的 action

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有