1.问题的产生原因
用Struts来实现MVC框架。这时页面提交给Action去进行业务处理,Action再跳转回前台页面,但这时URL依然是“页面提交给Action的链接”,这时前台刷新一下页面,就变成再次执行了一次提交操作; 2.解决思路 2.1在Action页面中跳转的时候用重定向,可以在struts_config.xml中配置<forward ... redirect="true"> 不过这种方法会使得Request中放置数据丢失; 2.2用Token令牌环来实现(这个操作也相对简单,本文章就来实现这个功能); 提交到Action的时候,进行一系列操作,然后保存一个标志,这时再跳转到前台页面(必须用struts标签,程序会自动在该前台页面设置一个隐藏域)。如果前台页面刷新的话,Action通过查看是否有标志,就能判断用户是刷新还是提交。 3.做个Token例子(模拟一个插入数据的操作,插入数据后,返回到列表页面,这时刷新列表页,看插入操作会不会多次执行) 3.1工程名为SubmitAgain,文件:AddUserAction.java,AddUserForm.java,index.jsp,add.jsp,list.jsp,struts_config.xml 3.2AddUserAction.java的内容如下: public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) { AddUserForm addUserForm = (AddUserForm) form; switch (addUserForm.getType()) { case 1: // 跳转到输入插入信息页面 this.saveToken(request); return mapping.findForward("goadd"); case 2: // 插入信息 if (this.isTokenValid(request)) { System.out.println("插入"); this.resetToken(request); } else { System.out.println("你在刷新页面"); } return mapping.findForward("golist"); } return null; } 3.3AddUserForm.java里面就一个参数type及其set和get方法; 3.4Struts_config.xml的内容如下: <action attribute="addUserForm" name="addUserForm" path="/addUser" scope="request" type="com.wangwz.struts.action.AddUserAction"> <forward name="goadd" path="/add.jsp"></forward> <forward name="golist" path="/list.jsp"></forward> </action> 3.5index.jsp的内容如下: <a href="./addUser.do?type=1">插入</a> 3.6add.jsp的内容如下: <html:form action="/addUser.do"> <html:hidden property="type" value="2" /> <html:submit value="插入" /> </html:form> 3.7list.jsp页面中随便输入几个字即可 3.8代码写完后,访问http://localhost:8080/SubmitAgain即可 |
Struts重复提交
最新推荐文章于 2019-04-09 11:15:39 发布