Struts2--day04

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


記筆記啊記筆記

Ognl的簡(jiǎn)介

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

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

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

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

Ognl入門(mén)案例

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

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

<%@ 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)用對(duì)象的方法
        計(jì)算字符串長(zhǎng)度
        String str = "aa";
        str.length();
     -->
    <s:property value="'itcast'.length()"/>    
    <hr/>
    <%--調(diào)用靜態(tài)方法  格式:@[類(lèi)全名(包括包路徑)]@[方法名] --%> 
    <s:property value="@java.lang.Math@random()"/>
  </body>
</html>

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

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

值棧

什么是值棧

值棧是數(shù)據(jù)的中轉(zhuǎn)戰(zhàn)妖枚,類(lèi)似于域?qū)ο笸⒕剩安僮鳎梢韵蛴驅(qū)ο罄锩嬖O(shè)置值绝页,可以從域?qū)ο罄锩娅@取值荠商。向域?qū)ο笤O(shè)置值,從域?qū)ο螳@取值续誉。獲取值棧的數(shù)據(jù)莱没,可以通過(guò)struts2標(biāo)簽和ognl表達(dá)式獲取。

每次訪問(wèn)action的時(shí)候酷鸦,都會(huì)創(chuàng)建action實(shí)例饰躲,每個(gè)action實(shí)例里面只有一個(gè)值棧對(duì)象(valueStack對(duì)象)

在action實(shí)例中,值棧是如何存在的臼隔?

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

獲取值棧對(duì)象方法

第一種

從request域?qū)ο罄锩媸褂胓etAttribute獲取摔握,名稱(chēng)為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;
/**
 * 獲取值棧對(duì)象的兩種方式
 */
public class StackDemo1 extends ActionSupport {

    private String name;
    
    @Override
    public String execute() throws Exception {
        //第一種 從request域?qū)ο罄锩媸褂胓etAttribute獲取,名稱(chēng)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();
        //每個(gè)action實(shí)例中只有一個(gè)值棧對(duì)象
        //值是 true泊愧,表示是一個(gè)對(duì)象
        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ū)ο罄锩媸⒄@個(gè)數(shù)據(jù)存到context里面删咱,context里面的Map結(jié)構(gòu),key名稱(chēng)為request豪筝、session痰滋、Application摘能、attr、parameters

值棧

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

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

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

第三種 在action中創(chuàng)建對(duì)象,生成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)建對(duì)象
    private User user = new User();
    //生成對(duì)象的get和set方法
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

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

        //第三種 在action中創(chuàng)建對(duì)象著蟹,生成get和set方法
        //演示效果: 向值棧中放對(duì)象墩蔓,在頁(yè)面中獲取對(duì)象值   
        //棧特點(diǎn):后進(jìn)先出      
        //向值棧的user對(duì)象里面設(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)建頁(yè)面 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ù)寫(xiě)法-->
--%>
    <!-- 獲取值棧的user對(duì)象中的值 -->
<%--
<s:property value="user.username"/>
    --
<s:property value="user.password"/> 
--%>
    ${itcast }<%--EL表達(dá)式直接獲取數(shù)據(jù)-->
  </body>
</html>

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

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里面的值:對(duì)象和list集合

獲取值棧的root的對(duì)象的值

<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)建多個(gè)user對(duì)象,放到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頁(yè)面
<%@ 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里面的值:對(duì)象和list集合

獲取值棧的context里面的對(duì)象

第一步 創(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里面放對(duì)象
 */
public class StackDemo4 extends ActionSupport {
    
    @Override
    public String execute() throws Exception {
        //創(chuàng)建對(duì)象
        User user = new User();
        user.setUsername("mary");
        user.setPassword("520");
        //把對(duì)象放到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頁(yè)面
<%@ 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里面的對(duì)象的值
        獲取context里面值萧豆,首先 #
        request :是context里面key的名稱(chēng)

        #request.userrequest : 獲取request域里面名稱(chēng)是userrequest的對(duì)象
        #request.userrequest.username: 獲取域?qū)ο罄锩鎸?duì)象的屬性值
     -->
   <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)建對(duì)象
        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頁(yè)面
<%@ 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ù)

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

增強(qiáng)邏輯:首先調(diào)用getAttribute獲取域?qū)ο罄锩娴闹担绻@取了值涮雷,直接返回阵面;如果獲取不到域?qū)ο蟮闹担@取到值棧對(duì)象洪鸭,從值棧中把值取出來(lái)样刷,賦值給域?qū)ο笾械膮?shù)數(shù)據(jù)。所以览爵,通過(guò)EL表達(dá)式就可以獲取值棧數(shù)據(jù)置鼻。

Ognl中#的使用

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

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

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

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

演示效果:

  1. 編寫(xiě)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;
/**
 * 編寫(xiě)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頁(yè)面

<%@ 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ù),
    不能直接寫(xiě)ognl表達(dá)式俱济,因?yàn)樽鳛槠胀ㄗ址@示嘶是,
    要讓是一個(gè)ognl,使用%{ognl表達(dá)式}
    <s:textfield> 類(lèi)似于 <input type="text" value=""/>
 -->
    用戶(hù)名: <s:textfield value="%{#request.username}"></s:textfield>
  </body>
</html>

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

在國(guó)際化資源文件中使用

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

在頁(yè)面

<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á)式的一部分聂喇,是獨(dú)立的項(xiàng)目,經(jīng)常和Struts2的標(biāo)簽一起使用左医,獲取值棧

2授帕、值棧

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

每個(gè)Action對(duì)象里面都只有一個(gè)值棧對(duì)象跛十,在值棧request域里面

3、獲取值棧對(duì)象有兩種

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

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

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

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

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

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

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)簽庫(kù)

通用標(biāo)簽庫(kù)

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

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

介紹

Html中表單標(biāo)簽

Form :屬性 action矢渊、method、enctype

在form里面有很多的輸入項(xiàng)

大部分在input里面 type=””

text : 普通輸入項(xiàng)

password :密碼輸入項(xiàng)

radio :?jiǎn)芜x輸入項(xiàng)

checkbox:復(fù)選框

file: 文件上傳項(xiàng)

hidden:隱藏項(xiàng)

button:普通按鈕

submit: 提交按鈕

reset: 重置按鈕

select : 下拉輸入框

textarea:文本域

struts2的表單標(biāo)簽對(duì)應(yīng)的輸入項(xiàng)枉证,沒(méi)有文件上傳輸入項(xiàng)

struts2表單標(biāo)簽實(shí)現(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="用戶(hù)名"></s:textfield>
        <s:password name="password" label="密碼"></s:password>
        <!-- 性別 -->
    <!--顯示內(nèi)容和value值一樣  在list屬性里面 構(gòu)造一個(gè)list集合
         顯示內(nèi)容和value不一樣     在list屬性里面 構(gòu)造一個(gè)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="愛(ài)好">
        </s:checkboxlist>
        
        <s:select list="{'博士后','博士前','幼兒園'}" name="college" label="學(xué)歷"></s:select>
        
        <s:textarea cols="2" rows="2" name="resume" label="簡(jiǎn)歷"></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)象: 只是校驗(yàn)其中的一個(gè)輸入項(xiàng)是否為空矮男,但是把其他的輸入項(xiàng)也清空了

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

創(chuàng)建頁(yè)面

<%@ 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/>  <%--真正的錯(cuò)誤--%>
    <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>

通過(guò)xml做配置校驗(yàn) 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>用戶(hù)名不能為空xml</message>
        </field-validator>
    </field>
</validators>

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

創(chuàng)建頁(yè)面

<%@ 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直接寫(xiě)action的名字就行 不要寫(xiě)絕對(duì)路徑--%>
    <s:form action="tag1.action" method="post">
        <s:textfield name="username" label="username"></s:textfield>
        <%--寫(xiě)上showPassword="true"密碼才會(huì)回顯--%>
<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>

通過(guò)xml做配置校驗(yàn) 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>用戶(hù)名不能為空xml</message>
        </field-validator>
    </field>
</validators>

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

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

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

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

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

第二步 提交表單到action秒赤,

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

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

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

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

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

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

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

創(chuàng)建頁(yè)面

<%@ 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>
<%--因?yàn)閠oken不是默認(rèn)的所以要聲明默認(rèn)的否則默認(rèn)的會(huì)失效--%>
            <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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饲做,隨后出現(xiàn)的幾起案子线婚,更是在濱河造成了極大的恐慌,老刑警劉巖盆均,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞弊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泪姨,警方通過(guò)查閱死者的電腦和手機(jī)游沿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肮砾,“玉大人诀黍,你說(shuō)我怎么就攤上這事≌檀Γ” “怎么了眯勾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵枣宫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吃环,道長(zhǎng)也颤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任郁轻,我火速辦了婚禮翅娶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘范咨。我一直安慰自己故觅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布渠啊。 她就那樣靜靜地躺著,像睡著了一般权旷。 火紅的嫁衣襯著肌膚如雪替蛉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天拄氯,我揣著相機(jī)與錄音,去河邊找鬼。 笑死蚤霞,一個(gè)胖子當(dāng)著我的面吹牛奈搜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鄙麦,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼典唇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了胯府?” 一聲冷哼從身側(cè)響起介衔,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骂因,沒(méi)想到半個(gè)月后炎咖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寒波,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年乘盼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俄烁。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绸栅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猴娩,到底是詐尸還是另有隱情阴幌,我是刑警寧澤勺阐,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站矛双,受9級(jí)特大地震影響渊抽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜议忽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一懒闷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栈幸,春花似錦愤估、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芍锚,卻和暖如春昔园,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背并炮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工默刚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逃魄。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓荤西,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伍俘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邪锌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容