- 浏览: 48240 次
- 性别:
- 来自: 广州
文章分类
最新评论
对于JSP 入门的初级的学习者表单的提交是一个非常困扰的问题,那么如何避免Form 表单多次提交呢?可以从以下的几个方面入手:
一. 对于初学JSP 可以先通过Javascript 中设置
设置一个变量,只允许表单提交一次。
1. ﹤ script language = "javascript" ﹥
2. var checkSubmitFlg = false ;
3. function checkSubmit() {
4. if ( checkSubmitFlg == true) {
5. return false;
6. }
7. checkSubmitFlg = true ;
8. return true;
9. }
10. document.ondblclick = function docondblclick() {
11. window.event.returnValue = false ;
12. }
13. document.onclick = function doconclick() {
14. if (checkSubmitFlg) {
15. window.event.returnValue = false ;
16. }
17. }
18. ﹤ /script ﹥
19.
20. ﹤ html:form action = "myAction.do" method = "post" onsubmit = "return checkSubmit();" ﹥
二. 对于JSP 人门还要掌握Javascript 的另一设置
将表单提交按钮或者image 置为disable
21. ﹤ html:form action = "myAction.do" method = "post"
22. onsubmit = "getElById('submitInput').disabled = true; return true;" ﹥
23. ﹤ html:image styleId = "submitInput" src = "images/ok_b.gif" border = "0" / ﹥
24. ﹤ /html:form ﹥
三.
在JSP
入门阶段也要注意善于利用STRUTS
的同步令牌机制
利用同步令牌(Token
)机制来解决Web
应用中重复Form
表单提交的问题,Struts
也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
25. if (isTokenValid(request, true)) {
26. // your code here
27. return mapping.findForward("success");
28. } else {
29. saveToken(request);
30. return mapping.findForward("submitagain");
31. }
STRUTS 根据用户会话ID 和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor 类中的generateToken() 方法。
1. // 验证事务控制令牌, ﹤html:form ﹥会自动根据session 中标识生成一个隐含input 代表令牌,防止两次提交
2. 在action 中:
32. // ﹤ input type = "hidden" name = "org.apache.struts.taglib.html.TOKEN"
33. // value = "6aa35341f25184fd996c4c918255c3ae" ﹥
34. if (!isTokenValid(request))
35. errors.add(ActionErrors.GLOBAL_ERROR,
36. new ActionError("error.transaction.token"));
37. resetToken(request); // 删除 session 中的令牌
3. action 有这样的一个方法生成令牌
38. protected String generateToken(HttpServletRequest request) {
39. HttpSession session = request .getSession();
40. try {
41. byte id[] = session.getId().getBytes();
42. byte now[] =
43. new Long(System.currentTimeMillis()).toString().getBytes();
44. MessageDigest md = MessageDigest .getInstance("MD5");
45. md.update(id);
46. md.update(now);
47. return (toHex(md.digest()));
48. } catch (IllegalStateException e) {
49. return (null);
50. } catch (NoSuchAlgorithmException e) {
51. return (null);
52. }
53. }
在更新的时候防止表单按钮重复点击,主要是用Session
来做判断
四. 在JSP 入门时还要掌握页面方式
54. ﹤ input type = "hidden " name = " ﹤ % =com.lims.util.SynchroToken.TOKEN_NAME% ﹥ " value = " ﹤ %= com.lims.util.SynchroToken.getToken(request)% ﹥ " ﹥
55.
56. SynchroToken.java
57. package com.lims.util;
58. import org.apache.struts.util.*;
59. import javax.servlet.http.*;
60. import javax.servlet.jsp.*;
61. import org.apache.struts.action.*;
62. /**
63. * ﹤ p ﹥ Title: SynchroToken ﹤ /p ﹥
64. * ﹤ p ﹥ Description: ﹤ /p ﹥
65. * ﹤ p ﹥ Copyright: Copyright (c) 2004 ﹤ /p ﹥
66. * ﹤ p ﹥ Company: NetStar ﹤ /p ﹥
67. * @author Jstar
68. * @version 1.0
69. * Created in 2004/04/21
70. */
71. public class SynchroToken{
72. public final static java.lang.String TOKEN_NAME = "_token" ;
73. public static boolean checkToken (HttpServletRequest request){
74. boolean isEqual = false ;
75. HttpSession session = request .getSession ();
76. String formToken = request .getParameter (TOKEN_NAME);
77. String sessionToken = (String)session.getAttribute (TOKEN_NAME);
78. System.out.println ("formToken: " + formToken + " sessionToken: " +
79. sessionToken);
80. if (formToken != null && sessionToken == null){
81. session.setAttribute (TOKEN_NAME, formToken);
82. isEqual = true ;
83. }
84. return isEqual;
85. }
86. /**
87. * Insert the method's description here.
88. * Creation date: (4/19/2004 3:23:25 PM)
89. * @return java.lang.String
90. * @param request javax.servlet.http.HttpServletRequest
91. */
92. public static String getToken (HttpServletRequest request){
93. String token = "" + System.currentTimeMillis ();
94. HttpSession session = request .getSession ();
95. if (session != null){
96. session.removeAttribute (TOKEN_NAME);
97. }
98. return token;z
99. }
100. /**
101. * Insert the method's description here.
102. * Creation date: (4/19/2004 3:24:10 PM)
103. * @return java.lang.String
104. */
105. final static java.lang.String getTOKEN_NAME (){
106. return TOKEN_NAME;
107. }
108. public static String message (PageContext pageContext, String key) throws
109. JspException{
110. return RequestUtils.message (pageContext, null, null, key);
111. }
112. }
113.
五. 也可以通过添加中转页面的方式
对于JSP 入门的角度讲,可以通过添加中转页面的方式,这样做虽然在视觉上不是很好,页面间显繁琐,但是这是有效地避免Form 表单重复提交的好方式。
发表评论
-
java web项目配置tomcat连接池
2011-09-20 23:33 1779本文包含两部分内容。第一部分是在eclipse下配置项目 ... -
javaweb中的请求--响应流程(get方式提交请求)
2011-09-11 22:30 1057javaweb中的请求--响应流程(get方式提交请求) -
JSP入门需要知道的五个方面
2011-09-10 21:16 817本文是一个JSP入门的简单的总结性文章,从Servlet知 ... -
Form表单提交数据编码方式和tomcat接受数据解码方式的思考
2011-09-10 21:11 544form有2中方法把数据提 ... -
execute、executeQuery和executeUpdate之间的区别
2011-09-10 21:09 697JDBCTM中Statement接口提 ... -
使用eclipse开发J2EE应用
2011-09-10 21:08 783使用eclipse开发J2EE应用 -
web.xml文件在web项目中的作用及基本配置
2011-09-10 21:03 1905web 工程中的 web.xml 文件有什 ... -
java中文乱码解决方法
2011-09-10 20:56 7721 .以POST 方法提交 ... -
jsp实现网页计数器(防刷新计数和防刷新单用户计数)
2011-09-10 20:51 1301jsp实现网页计数器(防刷新计数和防刷新单用户计数) -
jsp分页实现
2011-09-10 20:47 613jsp分页实现 -
多图详解教程:Eclipse3.6连接Tomcat7
2011-09-10 20:44 717多图详解教程:Eclipse3.6连接Tomcat7(见附件) ... -
url 重写来实现会话管理
2011-09-08 21:45 939如果浏览器不支持 cookies,或将浏览器设置为不接受 co ... -
jsp环境下session的创建
2011-09-08 20:54 8161)-不恰当的request.getSessi ... -
跳出页面的Frame框架
2011-09-08 12:12 640如何跳出页面的Frame 框架 很多网页都是框架结构的 ... -
使用eclipse开发J2EE应用
2011-09-08 12:09 0<!-- [if !mso]> <styl ... -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
2011-09-08 12:05 673一、 1、启动一个WEB项 ... -
UrlRewriter url重写
2011-09-08 12:04 808如何增强你网站中地址的可读性和让搜索引擎快速的收录到你的 ... -
TOMCAT数据库连接池的配置方法总结
2011-09-08 12:02 853以MySQL+TOMCAT 为例 1. ... -
Tomcat解决中文转码问题
2011-09-08 11:51 1877Tomcat解决中文转码问题 ... -
Tomcat与IIS整合手记
2011-09-08 11:49 995安装配置 IIS6 和 Tomcat6 ...
相关推荐
7. **请求Action的几种方式**:在JSP中,有多种方式请求Action,如使用HTML的form表单提交,s:form标签,以及通过JavaScript的Ajax调用。每种方式都有其适用场景,开发者应根据需求选择合适的请求方式。 8. **...
JSP中的`<form>`标签用于创建表单,`action`属性指定处理表单的Servlet,`method`属性决定是GET还是POST方式提交。 6. **错误处理与验证**: 系统应包含对用户输入的验证,如检查必填项、格式正确性等,避免无效数据...
### 在JSP中运用AJAX(简单入门) 随着互联网技术的发展与用户对交互体验要求的提高,AJAX技术因其能够实现网页的异步更新而受到广泛欢迎。本篇文章将通过一个具体的示例来介绍如何在JSP页面中使用AJAX进行简单的...
JSP有以下几种语法元素: 1. **指令(Directives)**:用于设置页面属性,如`<%@ page ... %>`,用于指定页面编码、导入Java包等。 2. **脚本元素(Scriptlets)**:在`<%...%>`内写入Java代码,执行服务器端逻辑。...
`<jsp:setProperty>`设置Bean的属性,对应表单提交的数据。 5. **请求处理与响应**:当用户提交注册表单时,JSP会通过HTTP请求将数据发送到服务器。服务器端的JSP或Servlet接收请求,验证数据,然后可能返回一个...
JavaServer Pages (简称 JSP) 是一种基于 Java 的服务器端技术,用于生成动态 Web 内容。它允许开发者将静态 HTML 和动态 Java 代码混合在一起,从而创建功能强大的 Web 应用程序。JSP 文件通常以 `.jsp` 扩展名存储...
JavaServer Pages,简称JSP,是一种基于Java技术的网页程序设计语言,用于动态生成Web内容。JSP被设计用来简化Servlet的开发,将界面设计与业务逻辑分离,使得开发更加高效和便捷。JSP文件本质上是HTML或XML文档,但...
- **表单(form)处理**: 在JavaWeb开发中,表单是非常重要的一部分,用于收集用户的输入。常见的表单元素包括: - 文本框 `<input type="text">` - 密码框 `<input type="password">` - 提交按钮 `...
2. **Action类**:这些类是业务逻辑的入口点,处理用户提交的表单数据,并调用相应的服务层方法。Action类通过`execute()`方法响应用户请求,并返回一个表示视图结果的ActionForward对象。 3. **Form Bean**:用于...
例如,你可以使用`s:form`标签创建表单,`s:textfield`生成输入框,`s:submit`创建提交按钮,以及`s:actionerror`显示验证错误等。 通过这个入门例子,你可以逐步了解Struts2的运行机制,包括请求处理、数据绑定、...
表单会提交到`LoginAction`,通过POST请求传递用户输入的数据。 3. **ActionForm**:Struts中的Form Bean类,用于封装用户的输入数据。在登录示例中,可能有一个`LoginForm`类,它有对应的属性如`username`和`...
JSP页面中通常会使用Struts的标签库,如`<s:form>`、`<s:textfield>`等,来与Action类进行数据绑定和表单提交。 5. **控制器**:Struts框架本身充当了控制器角色,负责接收HTTP请求,调用相应的Action处理,然后...
### JavaBean入门概念与简单示例 #### 一、JavaBean简介 JavaBean是一种符合特定规范的Java类,主要用于封装数据或实现简单的业务逻辑。它通常用于Java Web开发中的MVC(Model-View-Controller)架构中作为模型层...
此外,还需要掌握如何处理表单提交,文件上传,以及错误和异常处理等常见功能。 在实际开发中,Struts1.x 提供了强大的标签库,使得开发者可以方便地在JSP页面中进行业务逻辑和视图展示的分离。通过ActionForm可以...
#### 第六讲:表单提交与数据处理 ##### 1. 表单基础 - **HTML 表单**:用于收集用户输入的数据。 - **标签**: - `<form>`:定义表单,指定 action 和 method 属性。 - `<input>`:用于创建各种类型的输入控件。...
在Struts框架中,主要涉及到以下几种关键配置和组件: 1. **JSP页面**: JSP(Java Server Pages)是Struts框架中用于展示数据的页面。例如,在提供的代码片段中,通过表单元素收集用户的输入信息。 ```html <form...
### 前端入门基础及框架入门应用 本篇文章旨在为初学者介绍前端开发的基础概念以及常用技术的应用方法。文章内容覆盖了HTML的基础语法、标签使用及其相关属性,并且涉及到了CSS样式的简单运用。 #### HTML简介 ...