struts2 例子三 【Action】整理文

 Action 的配置是 Struts2 框架的一个基础工作单元,每一个 Action 的配置都有对应的处理类,当一个请求和 Action 的 name 相匹配时,框架将根据所配置的 Action 映射来决定对请求的处理。

1、Action 映射配置

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

如:

<action name="Logon" class="tutorial.Logon"> 

  <result name="input">Logon.jsp</result> 

</action>

2、Action 名称及命名

在 web 应用中, action 的 name 属性用于匹配通过浏览器发送的请求地址或链接的一部分。框架将取主机地址、应用名称和扩展名之间的部分和 name 属性进行匹配,如:一个请求http://.../.../Welcome将映射到 name属性为Welcome的 Action 处理类。(请求是区分大小写的)在一个应用里边,通常通过在标签中指定 action 的 name 来链接到相应的 action ,然后由框架自动追加action 的扩展名和其它需要的内容。

注意:如果在你的 action 的 name 中包含有斜线(如: <action name="xxxxxx/xxxxxx" class="xxxxxx.xxxxx"/> ),你需要在 struts.xml 中进行如下配置: <constant name="struts.enable.SlashesInActionNames" value="true"/> ,但是,启用该配置也会产生一些副作用。具体-。-问度娘

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

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

如:

<struts>

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

    <package name="actions" extends="struts-default" namespace="/actions">

        <action name="Studentadd" class="com.bjsxt.struts2.action.StudentAction" method="add">

            <result>/Studentadd_success.jsp</result>

        </action>

    </package>

</struts>

3、Action 方法

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

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"; 

}  

 

在struts2中,Action不同于struts1.x中的Action。在struts2中Action并不需要继承任何控制器类型或实现相应接口。比如struts1.x中的Action需要继承Action或者DispatcherAction。

同时struts2中的Action并不需要借助于像struts1.x中的ActionForm获取表单的数据。可以直接通过与表单元素相同名称的数据成员(需要存在符合命名规范的set和get方法)获取页面表单数据。

虽然struts2中的Action原则上不用继承任何类型。但是一般需要实现com.opensymphony.xwork2.Action接口或者继承com.opensymphony.xwork2.ActionSupport类型,然后重写execute方法。通常更愿意去继承ActionSupport类型,这样我们可以在我们的控制器中增加更多的功能。因为ActionSupport本身不但实现了Action接口,而且实现了其他的几个接口,让我们的控制器的功能更加强大,例如:

com.opensymphony.xwork2.Validateable:提供了validate方法,可以对action中的数据进行校验

com.opensymphony.xwork2.ValidationAware:提供了addFieldError方法,可以存取action级别或者字段级别的错误消息

com.opensymphony.xwork2.TextProvider:提供了获取本地化信息文本的方法getText

com.opensymphony.xwork2.LocaleProvider:提供了getLocale方法,用于获取本地信息

从以上我们可以看到,继承ActionSupport,可以完成更多的工作。

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

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

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

 

4、通配符方法

大多数情况下,一组 action 映射拥有通用的模式,如:所有的 edit actions 可能都是以 edit 开头,并且在 action 类中的入口方法也被命名为 edit 。 delete 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 。

如:

<action name="*" class="shawuai.action.{1}Action">

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

<action name="*_*" class="shawuai.action.{1}Action" method="{2}">

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

</action>

<action name="Student*" class="shawuai.action.StudentAction" method="{1}">

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

</action>

<action name="Teacher_*" class="shawuai.action.TeacherAction" method="{1}">

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

</action>

每个 package 内可以配置自己的缺省 action ,但是在每个命名空间下只能配置一个缺省的 action,如果在多个具有相同命名空间的 package 内配置有多个缺省 action 时(name="*" And name="*_*" And name="*XX"等这样的配置!),框架就没法保证哪个action 将被作为缺省的 action 。

如:

<action name="*" > 

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

</action> 

5、动态方法调用

在 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 。

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 name="Hello" extends="action-default"> 

<default-action-ref name="UnderConstruction"> 

<action name="UnderConstruction"> 

  <result>/UnderConstruction.jsp</result> 

</action> 

</package> 

 

  

 

 

 

 

 

 

 

 

posted @ 2012-06-07 23:50  鯊鲨  阅读(630)  评论(0编辑  收藏  举报