struts2获取表单数据 为什么总是提交2次表单

struts2 如何防止表单重复提交_百度知道
struts2 如何防止表单重复提交
我有更好的答案
  一、造成重复提交主要的两个原因:  在平时的开发过程中,经常可以遇到表单重复提交的问题,如做一个注册页面,如果表单重复提交,那么一个用户就会注册多次,重复提交主要由于两种原因。  1、 一是,服务器处理时间久。当用户在表单中填完信息,点击“提交”按钮后,由于服务器反应时间过长没能及时看到响应信息,或者出于其它目的,再次点击“提 交”按钮,从而导致在服务器端接收到两条或多条相同的信息。如果信息需要存储到后台数据库中,如此以来就会产生数据库操作异常提示信息,以至于给用户带来 错误信息提示,从而给用户的使用带来不便。  2、二是,forward跳转引起的重复提交。在页面跳转的时候,有两种类型:请求转发和重定向,所谓请求转发是在服务器端进行跳转,对用户是透明的,此时浏览器中的地址不会发生改变,重定向是在客户端发生跳转,跳转时候浏览器中的地址栏会发生改变,如果在注册时,使用了请求转发,那么当刷新页面时,就会引起表单的重复提交  二、解决方案  方案一、使用struts2中的token拦截器或者tokenSession拦截器  对token的简单理解:  1)当用户首次访问包含表单的页面时,服务器会在这次会话中创建一个session对象,并产生一个令牌值,然后将这个令牌值作为隐藏输入域的值,随表单一起发送到服务器端,同时将令牌值保存到Session中。  2) 当用户提交页面时,服务器首先判断请求参数中的令牌值和Session中保存的令牌值是否相等,若相等,则清楚Session中的令牌值,然后执行数据处 理操作。如果不相等,则提示用户已经提交过了表单,同时产生一个新的令牌值,保存到Session中。当用户重新访问提交数据页面时,将新产生的令牌值作 为隐藏输入域的值。  ####  token: 在活动Action中检查合法令牌(token), 防止表单的重复提交;  token-session: 同上, 但是在接到非法令牌时将提交的数据保存在session中;  主要步骤如下:  第一步:在表单中加入&s:token /&(当然啦!要首先导入struts2的标签库 &%@taglib uri=&/struts-tags& prefix=&s& %&)  &s:form action=&helloworld_other& method=&post& namespace=&/test&&  &s:textfield name=&person.name&/&&s:token/&&s:submit/&  &/s:form&  第二步:在struts.xml配置文件中相应的action上配置token拦截器或者tokenSession拦截器。此拦截器只能用在有form的提交请求上。  &action name=&helloworld_*& class=&com.jim.action.HelloWorldAction& method=&{1}&&  &interceptor-ref name=&defaultStack&/&  &interceptor-ref name=&token& /&  &result name=&invalid.token&&/WEB-INF/page/message.jsp&/result&  &result&/WEB-INF/page/result.jsp&/result&  &/action&  以上配置加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。  方案二:基于第二种重复提交表单的原因,服务器内部使用重定向  在Struts2中的struts.xml中,result标签的type默认值是 dispatcher,(请求转发),要实现以上的功能,肯定不能使用默认值,需要将其值设为redirectAction(重定向到某一 Action),也就是说重一个Action跳转到另外一个Action,此时浏览器中的地址是第二个Action,结合到上面的需求,可以再第一个 Action中将记录添加到数据库中,然后在第二个Action中将数据读取出来。以后每次刷新,那么只会执行第二个Action。  到struts-default.xml中找到与redirectionAction对应的一个类,ServletActionRedirectResult  从Api文档中发现找出里面有一个字段叫做actionName,指定需要跳转的Action  配置方法如下:  &action name=&add& class=&com.action.AddAction&&  &result name=&success& type=&redirectAction&&  &param name=&actionName&&show_show&/param&  &/result&  &/action&  至于第二个Action的配置方法,相信学过struts2的同学都会。
电子产品技术支持
struts2有自己的ognl标签库,你可以用token这个标签,令牌标签,自己会处理表单重复提交问题,你也可以使用jsp的自定义标签来处理,通过时间戳来判定.
本回答被提问者采纳
baidu://zhidao.baidu.com/link.com/link?url=ZQAwjxVoVlCrctsJU62c03148ZlmszAeukwicxse2iv1MO-g9mccBh_Awc6tY6CZEg6jfWBGyyNRpvPrnJGVlK" target="_blank">http<a href="http://zhidao
利用一个标志位也行
用token标签
其他2条回答
为您推荐:
其他类似问题
struts2的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。提交form表单action代码执行两次?!!!!!!!是struts2
[问题点数:40分,结帖人qqqwww198273]
提交form表单action代码执行两次?!!!!!!!是struts2
[问题点数:40分,结帖人qqqwww198273]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
struts2中一个表单中提交多个请求的例子(多个提交按钮)
摘要:使用这种方式也需要通过请求参来来指定要执行的动作。请求参数名的格式为action!method.action注:由于Struts2只需要参数名,因此,参数值是什么都可以。下面我就给出一个实例程序来演示如何处理有多个submit的form:主页面more_submit.jsp&%@pagelanguage=&java&import=&java.util.*&pageEncoding=&GBK&%&&%
使用这种方式也需要通过请求参来来指定要执行的动作。请求参数名的格式为
action!method.action
注:由于Struts2只需要参数名,因此,参数值是什么都可以。
下面我就给出一个实例程序来演示如何处理有多个submit的form:
主页面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&
MoreSubmitAction.java
import javax.servlet.http.*;import com.opensymphony.xwork2.ActionSimport org.apache.struts2.interceptor.*;public class MoreSubmitAction extends ActionSupport implementsServletRequestAware { private S private javax.servlet.http.HttpServletR // 获得HttpServletRequest对象 public void setServletRequest(HttpServletRequest request) {this.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() { } public void setMsg(String msg) {this.msg = }}
structs.xml &?xml version=&1.0& encoding=&UTF-8& ?&&!DOCTYPE struts PUBLIC &-//Apache Software Foundation//DTD Struts Configuration 2.1//EN& &http://struts.apache.org/dtds/struts-2.1.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&
result.jsp
&%@ page language=&java& contentType=&text/ charset=GBK& pageEncoding=&GBK&%&&!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/ charset=ISO-8859-1&&&title&提交结果&/title&&/head&&body&&h1&${result }&/h1&&/body&&/html&
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
struts2中一个表单中提交多个请求的例子(多个提交按钮)相关信息,包括
的信息,所有struts2中一个表单中提交多个请求的例子(多个提交按钮)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
服务与支持
账号与支持
关注阿里云
International通过代码实例跟我学Struts2框架从入门到精通――在Struts2框架中如何防止Web表单重复提交的应用实例_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
通过代码实例跟我学Struts2框架从入门到精通――在Struts2框架中如何防止Web表单重复提交的应用实例
互联网从业者|
总评分3.8|
浏览量245739
用知识赚钱
&&通过代码实例跟我学Struts2框架从入门到精通――在Struts2框架中如何防止Web表单重复提交的应用实例
试读已结束,如果需要继续阅读或下载,敬请购买
定制HR最喜欢的简历
你可能喜欢
您可以上传图片描述问题
联系电话:
请填写真实有效的信息,以便工作人员联系您,我们为您严格保密。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&
&!-- 默认的视图主题 --&
&constant name="struts.ui.theme" value="simple" /&
&!-- struts2在防止表单重复提交的拦截中有2个,分别是:token,tokenSession。tokenSession继承token而来。
通常情况下,使用tokenSession客户端感觉会比较友好。 --&
&!-- 如果重复提交,会跳转到error.jsp页面 --&
&package name="person" namespace="/test" extends="struts-default"&
&action name="token" class="com.ljq.action.PersonAction"&
&interceptor-ref name="defaultStack" /&
&interceptor-ref name="token" /&
&!-- 如果重复提交,跳转到error.jsp页面 --&
&result name="invalid.token"&/WEB-INF/page/error.jsp&/result&
&result&/WEB-INF/page/message.jsp&/result&
&action name="tokenSession" class="com.ljq.action.PersonAction"&
&interceptor-ref name="defaultStack" /&
&interceptor-ref name="tokenSession" /&
&!-- 如果重复提交,不会跳转到error.jsp页面 --&
&result name="invalid.token"&/WEB-INF/page/error.jsp&/result&
&result&/WEB-INF/page/message.jsp&/result&
&/package&&/struts&
PersonAction类
package com.ljq.import java.util.ArrayLimport java.util.Lpublic class PersonAction {
@SuppressWarnings("unchecked")
//观看控制台
//如果token生效则不会在控制台输出name的值,而会输出如下警告:
20:45:32 com.opensymphony.xwork2.util.logging.commons.CommonsLogger
//warn 警告: Form token EDZ4S96RNDN5VD8B1CQTK6FTHIJUPC66 does not match the session token null.
public String execute() {
List ls = new ArrayList();
ls.add(name);
for (int i = 0; i & ls.size(); i++) {
System.out.println(ls.get(i));
return "success";
public String getName() {
public void setName(String name) {
this.name =
index.jsp表单页面
&%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&&%@ taglib uri="/struts-tags" prefix="s"%&&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&&html&
&title&防止表单重复提交&/title&
&meta http-equiv="pragma" content="no-cache"&
&meta http-equiv="cache-control" content="no-cache"&
&meta http-equiv="expires" content="0"&
&!-- 防止表单重复提交,记得在form表单里填上&s:token&&/s:token&
&!-- action="token"、action="tokenSession" --&
&s:form action="token" namespace="/test" method="post"&
姓名:&s:textfield name="name"/&&s:token&&/s:token&
&input type="submit" value="发送"/&
&/body&&/html&
message.jsp返回成功页面
&%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&&%@ taglib uri="/struts-tags" prefix="s"%&&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&&html&
&title&My JSP 'index.jsp' starting page&/title&
&meta http-equiv="pragma" content="no-cache"&
&meta http-equiv="cache-control" content="no-cache"&
&meta http-equiv="expires" content="0"&
&s:property value="name"/&&br/&
&%=new Date() %&
&/body&&/html&
error.jsp表单重复提交提示页面
&%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&&%@ taglib uri="/struts-tags" prefix="s" %&&%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%&&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&&html&
&base href="&%=basePath%&"&
&title&My JSP 'error.jsp' starting page&/title&
&meta http-equiv="pragma" content="no-cache"&
&meta http-equiv="cache-control" content="no-cache"&
&meta http-equiv="expires" content="0"&
&meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&
&meta http-equiv="description" content="This is my page"&
&link rel="stylesheet" type="text/css" href="styles.css"&
您已经提交了表单,请不要重复提交。
&/body&&/html&
阅读(...) 评论()

我要回帖

更多关于 struts form表单提交 的文章

 

随机推荐