day30_攔截器、國際化、標(biāo)簽_第1頁
day30_攔截器、國際化、標(biāo)簽_第2頁
day30_攔截器、國際化、標(biāo)簽_第3頁
day30_攔截器、國際化、標(biāo)簽_第4頁
day30_攔截器、國際化、標(biāo)簽_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、回顧:Struts第二天:Struts配置# 通配符、動(dòng)態(tài)方法調(diào)用# 全局跳轉(zhuǎn)配置、配置的默認(rèn)值、常量配置Struts核心業(yè)務(wù)# 請(qǐng)求數(shù)據(jù)的自動(dòng)封裝 (param 攔截器)# 類型轉(zhuǎn)換自動(dòng)類型轉(zhuǎn)換(struts提供)類型轉(zhuǎn)換器$ 自定義局部- ActionClassNperties$ 自定義全局-perties# 數(shù)據(jù)處理|-ActionContext |- ServletActionContext# 文件上傳與下載Jsp: Action: (上傳,攔截器完成的)Privat File file1; / 拿到上傳的文件

2、對(duì)象Private String file1FileName; / 文件名Private String file1ContentType;/類型目標(biāo):攔截器(國際化)Ognl表達(dá)式語言與Struts標(biāo)簽1. 攔截器1.1 概述 基本概念I(lǐng)ntercetor, 即為攔截器。1) 在Struts2中,把每一個(gè)功能都用一個(gè)個(gè)的攔截器實(shí)現(xiàn);用戶想用struts的哪個(gè)功能的時(shí)候,可以自由組裝使用。2)Struts2中,為了方法用戶對(duì)攔截器的引用,提供了攔截器棧的定義,里面可以包含多個(gè)攔截器。 文件夾(文件, 文件2) 攔截器棧(攔截器,攔截器2)3)Struts2中,如果用戶沒有指定執(zhí)行哪些攔截器,st

3、ruts2有一個(gè)默認(rèn)執(zhí)行的棧,defaultStack; 一旦如果用戶有指定執(zhí)行哪些攔截器,默認(rèn)的攔截器棧就不會(huì)被執(zhí)行攔截器的設(shè)計(jì),就是基于組件設(shè)計(jì)的應(yīng)用! 攔截器配置舉例struts-default.xml文件中,定義了struts提供的所有攔截器!/1. 定義攔截器以及攔截器棧 1.1 攔截器定義 1.2 攔截器棧的定義 引用了上面攔截器(1.1) 2. 默認(rèn)執(zhí)行的攔截器(棧) API|- Interceptor 攔截器接口 |- AbstractInterceptor 攔截器默認(rèn)實(shí)現(xiàn)的抽象類; 一般用戶只需要繼承此類即可繼續(xù)攔截器開發(fā)|- ActionInvocation 攔截器的執(zhí)行狀

4、態(tài),調(diào)用下一個(gè)攔截器或Action攔截器與過濾器區(qū)別:.1.2 自定義一個(gè)攔截器案例步驟:1. 寫攔截器類 (看生命周期)2. 配置/* * 自定義攔截器 * author Jie.Yuan * */public class HelloInterceptor implements Interceptor/ 啟動(dòng)時(shí)候執(zhí)行public HelloInterceptor()System.out.println(創(chuàng)建了攔截器對(duì)象);/ 啟動(dòng)時(shí)候執(zhí)行Overridepublic void init() System.out.println(執(zhí)行了攔截器的初始化方法);/ 攔截器業(yè)務(wù)處理方法 (在訪問ac

5、tion時(shí)候執(zhí)行? 在execute之前執(zhí)行?)Overridepublic String intercept(ActionInvocation invocation) throws Exception System.out.println(2. 攔截器,業(yè)務(wù)處理-開始);/ 調(diào)用下一個(gè)攔截器或執(zhí)行Action (相當(dāng)于chain.doFilter(.)/ 獲取的是: execute方法的返回值String resultFlag = invocation.invoke();System.out.println(4. 攔截器,業(yè)務(wù)處理-結(jié)束);return resultFlag;Override

6、public void destroy() System.out.println(銷毀.);1.2 攔截器執(zhí)行流程UML (時(shí)序圖)啟動(dòng):創(chuàng)建所有攔截器、執(zhí)行init()訪問:先創(chuàng)建Action,再執(zhí)行攔截器,最后:攔截器放行,執(zhí)行execute();1.3 攔截器案例需求:登陸后,顯示列表!案例準(zhǔn)備:Struts jar文件DbUtils組件數(shù)據(jù)庫連接池/ 驅(qū)動(dòng)包- login.jsp 用戶名: 密碼: UserAction.javapublic class UserAction extends ActionSupport / -1. 封裝請(qǐng)求數(shù)據(jù)-private Admin admin;p

7、ublic Admin getAdmin() return admin;public void setAdmin(Admin admin) this.admin = admin;/ -2. 調(diào)用的Service-private AdminService adminService = new AdminService();/ 登陸public String login() try Admin userInfo = adminService.login(admin);/ 判斷if (userInfo = null)/ 登陸失敗return input;/ 登陸成功:數(shù)據(jù)保存在session中Act

8、ionContext.getContext().getSession().put(userInfo, userInfo);/ 登陸成功return loginSuccess; catch (Exception e) return ERROR;/ 列表public String list() try / 查詢?nèi)縇ist list = adminService.getAll();/ 保存到requestActionContext.getContext().getContextMap().put(listAdmin, list);return list; catch (Exception e) r

9、eturn ERROR;public String add() return null; list.jsp 歡迎你,$userInfo.userName 序號(hào) 編號(hào) 用戶名 密碼 自定義攔截器public class UserCheckInterceptor extends AbstractInterceptor/* * 攔截器業(yè)務(wù)處理方法 */public String intercept(ActionInvocation invocation) throws Exception / 拿到當(dāng)前執(zhí)行的方法名:判斷,只有當(dāng)前方法名不是login,就進(jìn)行驗(yàn)證/ 獲取ActionContext對(duì)象A

10、ctionContext ac = invocation.getInvocationContext();/ 獲取action的代理對(duì)象 ActionProxy proxy = invocation.getProxy(); / 獲取當(dāng)前執(zhí)行的方法名 String methodName = proxy.getMethod(); / 判斷 if (!login.equals(methodName) / 先獲取當(dāng)前登陸的用戶 Object obj = ac.getSession().get(userInfo); if (obj = null) / 沒有登陸 return input; else / 當(dāng)

11、前用戶有登陸 return invocation.invoke(); else / 說明當(dāng)前用戶正在登陸 return invocation.invoke(); 配置攔截器!- 【執(zhí)行攔截器:第一種寫法: 當(dāng)前包下所有的acntion都執(zhí)行myStack棧】 -/error.jsp!-第二種寫法: 只是在這一個(gè)Action中執(zhí)行myStack棧 -/login.jspuser_list/WEB-INF/list.jsp2. Struts2中的國際化回顧:Servlet 中國際化:1. 寫資源文件基礎(chǔ)名.properties 【默認(rèn)的語言環(huán)境的配置】 基礎(chǔ)名_語言簡稱_國家簡稱.properti

12、es2. 讀取資源文件,再使用程序:ResourceBundleJsp: jstl提供的格式化與國際化標(biāo)簽庫。Struts2中國際化:1. 寫資源文件 (同servlet)2. 讀資源文件程序:ResourceBundle (同servlet)JSP: 1)jstl表親啊 (同servlet)2)struts標(biāo)簽獲取資源文件內(nèi)容區(qū)別:Struts2加載資源文件更加簡單!通過常量加載即可!再在jsp頁面直接使用!1. 寫資源文件Mperties 默認(rèn)的語言環(huán)境; 找不到配置就找它Msg_en_US.properties 美國-2. 加載3. 使用: 標(biāo)簽name值直接寫配置文件中的k

13、ey另外一點(diǎn),(推薦)加載資源文件通過常量加載還可以在頁面加載, 這樣用: 標(biāo)簽必須放到標(biāo)簽體中。3. Ognl表達(dá)式語言概述l OGNL表達(dá)式 OGNL是Object Graphic Navigation Language(對(duì)象圖導(dǎo)航語言)的縮寫,它是一個(gè)開源項(xiàng)目。 Struts2框架使用OGNL作為默認(rèn)的表達(dá)式語言。l OGNL優(yōu)勢 1、支持對(duì)象方法調(diào)用,如xxx.doSomeSpecial(); 2、支持類靜態(tài)的方法調(diào)用和值訪問,表達(dá)式的格式: 類全名(包括包路徑)方法名 | 值名,例如: java.lang.Stringformat(foo %s, bar) 或tutorial.MyC

14、onstantAPP_NAME; 3、支持賦值操作和表達(dá)式串聯(lián),如price=100, discount=0.8, calculatePrice(),這個(gè)表達(dá)式會(huì)返回80; 4、訪問OGNL上下文(OGNL context)和ActionContext; 5、操作集合對(duì)象。l 總結(jié) OGNL 有一個(gè)上下文(Context)概念,說白了上下文就是一個(gè)MAP結(jié)構(gòu),它實(shí)現(xiàn)了 java.utils.Map 的接口。 OgnlContext對(duì)象分析: Struts框架默認(rèn)就支持Ognl表達(dá)式語言。(struts必須引用的包:ognl.jar) 作用頁面取值用。El表達(dá)式語言,用于頁面取值,jsp頁面取值

15、的標(biāo)準(zhǔn)。(默認(rèn)直接可以使用) (應(yīng)用范圍更廣。)Ognl表達(dá)式語言, struts標(biāo)簽?zāi)J(rèn)支持的表達(dá)式語言。 必須配置struts標(biāo)簽用,不能離開struts標(biāo)簽直接用。OgnlContext對(duì)象(了解)OgnlContext對(duì)象是ognl表達(dá)式語言的核心。源碼類:public class OgnlContext extends Object implements Map.硬編碼方式,了解OgnlContext對(duì)象:/ OgnlContext用法public class OgnlDemo1 /* * 1. Ognl表達(dá)式語言語言取值,取非根元素的值,必須用#號(hào) * throws Excepti

16、on */Testpublic void testOgnl() throws Exception / 創(chuàng)建一個(gè)Ognl上下文對(duì)象OgnlContext context = new OgnlContext();/ 放入數(shù)據(jù)User user = new User();user.setId(100);user.setName(Jack);/ 【往非根元素放入數(shù)據(jù), 取值的時(shí)候表達(dá)式要用#】context.put(user, user);/ 獲取數(shù)據(jù)(map)/ 先構(gòu)建一個(gè)Ognl表達(dá)式, 再解析表達(dá)式Object ognl = Ognl.parseExpression(#);Ob

17、ject value = Ognl.getValue(ognl, context, context.getRoot();System.out.println(value);/* * 2. Ognl表達(dá)式語言語言取值,取根元素的值,不用帶#號(hào) * throws Exception */Testpublic void testOgn2() throws Exception / 創(chuàng)建一個(gè)Ognl上下文對(duì)象OgnlContext context = new OgnlContext();/ 放入數(shù)據(jù)User user = new User();user.setId(100);user.setName(J

18、ack);/ 【往根元素放入數(shù)據(jù)】context.setRoot(user);/ 獲取數(shù)據(jù)(map)/ 先構(gòu)建一個(gè)Ognl表達(dá)式, 再解析表達(dá)式Object ognl = Ognl.parseExpression(vince);Object value = Ognl.getValue(ognl, context, context.getRoot();System.out.println(value);/* * 3.Ognl對(duì) 靜態(tài)方法調(diào)用的支持 * throws Exception */Testpublic void testOgn3() throws Exception

19、 / 創(chuàng)建一個(gè)Ognl上下文對(duì)象OgnlContext context = new OgnlContext();/ Ognl表單式語言,調(diào)用類的靜態(tài)方法/Object ognl = Ognl.parseExpression(Mathfloor(10.9);/ 由于Math類在開發(fā)中比較常用,所以也可以這樣寫Object ognl = Ognl.parseExpression(floor(10.9);Object value = Ognl.getValue(ognl, context, context.getRoot();System.out.println(value);ValueStack對(duì)

20、象ValueStack, 即值棧對(duì)象。值棧對(duì)象:是整個(gè)struts數(shù)據(jù)存儲(chǔ)的核心,或者叫中轉(zhuǎn)站。用戶每次訪問struts的action,都會(huì)創(chuàng)建一個(gè)Action對(duì)象、值棧對(duì)象、ActionContext對(duì)象; 然后把Action對(duì)象放入值棧中; 最后再把值棧對(duì)象放入request中,傳入jsp頁面。(key: struts.valueStack); 開發(fā)者只需要通過ActionContext對(duì)象就可以訪問struts的其他的關(guān)鍵對(duì)象。 (ActionContext是給開發(fā)者用的,便于學(xué)習(xí)與使用。)ActionRequest|-ValueStack|-ActionActionContextVal

21、ueStack只要記住值棧中有List 和Map兩個(gè)東西,Map是存放request,session,application等域?qū)ο蟮牡胤?,而list是存放各種常量,變量|-ObjectStack(把動(dòng)作和相關(guān)對(duì)象壓入ObjectStack)是一個(gè)List|-ContextMap(把各種各樣的映射關(guān)系壓入ContextMap中)問題:OgnlContext與ValueStack對(duì)象的關(guān)系?值棧中包含有OgnlContext對(duì)象Ognl是一個(gè)Map結(jié)構(gòu)的數(shù)據(jù)存儲(chǔ)中心Struts標(biāo)簽Struts標(biāo)簽取值,就使用了Ognl表達(dá)式語言。對(duì)ValueStack的深入理解ValueStack是一個(gè)接口,而

22、OgnlValueStack是strtus2中的缺省實(shí)現(xiàn)。ValueStack中的數(shù)據(jù),分兩個(gè)部分存放:root(CompoundRoot)和context(OgnlContext)(這與OGNL中的概念一致),同時(shí)ValueStack暴露相關(guān)的接口:void setValue(String expr, Object value);Object findValue(String expr);用來通過OGNL表達(dá)式對(duì)ValueStack中的數(shù)據(jù)進(jìn)行操作!ValueStack中的root對(duì)象是CompoundRoot,CompoundRoot繼承了ArraryList,提供了額外的方法:push(

23、)和pop()方法,用來對(duì)root對(duì)象中所包含的數(shù)據(jù)進(jìn)行存??!在Struts2中,一個(gè)請(qǐng)求在最終到達(dá)Action的方法之前,Action對(duì)象本身會(huì)被壓入ValueStack(實(shí)際上就是放到ValueStack的CompoundRoot中),所以Action對(duì)象是CompoundRoot中的一個(gè)元素??磮D看下面的代碼:public class UserAction private String username; private Integer age; private boolean valid; /查看用戶的詳細(xì)信息 public String detail()username = 張三;

24、age = 18; valid = true; return detail; 不加#號(hào)取根元素值在Action中,給Action的username/age/valid賦值。Detail頁面如下:username: valid: age: 上述JSP頁面將能正確將它們的值取出。在s:property標(biāo)簽中的OGNL表達(dá)式,最終會(huì)交給ValueStack來解釋。username就是一個(gè)OGNL表達(dá)式,意思是調(diào)用root對(duì)象的getUsername()方法。Struts2將自動(dòng)搜索CompoundRoot中有哪些元素(從第0個(gè)元素開始搜索),檢測這些元素是否有g(shù)etUsername()方法,如果第0

25、個(gè)元素沒有g(shù)etUsername()方法,將繼續(xù)搜索第1、2、3個(gè)元素是否有g(shù)etUsername()方法。再看下面的例子:public class UserAction private String username; private String name; /查看用戶的詳細(xì)信息 public String detail() username = 張三; name = 王五; User u = new User(); u.setUsername(趙毅); ActionContext.getContext().getValueStack().push(u); return detail; 這

26、個(gè)例子通過ValueStack的接口方法push(object)往ValueStack中推入U(xiǎn)ser的實(shí)例對(duì)象。在上面這個(gè)UserAction的代碼中,我們直接調(diào)用ActionContext.getContext().getValueStack().push()方法,把一個(gè)User對(duì)象(這個(gè)對(duì)象擁有g(shù)etUsername()和setUsername()方法)直接壓入到ValueStack中,這時(shí)候,在ValueStack的CompoundRoot中將有兩個(gè)元素:第0個(gè)元素是剛剛壓入的user對(duì)象趙毅,而第1個(gè)元素是userAction對(duì)象張三,如果在JSP中使用下面的表達(dá)式來取值: ,那么輸出

27、的值將是“趙毅”!道理上面已經(jīng)講過了,struts2將會(huì)從第0個(gè)元素開始搜索CompoundRoot中的對(duì)象,第0個(gè)元素正是剛剛壓入的那個(gè)user對(duì)象!如果在JSP中使用來取值,將取出“王五”,因?yàn)榈?個(gè)元素user對(duì)象沒有name屬性,所以,會(huì)繼續(xù)搜索第1個(gè)元素userAction對(duì)象,在這個(gè)對(duì)象中就有name屬性了!存儲(chǔ)的自定義字段即通過ValueStack的Set方法設(shè)置的東西,都會(huì)放到棧的HashMap中深入理解ActionContextActionContext.getContext().getValueStack();我們知道ActionContext有一個(gè)getContext方法

28、用來獲取OgnlContext對(duì)象,OgnlContext中有g(shù)etValueStack方法,可以通過該方法獲得值棧對(duì)象(ValueStack)OgneContext.getValueStack();獲得值棧,但是這個(gè)方法只是方便調(diào)試用;實(shí)際上,我們獲得ValueStack,只能用request.getAttribute(“struts.valueStack”);再來重點(diǎn)觀察OgnlContext這個(gè)非常重要的容器:OgnlContext實(shí)現(xiàn)了Map接口,這里_values私有屬性存放的是Map的鍵值對(duì)信息,我們展開里面的table節(jié)點(diǎn)觀察里面存放了什么秘密:6、我只是展開了部分,從中我們可以

29、看出Struts2放置請(qǐng)求表單參數(shù)、請(qǐng)求對(duì)象本身、session對(duì)象、application對(duì)象和application對(duì)象屬性等等到OGNL棧(事實(shí)上放在OgnlContex).Struts 2 places request parameters and request, session, and application attributes on the OGNL stack (in fact the OGNL context).小結(jié):1、Struts2數(shù)據(jù)傳輸DataTransfer的核心對(duì)象是OgnlValueStack、OgnlContext,OgnlValueStack持有Ognl

30、Context和root對(duì)象,注意:OgnlContext和root對(duì)象是ognl的核心要素【參考我的轉(zhuǎn)載2、OgnlContext這個(gè)容器存放了所有本次Web請(qǐng)求響應(yīng)的所有相關(guān)信息對(duì)象,root的存放的多個(gè)根對(duì)象。3、Struts2 Ognl表達(dá)式的解析主要依賴OgnlValueStack去完成。表達(dá)式中如果沒有帶#,如:“”,那么OgnlValueStack將去根對(duì)象中去遍歷每個(gè)對(duì)象看是否某個(gè)對(duì)象的方法是否匹配emp.getName(),匹配則執(zhí)行,否則跑出OgnlExcpetion異常。如果帶有#,則去Ognl上下文中去尋找是否有滿足屬性的key,有責(zé)返回。4、Struts2的ActionContext類只是為了訪問ValueStack而提供的一個(gè)Facade【門面設(shè)計(jì)模式】,為程序員訪問各種信息提供一個(gè)一致的界面。5、使用Ognl表達(dá)式從OgnlValueStack中取出值:代碼:深入理解Struts遍歷在Action中定義,直接在棧頂?shù)脑匾?,獲取Map中的對(duì)象不同屬性studentMap=newHashMap();studentMap.put(student1,newStudent(newLong(1),20034140201,張三1,男,25);studentMap.put(student2,newStudent(newLon

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論