【转载】JavaScript代码的核心在于动态修改表单元素的action属性,修改后的action属性为login!regist.action
实际上就是将该表单提交给login Action 的regist方法处理
对于使用动态方法调用的方法,例如regist方法,该方法的声明与系统默认的execute方法只有方法名不同,其它的都应该绝对相同
//开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的 //设置该常量为true,将开启动态方法调用,否则将关闭动态方法调用
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> <script type="text/javascript"> function regist(){ form = document.forms[0]; form.action = "login!regist.action"; form.submit(); } </script> </head> <body> <s:form action="login"> <s:textfield label="用户名" name="username"></s:textfield> <s:textfield label="密码" name="password"></s:textfield> <s:submit label="注册" onclick="regist()" value="注册"></s:submit> <s:submit label="登陆" value="登陆"></s:submit> </s:form> </body> </html>
【备注:】
Struts1框架提供了DispatchAction,从而允许一个Action内包含多个处理逻辑。例如对于同一个表单,当用户通过不同的请求按钮提交表单时,应该使用Action的不同方法来处理请求。 Struts2同样提供了这种处理多个请求的Action,看下面的JSP页面。 上面的JSP页面包含两个提交按钮,但两个提交按钮分别提交给Action的不同方法处理,其中“登陆”按钮希望使用登陆逻辑来处理请求,而“注册”按钮则希望使用注册逻辑来处理请求。 此时,可以采用DMI(Dynamic Method Invocation,动态方法)调用来处理这种请求,动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定Form的action属性:
action="ActionName!methodName.action" 于上面JSP页面的“注册”按钮的代码如下:
单击“注册”按钮时将触发regist函数,该函数的代码如下: function regist() { //获取JSP页面中的一个表单元素 targetForm = document.forms[0]; //动态修改目标表单的action属性 targetForm.action = "Login!regist.action"; //提交表单 targetForm.submit(); } 上面JavaScript代码的核心在于动态修改表单元素的action属性,修改后action属性为:Login!regist.action,其实质就是将该表单提交给login Action的regist方法处理。 login Action类的代码如下: public class LoginRegistAction extends ActionSupport { //封装用户请求参数的两个属性 private String username; private String password; //封装处理结果的tip属性 private String tip; //username属性对应的setter和getter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //password属性对应的getter和setter方法 public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //tip属性对应的setter和getter方法 public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } //Action包含的注册逻辑 public String regist() throws Exception { ActionContext.getContext().getSession().put("user" , getUsername()); setTip("恭喜您," + getUsername() + ",您已经注册成功!"); return SUCCESS; } //Action包含的默认处理逻辑 public String execute() throws Exception { if (getUsername().equals("scott") && getPassword().equals("tiger") ) { ActionContext.getContext().getSession().put("user" , getUsername()); setTip("欢迎," + getUsername() + ",您已经登陆成功!"); return SUCCESS; } else { return ERROR; } } } 图4.1所示的JSP页面中的“登陆”按钮就是一个普通按钮,没有任何特殊之处,当浏览者单击“登陆”按钮时,系统将提交给对应Action的默 认方法处理。当浏览者单击“注册”按钮时,系统将提交给login Action的regist方法处理。因此,如果单击“注册”按钮,将看到如图4.2所示的页面。 通过这种方式,我们可以在一个Action中包含多个处理逻辑,并可以通过为表单元素指定不同action属性来提交给Action的不同方法。 对于使用动态方法调用的方法,例如regist方法,该方法的方法声明与系统默认的execute方法的方法声明,只有方法名不同,其他方法参数,返回值类型都应该绝对相同。
注意:使用动态方法调用必须设置Struts2允许动态方法调用。开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的,设置该常量的值为true,将开启动态方法调用;否则将关闭关闭动态方法调用。
注意
关键字: javascript
Javascript Error: submit is not a function 有时候需要用javascript提交表单,这个时候我们会用javascript:userform.submit();可是我在这样做的时候怎么也提交不成功,报出javascript错误Javascript Error: submit is not a function。百思不得其解,后来查阅资料才发现,在用userForm.submit()提交表单的时候,表单里面不能有name="submit"的元素,否则在提交的时候,该对象会和submit();方法发生混淆造成该错误!! 切记,切记!
|