Struts2第十三篇【防止表单重复提交】

回顾防止表单重复提交

当我们学习Session的时候已经通过Session来编写了一个防止表单重复提交的小程序了,我们来回顾一下我们当时是怎么做的:

  • 在Servlet上生成独一无二的token,保存在Session域中,并交给JSP页面
  • JSP页面在提交表单数据的时候,把token放在隐藏域中…一起带过去给Servlet
  • Servlet判断用户有没有带token值过来,判断token的值是否和Session的相匹配
  • 如果用户是第一次提交的话,那么就允许用户的请求,接着就把保存在Session中的token值去除
  • 等用户想要再次提交的时候,Servlet发现Session中并没有token了,所以不搭理用户的请求

我们以前写表达重复提交就花了这么几个步骤…如果有兴趣的同学可以看一下以前的实现思路:http://blog.youkuaiyun.com/hon_3y/article/details/54799494#t11


Struts2防止表单重复提交

Struts2是简化我们的开发的,表单重复提交也是一件非常常用的功能…Struts2也为我们实现了…当然啦,也是通过拦截器来实现

   <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>

它的实现原理和我们以前写的思路几乎一致…它不需要另外写一个组件来生成token值,struts2标签就有这么一个功能…因此是十分方便的

这里写图片描述

为了熟悉一下Struts2,我们也使用Struts2来编写一下上图的程序…

编写DAO


package zhongfucheng.dao;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import zhongfucheng.entity.User;
import zhongfucheng.utils.Utils2DB;

import java.sql.SQLException;
import java.util.List;

/**
 * Created by ozc on 2017/5/3.
 */
public class UserDao {

    public void add(User user) {
        try {

            String sql = "INSERT INTO user(id,username,cellphone,password,address) VALUES (?,?,?,?,?)";
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

            queryRunner.update(sql, new Object[]{user.getId(), user.getUsername(), user.getCellphone(), user.getPassword(),user.getAddress()});

        } catch (SQLException e) {
            new RuntimeException("登陆失败了!");
        }
    }

    public User findUser(String id) {
        try {
            String sql = "SELECT * FROM user WHERE id=?";
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

            return (User) queryRunner.query(sql, new BeanHandler(User.class), new Object[]{id});

        } catch (SQLException e) {
            new RuntimeException("登陆失败了!");
        }
        return null;
    }

    public List<User> getAll() {

        try {
            String sql = "SELECT * FROM user";
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
            return (List<User>) queryRunner.query(sql, new BeanListHandler(User.class));
        } catch (SQLException e) {
            new RuntimeException("登陆失败了!");
        }
        return null;
    }
    public void  updateUser(User user) {

        try {
            String sql = "UPDATE user SET username=?,password=?,cellphone=? WHERE id=?";
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

            queryRunner.update(sql, new Object[]{user.getUsername(), user.getPassword(), user.getCellphone(), user.getId()});
        } catch (SQLException e) {
            new RuntimeException("登陆失败了!");
        }
    }

}

编写service


package zhongfucheng.service;

import zhongfucheng.dao.UserDao;
import zhongfucheng.entity.User;
import zhongfucheng.utils.WebUtils;

import java.util.List;

/**
 * Created by ozc on 2017/5/3.
 */
public class Service {

    UserDao userDao = new UserDao();

    public void add(User user) {


        //手动设置id,因为在数据库表我没使用自动增长id
        user.setId(WebUtils.makeId());

        //这是以前的表,规定要address,只能手动设置了
        user.setAddress("广州");
        userDao.add(user);

    }

    public User findUser(String id) {

        return userDao.findUser(id);

    }

    public List<User> getAll() {

        return userDao.getAll();

    }
    public void  updateUser(User user) {


        userDao.updateUser(user);

    }
}

开发步骤

  • 编写添加用户JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>

<form action="${pageContext.request.contextPath}/user_register" method="post">
    <table border="1">

        <tr>
            <td>用户名:<input type="text" name="username"></td>
        </tr>
        <tr>
            <td> 密码:<input type="password" name="password"></td>
        </tr>
        <tr>
            <td>电话:<input type="text" name="cellphone"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>


</body>
</html>
  • 使用了模型驱动封装数据,添加用户


    //这里一定要实例化
    User user = new User();

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public User getModel() {
        return user;
    }


    /*******调用service********/
    Service service = new Service();

    public String register() throws Exception {

        service.add(user);


        //注册成功,就跳转到list()方法,list方法就跳转到查看所有用户页面了!
        return list();
    }
  • 列出全部的用户数据,提供修改功能,需要把id传递过去,明确修改的是哪一个用户

<%--
  Created by IntelliJ IDEA.
  User: ozc
  Date: 2017/5/2
  Time: 18:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>列出下载页面</title>
</head>
<body>
<table border="1" align="center">
    <tr>
        <td>用户id</td>
        <td>用户姓名</td>
        <td>用户密码</td>
        <td>用户电话</td>
        <td>操作</td>
    </tr>

    <s:if test="#request.users!=null">
        <c:forEach items="${users}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.password}</td>
                <td>${user.cellphone}</td>
                <td><a href="${pageContext.request.contextPath}/user_updatePage?id=${user.id}">修改</a></td>
            </tr>
        </c:forEach>
    </s:if>
</table>


</body>
</html>
  • Action得到web带过来的id,找到对象,添加到值栈中(数据回显)

    public String updatePage() throws Exception {

        //得到用户带过来的id,根据id查找对象
       User user222 = service.findUser(user.getId());

        ActionContext.getContext().getValueStack().push(user222);

        return "updatePage";
    }
  • 修改用户的JSP页面,使用Struts2提供的回显技术,并把id通过隐藏域带过去给Action..最终是通过id来修改用户的数据

<form action="${pageContext.request.contextPath}/user_update">
    <table border="1">

        <tr>
            <td>用户名<s:textfield name="username"/></td>
        </tr>
        <tr>
            <td>密码 <s:textfield name="password" /></td>
        </tr>
        <tr>
            <td>电话<s:textfield name="cellphone"/></td>
        </tr>
        <s:hidden name="id"/>

        <tr>
            <td><input type="submit" value="修改"></td>
        </tr>
    </table>
</form>

效果

这里写图片描述


防止表单重复提交

上面我们已经完成了大部分的功能了,但当我们如果提交之后,再刷新页面,那么表单的数据就会重复提交…我们使用Struts2我们提供的防止表单重复提交的功能把!

这里写图片描述

在需要提交的表单上使用token标签


<table border="1">
        <s:token></s:token>
        <tr>
            <td>用户名:<input type="text" name="username"></td>
        </tr>
        <tr>
            <td> 密码:<input type="password" name="password"></td>
        </tr>
        <tr>
            <td>电话:<input type="text" name="cellphone"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>

在struts配置文件中配置拦截器

token拦截器默认是不会启动的,也就是说:需要我们手动配置…

当我们配置拦截器的时候,Struts2默认的拦截器是不会执行的,所以要把Struts2默认的拦截器也写上


<?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>
    <constant name="struts.ui.theme" value="simple"/>
    <package name="xxx" extends="struts-default">



        <action name="user_*" class="zhongfucheng.action.UserAction" method="{1}">

            <interceptor-ref name="defaultStack"/>

            <interceptor-ref name="token">
                <!-- 要拦截的方法! -->
                <param name="includeMethods">register</param>
            </interceptor-ref>

            <!--如果是list,那么就跳转到list的JSP页面-->
            <result name="list"> /list.jsp</result>

            <!--请求跳转到修改页面-->
            <result name="updatePage">/update.jsp</result>

            <!--如果校验成功,跳转到login.jsp页面回显-->
            <result name="success">/login.jsp</result>

            <result name="redirectList" type="redirect">/user_list</result>
        </action>
    </package>

    <include file="config.xml"/>

</struts>
  • 当我们重复提交的时候,它会报错,因此,如果它报错了,我们就跳转到register页面把

这里写图片描述

测试

这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
防止用户刷新,重复提交数据 源码,下载下来直接可以用(防止用户刷新,重复提交数据) 有十分清晰的操作步骤,和注释,代码也封装的很好,我经常用 立即下载

相关推荐

华北理工大学以升实验班蓝桥杯选拔赛题解

文章目录华北理工大学以升实验班蓝桥杯选拔赛题解A:期末考试题目描述题目讲解代码B:月份题目描述题目讲解代码C:打饭题目描述题目讲解代码D : 正弦波信号题目描述题目讲解代码E : 亲爱的长方形题目描述题目讲解代码F:挖金子题目描述题目讲解代码G : 金金的游戏题目描述题目讲解代码H : 区间和题目描述题目讲解代码详细视频讲解请关注华北理工大学b站账号。 华北理工大学以升实验班蓝桥杯选拔赛题解 A:期末考试 题目描述 Description 期末考试过去许多天了,如今成绩都出来了,那么现在让我们对成绩我分个类

Qq1739206233的博客 1131

Struts2防止表单重复提交

一 、什么是表单的重复提交 > 在不刷新表单页面的前提下: >> 多次点击提交按钮 >> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮". >> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)" > ...

weixin_30791095的博客 146

从S参数矩阵到硬件实现:手把手教你用耦合微带线设计Marchand巴伦

本文详细介绍了使用耦合微带线设计Marchand巴伦的完整流程。从奇偶模理论和S参数矩阵分析入手,结合ADS仿真软件进行参数优化与电磁仿真验证,最终指导PCB布局、制作与实测调试。文章以2.4GHz Wi-Fi前端电路为例,手把手演示了从理论计算到硬件实现的全过程,并分享了关键的工程经验与调试技巧。

weixin_29271263的博客 537

struts2学习笔记(十四)防重复提交

当某些特定的场景下,如网络延迟时,用户可能会重复提交信息,需要用一种机制来防止这种情况. struts2防重复提交是基于拦截器的. 1.模拟重复提交场景 1)jsp文件 2)struts.xml配置 /regSuc.jsp 3)Action类 public class StudentAction extends ActionSu

naruto_Mr的专栏 557

转录组PCA分析3大常见误区:数据标准化、离群样本与批次效应处理

本文深入探讨转录组PCA分析中的三大常见误区:数据标准化、离群样本识别与批次效应处理。通过实战案例和R代码演示,揭示如何优化PCA结果以提升生物学解释力,特别关注数据标准化策略的选择和批次校正方法的应用,帮助研究者避免常见陷阱并获得可靠的转录组分析结果。

weixin_28362173的博客 374

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026 (以YOLO26最新目标检测模型为基础,利用C2PSA_FSD创新模块进行改进)

2502_91881744的博客 316

springboot 项目里面 防止重复提交拦截器,就是防止一直请求一个url

java

一天不写代码难受的博客 613

DO-297标准详解:IMA系统开发与认证指南

DO-297的前言部分为读者提供了本指南的概述,说明了该标准的编写背景、主要目标、目标受众以及该文件在开发和认证集成模块化航空电子(IMA,Integrated Modular Avionics)系统中的作用。作为现代航空电子架构的重要组成部分,IMA系统大幅度简化了航空电子系统的硬件配置,增加了灵活性并降低了成本。因此,DO-297成为确保IMA系统开发、集成和认证符合适航标准的核心文件。在现代航空领域,系统复杂性逐渐增加,传统上各子系统独立运行的方式已经不适应多任务、多功能的需求。

qq_41854911的博客 1587

Struts2中防止表单重复提交的两种方式

防止表单重复提交,这是个很重要的知识点,而且很有用。当用户提交了一个表单,此时,地址栏显示的是处理这个表单的Action的地址,若此时刷新,则会重新发送一次表单数据,即又进行了一次提交,若这个Action是用来处理用户注册的,那么重复提交会再一次向数据库中插入之前已经插入的数据,这显然不是我们想要的。有两种方法,可以防止表单重复提交,一种是用Action的重定向,一种是用Session Token

成长的足迹 9082

SAP_MM模块通过CC11 创建物料版本

通过本文,我们了解了 SAP 的[SAP_MM模块通过CC11 创建物料版本]的基本概念和应用方法。当物料主数据、BOM(物料清单)、工艺路线等对象需要进行变更控制时,通过创建“版本”或“更改单”来记录、控制和追溯变更。创建完变更主记录(Change Number)后,可在物料主数据维护时引用它,从而创建物料版本化信息。,在其中可以定义物料、BOM、工艺路线等对象的变更版本信息,从而在系统中实现版本化的物料管理。

我小时候很黑的博客 816

26版SPSS操作教程(高级教程第二十一章)

#专注方能成事 #本期内容:信度分析 #由于导师最近布置了学习SPSS这款软件的任务,因此想来平台和大家一起交流下学习经验,这期推送内容接上一次高级教程第二十章的学习笔记,希望能得到一些指正和帮助~

你好! 1713

struts2 防止重复提交的解决方案

首先说说重复提交是怎么产生的,一般情况下有两种方式:1,页面提交后再次刷新页面。2,在提交的时候多次点击提交按钮。strut1.x中解决防止提交1的方法是通过重定向解决,但是方式2在网速很慢或者是用户快速的点击提交按钮时,还是能够重复提交数据。struts2中为方式2提供了解决方案(方式1用重定向是也可以防止用户刷新页面而引起的重复提交),struts2通过使用令牌(token)解

JSPGB2312的专栏 1957

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

weixin_42412049的博客 2279

生产级 RAG Agent 实战:从切块、多路召回到 Agent 编排的完整攻略

检索增强生成(RAG)与智能体(Agent)结合,正在成为企业知识库问答、智能客服与文档分析的核心技术范式。其底层逻辑并不复杂:通过向量化与关键词索引将文档拆解为可检索单元,借助混合检索与重排模型精确定位高相关片段,再由大模型基于可靠上下文生成答案。然而,从演示原型走向生产环境,真正的挑战往往在于数据切分、多路召回、rerank 策略以及 Agent 编排的系统性设计。例如,如何合理设置 chunk 大小以避免语义割裂?如何融合向量检索与 BM25 提升召回率?Rerank 应在哪一环节介入以平衡精度与延迟

weixin_34375251的博客 348

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

form表单防止重复提交的N种方法

Form表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: (1)点击提交按钮两次。 (2)点击刷新按钮。 (3)使用浏览器后退按钮重复之前的操作,导致重复提交表单。 (4)使用浏览器历史记录重复提交表单。 (5)浏览器重复的HTTP请求。 (6)用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数...

qq_31459039的博客 6111

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Struts2学习笔记(十八) 防止表单重复提交

概述 有些时候,我们在想某个网页提交了信息之后,由于某些原因,我们会重复点击提交,或者刷新页面,或者是在提交页面呈现之后点击后退按钮,从而导致这些表单数据被重复提交。在大多数情况下我们是不希望这种情况发生的,我们不可能强迫使用者不这么做,那么我们就只能自己想办法来尽量避免这些情况了。 下面我们来看一个例子: public class HelloServlet extends HttpSe

心静欣 6171

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

struts2 token拦截器防止表单重复提交

>======================================================< 0.struts2的token是什么? struts2的token是用来防止表达的重复提交而定制的拦截器,token只是这个拦截器的别名而已 token有很多种意思如记号,符号等都可称为token。 防止表单重复提交的实现是通过在表单中添加一个隐藏域然后在这个隐藏域中保存一个记号,这个

zyb243380456的专栏 5645

Struts2防止form表单重复提交

问题?Struts2防止form表单重复提交 原理: 1.struts2环境 2.拦截器: 在struts-default.xml可以找到这两个拦截器 返回结果invalid.token --> /message.jsp           案例: jsp页面: str

Mr_li13的博客 983

struts2之防止表单重复提交

struts.xml配置文件 &lt;? xml version = " 1.0 " encoding = " UTF-8

dearbaba_8520的博客 313

Struts2中使用<s:token>防止表单重复提交

一、造成表单重复提交的原因 1.服务器处理时间过长,当再次点击提交时,导致服务器接收到两条或者多条相同信息; 2.forward跳转引起重复提交,页面跳转主要有两种情况:一是,请求转发,主要指服务端进行跳转,浏览器地址不会发生改变;二是,重定向,在客户端进行跳转,浏览器中地址发生改变。 二、使用token令牌拦截防止表单重复提交 1.token工作原理: 1)用户首次访问包含表单的页

态度决定思路,思路决定出路!!! 2154

使用Struts2的token机制和Cookie来防止表单重复提交

Struts2的token机制防止表单重复提交: 首先需要在提交的jsp页面(要使用token机制,必须使用struts2提供的标签库)加上    这段代码,然后在struts.xml里面需要进行如下配置: class="com.xiaoluo.struts2.TokenAction"> /tokenSuccess.jsp

LeefengBoy的博客 1130

SSH笔记-Struts2的防止表单重复提交

1、表单重复提交定义: (1)在不刷新表单页面的前提下: I、多次点击提交按钮 II、已经提交成功, 按 “回退” 之后, 再点击 “提交按钮” III、在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 “刷新(F5)” (2)解决表单重复提交步骤: I、刷新表单页面, 再提交表单不算重复提交 II、若使用的是 redirect响应类型, 已经...

oyy的博客 1171
上一篇: Struts2第十二篇【模型驱动】
下一篇: Intellij idea使用Junit
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值