内容
主要涉及到Struts的两个内容:
1. 数据回显技术
2. 防表单重复提交
原理
数据回显技术:
使用Struts标签接收、发送数据。回显技术主要是对值栈的使用。是对对象栈(即root根元素)使用。只要熟悉值栈根元素怎么取值,对数据回显技术就能够轻易理解。
【详细讲解】:struts标签的特殊性,如果标签中name和根元素中的值一样,是可以直接在struts标签中用<s:password name="user.password"></s:password><br/>
,struts标签会自动将root根元素中的值填充进去。(我在root中放入的user对象,所以要user.password取值)防表单重复提交
原理是在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";
}
}