Struts2--day04

非本人總結(jié)的筆記,抄點筆記復(fù)習(xí)復(fù)習(xí)。感謝傳智博客和黑馬程序猿


記筆記啊記筆記

Ognl的簡介

Ognl是獨立的項目,不是Struts2的一部分,只是經(jīng)常和Struts2一起使用,獲取值棧的數(shù)據(jù)。如果想要使用Ognl首先導(dǎo)入包。

El表達(dá)式,在jsp頁面中獲取域?qū)ο罄锩娴臄?shù)據(jù),顯示到頁面中。

Ognl表達(dá)式比El表達(dá)式強(qiáng)大

  1. 支持對象方法調(diào)用,如xxx.xxx();
  2. 支持類靜態(tài)方法調(diào)用和值訪問,表達(dá)式的格式:@[類全名(包括包路徑)]@[方法名|值名]。例如:@java.lang.String@format('foo%s', 'bar')或@tutorial.MyConstant@APP_NAME。設(shè)置 struts.ognl.allowStaticMethodAccess=true
  3. 訪問OGNL上下文(OGNL content)和ActionContent;(操作值棧數(shù)據(jù))
  4. 支持賦值操作和表達(dá)式串聯(lián)
  5. 操作值棧集合對象

Ognl入門案例

使用ognl和Struts2標(biāo)簽一起做下面的操作

第一步 創(chuàng)建Ognl.jsp頁面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!--引入struts2標(biāo)簽-->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>    
    <title>My JSP 'helloOgnl.jsp' starting page</title>
  </head>
  <body>
    <!-- 調(diào)用對象的方法
        計算字符串長度
        String str = "aa";
        str.length();
     -->
    <s:property value="'itcast'.length()"/>    
    <hr/>
    <%--調(diào)用靜態(tài)方法  格式:@[類全名(包括包路徑)]@[方法名] --%> 
    <s:property value="@java.lang.Math@random()"/>
  </body>
</html>

第二步 配置struts.xml調(diào)用靜態(tài)方法,必須開啟常量值

<!--設(shè)置OGNL靜態(tài)方法常量-->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

值棧

什么是值棧

值棧是數(shù)據(jù)的中轉(zhuǎn)戰(zhàn),類似于域?qū)ο螅安僮?,可以向域?qū)ο罄锩嬖O(shè)置值,可以從域?qū)ο罄锩娅@取值。向域?qū)ο笤O(shè)置值,從域?qū)ο螳@取值。獲取值棧的數(shù)據(jù),可以通過struts2標(biāo)簽和ognl表達(dá)式獲取。

每次訪問action的時候,都會創(chuàng)建action實例,每個action實例里面只有一個值棧對象(valueStack對象)

在action實例中,值棧是如何存在的?

Struts2框架將把ValueStack對象保存在名為"struts.valueStack",的請求屬性中,request中Request.setAttribute("struts.valueStack")

獲取值棧對象方法

第一種

從request域?qū)ο罄锩媸褂胓etAttribute獲取,名稱為struts.valueStack

第二種

得到ActionContext,使用ActionContext里面的方法得到

案例演示

第一步 創(chuàng)建Action

package cn.itcast.valuestack;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
/**
 * 獲取值棧對象的兩種方式
 */
public class StackDemo1 extends ActionSupport {

    private String name;
    
    @Override
    public String execute() throws Exception {
        //第一種 從request域?qū)ο罄锩媸褂胓etAttribute獲取,名稱struts.valueStack
        //第一種方式  從request域里面獲取
        HttpServletRequest request = ServletActionContext.getRequest();
        ValueStack stack1 = (ValueStack) request.getAttribute("struts.valueStack");
        //第二種 得到ActionContext,使用ActionContext里面的方法得到
        //第二種方式 使用ActionContext獲取
        ActionContext context = ActionContext.getContext();
        ValueStack stack2 = context.getValueStack();
        //每個action實例中只有一個值棧對象
        //值是 true,表示是一個對象
        System.out.println(stack1 == stack2);
        return SUCCESS;
    }
}

第二步 配置Action struts.xml

<package name="valuedemo" extends="struts-default" namespace="/">
     <action name="stack1" class="cn.itcast.valuestack.StackDemo1">
          <result>/index.jsp</result>
     </action>
</package>

值棧的內(nèi)部結(jié)構(gòu)

值棧包含兩部分內(nèi)容

  1. Root:是list集合,Struts2里面默認(rèn)操作數(shù)據(jù)都在root里面
  2. Context:是map集合

在action里面把數(shù)據(jù)放到域?qū)ο罄锩妫@個數(shù)據(jù)存到context里面,context里面的Map結(jié)構(gòu),key名稱為request、session、Application、attr、parameters

值棧

向值棧中存放數(shù)據(jù)

第一種 獲取值棧對象,調(diào)用值棧對象里面的方法的set方法

第二種 獲取值棧對象,調(diào)用值棧對象的方法push方法

第三種 在action中創(chuàng)建對象,生成set和get方法

案例演示

第一步 創(chuàng)建Action

package cn.itcast.valuestack;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
/**
 * 向值棧放數(shù)據(jù)的方式
 */
public class StackDemo2 extends ActionSupport {
    //第三種
    //創(chuàng)建對象
    private User user = new User();
    //生成對象的get和set方法
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        //第一種 獲取值棧對象,調(diào)用值棧對象里面的方法set方法
        //獲取值棧對象
        ValueStack stack = ActionContext.getContext().getValueStack();
        //設(shè)置值
        stack.set("itcast", "東方不敗");    
    
        //第二種 獲取值棧對象,調(diào)用值棧對象的方法push方法
        stack.push("岳不群");  

        //第三種 在action中創(chuàng)建對象,生成get和set方法
        //演示效果: 向值棧中放對象,在頁面中獲取對象值   
        //棧特點:后進(jìn)先出      
        //向值棧的user對象里面設(shè)置值
        user.setUsername("lucy");
        user.setPassword("250");
        
        return SUCCESS;
    }
}

第二步 配置struts.xml

<action name="stack2" class="cn.itcast.valuestack.StackDemo2">
    <result>/stack/demo2.jsp</result>
</action>

第三步 創(chuàng)建頁面 demo.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 'demo2.jsp' starting page</title>
  </head>  
  <body>
    <!-- 獲取set方法設(shè)置到值棧數(shù)據(jù) -->
<%--
<s:property value="itcast"/>
    <!-- 獲取push方法設(shè)置到值棧數(shù)據(jù) -->
    <hr/>
    <s:property value="[0].top"/>     <!--獲取棧頂數(shù)據(jù)寫法-->
--%>
    <!-- 獲取值棧的user對象中的值 -->
<%--
<s:property value="user.username"/>
    --
<s:property value="user.password"/> 
--%>
    ${itcast }<%--EL表達(dá)式直接獲取數(shù)據(jù)-->
  </body>
</html>

第四步 創(chuàng)建User類

package cn.itcast.valuestack;

public class User {

    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

從值棧中獲取值

第一種 獲取值棧的root里面的值:對象和list集合

獲取值棧的root的對象的值

<s:property value="user.username"/>
<s:property value="user.password"/>

獲取值棧的root里面list集合內(nèi)容

第一步 創(chuàng)建action
package cn.itcast.valuestack;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 向值棧放數(shù)據(jù)的方式
 * @author asus
 *
 */
public class StackDemo3 extends ActionSupport {
    // 獲取root的list集合的值
    //創(chuàng)建list集合
    private List<User> list = new ArrayList<User>();
    //生成list集合的get和set方法
    public List<User> getList() {
        return list;
    }
    public void setList(List<User> list) {
        this.list = list;
    }

    @Override
    public String execute() throws Exception {
        //向list集合中設(shè)置值
        //創(chuàng)建多個user對象,放到list集合
        User u1 = new User();
        u1.setUsername("岳不群");
        u1.setPassword("119");
        User u2 = new User();
        u2.setUsername("林平之");
        u2.setPassword("999");
        
        list.add(u1);
        list.add(u2);
        
        return SUCCESS;
    }
}
第二步 配合struts.xml
<action name="stack3" class="cn.itcast.valuestack.StackDemo3">
    <result>/stack/demo3.jsp</result>
</action>
第三步 創(chuàng)建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 'demo2.jsp' starting page</title>

  </head>
  
  <body>
<!--在jsp中獲取值棧的list集合內(nèi)容-->
   <!-- 獲取值棧中的list集合內(nèi)容 -->
   <s:property value="list[0].username"/>
   --
   <s:property value="list[0].password"/>
   <br/>
   <s:property value="list[1].username"/>
   --
   <s:property value="list[1].password"/>
   
  </body>
</html>

第二種 獲取值棧的context里面的值:對象和list集合

獲取值棧的context里面的對象

第一步 創(chuàng)建action
package cn.itcast.valuestack;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 *  向context里面放對象
 */
public class StackDemo4 extends ActionSupport {
    
    @Override
    public String execute() throws Exception {
        //創(chuàng)建對象
        User user = new User();
        user.setUsername("mary");
        user.setPassword("520");
        //把對象放到request域?qū)ο罄锩嫦鹊玫皆诜诺絚ontext中
        ServletActionContext.getRequest().setAttribute("userrequest", user);
        
        return SUCCESS;
    }
}
第二步 配置struts.xml
<action name="stack4" class="cn.itcast.valuestack.StackDemo4">
    <result>/stack/demo4.jsp</result>
</action>
第三步 創(chuàng)建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 'demo2.jsp' starting page</title>
  </head> 
  <body>
   <!-- 在jsp中獲取值棧的context里面的對象的值
        獲取context里面值,首先 #
        request :是context里面key的名稱

        #request.userrequest : 獲取request域里面名稱是userrequest的對象
        #request.userrequest.username: 獲取域?qū)ο罄锩鎸ο蟮膶傩灾?     -->
   <s:property value="#request.userrequest.username"/>
   --
   <s:property value="#request.userrequest.password"/>
  </body>
</html>

獲取值棧的context里面的list集合

第一步 創(chuàng)建action
package cn.itcast.valuestack;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 向值棧放數(shù)據(jù)的方式
 */
public class StackDemo5 extends ActionSupport {
    @Override
    public String execute() throws Exception {
        //向context里面放list集合
        //創(chuàng)建對象
        User u1 = new User();
        u1.setUsername("岳不群");
        u1.setPassword("119");
        User u2 = new User();
        u2.setUsername("林平之");
        u2.setPassword("999");
        //創(chuàng)建list集合
        List<User> list = new ArrayList<User>();
        list.add(u1);
        list.add(u2);
        //放到域?qū)ο?        ServletActionContext.getRequest().setAttribute("userlist", list);
        
        return SUCCESS;
    }
}
第二步 配置struts.xml
<action name="stack5" class="cn.itcast.valuestack.StackDemo5">
    <result>/stack/demo5.jsp</result>
</action>
第三步 創(chuàng)建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 'demo2.jsp' starting page</title>

  </head>
  
  <body>
   <!-- 獲取值棧context中的list集合值 -->
   <s:property value="#request.userlist[0].username"/>
   -- 
   <s:property value="#request.userlist[0].password"/>
   <hr/>
   <s:property value="#request.userlist[1].username"/>
   -- 
   <s:property value="#request.userlist[1].password"/>
  </body>
</html>

EL表達(dá)式為什么可以獲取值棧數(shù)據(jù)

實現(xiàn)原理:首先增強(qiáng)request里面的getAttribute方法,而getAttribute方法獲取域?qū)ο罄锩娴闹?/p>

增強(qiáng)邏輯:首先調(diào)用getAttribute獲取域?qū)ο罄锩娴闹?,如果獲取了值,直接返回;如果獲取不到域?qū)ο蟮闹?,獲取到值棧對象,從值棧中把值取出來,賦值給域?qū)ο笾械膮?shù)數(shù)據(jù)。所以,通過EL表達(dá)式就可以獲取值棧數(shù)據(jù)。

Ognl中#的使用

用來獲取值棧里面context里面的數(shù)據(jù)

<!--獲取值棧context里面的數(shù)據(jù)-->
<s:property value="#request.userrequest.username"/>
<s:property value="#request.userrequest.password"/>

Ognl表達(dá)式的%的使用

一般使用在Struts2的表單標(biāo)簽里面

演示效果:

  1. 編寫action,向request里面設(shè)置值
  2. 到j(luò)sp中獲取request域里面設(shè)置的值
  3. 在jsp中把值顯示到Struts2表單中

第一步 創(chuàng)建Action

package cn.itcast.ognl;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import cn.itcast.valuestack.User;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 編寫action,向request域里面設(shè)置值
 */
public class OgnlDemo2 extends ActionSupport {
    
    @Override
    public String execute() throws Exception {
        //向request域里面設(shè)置值
        ServletActionContext.getRequest().
                    setAttribute("username", "requestValueOgnl");
        
        return SUCCESS;
    }
}

第二步 配置struts.xml

<action name="ognl2" class="cn.itcast.ognl.OgnlDemo2">
    <result>/ognl/ognl2.jsp</result>
</action>

第三步 創(chuàng)建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 'ognl1.jsp' starting page</title>
  </head> 
  <body>
<!--顯示到struts2的表單標(biāo)簽里面 
    在struts2的表單標(biāo)簽里面,使用ognl顯示數(shù)據(jù),
    不能直接寫ognl表達(dá)式,因為作為普通字符串顯示,
    要讓是一個ognl,使用%{ognl表達(dá)式}
    <s:textfield> 類似于 <input type="text" value=""/>
 -->
    用戶名: <s:textfield value="%{#request.username}"></s:textfield>
  </body>
</html>

Ognl表達(dá)式的$的使用

在國際化資源文件中使用

在properties文件中msg=歡迎您 ${#request.username}

在頁面

<s:i18n name="massages">
    <s:text name="msg"></s:text>
</s:i18n>
<s:text name="namekey"></s:text>

Struts2座文件下載用

<result name="success" type="stream">
    <param name="contentDisposition">attachment;file=${filename}</param>
    <param name="inputstream">${inputstream}</param>
</result>

總結(jié)值棧和ognl表達(dá)式

1、ognl

ognl不是Struts2表達(dá)式的一部分,是獨立的項目,經(jīng)常和Struts2的標(biāo)簽一起使用,獲取值棧

2、值棧

類似域?qū)ο螅瑪?shù)據(jù)的中轉(zhuǎn)站,存值和取值

每個Action對象里面都只有一個值棧對象,在值棧request域里面

3、獲取值棧對象有兩種

  1. 從request域?qū)ο罄锩娅@取
  2. ActionContext類方法獲取

4、放數(shù)據(jù)到值棧有三種

  1. set方法
  2. push方法
  3. 創(chuàng)建對象,生成get和set方法

5、從值棧去數(shù)據(jù)

<s:property value="ognl表達(dá)式"></s:property>

獲取context里面數(shù)據(jù),ognl之前寫#

6、El表達(dá)式獲取值棧數(shù)據(jù)

7、 %和$的使用

8、值棧內(nèi)部結(jié)構(gòu)

Root是list集合;Context是Map集合;Struts2里面默認(rèn)操作數(shù)據(jù)都在Root里面,把數(shù)據(jù)放到域?qū)ο罄锩娲娴絚ontext里面

Struts2的標(biāo)簽庫

通用標(biāo)簽庫

<!-- 和ognl表達(dá)式使用,獲取值棧數(shù)據(jù) -->
<s:property value="ognl表達(dá)式"></s:property>
<!-- 遍歷值棧集合 -->
<s:iterator value="" var=""></s:iterator>
<!-- 獲取action里面使用addActionError設(shè)置的值 本身不是錯誤業(yè)務(wù)上的操作  如文件大小-->
<s:actionerror></s:actionerror>
<!-- 獲取action里面使用addFiledError設(shè)置的值   真正的錯誤 -->
<s:fielderror></s:fielderror>
<!-- 獲取國際化資源文件內(nèi)容 -->
<s:text name=""></s:text>

Struts2表單標(biāo)簽UI標(biāo)簽庫

介紹

Html中表單標(biāo)簽

Form :屬性 action、method、enctype

在form里面有很多的輸入項

大部分在input里面 type=””

text : 普通輸入項

password :密碼輸入項

radio :單選輸入項

checkbox:復(fù)選框

file: 文件上傳項

hidden:隱藏項

button:普通按鈕

submit: 提交按鈕

reset: 重置按鈕

select : 下拉輸入框

textarea:文本域

struts2的表單標(biāo)簽對應(yīng)的輸入項,沒有文件上傳輸入項

struts2表單標(biāo)簽實現(xiàn)

<%@ 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 'struts2tag.jsp' starting page</title>
  </head>  
  <body>
<!--<input type="radio" name="sex" value="女"/>女
    <input type="radio" name="sex" value="nan"/>男 -->
    <!-- 顯示內(nèi)容和value值一樣 
         顯示內(nèi)容和value不一樣
      -->
    <!--   <input type="checkbox" value="足球"/>足球 -->
    <select>
        <option value="足球">足球</option>
    </select>
  <hr/>
    <s:form action="" method="">
        <s:textfield name="username" label="用戶名"></s:textfield>
        <s:password name="password" label="密碼"></s:password>
        <!-- 性別 -->
    <!--顯示內(nèi)容和value值一樣  在list屬性里面 構(gòu)造一個list集合
         顯示內(nèi)容和value不一樣     在list屬性里面 構(gòu)造一個map集合
      -->
 <!-- <s:radio list="{'女','男'}" name="sex1" label="性別"></s:radio> -->
        <s:radio list="#{'nv':'女','nan':'男'}" name="sex2" label="性別"></s:radio>
        
        <s:checkboxlist list="{'足球','籃球','乒乓球'}" name="love" label="愛好">
        </s:checkboxlist>
        
        <s:select list="{'博士后','博士前','幼兒園'}" name="college" label="學(xué)歷"></s:select>
        
        <s:textarea cols="2" rows="2" name="resume" label="簡歷"></s:textarea>
        
        <s:hidden name="hid" value="hidvalue" label="隱藏"></s:hidden>
        
        <s:submit value="提交"></s:submit>
        <s:reset value="重置"></s:reset>
    </s:form>
  </body>
</html>

Struts2的表單標(biāo)簽數(shù)據(jù)回顯

現(xiàn)象: 只是校驗其中的一個輸入項是否為空,但是把其他的輸入項也清空了

演示一:使用普通的html標(biāo)簽,提交表單數(shù)據(jù)到action,進(jìn)行數(shù)據(jù)的校驗

創(chuàng)建頁面

<%@ 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 'tagCommon.jsp' starting page</title>
  </head>  
  <body>
    <s:fielderror/>  <%--真正的錯誤--%>
    <form action="${pageContext.request.contextPath }/tag1.action" method="post">
        username:<input type="text" name="username"/>
        <br/>
        password:<input type="text" name="password"/>
        <br/>
        address:<input type="text" name="address"/> 
        <br/>
        <input type="submit"/>
    </form>
  </body>
</html>

創(chuàng)建Action

package cn.itcast.tag;

import com.opensymphony.xwork2.ActionSupport;

public class Tag1Action extends ActionSupport {
    //屬性封裝方法
    private String username;
    private String password;
    private String address;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return SUCCESS;
    }
}

配置struts.xml

<action name="tag1" class="cn.itcast.tag.Tag1Action">
    <result name="success">/index.jsp</result>
    <result name="input">/tag/tagstruts2.jsp</result>
</action>

通過xml做配置校驗 Tag1Action-validation.xml放到action的包下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//Apache Struts//XWork Validator 1.0.3//EN"
  "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>用戶名不能為空xml</message>
        </field-validator>
    </field>
</validators>

演示二:使用struts2的表單標(biāo)簽,提交數(shù)據(jù)到action,進(jìn)行數(shù)據(jù)的校驗

創(chuàng)建頁面

<%@ 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 'tagCommon.jsp' starting page</title>
  </head> 
  <body>   <%--action直接寫action的名字就行 不要寫絕對路徑--%>
    <s:form action="tag1.action" method="post">
        <s:textfield name="username" label="username"></s:textfield>
        <%--寫上showPassword="true"密碼才會回顯--%>
<s:password name="password" label="password"showPassword="true"></s:password>

        <s:textfield name="address" label="address"></s:textfield>
        <s:submit value="提交"></s:submit>
    </s:form>
  </body>
</html>

創(chuàng)建Action

package cn.itcast.tag;

import com.opensymphony.xwork2.ActionSupport;

public class Tag1Action extends ActionSupport {
    //屬性封裝方法
    private String username;
    private String password;
    private String address;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return SUCCESS;
    }
}

配置struts.xml

<action name="tag1" class="cn.itcast.tag.Tag1Action">
    <result name="success">/index.jsp</result>
    <result name="input">/tag/tagstruts2.jsp</result>
</action>

通過xml做配置校驗 Tag1Action-validation.xml放到action的包下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//Apache Struts//XWork Validator 1.0.3//EN"
  "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>用戶名不能為空xml</message>
        </field-validator>
    </field>
</validators>

防止表單重復(fù)提交

防止表單重復(fù)提交原理:

使用令牌機(jī)制 javaweb原理

第一步 在表單里面做幾件事情

(1)在表單頁面中生成隨機(jī)的唯一的值 uuid
 <%
           Stirng uuid =UUID.randomUUID().toString()
%>
(2)把生成的唯一的值首先放到頁面的隱藏項里面 hidden
 <input type=”hidden” name=”id” value=”uuid”/>
(3)還要把生成的唯一的值再放到session域里面
session.setAttribute("id",uuid);

第二步 提交表單到action,

(1) 獲取隱藏項里面的uuid值

(2) 獲取session域?qū)ο罄锩娴膗uid值

(3) 比較這兩個值是否相同,如果相同,獲取表單其他值進(jìn)行操作

(4) 操作完成之后,把session域里面的值清空

(5) 如果這兩個值,不相同,不進(jìn)行操作

使用struts2防止表單重復(fù)提交

使用struts2里面攔截器實現(xiàn),token,這個token攔截器不是默認(rèn)執(zhí)行的攔截器

創(chuàng)建頁面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--引入struts標(biāo)簽--%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'form1.jsp' starting page</title>
  </head>  
  <body>
   <form action="${pageContext.request.contextPath }/formSubmit.action" method="post">
<%--使用struts標(biāo)簽token--%>
    <s:token/>  
    <input type="submit"/>
   </form>
  </body>
</html>

創(chuàng)建Action

package cn.itcast.form;

import com.opensymphony.xwork2.ActionSupport;

public class FormSubmitAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("ACTION執(zhí)行了.............");
        return SUCCESS;
    }
}

使用token攔截器 配置action

token攔截器不是默認(rèn)的所以要聲明攔截器 struts.xml

----------------------配置位置在struts.xml中<package的最上面----------------
<%--聲明token攔截器--%>
<interceptors>
        <interceptor-stack name="mytoken">
            <interceptor-ref name="token"></interceptor-ref>
<%--因為token不是默認(rèn)的所以要聲明默認(rèn)的否則默認(rèn)的會失效--%>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </interceptor-stack>
</interceptors>



--------------------配置位置在struts.xml中<package的任意位置----------------
<%--配置action--%>
<action name="formSubmit" class="cn.itcast.form.FormSubmitAction">
        <interceptor-ref name="mytoken"></interceptor-ref>
        <result name="success">/index.jsp</result>
<%--使用token攔截器之后返回的視圖不是input而是invalid.token--%>
        <result name="invalid.token">/form/form1.jsp</result>
</action>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容