每一个Action中都有一个execute方法,当我们调用相应的Action时,execute方法就会被默认执行。也就是说,每一个请求都对应一个Action,这样就会导致我们需要写很多个Action,即使它们是相关联的。为了减少Action的数量,减少重复编码,struts2提供了动态方法调用。将一组相关的业务放到同一个Action中,根据业务请求的不同而动态的调用相应的方法。
1、method方法:在一个Action中写入多个相关的方法,每一个方法都要在struts.xml中配置一个action,action中的method属性值指定调用Action的方法。execute为默认的调用方法,当配置的action中没有指定method属性时,调用execute方法。
index.jsp中的3个表单
<form action="LoginAction" method="post">
<input type="submit" value="登陆" />
</form>
<form action="RegisterAction" method="post">
<input type="submit" value="注册"/>
</form>
<form action="DefaultAction" method="post">
<input type="submit" value="默认"/>
</form>
LoginAction.java
public class LoginAction extends ActionSupport{
public String login() {
System.out.println("login方法");
return SUCCESS;
}
public String register() {
System.out.println("register方法");
return SUCCESS;
}
public String execute() throws Exception{
System.out.println("默认调用的方法");
return SUCCESS;
}
}
struts.xml
<struts>
<package name="xxx" extends="struts-default">
<action name="LoginAction" method="login" class="com.demo.action.LoginAction">
<result name="success">/page/loginSuccess.jsp</result>
</action>
<action name="RegisterAction" method="register" class="com.demo.action.LoginAction">
<result name="success">/page/registerSuccess.jsp</result>
</action>
<action name="DefaultAction" class="com.demo.action.LoginAction">
<result name="success">/page/error.jsp</result>
</action>
</package>
</struts>
2、感叹号方法:只配置一个action。通过在Action后加上 !方法名来调用同一个Action中的不同方法。感叹号方法要注意,2.5及以上版本需要在struts.xml文件中配置两条信息,同时,dtd约束需要是2.5版本
index.jsp
<form action="LoginAction!login" method="post">
<input type="submit" value="登陆" />
</form>
<form action="LoginAction!register" method="post">
<input type="submit" value="注册"/>
</form>
<form action="LoginAction" method="post">
<input type="submit" value="默认"/>
</form>
LoginAction.java
public class LoginAction extends ActionSupport{
public String login() throws Exception{
System.out.println("login方法");
return "login";
}
public String register() throws Exception{
System.out.println("register方法");
return "register";
}
public String execute() throws Exception{
System.out.println("默认调用的方法");
return "default";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="xxx" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="LoginAction" class="com.demo.action.LoginAction">
<result name="login">/page/loginSuccess.jsp</result>
<result name="register">/page/registerSuccess.jsp</result>
<result name="default">/page/error.jsp</result>
</action>
</package>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>