一、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>
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错误。