Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法:
1、方法一(通过methed属性指定执行方法):
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
这样,只要在action的对象中有一个add的方法,并且返回类型为String就可以了。如果没有method属性,则默认执行execute()方法。
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
public String add() {
return SUCCESS;
}
}
2、 动态方法调用DMI(推荐)
可以在url地址中动态指定action执行那个方法。Url地址如下:
方法:action + ! + 方法名
注:只要Action对象中有这个方法,并且返回类型为String就可以调用。
需要设置开关:<constant name="struts.enable.DynamicMethodInvocation" value="true" />
这样Struts.xml配置文件中不需要配置methed属性。代码如下:
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
Action类:
public class UserAction extends ActionSupport {
public String add() {
return SUCCESS;
}
}
使用通配符,将配置量降到最低, 不过,一定要遵守"约定优于配置"的原则
3、 通配符
星号(*) 表示所有
{数字} 表示第几个通配符
例如:Student* 那么{1}代表第一个星号(*)
*_* 那么{1}代表第一个星号(*) ,{2}代表第二个星号(*)
3-1、 实例
<package name="actions" extends="struts-default" namespace="/actions">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action"method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
解释:第一个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
3-2、 匹配顺序
当匹配的Action有两个以上时,则会按 匹配精确度高的那个Action,当有个相同的匹配精确度时,则按先后顺序进行。