一.为什么要进行表单验证
在实际开发和生活中,当我们在一个表单填写好数据,进行提交时,如果这个时候网卡,我们一般会再次,甚至是多次点击提交按钮(以为这样会快),也有的会先将浏览的页面返回到上一步,再进行退回,或者重复点击回车, 这样会导致数据重复提交。
为了防止表单重复提交,可以在客户端进行简单的处理,可以在服务器端进行处理。
这里只说明在服务器端进行的处理。
如果想了解客户端处理的,可以观看孤傲苍狼前辈的博客:https://www.cnblogs.com/xdp-gacl/p/3859416.html
二 搭建Struts2的基本运行环境,演示重复提交
二.一 创建UserAction
里面有常用的五个方法。
package com.yjl.web.action; import org.apache.log4j.Logger; import com.opensymphony.xwork2.ActionSupport; /** * @author 两个蝴蝶飞 * @version 创建时间:2018年9月14日 下午6:35:10 * 演示重复提交的Action.在添加用户是进行演示 */ public class UserAction extends ActionSupport { private static Logger logger=Logger.getLogger(UserAction.class); private static final long serialVersionUID = -4164832837385401186L; public String toAddUI(){ logger.info("跳转到添加学生的页面"); return "addUI"; } public String add(){ logger.info("执行添加学生的操作"); return "toList"; } public String toEditUI(){ logger.info("跳转到添加学生的页面"); return "editUI"; } public String edit(){ logger.info("执行修改学生的操作"); return "toList"; } public String delete(){ logger.info("执行删除学生的操作"); return "toList"; } public String list(){ logger.info("执行查询学生的操作"); return "list"; } }
二.二 配置struts.xml文件
<package name="user" namespace="/" extends="struts-default"> <action name="User_*" class="com.yjl.web.action.UserAction" method="{1}"> <result name="addUI">/WEB-INF/content/add.jsp</result> <result name="editUI">/WEB-INF/content/edit.jsp</result> <result name="list">/WEB-INF/content/list.jsp</result> <!-- 应该当添加成功之后,就跳转到List界面 --> <result name="toList" type="chain">User_list</result> </action> </package>
二.三 编写前端页面
二.三.一 编写 /content/add.jsp 页面
<body> <h3>这是一个添加学生的页面</h3> <s:form action="User_add" method="post" namespace="/"> <s:textfield label="姓名" name="name"></s:textfield> <s:submit value="添加学生"/> </s:form> </body>
二.三.二 编写 /content/edit.jsp 页面
<body> <h3>这是一个修改学生的页面</h3> <s:form action="User_edit" method="post" namespace="/"> <s:textfield label="姓名" name="name"></s:textfield> <s:submit value="添加学生"/> </s:form> </body>
二.三.三 编写 /content/list.jsp 页面
<body> <h3>这是一个显示学生的页面</h3> </body>
二.四 重启服务器,运行程序
输入网址: http://localhost:8080/Struts_Token/User_toAddUI
当输入名字之后 ,
点击添加学生之后:
日志栏:
页面上会显示:
下面会显示学生的信息,
注意此时上面的地址栏是:User_add.action。
二.五 出现的问题
- 此时如果用户将光标定位到地址栏, 继续点击回车的话,还会继续执行一遍add()的方法:
2.如果用户刷新浏览器的话,也会继续执行一遍add()的方法:
会发现根本原因主要是地址栏的原因。地址栏的地址仍然是 User_add.action, 而不是 User_list.action
需要在 struts.xml中配置时type类型的值。
二.六 将类型type改成redirectAction
将toList 的返回类型,由默认的 chain改成redirectAction。
<!--错误的用法:<result name="toList" type="chain">User_list</result>--> <result name="toList" type="redirectAction">User_list</result>
二.七 修改后重新验证
点击添加学生按钮:
再次点击回车按钮时:
刷新浏览器时:
都只是执行list()的方法,并不会再次执行add()的方法。