一.知识点回顾
防止表单重复提交核心思想:
客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交.
1.getSession三种方式比较:
request.getSession()
request.getSession(true);//无论如何都要得到新的Session
request.getSession(false);//只能得到旧有的Session
2.>>struts2框架提供了token拦截器,主要用于防止表单重复提交
>>默认栈中无token拦截器,所以在<action>标签中要显示引用token拦截器
3.开发步骤:
1)在jsp页面中使用<s:token/>,自动产生hidden框,同时在服务端的session中放置一份id值
2)在<action>中,显示引用token拦截器
3)token的实现源码org.apache.struts2.interceptor.TokenInterceptor
二.需求
针对上一篇文章中实现的验证,实现防止表单重复提交,一旦出现重复提交,应当给予提示.
1.填写所必需的内容
2.提交成功后
3.刷新提交后的页面,提示页面已经重复提交
三.实现
1.实现代码
validator.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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/html; charset=UTF-8">
<title>validator</title>
</head>
<body>
<s:form action="ValidatorAction" type="POST">
<s:token/>
<s:textfield label="用户名" name="username" />
<s:password label="密码" name="password" showPassword="true"/>
<s:textfield label="薪水" name="salary" />
<s:textfield label="生日" name="birthday"/>
<s:submit name="submit"/>
</s:form>
</body>
</html>
validator_struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="validator" extends="struts-default"> <action name="ValidatorAction" class="validator.ValidatorAction" method="execute"> <result name="success" type="dispatcher"> /WEB-INF/validator_success.jsp </result> <result name="input" type="dispatcher"> /validator.jsp </result> <result name="invalid.token" type="dispatcher"> /error.jsp </result> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="token"></interceptor-ref> </action> </package> </struts>
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <font size="36" color="red"> 表单重复提交了 </font> </body> </html>
2.代码分析
在validator.jsp中添加token标签,将token分别写入客户端和服务器端.
validator_struts.xml,配置出错页面,以及引用默认拦截器和token拦截器.
error.jsp,提示重复提交了.
3.本文源码
四.OGNL语言
1.简介:
OGNL是Object-Graph Navigation Language的缩写(对象图导航语言),它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
2.作用:
1)访问OGNL上下文(OGNL context)和ActionContext;
2)操作集合对象。
3.理解OGNL
1)OGNL通常与Struts2的标签一起使用,不能独立使用.
2) Action一旦产生,值栈就产生了,位于request域中
Action一旦销毁,值栈就销毁了.
3)值栈分数两部分:
List区域:
>>Action实例本身
>>Action中所有的属性,例如:username/password ..
Map区域:
>>在Action中,能够取得的一切Map对象,都放置在Map区域.
如下图所示: