动态方法调用(DMI)
定义:动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以action=“Action!methodName.action”形式来指定Form的action属性。
功能:在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多。
注意:使用动态方法调用必须设置Struts2允许动态方法调用。开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的,设置该常量的值为true,将开启方法调用,否则将关闭动态方法调用。
第一种指定method属性:
如果在配置<action>元素指定method属性,则可以让Action类调用指定方法,而不是execute方法来处理用户请求。
在struts.xml
<action name="login" class="chapter2.action.LoginRegister"
method="">
<result name="success">/redirect.jsp</result>
</action>
<action name="register" class="chapter2.action.LoginRegister"
method="register">
<result name="success" >/register.jsp</result>
</action>
第二种方式:感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用.
使用实例
Action
package chapter3.action;
public class Chapter3Action {
public String result1(){
return "result1";
}
public String result2(){
return "result2";
}
}
Jsp的访问方式:
<body>
<a href="${basePath}/chapter3/chapter3Action!result1">result1</a><br>
<a href="${basePath}/chapter3/chapter3Action!result2">result2</a><br>
</body>
如果配置了后缀:
/chapter4/chapter4Action!create.action
xml配置方式:
<package name="chapter3" namespace="/chapter3" extends="struts-default">
<action name="chapter3Action" class="chapter3.action.Chapter3Action">
<result name="result1">/WEB-INF/JspPage/chapter3/result1.jsp</result>
<result name="result2">/WEB-INF/JspPage/chapter3/result2.jsp</result>
<result name="chapter3">/WEB-INF/JspPage/chapter3/chapter3.jsp</result>
</action>
</package>
第三种:使用通配符
在配置<action.../>元素时,需要指定name、class和method属性,在name属性中使用通配符,在class和method属性中使用表达式。当我们使用通配符定义Action的name属性时,相当于一个<action.../>元素定义多个逻辑Action。
开关关闭
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<action name="chapter3_*" class="chapter3.action.Chapter3Action"
method="{1}">
<result name="test">/…/test.jsp</result>
</action>
chapter3_*这里的*就是你呆会要匹配的字符串,即你在后面的请求中得这样写
http://...../ chapter3_create 或 http://...../ chapter3_update
注意,这时你action中必须有create和update方法与之匹配,甚至还可以这样匹配
<action name="chapter3_*" class="chapter3.action.Chapter3Action"
method="{1}">
<result name="test">/…/{1}.jsp</result>
</action>