java struts2入门学习--防止表单重复提交.OGNL语言学习

一.知识点回顾

防止表单重复提交核心思想:

客户端和服务器端和写一个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区域.

如下图所示:

 

原文地址:https://www.cnblogs.com/amosli/p/3552010.html