Struts2之Action的配置 一、Action的动态调用方法 二、Action通配符(wildcard)的配置 三、默认的action

Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法:

方法一:通过methed属性指定执行方法:

<package name="user" extends="struts-default" namespace="/user">
    <!-- method="add"表明调用该action时是执行该action对象的add方法 -->
    <action name="userAdd" class="com.chongqing.action.UserAction" method="add">
        <result>/user_add_success.jsp</result>
    </action>
</package>

这样,只要在action的对象中有一个add的方法,并且返回类型为String就可以了。如果没有使用method属性,则默认执行execute方法

package com.chongqing.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
	public String add() {
		return SUCCESS;
	}
	
	
}

方法二:动态方法调用DMI(推荐)

可以在URL地址中动态指定Action执行那个方法。URL地址如下:

方法:action + ! + 方法名
注:只要Action对象中有这个方法,并且返回类型为String就可以调用

这样struts.xml配置文件中不需要配置methed属性。代码如下:

<action name="user" class="com.chongqing.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>
 Action类:
package com.chongqing.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
	public String add() {
		return SUCCESS;
	}	
}

总结:推荐使用第二种动态方法调用DMI,因为第一种需要大量的Action配置,后者可以在URL中动态指定执行action中哪个方法。

二、Action通配符(wildcard)的配置

随着Web应用程序的增加,所需的Action也会更多,会导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置

通配符即星号(*),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。 

不过,一定要遵守"约定优于配置"的原则

用法:

星号(*) :表示所有
{数字}:表示第几个通配符
例如:name="Student*": 那么{1}代表第一个星号(*)
         name="*_*"        : 那么{1}代表第一个星号(*) ,{2}代表第二个星号(*)

例子:struts.xml文件代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="actions" extends="struts-default" namespace="/actions">
    <!-- 这个action将匹配所有Student*的名字,比如说星号可以是add,delete等等,对应的action调用方法为add,delete,对应的jsp为:Studentadd_success.jsp和Studentdelete_success.jsp--> <action name="Student*" class="com.chongqing.action.StudentAction" method="{1}"> <result>/Student{1}_success.jsp</result> </action>     <!-- 这个action将匹配所有*_*的名字,--> <action name="*_*" class="com.chongqing.action.{1}Action" method="{2}"> <result>/{1}_{2}_success.jsp</result> </action> </package> </struts>

action类的代码:

package com.chongqing.action;

import com.opensymphony.xwork2.ActionSupport;

public class StudentAction extends ActionSupport {
	public String add() {
		return SUCCESS;
	}
	public String delete() {
		return SUCCESS;
	}	
}
package com.chongqing.action;

import com.opensymphony.xwork2.ActionSupport;

public class TeacherAction extends ActionSupport {
	public String add() {
		return SUCCESS;
	}
	
	public String delete() {
		return SUCCESS;
	}		
}

 相应的jsp页面有:
Course_add_seccess.jsp
Course_delete_success.jsp
Teacher_add_seccess.jsp
Teacher_delete_success.jsp
Studentadd_success.jsp
Studentdelete_success.jsp

解释:

第一个Action的名称为name="Student*" method="{1}",表示所有Action以Student开始的都会执行这个Action(就此程序而言),并且执行Student后字符为方法名的方法,例如:访问的Action为Studentadd,会执行这个Action(Student*),并且执行add的方法.因为{1}在这里代表add,并且返回/Studentadd_success.jsp页面。

第二个Action的名称name="*_*" method="{2}" class="action.{1}Action" ,表示所有Action中包含下划线("_")并与此格式匹配的都会执行这个Action(就此程序而言),例如:Teacher_add,那么会执行这个Action,并且Action对应的类为TeacherAction,且执行Action中的add方法,返回结果页面为/Teacher_add_success.jsp,因为在这里的{1}表示Teacher,{2}表示add

 匹配顺序:当匹配的Action有两个以上时,则会按匹配精确度高的那个Action,当有个相同的匹配精确度时,则按先后顺序进行。

三、默认的action

如果你请求一个不存在的action,那么结果将是HTTP 404错误,即页面没有发现错误。在Struts2中,你可以指定一个默认的action,当一个请求没有其他action匹配时,默认的action将被执行。

默认的action使用default-action-ref元素来声明,如下:

<struts>
    <constant name="struts.devMode" value="true" />
   
    <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index"></default-action-ref>
    <action name="index">
        <result>/default.jsp</result>
    </action>
    </package>
</struts>

当前访问namespace="/"下不存在的action时,则返回自动转到访问/default.jsp页面。

注意:默认action只对action的访问有效。如果访问的是一个非action资源,例如/book.jsp,而该页面并不存在,那么依旧会看到HTTP 404错误。