Struts数据回显技术(附加防表单重复提交)

内容

主要涉及到Struts的两个内容:
1. 数据回显技术
2. 防表单重复提交

原理

  1. 数据回显技术:

    使用Struts标签接收、发送数据。回显技术主要是对值栈的使用。是对对象栈(即root根元素)使用。只要熟悉值栈根元素怎么取值,对数据回显技术就能够轻易理解。
    【详细讲解】:struts标签的特殊性,如果标签中name和根元素中的值一样,是可以直接在struts标签中用<s:password name="user.password"></s:password><br/>
    ,struts标签会自动将root根元素中的值填充进去。(我在root中放入的user对象,所以要user.password取值)

  2. 防表单重复提交

    原理是在form表单中添加<s:token/>标签,该标签会在form中制作两个隐藏域,一个隐藏域存的是Struts相关的其他名字,一个是校验值。校验值是用来与 服务器上token拦截器创建的值进行比较,如果相同就代表这个form提交的数据有效。否则失败。返回到struts.xml中配置的<result name="invalid.token">/login.jsp</result> 此中去。
    这里写图片描述

以上就是原理。不废话,代码显而易见。

struts.xml

        <!-- 数据回显以及防重复提交 -->
        <action name="data_v1_*Action" class="cn.data.UserAction" method="{1}">
            <!-- 防表单重复提交 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="token">
                <param name="includeMethods">login</param>
            </interceptor-ref>
            <result name="invalid.token">/data.jsp</result>

            <result name="success">/success.jsp</result>
            <result name="input">/error.jsp</result>
            <result name="login">/data.jsp</result>
            <result name="debug">/input.jsp</result>
        </action>

data.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'data.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  <h3>防表单重复提交/数据回显</h3>
  <p>模型驱动的结果是:user.username和username传值结果是一致的</p>
    <form action="data_v1_loginAction" method="post">
        用户名:<s:textfield name="user.username"></s:textfield><br/>
        密码:<s:password name="user.password"></s:password><br/>
        日期:<s:textfield name="user.date"/><br/>
        <input type="submit" value="提交"/>
        <s:token/>
    </form><br>
    <br/>
    El:{username:${username}}<br/>
    ognl:{root:<s:property value="user.username"/>、map栈:<s:property value="#request.user.username"/>}<br/>
  </body>
</html>

Action

package cn.data;

import java.util.Map;

import cn.entity.User;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;

public class UserAction extends ActionSupport {
    private User user = new User();


    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String login(){
        //值栈! 此是传入root根元素中。
        ValueStack vs = ActionContext.getContext().getValueStack();
        vs.set("user", user);   

        System.out.println("usernmae: "+user.getUsername());
        System.out.println("password: "+user.getPassword());
        System.out.println("date: "+user.getDate().toLocaleString());
        return "login";
    }
    public String register(){
        System.out.println("register");
        System.out.println("usernmae: "+user.getUsername());
        System.out.println("password: "+user.getPassword());
        System.out.println("date: "+user.getDate().toLocaleString());   
        return "debug";
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值