index.jsp 代码:
<form name="form" method="post">
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td>用户名: </td>
<td><input type="text" name="userName" id="userName" /></td>
<td><input type="submit" value="检验" οnclick="submitFrm('chexk');" /></td>
</tr>
<tr >
<td>密码 </td>
<td colspan="2"><input type="text" name="pwd" id="pwd" /></td>
</tr>
<tr>
<td colspan="4">
<input type="submit" name="submit" id="submit" value="登录" />
<input type="submit" name="submitZ" id="submitZ" value="注册" οnclick="submitFrm('reg');" />
<input type="reset" name="reset" id="reset" value="重置" />
<input type="submit" name="Cess" id="Cess" value="测试" οnclick="submitFrm('cess');">
</td>
</tr>
</table>
</form>
<form action="Cessac!cess.action" method="post">
<input type="submit" name="Cess" id="Cess" value="测试">
</form>
<script type="text/javascript">
function submitFrm(menubar)
{
alert(menubar);
//配置动态方法调用 格式: ActionName(action名)!chexk(方法名).action
form.action="ActionName!"+menubar+".action";
form.submit;
}
</script>
分解:
第一种: 1---24 和 33--44属于 javascript的动态方法调用、格式如:action名!调用的方法名.action
第二种:27--31 一个普通的表单提交 格式也是一样!
区别:第一种可以在一个表单提交中调用多个方法. 第二种唯一的提交方法、允许一个submit.
效果:
struts.XML
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.action.extension" value="action" />
<package name="default" extends="struts-default">
<action name="ActionName" class="com.struts2.action.UserManagerAction" >
<result name="chexk">/check.jsp</result>
<result name="reg">/reg.jsp</result>
<result name="cess">/cess.jsp</result>
</action>
<action name="Cessac" class="com.struts2.action.UserManagerAction">
<result name="cess">/cess.jsp</result>
</action>
</package>
</struts>
注意正常书写:
其中 <constant name="struts.action.extension" value="action" />
指定请求的后缀可以是.do或.action (这里用的是action)
UserManagerAction 方法类:
public class UserManagerAction extends BaseAction {
//定义检测方法
public String chexk() throws Exception{
//获得输出对象
PrintWriter out=this.getResponse().getWriter();
out.println("检测方法!! chexk()");
return "chexk";
}
//定义注册方法
public String reg() throws Exception{
//获取输出对象
PrintWriter out=this.getResponse().getWriter();
out.println(" 注册方法!! reg() ");
return "reg";
}
//测试方法
public String cess() throws Exception{
//获取输出对象
PrintWriter out=this.getResponse().getWriter();
out.println(" 注册方法!! cess() ");
return "cess";
}
}
继承的 BaseAction 属于action的基类:
参考一下:
public class BaseAction {
//获取request对象
public Map<String,Object> getRequest(){
//通过ActionContext得到requerst对象
return (Map<String, Object>) ActionContext.getContext().get("request");
}
//获得session对象
public Map<String, Object> getSession(){
return ActionContext.getContext().getSession();
}
//获得responseduix
public HttpServletResponse getResponse(){
//通过ServletActionContext获得HttpServletResponse对象
HttpServletResponse response=ServletActionContext.getResponse();
//设置编码响应头与字符串编码
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
return response;
}
}
以上是对Struts2的方法调用、还有一个就是通配符的使用. 注意是在 struts.xml 中
注意:4个方法在同一个类中:
<action name="addUser" class="com.asm.UserAction" method="addUser">
<result name="success">/user/addUser.jsp</result></action>
<action name="delUser" class="com.asm.UserAction" method="delUser">
<result name="success">/user/delUser.jsp</result></action>
<action name="queryUser" class="com.asm.UserAction" method="queryUser">
<result name="success">/user/queryUser.jsp</result></action>
<action name="updateUser" class="com.asm.UserAction" method="updateUser">
<result name="success">/user/updateUser.jsp</result></action>
使用通配符只需如下内容即可达到相同的效果:
<action name="*User" class="com.asm.UserAction" method="{1}User">
<result name="success">/user/{1}User.jsp</result>
</action>
原理:
这里不难明了*此时代指的内容是add,再来看method恰恰是引用第一个*的内容,所以它的method此时的完整名为addUser,
它刚好和com.asmUserAction中的addUser方法相对,所以它会去addUser方法,再来看下面的result配置所指代的页面,它也用到了{1},
所以它的完整页面是/addUser.jsp。其实如果我们有良好的编程命名习惯,所有的Action我们都只需要进行一次配置。
即配置文件可以写成如下形式:
<action name="*_*" class="com.asm.{2}Action" method="{1}">
<result name="success">.../{1}_{2}.jsp</result>
</action>