您的位置:首页 > 编程语言 > Java开发

Struts重复提交

2008-03-01 11:49 288 查看
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即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: