• struts2学习(15)struts2防重复提交


    一、重复提交的例子:                          

    模拟一种情况,存在延时啊,系统比较繁忙啊啥的。
    模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况;
    这样会造成重复提交;
     
    com.cy.action.StudentAction.java:
    package com.cy.action;
    
    import java.io.File;
    
    import org.apache.commons.io.FileUtils;
    
    import com.cy.model.Student;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class StudentAction extends ActionSupport{
        private static final long serialVersionUID = 1L;
        
        private Student student;
        
        public Student getStudent() {
            return student;
        }
    
        public void setStudent(Student student) {
            this.student = student;
        }
    
        public String add() throws Exception {
            System.out.println("开始添加学生:"+student);
            Thread.sleep(5000);
            System.out.println(student.getName()+"添加完成");
            return SUCCESS;
        }
    
    }

    struts.xml:

    <struts>
        
        <package name="manage" extends="struts-default">
            <action name="student" class="com.cy.action.StudentAction" method="add">
                <result name="success">/success.jsp</result>
            </action>
        </package>
        
    </struts>
    View Code

    student.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="student" method="post" >
        姓名:<input type="text" name="student.name"/><br/>
        年龄:<input type="text" name="student.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>
    View Code

    测试:

    二、使用<s:token/>标签防重复提交                                

     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="manage" extends="struts-default">
            <action name="student" class="com.cy.action.StudentAction" method="add">
                <result name="success">/success.jsp</result>
                <result name="invalid.token">/student.jsp</result>
                
                <interceptor-ref name="token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        </package>
        
    </struts>

    student.jsp修改为如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <!-- 重复提交的错误信息显示在这里 -->
    <s:actionerror/>
    
    <form action="student" method="post" >
        <!-- s:token的存在,让每次提交都有唯一的一个token令牌
             到了struts.xml中的<interceptor-ref name="token">token拦截器,就会识别
             比如说第一次提交的时候,肯定有一个标识记录在session里面,假如用户手贱又点了一次的话,
             form中token的值还是一样的,<interceptor-ref name="token">发现又来了这个玩意,肯定是重复提交。
             会返回一个<result name="invalid.token">,将错误信息返回到student.jsp里面。
         -->
        <s:token></s:token>
        姓名:<input type="text" name="student.name"/><br/>
        年龄:<input type="text" name="student.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>

    测试:

    填写姓名和年龄,点击两次提交,发现界面提示信息:

     而后台正常执行,只添加一条:

    上面有个不好的地方就是:将重复提交的错误信息,返回到界面了。
    但是有这种需求:将重复提交的忽略;无视重复提交的请求;

    三、使用tokenSession 拦截器防重复提交  -- 这种方式挺好的。                    

     

     com.cy.action.StudentAction.java:

    package com.cy.action;
    
    import com.cy.model.Student;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class StudentAction extends ActionSupport{
        private static final long serialVersionUID = 1L;
        
        private Student student;
        
        public Student getStudent() {
            return student;
        }
    
        public void setStudent(Student student) {
            this.student = student;
        }
    
        public String add() throws Exception {
            System.out.println("开始添加学生:"+student);
            Thread.sleep(5000);
            System.out.println(student.getName()+"添加完成");
            return SUCCESS;
        }
    
    }
    View Code

    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="manage" extends="struts-default">
            <action name="student" class="com.cy.action.StudentAction" method="add">
                <result name="success">/success.jsp</result>
                
                <!-- <result name="invalid.token">/student.jsp</result>
                <interceptor-ref name="token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref> -->
                
                <interceptor-ref name="tokenSession"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        </package>
        
    </struts>

    student.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="student" method="post" >
        <s:token></s:token>
        姓名:<input type="text" name="student.name"/><br/>
        年龄:<input type="text" name="student.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>

    测试:

    前台显示添加成功:

    查看后台:

     

  • 相关阅读:
    Go基础数据类型
    在foreach中使用distinct查找不重复记录
    DataTable,List去重复记录的方法(转载)
    ArcEngine的IMap接口(转载)
    根据Excel表格建立Shp文件(开发详解及源代码)(转载)
    axmapcontrol和mapcontrol有什么区别呢(转发)
    DataSet多表查询操作(转载)
    c#调用DLL(转载)
    wall 系列技术贴
    ArcEngine的IFeaturLayer接口(转载)
  • 原文地址:https://www.cnblogs.com/tenWood/p/7105750.html
Copyright © 2020-2023  润新知