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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

6、public void destroy() System.out.println(銷毀.);1.2 攔截器執(zhí)行流程UML (時序圖)啟動:創(chuàng)建所有攔截器、執(zhí)行init()訪問:先創(chuàng)建Action,再執(zhí)行攔截器,最后:攔截器放行,執(zhí)行execute();1.3 攔截器案例需求:登陸后,顯示列表!案例準備:Struts jar文件DbUtils組件數(shù)據(jù)庫連接池/ 驅動包- login.jsp 用戶名: 密碼: UserAction.javapublic class UserAction extends ActionSupport / -1. 封裝請求數(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 序號 編號 用戶名 密碼 自定義攔截器public class UserCheckInterceptor extends AbstractInterceptor/* * 攔截器業(yè)務處理方法 */public String intercept(ActionInvocation invocation) throws Exception / 拿到當前執(zhí)行的方法名:判斷,只有當前方法名不是login,就進行驗證/ 獲取ActionContext對象A

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

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

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

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

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

15、的標準。(默認直接可以使用) (應用范圍更廣。)Ognl表達式語言, struts標簽默認支持的表達式語言。 必須配置struts標簽用,不能離開struts標簽直接用。OgnlContext對象(了解)OgnlContext對象是ognl表達式語言的核心。源碼類:public class OgnlContext extends Object implements Map.硬編碼方式,了解OgnlContext對象:/ OgnlContext用法public class OgnlDemo1 /* * 1. Ognl表達式語言語言取值,取非根元素的值,必須用#號 * throws Excepti

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

17、ject value = Ognl.getValue(ognl, context, context.getRoot();System.out.println(value);/* * 2. Ognl表達式語言語言取值,取根元素的值,不用帶#號 * throws Exception */Testpublic void testOgn2() throws Exception / 創(chuàng)建一個Ognl上下文對象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)/ 先構建一個Ognl表達式, 再解析表達式Object ognl = Ognl.parseExpression(vince);Object value = Ognl.getValue(ognl, context, context.getRoot();System.out.println(value);/* * 3.Ognl對 靜態(tài)方法調(diào)用的支持 * throws Exception */Testpublic void testOgn3() throws Exception

19、 / 創(chuàng)建一個Ognl上下文對象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對

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

21、ueStack只要記住值棧中有List 和Map兩個東西,Map是存放request,session,application等域對象的地方,而list是存放各種常量,變量|-ObjectStack(把動作和相關對象壓入ObjectStack)是一個List|-ContextMap(把各種各樣的映射關系壓入ContextMap中)問題:OgnlContext與ValueStack對象的關系?值棧中包含有OgnlContext對象Ognl是一個Map結構的數(shù)據(jù)存儲中心Struts標簽Struts標簽取值,就使用了Ognl表達式語言。對ValueStack的深入理解ValueStack是一個接口,而

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論