目錄
1.Action處理請(qǐng)求參數(shù)(重點(diǎn))
2.struts2類型轉(zhuǎn)換(了解)
3.struts2請(qǐng)求參數(shù)校驗(yàn)(次重點(diǎn))
復(fù)習(xí):
1.框架:是一個(gè)半成品绿贞,可以在其基礎(chǔ)上在次開發(fā)。
2.struts2框架:它是一個(gè)web層使用的mvc框架。
3.struts2核心 1.struts2核心 2.xwork核心
4.struts2入門:
1.導(dǎo)jar包
struts2/apps/strut_blank.war文件
2.需要配置struts2
1.web.xml
StrutsPrepareAndExecuteFilter
2.struts.xml
位置:src以下(clasess)
3.struts.xml文件中標(biāo)簽
<package> 用于管理action
name:包名 唯一
namespace:與action的name屬性確定訪問action的路徑. 默認(rèn)值""
extends:繼承的包名 struts-default
<action> 聲明一個(gè)action
name:action名稱 在同一個(gè)包下不能重名
class:action類全名 ActionSupport
method:action類中的方法名 方法無參數(shù)梧税,返回值為String execute
<result> 結(jié)果視圖
name:與action的method方法的返回值匹配跳轉(zhuǎn)
type:跳轉(zhuǎn)方式
在struts-default.xml文件中定義
chain 請(qǐng)求轉(zhuǎn)發(fā) action
dispatcher 請(qǐng)求轉(zhuǎn)發(fā) 頁面
redirect 重定向 頁面
redirectActiono 重定向 action
stream 下載.
5.struts2框架加載配置文件順序
1.default.properties
2.struts-default.xml struts-plugin.xml struts.xml
3.struts.properties
4.web.xml
6.定義常量
1.struts.xml
2.struts.properties
3.web.xml
7.struts2中action創(chuàng)建方式
1.pojo類
2.implements Action
3.extends ActionSupport
8.struts2中action方法訪問方式
1.method=xxx;
2.通配符
3.動(dòng)態(tài)方法調(diào)用
9.關(guān)于在struts2中獲取Servlet API
1.ActionContext
ActionContext context=ActionContext.getContext();
2.使用注入
3.ServletActionContext
1.struts2中獲取請(qǐng)求參數(shù)
在struts2中action是什么?(struts2是一個(gè)mvc框架)
V:jsp
M:action
C:action StrutsPrepareAndExecuteFilter
在struts2中獲取請(qǐng)求參數(shù):
1.屬性驅(qū)動(dòng)
1.直接將action做一個(gè)model,就可以得到請(qǐng)求參數(shù).
問題1:action封裝請(qǐng)求參數(shù)旬牲,會(huì)不會(huì)存在線程安全問題?
不會(huì):因?yàn)槊恳淮握?qǐng)求逗旁,都是一個(gè)新的action站叼。(servlet在web容器(tomcat)里只會(huì)被實(shí)例化一次例诀,在多請(qǐng)求時(shí)充易,web容器會(huì)為每個(gè)請(qǐng)求從線程池分配一個(gè)線程梗脾,多個(gè)線程共享一個(gè)servlet的實(shí)例,因此servlet是線程不安全的盹靴,比如共享狀態(tài)變量)
缺點(diǎn):需要單獨(dú)定義javaBean,將action中屬性copy到j(luò)avaBean中炸茧。
優(yōu)點(diǎn):簡單瑞妇。
這種方式 ,底層是通過反射來實(shí)現(xiàn)的梭冠。
2.在action中聲明一個(gè)model辕狰。
private User user;提供get/set方法
在頁面上使用ognl來描述
<input type="text" name="user.username">
優(yōu)點(diǎn):簡單,解決了第一種封裝的問題
缺點(diǎn):在頁面上使用了ognl表達(dá)式控漠,頁面不通用了蔓倍。
問題:這種方式,數(shù)據(jù)是怎樣封裝的?
是通過struts2中的interceptor進(jìn)行了數(shù)據(jù)封裝.
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
2.模型驅(qū)動(dòng)(在開發(fā)中應(yīng)用比較多)
步驟:
1.讓action類實(shí)現(xiàn)ModelDriven
2.重寫getModel方法
3.在action中實(shí)現(xiàn)化一個(gè)model對(duì)象盐捷,讓getModel方法返回這個(gè)對(duì)象偶翅。
public class Login3Action extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public User getModel() {
return user;
}
}
優(yōu)點(diǎn):解決了屬性驅(qū)動(dòng)存在的問題
缺點(diǎn):一次只能封裝一個(gè)model對(duì)象.
struts2 有很多圍繞模型驅(qū)動(dòng)的特性
* <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 為模型驅(qū)動(dòng)提供了更多特性
--------------------------------------------------------------------------
擴(kuò)展:
1.將數(shù)據(jù)封裝到List集合
頁面:
username1:<input type="text" name="users[0].username"><br>
password1:<input type="password" name="users[0].password"><br>
username2:<input type="text" name="users[1].username"><br>
password2:<input type="password" name="users[1].password"><br>
action類:
private List<User> users;
get/set方法
2.將數(shù)據(jù)封裝到Map集合
頁面:
username1:<input type="text" name="map['aaa'].username"><br>
password1:<input type="password" name="map['aaa'].password"><br>
username2:<input type="text" name="map['bbb'].username"><br>
password2:<input type="password" name="map['bbb'].password"><br>
action類:
private Map<String, User> map;
提供get/set
===================================================================================
struts2中提供的類型轉(zhuǎn)換
在web中我們使用beanutils直接將表單數(shù)據(jù)封裝到j(luò)avaBean中。---類型轉(zhuǎn)換
struts2中action得到請(qǐng)求參數(shù)碉渡,也可以直接封裝到j(luò)avaBean.
struts2 內(nèi)部提供大量類型轉(zhuǎn)換器聚谁,用來完成數(shù)據(jù)類型轉(zhuǎn)換問題
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 可以接收 yyyy-MM-dd格式字符串
數(shù)組 可以將多個(gè)同名參數(shù),轉(zhuǎn)換到數(shù)組中
集合 支持將數(shù)據(jù)保存到 List 或者 Map 集合
例如:日期類型滞诺,我們傳遞 yyyy-MM-dd yyyy年MM月dd日格式都可以形导,但是如果是yyyy/MM/dd
就會(huì)出現(xiàn)問題.
關(guān)于struts2中的類型轉(zhuǎn)換器:
struts2中的類型轉(zhuǎn)換器根接口是:com.opensymphony.xwork2.conversion.TypeConverter。
-------------------------------------------------------
自定義類型轉(zhuǎn)換器:
步驟:
1.創(chuàng)建一個(gè)類實(shí)現(xiàn)TypeConverter接口.
2.重寫接口中方法习霹,實(shí)現(xiàn)類型轉(zhuǎn)換操作.
3.注冊(cè)類型轉(zhuǎn)換器.
詳解說明:
1.創(chuàng)建一個(gè)自定義類型轉(zhuǎn)換器
1.實(shí)現(xiàn)TypeConverter需要重寫
public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
如果實(shí)現(xiàn)接口朵耕,這個(gè)方法參數(shù)太多(6個(gè))
2.不推薦實(shí)現(xiàn)接口,可以繼承 DefaultTypeConverter類
優(yōu)點(diǎn):重寫的方法參數(shù)沒有那么多
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}
3.個(gè)人推薦使用 繼承DefaultTypeConverter類的一個(gè)子類StrutsTypeConverter.
原因:在這個(gè)類中將從頁面?zhèn)鬟f的數(shù)據(jù)怎樣封裝序愚,以及action中的數(shù)據(jù)怎樣在頁面上顯示做了分離.
public abstract Object convertFromString(Map context, String[] values, Class toClass);
public abstract String convertToString(Map context, Object o);
2.怎樣注冊(cè)一個(gè)自定義類型轉(zhuǎn)換器.
1.局部--針對(duì)于action
配置文件所在位置以及名稱: 在Action類所在包 創(chuàng)建 Action類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉(zhuǎn)換器的全類名
2.局部--針對(duì)于model
配置文件所在位置以及名稱: 在model類所在包 創(chuàng)建 model類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉(zhuǎn)換器的全類名
3.全局
配置文件所在位置以及名稱:在src下創(chuàng)建一個(gè)xwork-conversion.properties
配置文件書寫: 格式: 要轉(zhuǎn)換的類型全名=類型轉(zhuǎn)換器的全類名
-----------------------------------------------------------------------------
注意:
對(duì)于struts2中類型轉(zhuǎn)換器憔披,如果表單數(shù)據(jù)提交時(shí),將數(shù)據(jù)向model封裝爸吮,出現(xiàn)了問題芬膝,會(huì)報(bào)錯(cuò):
No result defined for action cn.itcast.action.RegistAction and result input
上面的意思是說,在RegistAction的配置中沒有配置input結(jié)果視圖.
<action name="regist" class="cn.itcast.action.RegistAction">
<result name="input">/success.jsp</result>
</action>
如果配置了形娇,出現(xiàn)類型轉(zhuǎn)換問題锰霜,就會(huì)跳轉(zhuǎn)到input指定的視圖。
問題:為什么會(huì)向input視圖跳轉(zhuǎn)?
是因?yàn)閟truts2中的攔截器(interceptor).
在struts2中的
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
用于記錄類型轉(zhuǎn)換問題
在struts2中
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
用于得到問題桐早,向input視圖跳轉(zhuǎn)癣缅。
關(guān)于錯(cuò)誤信息展示:
通過分析攔截器作用,得知當(dāng)類型轉(zhuǎn)換出錯(cuò)時(shí)哄酝,自動(dòng)跳轉(zhuǎn)input視圖 友存,在input視圖頁面中 <s:fieldError/> 顯示錯(cuò)誤信息
* 在Action所在包中,創(chuàng)建 ActionName.properties陶衅,在局部資源文件中配置提示信息 : invalid.fieldvalue.屬性名= 錯(cuò)誤信息
如果是自定義類型轉(zhuǎn)換器屡立,出現(xiàn)類型轉(zhuǎn)換問題,要跳轉(zhuǎn)到input視圖搀军,在類型轉(zhuǎn)換器中膨俐,必須拋出異常才可以勇皇。
======================================================================================
關(guān)于struts2提供的數(shù)據(jù)校驗(yàn)
在開發(fā)中,請(qǐng)求參數(shù)是需要校驗(yàn)的焚刺。
客戶端校驗(yàn)---->js
服務(wù)器校驗(yàn)---->java代碼敛摘。
struts2中提供的校驗(yàn)-----服務(wù)器端校驗(yàn)。
分成兩種:
1.手動(dòng)校驗(yàn)(編碼校驗(yàn))
2.配置校驗(yàn)(annotation,xml) 我們講的是xml乳愉。
1.手動(dòng)校驗(yàn):(了解)
要求:action類必須繼承自ActionSupport兄淫。需要重寫一個(gè)方法 validate
通過測試發(fā)現(xiàn)在action中重寫的validate方法執(zhí)行了。并且是在請(qǐng)求處理方法(execute)之前執(zhí)行的蔓姚。
對(duì)于struts2提供的校驗(yàn)拖叙,它也是通過攔截器實(shí)現(xiàn)的。
問題:在validate方法中怎樣存儲(chǔ)校驗(yàn)錯(cuò)誤信息?
在validate方法中 this.addFieldError(Sting name,String value);
問題:在頁面上怎樣獲取錯(cuò)誤信息?(在input視圖上)
<s:fielderror> 展示所有錯(cuò)誤信息
<s:fielderror fieldName="">展示特定名稱的錯(cuò)誤信息.
------------------
問題:在同一個(gè)Action中有多個(gè)請(qǐng)求處理方法(login,regist)那么有些方法是需要校驗(yàn)的赂乐,有些是不需要的,怎樣處理?
解決方案:創(chuàng)建一個(gè)名稱叫 validate+請(qǐng)求處理方法名 例如:請(qǐng)求處理方法叫 regist() 校驗(yàn) 的方法名 validateRegist().
-------------------------------------------------------------------------------------------------------------
2.配置校驗(yàn)(xml)
struts2的校驗(yàn)框架咖气。
已經(jīng)完成了校驗(yàn)操作(做了很多校驗(yàn)方法)挨措。
而我們?cè)谑褂脮r(shí),只需要將它們調(diào)用就可以(通過配置文件)
要求:action類必須繼承自ActionSupport崩溪。
問題:配置文件怎樣配置?
位置:xml文件要與action類在同一個(gè)包下
名稱:action類名-validation.xml
約束: xwork-core-2.3.7.jar 中 xwork-validator-1.0.3.dtd 下
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
書寫:
1.根元素
<validators>
2.子元素
<field name="屬性名稱"></field>
3.<field>子元素
<field-validator type="校驗(yàn)器"> 這個(gè)是指定校驗(yàn)器
問題:校驗(yàn)器有哪些?
xwork-core-2.3.7.jar 中 /com/opensymphony/xwork2/validator/validators/default.xml下
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
4.<field-validator>子元素
<message>錯(cuò)誤信息</message>
5.<field-validator>子元素
<param name="">值</param>
用于指定校驗(yàn)器中的參數(shù).
------------------------------------------------------------------------------------------------
介紹:關(guān)于配置校驗(yàn)中的校驗(yàn)器:
* required (必填校驗(yàn)器,要求被校驗(yàn)的屬性值不能為null)
* requiredstring (必填字符串校驗(yàn)器,要求被校驗(yàn)的屬性值不能為null浅役,并且長度大于0,默認(rèn)情況下會(huì)對(duì)字符串去前后空格)
* stringlength (字符串長度校驗(yàn)器,要求被校驗(yàn)的屬性值必須在指定的范圍內(nèi)伶唯,否則校驗(yàn)失敗,minLength參數(shù)指定最小長度觉既,maxLength參數(shù)指定最大長度,trim參數(shù)指定校驗(yàn)field之前是否去除字符串前后的空格)
* regex (正則表達(dá)式校驗(yàn)器乳幸,檢查被校驗(yàn)的屬性值是否匹配一個(gè)正則表達(dá)式瞪讼,expression參數(shù)指定正則表達(dá)式,caseSensitive參數(shù)指定進(jìn)行正則表達(dá)式匹配時(shí)粹断,是否區(qū)分大小寫,默認(rèn)值為true)
* int(整數(shù)校驗(yàn)器符欠,要求field的整數(shù)值必須在指定范圍內(nèi),min指定最小值瓶埋,max指定最大值)
* double(雙精度浮點(diǎn)數(shù)校驗(yàn)器,要求field的雙精度浮點(diǎn)數(shù)必須在指定范圍內(nèi),min指定最小值,max指定最大值)
* fieldexpression (字段OGNL表達(dá)式校驗(yàn)器,要求field滿足一個(gè)ognl表達(dá)式希柿,expression參數(shù)指定ognl表達(dá)式,該邏輯表達(dá)式基于ValueStack進(jìn)行求值,返回true時(shí)校驗(yàn)通過,否則不通過)
* email(郵件地址校驗(yàn)器养筒,要求如果被校驗(yàn)的屬性值非空曾撤,則必須是合法的郵件地址)
* url(網(wǎng)址校驗(yàn)器,要求如果被校驗(yàn)的屬性值非空,則必須是合法的url地址)
* date(日期校驗(yàn)器,要求field的日期值必須在指定范圍內(nèi),min指定最小值,max指定最大值)
-------------------------------------------------------------------------------------------
問題:通過配置校驗(yàn),怎樣處理在同一個(gè)action中存在多個(gè)請(qǐng)求處理方法校驗(yàn)問題?
只需要將校驗(yàn)xml文件名稱修改就可以晕粪。
action類名-valication.xml 現(xiàn)在要對(duì)action類中某一個(gè)方法校驗(yàn)挤悉。
action類名-action名稱-validation.xml.
=================================================================================