在很多 Web 应用中,为了完成不同的工作,一个 HTML form 标签中可能有两个或多个 submit 按钮,如下面的代码所示:
<!---->
由于在 <form>中的多个提交按钮都向一个 action提交,使用 Struts2 Action的 execute方法就无法判断用户点击了哪一个提交按钮。如果大家使用过 Struts1.x就会知道在 Struts1.2.9之前的版本需要使用一个 LookupDispatchAction动作来处理含有多个 submit的 form。但使用 LookupDispatchAction动作需要访问属性文件,还需要映射,比较麻烦。从 Struts1.2.9开始,加入了一个 EventDispatchAction动作。这个类可以通过 java反射来调用通过 request参数指定的动作(实际上只是判断某个请求参数是不存在,如果存在,就调用在 action类中和这个参数同名的方法)。使用 EventDispatchAction必须将 submit的 name属性指定不同的值以区分每个 submit。而在 Struts2中将更容易实现这个功能。
当然,我们也可以模拟 EventDispatchAction的方法通过 request获得和处理参数信息。但这样比较麻烦。在 Struts2中提供了另外一种方法,使得无需要配置可以在同一个 action类中执行不同的方法(默认执行的是 execute方法)。使用这种方式也需要通过请求参来来指定要执行的动作。请求参数名的格式为
action!method.action
注:由于 Struts2只需要参数名,因此,参数值是什么都可以。
下面我就给出一个实例程序来演示如何处理有多个 submit的 form:
【第 1步】实现主页面 (more_submit.jsp)
<!----><% @pagelanguage = " java " import = " java.util.* " pageEncoding = " GBK " %>
<% @taglibprefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > MyJSP'hello.jsp'startingpage </ title >
</ head >
< body >
< s:form action ="submit.action" >
< s:textfield name ="msg" label ="输入内容" />
< s:submit name ="save" value ="保存" align ="left" method ="save" />
< s:submit name ="print" value ="打印" align ="left" method ="print" />
</ s:form >
</ body >
</ html >
在 more_submit.jsp中有两个 submit:保存和打印。其中分别通过 method属性指定了要调用的方法: save和 print。因此,在 Action类中必须要有 save和 print方法。
【第 2步】实现 Action类( MoreSubmitAction)
<!---->package action;
import javax.servlet.http. * ;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor. * ;
public class MoreSubmitAction extends ActionSupport implements ServletRequestAware
{
private Stringmsg;
private javax.servlet.http.HttpServletRequestrequest;
// 获得HttpServletRequest对象
public void setServletRequest(HttpServletRequestrequest)
{
this .request = request;
}
// 处理savesubmit按钮的动作
public Stringsave() throws Exception
{
request.setAttribute( " result " , " 成功保存[ " + msg + " ] " );
return " save " ;
}
// 处理printsubmit按钮的动作
public Stringprint() throws Exception
{
request.setAttribute( " result " , " 成功打印[ " + msg + " ] " );
return " print " ;
}
public StringgetMsg()
{
return msg;
}
public void setMsg(Stringmsg)
{
this .msg = msg;
}
}
上面的代码需要注意如下两点:
save和 print方法必须存在,否则会抛出 java.lang.NoSuchMethodException异常。
Struts2 Action动作中的方法和 Struts1.x Action的 execute不同,只使用 Struts2 Action动作的 execute方法无法访问 request对象,因此, Struts2 Action类需要实现一个 Struts2自带的拦截器来获得 request对象,拦截器如下:
org.apache.struts2.interceptor. ServletRequestAware
【第 3步】配置 Struts2 Action
struts.xml 的代码如下:
<!----><? xmlversion="1.0"encoding="UTF-8" ?>
<! DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="demo" extends ="struts-default" >
< action name ="submit" class ="action.MoreSubmitAction" >
< result name ="save" >
/result.jsp
</ result >
< result name ="print" >
/result.jsp
</ result >
</ action >
</ package >
</ struts >
【第 4步】编写结果页( result.jsp)
<!----><% @pagepageEncoding = " GBK " %>
< html >
< head >
< title > 提交结果 </ title >
</ head >
< body >
< h1 > ${result} </ h1 >
</ body >
</ html >
在 result.jsp中将在 save和 print方法中写到 request属性中的执行结果信息取出来,并输出到客户端。
启动 Tomcat后,在 IE中执行如下的 URL来测试程序:
http://localhost:8080/moresubmit/more_submit.jsp
大家也可以直接使用如下的 URL来调用 save和 print方法:
调用 save方法: http://localhost:8080/moresubmit/submit!save.action
调用 print方法: http://localhost:8080/moresubmit/submit!print.action
分享到:
相关推荐
下面是一个实例程序,演示如何处理有多个 submit 的 form: 【第 1 步】实现主页面(more_submit.jsp) 在 more_submit.jsp 中,有两个 submit:保存和打印。其中分别通过 method 属性指定了要调用的方法:save 和...
在这个“一个form多个submit处理案例”中,我们将探讨如何在一个表单中使用多个submit按钮来实现不同的功能。这在实际应用中非常常见,比如在一个订单页面上,用户可能有一个“保存草稿”和“立即购买”的提交选项。...
以下是如何在Struts2中处理一个form多个submit的步骤: **步骤1:创建表单(JSP页面)** 在`more_submit.jsp`中,我们使用Struts2的`s:form`标签来定义表单,并为每个submit按钮指定一个唯一的name属性,同时通过`...
### 一个from表单提交多个功能 在Web开发中,我们经常会遇到需要通过同一个表单实现多种不同功能的情况。例如,根据用户的选择或输入执行不同的后端处理逻辑。本文将详细解析如何通过JavaScript来实现一个表单提交...
通常,一个表单只有一个Submit按钮,但有时根据设计需求,我们可能需要在同一个表单中添加多个Submit按钮,以实现不同的提交功能。本文将深入探讨如何在HTML和JavaScript中实现一个表单多个Submit按钮的简单方法。 ...
### EventDispatchAction类处理一个form多个submit #### 一、背景与概述 在Web应用程序开发过程中,表单的提交操作是非常常见的场景之一。对于复杂的业务逻辑而言,有时我们需要在一个表单中提供多个提交按钮,...
在一个网页表单(form)中,通常我们通过设置不同的提交按钮(submit或button)来实现将数据提交至不同的处理页面。然而,在某些特定情况下,我们可能需要仅使用一个提交按钮(submit或button)来将表单数据同时提交到两个...
代码如下: ”javascript” name=”code”>function check(txt){ $j(“form”).submit(function(){ if($txt==”提交”){ this.action=”doAddMessage.action?button=提交”; this.submit(); }else{ this.action=”...
由于EasyUI自带的Form提交方式会自动去除掉readonly和disabled的值,或者多层form时,不能正确获取到form表单中的数据,由此,产生了这个专门针对EasyUI form的提交工具。
这里的`onsubmit`属性指定了一个JavaScript函数`stat()`,该函数的作用是验证表单数据的有效性,如果返回`true`则提交表单;反之,则不提交。 #### 方法三:结合`<input type="submit">`和JavaScript进行复杂验证 ...
通过以上步骤,我们成功地在一个form表单中实现了同时上传多个文件和文本信息的功能。这种实现方式不仅提高了用户的使用体验,也方便了开发者对上传数据的管理和处理。在实际应用中,还可以进一步扩展该功能,例如...
为了解决这个问题,开发者需要确保表单只提交一次,防止不必要的数据重复处理或者服务器的重复计算。下面详细解释几种防止Layui表单重复提交的方法。 首先,在HTML表单中,为了避免在提交时页面刷新导致的重复提交...
Java的Servlet API提供了一个`Part`接口,用于处理`multipart/form-data`类型的请求。以下是一个简单的Servlet示例: ```java @WebServlet("/uploadServlet") public class UploadServlet extends HttpServlet { ...
在探讨“让submit只提交一次”的技术实现时,我们深入剖析了如何在Web表单提交过程中避免重复提交的问题,这是一个在Web开发中常见的需求,尤其是在处理敏感操作或交易时尤为重要。下面,我们将从多个角度详细解析这...
在JavaServer Pages (JSP) 技术中,创建一个包含多个提交按钮的页面是常见的需求,每个按钮可能对应不同的处理逻辑,比如提交到不同的后端Servlet或执行不同的操作。本示例着重讲解如何在JSP页面中实现多个提交按钮...
在本文中,我们将深入探讨一个可能导致`form.submit()`无法提交表单的错误原因,以及如何解决这个问题。 首先,我们要理解`form.submit()`这个JavaScript方法。它是HTML表单对象的一个方法,用于触发表单的提交动作...
在这个例子中,`data-submit-group="true"` 是一个自定义属性,用于标记需要同时提交的表单。 ### 下拉框可编辑功能 除了多表单提交之外,文件还提到了使用JavaScript来增强下拉框的可编辑性。这通常是指在用户...
接下来,`jquery-form.js` 是一个jQuery插件,它扩展了jQuery的功能,允许我们通过Ajax方式提交HTML表单,包括文件上传。这个插件处理了与文件上传相关的复杂性,如处理多部分/混合内容类型,使得在不离开当前页面的...
"form-request-submit-polyfill-main"是一个专门针对表单提交事件的polyfill,它旨在为不支持新特性的浏览器提供一个标准化的接口。本文将深入剖析其源码,揭示其内部工作原理。 1. **表单提交事件的标准化** 在...
这个文件可能定义了一个函数,接受一个JSON对象作为参数,然后返回一个适合表单提交的字符串。你可以直接在你的项目中引入这个文件,调用该函数来完成JSON到表单数据的转换。 4. **优化与注意事项** - JSON对象中...