A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 傅荣康 黑马帝   /  2011-8-3 12:34  /  2212 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在ssh框架中,当在jsp页面输入数据提交到action中的时候,有的时候会提交两边(我实际提交了一次),这是为什么呢,该如何解决?请多多指教!        这里我用的是struts2

评分

参与人数 1技术分 +1 收起 理由
admin + 1 超出了同学们认知的范围

查看全部评分

2 个回复

正序浏览
黑马网友  发表于 2011-8-7 13:22:10
藤椅
是不是提交的按钮标签写错了啊
<input type="button" value="提交" name="button1" onclick="formsubmit()">
这么写是没问题的,但如果是
<input type="submit" value="提交" name="button1" onclick="formsubmit()">
就会提交两次,因为submit标签本来就会提交一次,执行formsubmit()就会又提交一次
以前遇到过这个问题,代码里看半天,发现居然是这个问题,惭愧

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-4 17:20:26
沙发
这是表单重复提交的问题,貌似Sturts有这方面的功能,
Struts中的Token机制能够很好的解决表单重复提交的问题
使用Token的流程
假设用户需要提交一次表单,该表单是submit_info.jsp
1.  进入submit_info.jsp之前,先将请求转发给一个GenerateTokenAction.这个Action的关键代码如下。
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception{
......
//调用Action自带的方法在session和request中存储Token
saveToken(request);
......
}
可以看到这个Action为用户生成一个Token同时存储在session和request中 。
2. 将控制转交到submit_jsp,用户填写相应的提交信息,单击“提交”按钮。该提交触发的是SubmitAction.
3.在SubmitAction中,判断来自用户request中的Token与session中的Token是否是一致,若是一致的则处理请求,并调用resetToken(request)方法,将会话中的session清空,若不一致则提示出错,并调用saveToken(request)创建一个新的Token,然后返回,部分代码如下。

public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Excepion{
......
if(isTokenValid(request)){
resetToken(request);
//进行业务处理


}else{
saveToken(request);
//进行出错的处理
。。。。。。
}

。。。。。。
}
4.当用户单击一次提交按钮后,isTokenValid返回True信息,resetToken(requst)方法将当前会话中的Token信息删除,并接下去进行相印的业务处理。
说的含糊,你也可以自己查阅资料Token是怎样防止表单重复提交的

------------------------------------------------------------------------
还可以用javaScript实现表单的重复提交[code]<head>
<script language="javascript">
function formsubmit()
{
    Today = new Date();
    var NowHour = Today.getHours();
    var NowMinute = Today.getMinutes();
    var NowSecond = Today.getSeconds();
    var mysec = (NowHour*3600)+(NowMinute*60)+NowSecond;
    if(mysec-document.formsubmitf.mypretime.value)>600)
    {
        document.formsubmitf.mypretime.valur = mysec;
    }
    else
    {
        alert("请勿反复提交!请耐心等待!谢谢合作!");
        return false;
    }
    document.forms.formsubmitf.submit();
}
</script>
</head>
<body>
<form name="formsubmitf" id="the" method="post" action=".....">
<input type="hidden" name="mypretime" value="0">//传递一个隐藏值,判断是否重复提交
.....
.....
.....
<input type="button" value="提交" name="button1" onclick="formsubmit()">
.....
.....
.....
</form>
</form>
</body>   [/code]

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 我很赞同

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马