方法1:采用ActionName!methodName的方式来进行;
比如你有一个struts表单:
<s:form action="loginAction">
<s:textfield name="username" key="user"/>
<s:password name="password" key="pass"/>
<s:submit key="login" />
<s:submit key="register" οnclick="regist();"/>
</s:form>
里面有两个按钮,一个login,一个register,那么现在你需要考虑的是,register应该怎么选择相应的action呢?
我写了一个resgsit()的js函数,代码如下
function regist(){
targetForm=document.forms[0];
//这是一种动态调用的方式
targetForm.action="loginAction!regist"
//推荐使用这种
//targetForm.action="registAction ";
}
这个时候,你会发现,这个地方动态的将这个表单的action改为了loginAction!regist。这是什么原理呢?原来struts支持这种动态调用机制,你首先需要在struts.xml中打开这个机制,只需要一行代码
<!-- 开启使用!动态配置action方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
开启之后就可以使用相应的action了。其他的地方都不需要改,
只需要在对应的java代码中添加一个regist()方法即可,下面贴上完整的代码:
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>
<!-- 指定默认编码集 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 制定全局国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 开启使用!动态配置action方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- !形式-->
<package name="Login_Register_1" extends="struts-default">
<!-- 要添加这个,不然会因为不允许使用这个方法而阻止继续进行 -->
<global-allowed-methods>regist</global-allowed-methods>
<action name="loginAction" class="cn.nju.fxd.login.LoginAction">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
</package>
</struts>
loginAction对应的LoginAction.java
public class LoginAction extends ActionSupport{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String regist() throws Exception{
return SUCCESS;
}
public String execute() throws Exception{
//struts获得servelt api的方法之一,通过获得ActionContext的实例,来调用一些操作
//常见的操作有:
/*
* Object get(Object key):类似于调用HttpServeltRequest 的 getAttribute(String name)方法;
*void put(Object name,Object value):类似于调用
*Map getApplication():返回一个map对象,该对象模拟了该应用的ServletContext实例;
*static ActionContext getContext():静态方法,返回一个ActionContext实例,也就是从这里开始可以调用其他方法;
*Map getParameters():相当于HttpServletRequest的getParameterMap()方法;
*Map getSession():返回一个map对象,该map对象模拟了HttpSession实例;
*void setApplication(Map application):直接传入一个map实例,将该map实例里的key-value对直接转换成application的属性名,属性值;
*void setSession(Map session):直接传入一个map实例,将该map实例里的key-value对直接转换成session的属性名,属性值;
*/
ActionContext ctx = ActionContext.getContext();
Integer counter = (Integer) ctx.getApplication().get("counter");
if(counter==null){
counter=1;
}else{
counter++;
}
ctx.getApplication().put("counter", counter);
ctx.getSession().put("username", username);
if(getUsername().equals("fanxuande")&&getPassword().equals("123456")){
ctx.put("tip", "服务器提示,您已成功登录!");
return SUCCESS;
}else{
return ERROR;
}
}
}
方法二:通过制定method属性来确定使用哪个方法。这个比较简单,不再赘述,只给一个简单的配置例子
<?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>
<!-- 指定默认编码集 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 制定全局国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="mess"/>
<package name="Login_Register_1" extends="struts-default">
<action name="login" class="cn.nju.fxd.login.LoginAction">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
<action name="register" class="cn.nju.fxd.login.LoginAction" method="regist>
<result name="success">/regSucc.html</result>
</action>
</package>
</struts>
方法三:使用通配符,这个和方法1同样需要在对应的包中添加<global-allowed-method>元素,不然对应的方法无法使用;
具体的方式如下:
<!-- 通配符形式 -->
<package name="Login_Register" extends="struts-default">
<!-- 要添加这个,不然会因为不允许使用这个方法而阻止继续进行 -->
<global-allowed-methods>regist</global-allowed-methods>
<action name="*Action" class="cn.nju.fxd.login.LoginAction" method="{1}">
<result name="input" >/login.jsp</result>
<result name="error" type="plainText">
<param name="location">/error.jsp</param>
<param name="charSet">UTF-8</param>
</result>
<result name="success">/welcome.jsp</result>
</action>
<!-- 不指定class的action,默认使用AcctionSupport,result不指定name,默认为success -->
<action name="*" >
<result>error.jsp</result>
</action>
</package>
该方法,struts2会将符合*Action的action匹配,并调用相应的方法。其中method={1}表示第一个*的值。比如客户请求loginAction,那么就会请求*Action的对应的login()方法。
该方法还设置了一个*处理其他所有的不匹配请求,将会跳转到一个error.jsp页面。