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

【信息科学与工程学】计算机科学与自动化——第一百六十八篇 软件设计方法/模式06 编号软件类型设计方法/模式所属层解决的核心问题典型实现适用场景优点风险/注意2701数据治理主数据管理 (Master Data Management, MDM)数据治理层统一管理企业核心业务实体的单一可信版本实践:建立MDM平台,整合来自多个系统的客户、产品、供应商等主数据,通过匹配、合并、去重生成黄金记录。大型企业多系统环境。① 数据一致性;② 提升业务效率;③ 支撑分析。① 实施周期长;② 组织协调难;③ 数据质量要求高。2702数据治理主数据治理委员会 (MDM Governance Board)数 阅读详情

概述

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

下面我们来看一个例子:

public class HelloServlet extends HttpServlet {
	private int i = 0;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String userName = req.getParameter("name");
		String password = req.getParameter("password");
		int count = 0;
		for (int i = 0; i < 1000; i++) {
			count++;
		}

		resp.getWriter().println(
				i + ": hello" + userName + " your password is " + password);
		i++;
	}
}

input.jsp

<body>

    <form action="Hello"method="post">

    <input type="text"name="name"><br>

    <input type="text"name="password"><br>

    <input type="submit"value="submit">

    </form>

  </body>

测试(提交后刷新页面):

我们看到,在提交之后,刷新页面,同样会触发服务端的操作!

防止重复提交

对于防止表单重复提交,网上的朋友想出了很多方案。比如有用javascript来实现检测的,有通过提交后进行页面跳转来防止重复提交的,也有利用cookie来检测是否重复提交的。也有人利用session来判断是否重复提交的。当然,这些方法都有他们的用处,我个人觉得利用session来防止重复提交是最佳的方案。javascript防止不了页面刷新,重定向防止不了页面后退。对于cookie和session,由于session保存在服务端,所以要安全一点。(当然大多时候session也是基于cookie的)。Struts2中提供了一个专门的token标签来实现防止表单重复提交。基本原理就是我们在表单输入页面呈现之前生成一个独一无二的标记,将它放到表单页面(一般放在hidden表单中),并且同时将这个标记保存到session中。那么当页面提交时,我们首先检查请求参数中的标记与session中的标记是否相同,如果相同,将session中的标记删除,这次提交就是第一次提交。那么当表单重复提交时,由于session中的标记已经在第一次提交的时候被我们删掉了,因此在检测的时候就通不过,由此来判断表单为重复提交,再做出相应的处理。

jsp/servlet实现session方式防止重复提交

InputServlet.java

public class InputServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		String token = String.valueOf(System.currentTimeMillis());
		req.setAttribute("token",token);
		req.getSession().setAttribute("token",token);
		
		RequestDispatcher rd = req.getRequestDispatcher("/input.jsp");
		rd.forward(req,resp);
	}
}

HelloServlet.java

public class HelloServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		String reqToken = req.getParameter("token");
		String sessionToken = (String) req.getSession().getAttribute("token");

		if (reqToken == null || !reqToken.equals(sessionToken)) {

			resp.getWriter().println("repeat submit");
			return;
		}
		
		//删除session中的token
		req.getSession().removeAttribute("token");

		String userName = req.getParameter("name");
		String password = req.getParameter("password");
		int count = 0;
		for (int i = 0; i < 1000; i++) {
			count++;
		}

		resp.getWriter().println(
				": hello" + userName + " your password is " + password);
	}
}

input.jsp

<body>

       <form action="Hello"method="post">

           <input type="text" name="name">

           <br>

           <input type="text" name="password">

           <br>

           <input type="hidden" name="token"

              value=<%=request.getAttribute("token")%>/>

           <br />

           <input type="submit" value="submit">

       </form>

    </body>

测试(访问InputServlet):

这时我们查看页面源代码:

可以看到增加了一个hidden类型的token表单。

提交页面:


我们刷新页面:


Struts2实现防止表单重复提交

Struts2中的token标签可以用来生成一个唯一的标记,这个标记必须嵌套在form标签内使用,它将在表单里插入一个隐藏字段并把标记保存到Session中。这个token标签必须和token拦截器或者tokenSession拦截器配合使用,这两个拦截器的差别就是,使用token拦截器,如果发现表单重复提交,那么会返回”invalid.token”结果并且加上一条Action error,这个默认消息是:The form has already bean processed or no token was supplied,pleasetry agin.这个消息看起来可能会让用户觉得以为是让他们”try agin”,要想覆盖这个消息,那么可以新建一个TokenInterceptor.properties添加一个键为struts.messages.invalid.token的消息,这个文件必须放在/WEB_INF/classes/org/apache/struts2/interceptor下。这个操作起来很麻烦。一般情况下只要我们将用户重复提交的请求忽略掉就可以了,那么tokenSession拦截器正是我们想要的。

需要注意的是是这两个拦截器都没在defaultStack拦截器栈中,需要我们手动添加到Action的拦截器栈中。

tokenSession拦截器对应的实现类是org.apache.struts2.interceptor.TokenSessionStoreInterceptor,它是token拦截器的实现类org.apache.struts2.interceptor.TokenInterceptor的子类。我们查看他们的源代码:

protected String doIntercept(ActionInvocation invocation) throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Intercepting invocation to check for valid transaction token.");
        }

        //see WW-2902: we need to use the real HttpSession here, as opposed to the map
        //that wraps the session, because a new wrap is created on every request
        HttpSession session = ServletActionContext.getRequest().getSession(true);

        synchronized (session) {
            if (!TokenHelper.validToken()) {
                return handleInvalidToken(invocation);
            }
        }
        return handleValidToken(invocation);
}

TokenHelper类的validToken方法:

public static boolean validToken() {
        String tokenName = getTokenName();

        if (tokenName == null) {
            if (LOG.isDebugEnabled()) {
                LOG.debug("no token name found -> Invalid token ");
            }
            return false;
        }

        String token = getToken(tokenName);

        if (token == null) {
            if (LOG.isDebugEnabled()) {
                LOG.debug("no token found for token name "+tokenName+" -> Invalid token ");
            }
            return false;
        }

        Map session = ActionContext.getContext().getSession();
        String sessionToken = (String) session.get(tokenName);

        if (!token.equals(sessionToken)) {
            if (LOG.isWarnEnabled()) {
                LOG.warn(LocalizedTextUtil.findText(TokenHelper.class, "struts.internal.invalid.token", ActionContext.getContext().getLocale(), "Form token {0} does not match the session token {1}.", new Object[]{
                        token, sessionToken
                }));
            }

            return false;
        }

        // remove the token so it won't be used again
        session.remove(tokenName);

        return true;
    }

从中我们看以看出,处理的基本思想和我们前面使用jsp/servlet实现的差不多。只是token的生成转交的token标签来做,验证交给了拦截器来做。这整个过程都不许我们做任何操作.

下面动手做一个实例:

public class SubmitAction extends ActionSupport implements SessionAware {

	private String name;
	private String password;
	private Map<String, Object> session;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setSession(Map<String, Object> session) {
		this.session = session;
	}
	
	@Override
	public String execute() throws Exception {
		
		return SUCCESS;
	}

}

input.jsp

<formaction="submit.action"method="post">

      name : <input type="text" name="name"/><br/>

      password : <input type="text" name=password/><br>

      <s:token></s:token>

      <input type="submit"value="submit"/>

  </form>

struts.xml

<packagename="default"namespace="/"extends="struts-default">

       <action name="submit"class="action.SubmitAction">

           <result name="success">/success.jsp</result>

           <result name="input">/input.jsp</result>

          

           <interceptor-ref name="tokenSession"></interceptor-ref>

           <interceptor-ref name="defaultStack"></interceptor-ref>

       </action>

    </package>

success.jsp

<body>

    hello ${name } your password is ${password}

 </body>

测试:提交表单后多次刷新,页面没有看到的是同样的响应,就像提交了一次一样。实际上重复的提交未做处理。如果开启了dev模式,那么会从控制台从看到一些信息:

警告: Form token5XIHXGFEA4F15ZJKN07B88V9956ZAMPN does not match the session token null.

其实只要理解了这些原理,不管是用jsp/servlet亦或是php都能够实现出来!

 

Java教学资源管理系统:Spring Boot+MyBatis-Plus权限设计与文件上传下载实践 在Java后端开发中,权限控制与资源管理是两类高频需求。RBAC模型通过用户-角色-权限三层拆分,避免了散落的身份判断;结合Spring Boot与MyBatis-Plus,可以快速搭建稳定的文件上传、下载与检索接口。这类技术方案不仅适用于教学资源管理系统,也能迁移到文档库、内容平台等场景。文章从系统设计、数据表结构到拦截器鉴权与部署避坑,提供一套完整的工程落地路径,适合课程设计及内部系统开发者参考。 阅读详情

相关推荐

struts2利用token防止表单重复提交(源代码)

struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台输出效果

struts2 使用了token 再次提交 报空指针(初次提交没有问题)[ 寻求帮助 ]

错误信息 ?? 13, 2020 11:27:22 ?? com.opensymphony.xwork2.util.logging.jdk.JdkLogger warn ??: Form token 7D52ZAHT13615ZNRIJ1SYXHZARFXC0NG does not match the session token null. ?? 13, 2020 11:27:22 ?? com.opensymphony.xwork2.util.logging.jdk.JdkLogger error ??:

Java的一只小实习生的博客 417

Struts2防止重复提交解决方案

防止重复提交的总要解决方案 相信对struts的学者有帮助 大家看看

使用token拦截器(自定义拦截器的使用(不重要))

<br />    在页面的提交表单中加入<s:token/>标签,当请求该页面时,由服务器产生一个字符串,如:LO3ZSJ4MGAQH3VMFS425V62PK535THUI。可以通过查看ie源码查看生成的字符串。服务器产生这个字符串后将其放入到服务器的session里。同时客户端的字符串将随着提交,token拦截器在action执行之前会比较那个字符串与服务器session的字符串是否一致,比较一次后session中的字符串将会被删除。如果用户重复提交将不会通过。<br />Form token LO3

centre10的专栏 3717

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

这里是Struts2 中放置表单重复提交的例子。

在Proteus中用80C51模拟4线SPI点亮OLED屏幕

在Proteus里用80C51模拟4线SPI控制OLED屏幕使其显示图案(汇编实现)。

Connor3093的博客 5000

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

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

nwpu_geeker的博客 1252

【Pico手势开发实战】基于SteamVR串流与MRTK3的跨平台交互方案

本文详细介绍了在Pico设备上,结合SteamVR串流与微软MRTK3框架,实现高效跨平台手势交互开发的完整方案。该方案通过在PC端运行Unity项目并串流至头显,利用MRTK3封装的手势识别与交互组件,大幅提升了开发调试效率与性能上限,并确保了未来向其他OpenXR设备的良好兼容性。

weixin_29001683的博客 216

处理struts2自带的错误提示

struts2-core.jar包中的 struts-messages.properties文件中有定义: struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again. 你可以在自己的项目根目录里建立一个message_zh_CN

chaoloveyou的专栏 648

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 460

开源网格生成利器Gmsh:从入门到二次开发实战指南

本文详细介绍了开源网格生成工具Gmsh,从基础概念、安装配置到核心功能实战,提供了全面的入门指南。重点阐述了其强大的二次开发能力,通过Python API实现参数化建模、边界层网格生成以及与FEniCS、OpenFOAM等求解器的集成,为有限元分析和计算流体力学仿真提供灵活高效的自动化网格划分解决方案。

weixin_29066781的博客 434

Java进阶学习第十八天(Struts框架:数据校验、UI标签、数据回显、模型驱动、防止表单重复提交)

一、Struts数据效验 表单数据的验证: 前台验证:主要是通过JS验证, 表达数据是否合法! 后台验证:通过后台java代码进行验证! Struts也提供了数据效验的方式! Struts数据效验, 通过拦截器完成: 代码方式验证Action中所有的方法: 步骤: 1. 搭建struts环境 2. login.jsp 3.UserAction.java Struts数据效验错误信息处理: pub...

_Gerald的博客 377

07- Rossmann商店销售预测 (Xgboost集成算法) (项目七)

Rossmann在欧洲国家经营着3000多家日化用品超市。目前,Rossmann商店经理的任务是提前6周预测他们的日销售额。商店的销售受到许多因素的影响,包括促销、竞争、学校和国家假日、季节性和地域性。由于数以千计的管理者根据自己的特殊情况预测销售,结果的准确性可能会有很大的差异。 因此使用机器学习算法对销量进行预测,Rossmann要求预测德国1115家商店的6周日销售额。可靠的销售预测使商店经理能够制定有效的员工时间表,提高生产力和积极性。

March_A的博客 2460

java filter 是否能拦截到form表单的所有数据_java 知识点总结(框架篇)

目录基础篇​zhuanlan.zhihu.com框架篇 一、 Struts1的运行原理 二、 Struts2的运行原理 三、 struts2的体系结构 四、 Spring MVC运行原理 五、 Struts1.x与Struts2.x的区别 六、 Spring MVC、struts1和struts2区别 七、 Struts2中result中的type类型 八、 Struts2标签 九、 SSI整合 ...

weixin_39755873的博客 623

滤波算法实现大全——基于匀速直线运动模型的kalman滤波算法

滤波算法实现大全——基于匀速直线运动模型的kalman滤波算法

jane0819的博客 521

修改legged_gym地形后仍然是平地,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1563

java面试问题总结

目录 基础篇 4 一、JDK常用的包 4 二、 Get和Post的区别 4 三、 Java多态的具体体现 4 四、 StringBuffer StringBuilder String 区别 5 五、 Hashtable与HashMap的区别 5 六、 九大隐式对象 5 七、 Forword(请求转发)与Redirect(重定向) 6 八、JQurey总结 6 九、 XML和Js...

qq_36863199的博客 2440

YOLO11涨点优化:Loss魔改 | WIoU (Wise-IoU) v3版本全面替换,基于动态非单调聚焦机制,让模型更聪明地学习

YOLOv11目标检测中的WIoU v3损失函数改进 本文探讨了YOLOv11目标检测模型中CIoU损失函数的局限性,并提出了WIoU v3改进方案。关键发现包括: CIoU的缺陷:在低质量样本(小目标/遮挡目标)上过度惩罚,导致模型优化方向偏离,小目标AP往往比大目标低30%左右。 WIoU v3的创新: 动态非单调聚焦机制:根据样本"离群度"智能分配梯度 让模型重点优化中等质量样本,减少对低质量样本的无效关注 采用指数移动平均来自适应调整质量评判标准 实际效果:WIoU v3在保持大

2601_95807009的博客 421

Java基础知识点总结(面试版)

  目录 基础篇 4 一、JDK常用的包 4 二、 Get和Post的区别 4 三、 Java多态的具体体现 4 四、 StringBuffer StringBuilder String 区别 5 五、 Hashtable与HashMap的区别 5 六、 九大隐式对象 5 七、 Forword(请求转发)与Redirect(重定向) 6 八、JQurey总结 6 九、 XML...

小小木子渐成长 1967

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java面试整理 -码之狼

_面试概念整理以及项目逻辑分享 注意:( 所有的概念都是结合所学知识去记忆,死记硬背并不会有太好的记忆并且难以结合到自己的项目中去) 一、JDK常用的包 二、 Get和Post的区别 三、 Java多态的具体体现 四、 StringBuffer StringBuilder String 区别 五、 Hashtable与HashMap的区别 六、 九大隐式对象 七、 Forword(请求转发)与Re...

JingTao_Wu的博客 1069

深度学习工具包 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")

java统一复习

5目录 目录 1 基础篇 4 一、JDK常用的包 4 二、 Get和Post的区别 4 十一、 Page和PageContext的区别 7 十二、 Ajax总结三、 Java多态的具体体现 4 四、 StringBuffer StringBuilder String 区别 5 五、 Hashtable与HashMap的区别 5 六、 九大隐式对象 6 七、 Forword(请求转发)与Redirect(重定向) 6 八、JQurey总结 6 九、 XML和Json的特点 6 .

weixin_48364455的博客 3679

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

参考

目录 目录 1 基础篇 4 一、JDK常用的包 4 二、 Get和Post的区别 4 三、 Java多态的具体体现 4 四、 StringBuffer StringBuilder String 区别 5 五、 Hashtable与HashMap的区别 5 六、 九大隐式对象 5 七、 Forword(请求转发)与Redirect(重定向) 6 八、JQurey总结 6 九、 XML和Json的特点...

aiqutianli的博客 690

Spring MVC深入分析-优快云博客

为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平。你的一个决定会影响团队未来的几年。要考虑方面太多:1、简单易用,以提高开发效率。使小部分的精力在框架上,大部分的精力放在业务上。2、性能优秀,这是一个最能吸引眼球的话题。3、尽量使用大众的框架(避免使用小众的、私有的框架),新招聘来的开发人员有一些这方面技术积累,减低人员流动再适应的影响。如果你还在为这件事件发愁,本文最适合你了。选择Spring MVC吧。

求知若渴、虚心若愚 341
上一篇: Struts2学习笔记(十八) 防止表单重复提交
下一篇: Struts2学习笔记(十九) 验证码
jdluojing
博客等级 码龄17年 79粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值