`
hrbjie
  • 浏览: 27260 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2中处理同一个表单的多个提交按钮

 
阅读更多
在很多Web应用中,为了完成不同的工作,一个HTML form标签中可能有两个或多个submit按钮,如下面的代码所示:
<!--[if !supportLineBreakNewLine]-->
<html action="" method="post">

<input type="submit" value="保存" />
<input type="submit" value="打印" />
</html>


由于在<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)


<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>My JSP 'hello.jsp' starting page</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 String msg;
    private javax.servlet.http.HttpServletRequest request;
    // 获得HttpServletRequest对象
    public void setServletRequest(HttpServletRequest request)
    {
        this.request = request;
    }
    // 处理save submit按钮的动作
    public String save() throws Exception
    {
        request.setAttribute("result", "成功保存[" + msg + "]");
        return "save";
    }

    // 处理print submit按钮的动作
    public String print() throws Exception
    {
        request.setAttribute("result", "成功打印[" + msg + "]");
        return "print";
    }
    public String getMsg()
    {
        return msg;
    }

    public void setMsg(String msg)
    {
        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的代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.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)


<%@ page pageEncoding="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
分享到:
评论

相关推荐

    Struts2解决表单重复提交

    Struts2作为一个流行的Java Web框架,为解决表单重复提交提供了多种方法。 首先,关于表单重复提交的原因,有以下几点: 1. 服务器或网络延迟导致用户多次点击提交按钮。 2. 用户在表单提交后刷新浏览器页面。 ...

    struts1.2 from表单提交包含list的对象

    对于包含列表的表单,用户可能需要在页面上输入多条数据,如一个订单中包含多个商品。每个商品项可能都有自己的属性,如商品ID、名称、数量等。在HTML表单中,这些数据可以通过数组或列表的格式来表示,比如`[0].id...

    struts2 防止表单重复提交的例子

    1. **表单重复提交问题**:当用户在提交表单时,由于网络延迟或用户误操作,可能会导致同一个表单被多次提交。例如,在购物网站上,用户可能因点击按钮太快而无意中购买了多份商品。 2. **Struts2框架**:Struts2是...

    Struts2教程:处理一个form多个submit.doc

    在处理一个表单(form)中存在多个submit按钮的情况时,Struts2提供了一种优雅的方式来区分用户点击了哪个按钮,而无需像Struts1那样使用额外的动作类(如LookupDispatchAction或EventDispatchAction)。 在传统的...

    Struts2文件上传下载和表单重复提交问题

    综上所述,Struts2文件上传下载和表单重复提交涉及多个技术点,包括Struts2的配置、文件操作、HTTP响应头设置、安全性和异常处理。理解并熟练掌握这些知识点,对于构建健壮的Web应用程序至关重要。

    struts2中一个表单中提交多个请求的例子(多个提交按钮)

    在Struts2框架中,处理一个表单中的多个提交按钮是一项常见的需求。通常,一个HTML `&lt;form&gt;` 标签会包含多个 `&lt;input type="submit"&gt;` 按钮,每个按钮对应不同的操作。Struts2 提供了一种机制,允许在同一个Action类...

    struts2防止表单重复提交--重定向

    在Web开发中,表单重复提交是一个常见的问题,可能导致数据不一致或处理逻辑的混乱。Struts2提供了多种方法来防止这种情况,其中一种是通过重定向来实现。下面将详细解释Struts2如何通过重定向来防止表单重复提交。 ...

    Struts2防止重复提交解决方案

    在Struts2中,防止重复提交是一个重要的问题,因为它可能导致数据不一致性和服务器资源的浪费。本文将详细介绍如何在Struts2中解决这个问题,以及相关的技术概念。 首先,我们要理解Struts2中的拦截器(Interceptor...

    Struts之Token解决表单那重复提交

    在处理用户交互时,尤其是表单提交,一个常见的问题是防止表单的重复提交。这可能导致数据的不一致性和其他问题。本文将深入探讨如何在Struts框架中利用Token机制来解决这个问题。 一、表单重复提交问题 表单重复...

    关于struts表单验证

    在Struts框架中,表单验证是一个关键环节,确保从用户端接收到的数据准确无误,符合应用的要求。本文将详细讲解Struts中的表单验证机制,包括ActionForm Bean的使用、validate()方法和reset()方法,以及如何处理验证...

    Struts2_表单标签简介 示例

    Struts2框架为了简化表单的处理,提供了一系列丰富的表单标签,这些标签不仅包含了常见的HTML表单元素,还额外提供了许多高级特性。本文将详细介绍Struts2中的表单标签及其使用方法。 #### 二、Struts2表单标签概述...

    Struts表单重复提交问题

    在处理用户表单提交时,Struts框架可能会遇到一个常见的问题,即表单重复提交。这种情况通常发生在用户点击提交按钮后,由于网络延迟或其他原因导致请求被多次发送,从而可能对服务器端造成多次数据插入或更新,导致...

    Struts2.0深入学习 命名空间,模型驱动,表单重复提交

    本篇文章将深入探讨Struts2中的三个关键概念:命名空间、模型驱动以及表单重复提交的处理,这些都是在实际开发中必不可少的知识点。 **命名空间(Namespace)** 命名空间在Struts2中扮演着路由和隔离的作用。它可以...

    struts2简单例子

    包含在`struts2-tags`中的文件可能是一个示例,展示了如何在JSP页面中使用Struts2标签。这些标签简化了页面逻辑,如表单处理、显示数据、验证等。例如: - `&lt;s:form&gt;`:创建一个表单,可以与Action中的方法关联。 ...

    用Struts实现动态单选按钮

    在Web应用中,动态单选按钮通常用于让用户在多个预定义的选项中选择一个。下面我们将深入探讨如何通过Struts框架实现这一功能。 首先,我们需要在Struts配置文件(struts-config.xml)中定义ActionMapping,这个...

    struts token机制解决表单重复提交

    Struts Token机制是一种防止表单重复提交的有效策略,尤其在处理关键操作时,如金融交易或数据修改,防止用户意外或恶意多次点击提交按钮导致的数据重复性问题。下面将详细介绍Struts Token的工作原理、实现方式及其...

    struts2file2

    在Struts2中,文件上传通常依赖于`Commons FileUpload`库,这是一个Apache提供的用于处理HTTP请求中多部分/表单数据的组件。项目中会有一个专门的Action类处理文件上传请求,该Action类可能会包含一个`File`或`...

    Struts2框架及注释和用法

    视图通常由JSP页面构成,Struts2提供了标签库,如`s:property`显示属性值,`s:form`创建表单,`s:submit`定义提交按钮,简化了视图与模型之间的交互。 **8. 结果类型** Struts2支持多种结果类型,如dispatcher...

Global site tag (gtag.js) - Google Analytics