非本人總結(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)大
- 支持對(duì)象方法調(diào)用屎慢,如xxx.xxx();
- 支持類(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
- 訪問(wèn)OGNL上下文(OGNL content)和ActionContent环肘;(操作值棧數(shù)據(jù))
- 支持賦值操作和表達(dá)式串聯(lián)
- 操作值棧集合對(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)容
- Root:是list集合,Struts2里面默認(rèn)操作數(shù)據(jù)都在root里面
- 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)簽里面
演示效果:
- 編寫(xiě)action,向request里面設(shè)置值
- 到j(luò)sp中獲取request域里面設(shè)置的值
- 在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ì)象有兩種
- 從request域?qū)ο罄锩娅@取
- ActionContext類(lèi)方法獲取
4秕硝、放數(shù)據(jù)到值棧有三種
- set方法
- push方法
- 創(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>