• 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区域.

    如下图所示:

     

  • 相关阅读:
    struts2.0利用注解上传和下载图片
    hibernate @ManyToOne
    Cookie会话管理
    ServletContext
    Servlet 1
    ArrayList
    BigInteger类和BigDecimal类
    Math类
    System类
    基本类型包装类
  • 原文地址:https://www.cnblogs.com/amosli/p/3552010.html
Copyright © 2020-2023  润新知