




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Struts2 技術(shù)1. Struts2 概述1.1. 什么是struts2 框架1.1.1. 概念Struts2 是一個非常優(yōu)秀的 MVC 框架,基于 M2 設(shè)計模型解釋:框架:框架是可以重復(fù)使用的一些或一整套代碼,通常與具體業(yè)務(wù)無關(guān),也可以認(rèn)為是軟件的半成品??蚣艿暮锰幨牵嚎梢蕴岣唛_發(fā)效率,簡化開發(fā)過程。舉一個現(xiàn)實(shí)世界的例子:l你組裝一臺電腦,你需要去再去制造主板、CPU 或機(jī)箱么?你只需要將這些電腦的半成品,按照其規(guī)范(規(guī)矩),組裝到一起就行了。這樣比你從 0 開始來制造一臺電腦是不是快多了?lMVC:全名是 MView Controller,是模型(m)視圖(view)器(contro
2、ller)的縮寫,是一種軟件設(shè)計模式,或軟件設(shè)計思想。優(yōu)點(diǎn)是:代碼結(jié)構(gòu)更加清晰,為了更好維護(hù)和擴(kuò)展:nnn模型:負(fù)責(zé)數(shù)據(jù)處理。視圖:負(fù)責(zé)頁面數(shù)據(jù)的顯示。:負(fù)責(zé)調(diào)度不同的邏輯代碼。MVC 的設(shè)計模式在很多語言中都有實(shí)現(xiàn),如 java,.net 等JSP 規(guī)范提出了兩種用 JSP 技術(shù)建立應(yīng)用程序的開發(fā)模式,分別稱作 JSP M1 和 JSPMnn2:MM1: JSP (、顯示)+ JavaBean (數(shù)據(jù)處理)2 : Servlet ()+ JSP(顯示) + JavaBean(數(shù)據(jù)處理)-符合 MVC思想架構(gòu)模式。頁1Java web 企業(yè)應(yīng)用開發(fā)根據(jù)又根據(jù) M結(jié)構(gòu)體系(來自于 JavaEE
3、規(guī)范):2(也可以說是根據(jù) MVC 思想)制定了三層n 表現(xiàn)層(頁面數(shù)據(jù)顯示、頁面跳轉(zhuǎn)調(diào)度)jsp/servletn 業(yè)務(wù)層(業(yè)務(wù)處理和功能邏輯、事務(wù))-servicen 持久層(數(shù)據(jù)存取和封裝、和數(shù)據(jù)庫打交道)dao【注意】Struts2 是一個表現(xiàn)層框架 ,用來簡化表現(xiàn)層代碼開發(fā)的。1.1.2. Struts2 的前世今生(了解)由傳統(tǒng) Struts1 和 WebWork 兩個經(jīng)典框架發(fā)展而來。Java 興起 98 年 (最早進(jìn)行 java 開發(fā)分方向 j2se 、j2ee、J2EE 企業(yè)級應(yīng)用軟件開發(fā)j2me )2000 年左右出現(xiàn) struts1 (幾乎所有開發(fā)都在用 ) struts
4、1 設(shè)計有缺陷Webwork 出現(xiàn), 設(shè)計思想比 struts1 先進(jìn)的多 ,引入器機(jī)制、 ognl 表達(dá)式語言struts2 是在 struts 1 和 WebWork 的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的 Struts 2 框架,Struts 2以 WebWork 為兩個框架均源自 xwork 命令模式框架),但開發(fā)流程類似于 struts1(讓開發(fā)平滑過度)。頁 21.2. 開發(fā)包相關(guān)1.2.1. 開發(fā)包官網(wǎng)地址:提供了兩大系列版本:Struts1 框架最新版本 1.3.10Struts2 框架最新版本 2.3.16llstruts2 開發(fā)包:本次課程使用的版本是:頁 3關(guān)于版
5、本的問題:不同版本的框架會有不同的特性,不一定是最新的版本就適合使用。擴(kuò)展閱讀:關(guān)于 struts2 的漏洞:1.2.2. 開發(fā)包結(jié)構(gòu)struts2 開發(fā)包的目錄結(jié)構(gòu):lapps 該文件夾包含了基于的(導(dǎo)入 jar 包)struts2的示例應(yīng)用,這些示例應(yīng)用對于學(xué)習(xí)者是非常有用ldocs 該文件夾下包含了 struts2 相關(guān)文檔,包括 struts2 快速入門、struts2 的文檔以及API 文檔等lllib 該文件夾下包含了 Struts2 框架和類庫,以及 struts2 第插件類庫src 該文件夾下包含了 Struts2 框架的全部源代碼提示:開發(fā)時沒必要將 lib 目錄下 jar
6、文件全部blank.war 中的 jar。到項目中,課程中將使用 apps 中 struts2-了解軟件開源協(xié)議:GPLLGPLAPACHE2.0頁 42. 快速入門2.1. 入門理論Struts2 的基本運(yùn)行流程圖:因此:所有的重復(fù)代碼都交給前端處理相關(guān)代碼即可。器去調(diào)用完成,開發(fā)者只需要在 Aciton 中編寫業(yè)務(wù)頁 52.2. Hello World-入門示例開發(fā)步驟:.5.6.創(chuàng)建 WEB 工程導(dǎo)入必要 jar 包(struts2 開發(fā) jar 包) 編寫 JSP 頁面編寫 Action 服務(wù)器端處理邏輯進(jìn)行框架配置 web.xml、struts.xml運(yùn)試1.創(chuàng)建 WE
7、B 工程:開發(fā)工具為 MyEclise10.7注意兩個地方:ll選擇 JEE5.0 的版本(如果是 myeclipse2014,則需要選擇 servlet 版本 2.5)編譯器版本選擇 jdk6(jdk5 對注解支持不是很好)2.導(dǎo)入必要 jar 包(struts2 開發(fā) jar 包)到示例工程里面找,位置:apps/struts2_blank.war/WEB-INF/lib/頁 6共 13 個 jar 包。jar 包的介紹:lllllasm-*.jar:字節(jié)碼操作類庫 (.class 文件)commons-fileupload-1.2.2.jar:文件上傳組件,2.1.6 版本后需要加入此文
8、件。commons-io-2.0.1.jar:傳文件依賴的 jar 包。commons-lang-2.5.jar:對 java.lang 包的增強(qiáng),主要是提供字符串等操作的公用方法。commons-logging-1.1.x.jar:ASF的日志包,Struts 2 框架使用這個日志包來支持Log4J 和 JDK 1.4+的日志。(JCL,java 通用日志接口)lfreemarker-2.3.*.jar:模版引擎,struts2的模板使用 FreeMarker 編寫。庫,依賴 freemarker ,Struts 2 的 UIllljavassist*.jar 生成的類庫。log4j*.ja
9、r:一個日志實(shí)現(xiàn)。ognl-3.0.x.jar:OGNL 對象圖導(dǎo)航語言(Object Graph Navigation Language), struts2 框架通過其讀寫對象的屬性。(類似于 EL 但更強(qiáng)大)llstruts2-core-2.3.x.jar:Struts 2 框架的類庫。xwork-core-2.3.x.jar:Command 命令模式框架, Struts2 和WebWork 都基于和依賴xwork。3.編寫 JSP 頁面編寫 hello.jsp (發(fā)起請求頁面)【擴(kuò)展回顧】:如何在 jsp 中發(fā)起請求:llform 表單提交,采用的是 get 或 post 請求超<
10、a>,采用的是 get 請求提示中的.action 后綴是 struts2 的推薦寫法。默認(rèn)情況下框架接受以.action 請求,頁 7并進(jìn)行處理。success.jsp(結(jié)果頁面)4.編寫 Action 服務(wù)器端處理邏輯提示:struts2 的 Action 類似以前編寫的 Servlet 程序,可以處理用戶提交請求,頁面跳轉(zhuǎn)。5.進(jìn)行框架配置 web.xml、struts.xml先在 web.xml 中配置 struts2 的器,添加的過濾器如下:提示:建議從 struts2-blank.war 中的 web.xml過來再配置 struts2 的配置文件 struts.xml。在 s
11、rc 下新建 struts.xml 文件:頁 8提示:可以直接從 struts2-blank.war 的 classes 中過來。6.運(yùn)試將工程部署到 tomcat 中進(jìn)試:【兩個額外的知識點(diǎn)】:lDTD 約束提示配置:配置文件 struts.xml 無提示問題解決?!咀⒁狻颗渲?struts.xml DTD 提示:struts.xml 引入 DTD 約束 (限制如何配置這個文件 )nn如果電腦可以聯(lián)網(wǎng),自動從網(wǎng)上DTD,緩存提供提示如果電腦沒有聯(lián)網(wǎng),在本地配置 DTD 文件位置,提供本地提示頁 9struts-srccoresrcmainresourcesl 源碼關(guān)聯(lián)問題頁
12、102.3. 調(diào)用流程分析3. Struts2 運(yùn)行原理3.1. 內(nèi)部運(yùn)行流程圖StrutsPrepareAndExecuteFilter (準(zhǔn)備 和執(zhí)行):它是 Struts2 的器,它采用前端 器模式,對用戶的請求進(jìn)行處理。相當(dāng)于我們的學(xué)校的前臺。Interceptor多內(nèi)置器,Struts2 可復(fù)用的代碼功能都是基于(通過)它來實(shí)現(xiàn)的。struts2 有很器,用來實(shí)現(xiàn)不同的功能。我們看看有哪些默認(rèn)的器:參考 struts-core.jar 提供 struts-default.xml 配置文件頁 11默認(rèn)情況下,每個 Action,默認(rèn)器 defaultStack 都會執(zhí)行。通過斷點(diǎn)調(diào)試發(fā)
13、現(xiàn):其中包含的這些器都會依次執(zhí)行(按照從上倒下的順序),即可依次實(shí)現(xiàn)不同的功能。 而這些功能都是通用的、經(jīng)常用到的(重復(fù)的),都由現(xiàn)。器來實(shí)Action 是執(zhí)行具體的業(yè)務(wù)邏輯代碼的,它在器之后執(zhí)行。3.2. Config Brower 插件(了解)struts2 的配置查看工具。知識點(diǎn):如何使用 struts2 的插件。插件的安裝,只需要將到工程的 lib 中即可。導(dǎo)入插件包 ,啟動項目 ,:http:/項目名稱:端口/config-browser/index.action通過路徑,查看 struts2 Action 配置加載情況頁 124. Struts2 常用配置4.1. 框架配置文件種類
14、和加載順序配置文件的加載順序(6 種兩大類):第一類:框架內(nèi)置的配置文件:lStruts2 框架內(nèi)置的常量配置文件: perties , 位于 struts-core.jar 包的org.apache.struts2 包Struts2 框架內(nèi)置的用:定義了一些常量(鍵值對)。一些功能開關(guān)。配置文件:struts-default.xml,位于 struts-core.jar 包l用:定義了 Bean 元素、結(jié)果集類型、器等。注意默認(rèn)包:在 struts2 的框架體系中,package 主要是用來實(shí)現(xiàn)一些配置的復(fù)用,在使用時編寫子包來繼承 struts-default。lSt
15、ruts2 框架插件配置文件:struts-plugin.xml,位于每個插件包的根目錄。作用:用于擴(kuò)展插件的一些配置。第二大類:用戶自定義的配置文件:l用戶自定義文件配置:struts.xml,位于用戶工程的 src相關(guān)配置,如配置 package、action 等。用:用于用戶開發(fā)的l用戶自定義常量配置文件:perties,一般位于用戶工程的 src 下。只能用于配置一些常量(覆蓋內(nèi)置的常量)web.xml 中配置 struts2 常量(了解)l頁13【注意】1 配置文件加載的順序問題:后加載的配置文件的配置內(nèi)容,可以覆蓋先加載的配置文件的配置內(nèi)容。因此,自定義的可以覆
16、蓋默認(rèn)的配置。2 開發(fā)主要采用 struts.xm(l 可配置 action、常量等) 或者 perties (只能配置常量)4.2. Action 相關(guān)配置詳解Struts2 提供前端器,采用請求分發(fā)思想,將不同 url 請求,分配給不同 Action 進(jìn)行處理,需要在 struts.xml 配置 請求路徑和 Action關(guān)系。l<package>包Package 可以用來管理 Action, 實(shí)現(xiàn)包內(nèi)配置復(fù)用 (通過包繼承實(shí)現(xiàn) )struts-default.xml 定義一個 package默認(rèn)包內(nèi)定義大量結(jié)果集類型和器,用戶開發(fā) package 通常繼承
17、struts-default包。其中的屬性的作用:name:包的名稱,在 struts 容器中具有唯一性(在開發(fā)中可以用模塊名稱作為包名)namespace:名稱空間用來標(biāo)識一個路徑,來區(qū)分重復(fù)性例如:如果兩個包存在同名 Action ,需要名稱空間區(qū)分 action路徑示例:頁 14上面 Action 應(yīng)用名稱空間小結(jié):【擴(kuò)展了解】Action 名稱的搜索順序(請求 url 自動搜索機(jī)制)頁 154.3. Action 配置的默認(rèn)值A(chǔ)ction 的配置中有些屬性如果不配置,則使用默認(rèn)的值。如:l若不指定名稱空間 namespace,默認(rèn)為“/”ll若不指定結(jié)果集 result 的名字默認(rèn)為“
18、success”若沒有class 屬性,執(zhí)行默認(rèn)處理類,該默認(rèn)處理類在 struts-default.xml文件中有定義:通過源碼可以看到,默認(rèn)會執(zhí)行 默認(rèn)處理類 ActionSupport 類 execute 方法,返回 success邏輯視圖 ,找到 index.jsp頁 16提示:建議大家盡量少用默認(rèn)值,顯示的指定相應(yīng)的值【面試知識】區(qū)分 Action 默認(rèn)處理類和默認(rèn)執(zhí)行的 ActionlAction 默認(rèn)處理類:是配置了 action,但沒有指定 action 的 class,會自動調(diào)用執(zhí)行默認(rèn)的 action 類,該 action 在 struts2 的 struts-defaul
19、t.xml 文件中有配置內(nèi)置默認(rèn)的,也可以自定義一個進(jìn)行覆蓋(一般很少這樣做)。l默認(rèn)執(zhí)行的 action:是用戶的路徑中找不到這個 action,那么 struts2 會去尋找被的包中是否有配置一個默認(rèn)執(zhí)行的action,如果有配置,則執(zhí)行默認(rèn)配置的action,如果沒有配置,則顯示 action 找不到的錯誤信息哦error_page_404.html用戶可以為每個package 定義一個默認(rèn)的Action,如果就會執(zhí)行默認(rèn) action路徑在package 沒有匹配<action>4.4. 常量配置在 struts2 六種配置文件中,都可以配置 struts2 常量,而且后加
20、載的配置文件常量 可以對先加載配置文件進(jìn)行覆蓋 !頁 17<div align="center"><img src="./images/404-xsy.jpg"/></div>常用常量作用分析:1、 struts.i18n.encoding=UTF-8相當(dāng)于 request.setCharacterEncoding(“utf-8”);解決 post 請求亂碼問題。因此,在 Struts2 開發(fā)時,無需關(guān)注 post 亂碼問題。2、 struts.action.extension=action,Action 請求問題:如
21、果請求路徑路徑 默認(rèn)擴(kuò)展名也可以HelloAction必須以.action 結(jié)尾3 、struts.configuration.xml.reload=true : 修改 struts.xml 配置后, 無需重啟服務(wù)器;struts.i18n.reload = true,文件修改之后也不需要重啟服務(wù)器。會自動加載生效。當(dāng)設(shè)置開發(fā)者模式 devMode =true 會激活 xml 配置文件自動重新加載功能。頁 184、struts.devMode=true開發(fā)模式下使用,這樣可以打印出更詳細(xì)、友好的錯誤信息5、struts.ui.theme=xhtml設(shè)置頁面顯示樣式6、struts.object
22、Factory=struts負(fù)責(zé)創(chuàng)建 Action 對象類,默認(rèn)是使用的是:7、struts.enable.DynamicMethodInvocation=trueAction 支持 動態(tài)方法調(diào)用8、struts.multipart.maxSize=2097152上傳文件的大小限制4.5. 配置文件分離【開發(fā)場景】在大部分應(yīng)用里,隨著應(yīng)用規(guī)模的增加,系統(tǒng)中Action的數(shù)量也會大量增加,導(dǎo)致struts.xml 配置文件變得非常臃腫。為了避免 struts.xml 文件過于龐大、臃腫,提高 struts.xml文件的可讀性,我們可以將一個 struts.xml 配置文件分解成多個配置文件,然后
23、在 struts.xml文件中包含其他配置文件。下面的 struts.xml 通過<include>元素指定多個配置文件:<struts><include file="struts-part1.xml"/><include file="struts-part2.xml"/></struts>通過這種方式,我們就可以將 Struts 2 的 Action 按模塊添加在多個配置文件中。頁 195. Action 的相關(guān)5.1. Action 的三種書寫格式第一種 寫法, 編寫自定義 Action 類
24、, 實(shí)現(xiàn) Action 接口.Action 接口提供 execute 處理業(yè)務(wù)邏輯方法(命令模式一種設(shè)計模式,目的是將“行為請求者”與“行為實(shí)現(xiàn)者”解耦)struts.xml:頁 20【內(nèi)置的視圖名稱】Actionnnnnn接口提供一組 常用的內(nèi)置的邏輯視圖名稱:SUCCESS視圖NONE 沒有結(jié)果視圖,用戶ERROR 錯誤視圖INPUT 輸入視圖 (數(shù)據(jù)輸入生成響應(yīng)數(shù)據(jù),要求用戶重新輸入)LOGIN 登陸視圖 (如果用戶未登陸,使用登陸視圖)第二種 寫法:編寫自定義 Action 繼承 ActionSupport 類(相當(dāng)于間接實(shí)現(xiàn) Action 接口),使用的時候需要手動覆蓋 execut
25、e()。ActionSupport 提供功能 (數(shù)據(jù)校驗、 ),用的最多!第三種 寫法: POJO 寫法 (了解)POJO(Plain Old Java Object)簡單的 Java 對象,實(shí)際就是普通 JavaBeans頁 21提示:struts2 使用反射的機(jī)制來進(jìn)行調(diào)用執(zhí)行?!咀⒁狻筷P(guān)于 execute 方法的編寫要求,必須滿足:l public 修飾符l String 返回值l 無參數(shù)【提示】:一般情況下都使用繼承 ActionSupport 類的方法。其他兩種,大家了解就行了。5.2. Action 的方法調(diào)用執(zhí)行的三種方式問題:是不是默認(rèn)只能執(zhí)行 execute 這個方法?是不是
26、只能寫一個方法呢?頁 225.2.1. 通過設(shè)置 method 屬性,執(zhí)行 Action 不同業(yè)務(wù)方法【示例】一個業(yè)務(wù)中實(shí)現(xiàn)多個業(yè)務(wù)方法。(登錄)設(shè)置 method 屬性,指定調(diào)用 Action 哪個方法:頁 23提示: 可以在一個 Action 中編寫多個業(yè)務(wù)方法,在時,通過 method區(qū)別不同業(yè)務(wù)。5.2.2.使用通配符來簡化路徑和 Action 業(yè)務(wù)方法配置1 對應(yīng) name 中第一個* 匹配的內(nèi)容例如: user_login - * 匹配login - method 就是 login:/UserAction_login.actionmethod login- class cn.itc
27、ast.struts2.demo4.UserActon -頁 24:注意:一個*用多次的情況下,就要注意“約定”規(guī)則。5.2.3.動態(tài)方法調(diào)用 (了解)動態(tài)方法調(diào)用, 效果類似通配符,在配置 action 時無需配置 method(特點(diǎn):更靈活,外行不容易看懂)/user.action 執(zhí)行 UserAction 的 execute問題: 怎么執(zhí)行 login ?執(zhí)行 UserAction 的 regist方法,報錯: :在新版本 struts2 中動態(tài)方法調(diào)用,默認(rèn)是關(guān)閉的頁 25登錄:提示:該動態(tài)方法調(diào)用雖然很靈活,很方便,但有一定的安全隱患?!具x擇】在實(shí)際開發(fā)中,通配符和動態(tài)方法調(diào)用會二
28、選一, 如果偏向 xml 配置項目,使用統(tǒng)配符較多, 如果偏向注解開發(fā)項目,使用動態(tài)方法調(diào)用較多 !6. Action 使用 Servlet 相關(guān) APIstruts2 默認(rèn)情況下將 servlet api 都隱藏起來了,為了簡化開發(fā)。但,很多時候,我們還需要調(diào)用 servlet api,比如,向 session 中放入一個登錄用戶。6.1. 解耦合方式調(diào)用(間接調(diào)用)解耦相對于耦合,這里舉例:編寫的 Servlet 的時候的調(diào)用方法 doGet(HttpServletRequest, HttpServletReponse) ,需要直接在代碼中依賴 servletContext 的 reque
29、st 和 response,這就是耦合。Struts2 設(shè)計思想就是與 Servlet API 解耦合,編寫 Action 代碼中可以不再直接依賴Servlet 的任何 API,簡化開發(fā),也便于測試(方法簡單無參)。那如果我們想調(diào)用這些 API 呢?比如向 session 中放入登錄用戶、向 request 中放入一個值給頁面響應(yīng)用。struts2 為我們提供了一個 API,可間接調(diào)用 servlet api,這個 api 叫做:ActionContext 類 (Action 上下文 )。(可以理解該類就是一個工具類)【回顧了解】上下文: 與容器相關(guān),獲取容器相關(guān)對象、信息類似于一個工具類 (
30、如 servletcontext,可以拿到一些關(guān)于 web 應(yīng)用服務(wù)范圍的一些對象信息,pageContext 可以拿到關(guān)于 jsp 頁面的一些對象信息)。該 API 提供大量間接操作 Servlet API (request、 response、 session、application) 方法:頁 26提示:間接操作是指面向 map 的操作,而不是直接操作相關(guān)對象。通過操作 map 就相當(dāng)于操作相關(guān)對象?!臼纠颗渲?Action頁 27struts.xml請求 url:結(jié)果頁面 success.jsp:運(yùn)行結(jié)果出錯:數(shù)組不能被轉(zhuǎn)換為字符串。:(String)parameters.get(&
31、quot;name");-get 出來的數(shù)組 String將代碼修改為:向 session 和 request 中信息success.jsp:頁 286.2. Servlet API 直接調(diào)用兩種方式:方式一: 接口注入方式操作 Servlet API。(了解)用法:想用哪個對象就實(shí)現(xiàn)哪個接口。:p.s:在 action 初始化的時候,會自動將 request 注入賦值給 actionrequest.jsp:頁 29方式二:通過 ServletActionContext 類的靜態(tài)方法,直接獲取 Servlet API(推薦)頁 30:Struts2 推薦優(yōu)先 ActionContex
32、t (解耦合方式 )間接調(diào)用方式一直在操作 map 對象。實(shí)際開發(fā)中,看你的編寫習(xí)慣來選擇(個人:ServletActionContext)【問題】ServletActionContext 獲取 request 方法 是 static 的, 有沒有線程問題 ?會出現(xiàn),獲取錯 request 對象的情況 -的 (底層:ThreadLocal)ThreadLocal 相當(dāng)于一個大 Map ,key 是每個Thread!著每個線程的變量副本,每個線程只能取的 value。7. result 結(jié)果集的使用該節(jié)分為兩個知識點(diǎn):1. 局部結(jié)果集和全局結(jié)果集。2. 結(jié)果集類型。頁 317.1. 局部結(jié)果集和
33、全局結(jié)果集n局部結(jié)果集在<action>內(nèi)部配置的<result>元素。作用范圍:只對當(dāng)前 Action 有效struts.xml:提示:局部結(jié)果集只能給當(dāng)前的 action 使用n全局結(jié)果集在包的中的<global-results>中配置作用范圍:對 package 內(nèi)所有 Action 生效action:頁 32:【注意】同名的局部結(jié)果覆蓋全局結(jié)果集?!咀⒁狻縮truts。xml 的配置文件中的是有順序的。7.2. 結(jié)果集的類型 type配置<result> 元素時, name 是邏輯視圖名稱, type 是結(jié)果集類型。Struts2 提供的
34、常用結(jié)果集類型都定義在 struts-default.xml 中:n dispatcher(默認(rèn)值):請求轉(zhuǎn)發(fā)。(最常用)作用:服務(wù)器內(nèi)部是同一次請求,可采用 request 傳遞數(shù)據(jù),URL 不變。頁 33提示:一般可省略這個參數(shù)?!咎崾尽縩redirect作用:重定向到某個 jsp 頁面,服務(wù)器發(fā)起了一次新的請求,不能通過 request 傳遞參數(shù),URL 改變?yōu)樾碌牡刂?。?34應(yīng)用場景舉例:登錄后重定向到的主頁面。nredirectAction作用:重定向到另外一個 Action實(shí)際應(yīng)用:list 列表的時候,會用到。提示:這里的 result_updateData 是 Action
35、的 name。效果等同于:提示:寫法上如果不加/,會在當(dāng)前默認(rèn)的名稱空間中查找該 action。使用參數(shù)的寫法(較復(fù)雜一點(diǎn)):struts.xml 的配置:頁35提示:想知道可以指定哪些參數(shù),可以查看其源碼的 set 方法。nchain(了解)作用:轉(zhuǎn)發(fā)到另外一個 Action 中8. Strut2 約定編程和注解開發(fā)8.1. 約定編程配置開發(fā)現(xiàn)階段 注解開發(fā) 是一個企業(yè) 趨勢- 注解開發(fā), 替換傳統(tǒng) XML 配置, 置非常多,不便于后期維護(hù) )比 XML 更加簡單(項目非常大之后,xml 配【示例】第一步:導(dǎo)入導(dǎo)入新建 web project(struts2_day1_annotation)
36、struts2-blank.war 下 13 個 jar 包,導(dǎo)入 jar 包struts2-convention 插件包(struts2-convention-plugin-.jar)(如果不進(jìn)行注解開發(fā),就不要導(dǎo)入這個包)導(dǎo)入該插件包后,struts2 就會基于 convention 約定,實(shí)現(xiàn) Action 零配置開發(fā)。Convention 的 struts-plugin.xml:頁 36作用:會自動掃描上面四個包 ,對 Action 進(jìn)行自動作用:自動會掃描 class 的名字為后綴為 Action 的 class 文件。第二步: web.xml器第三步: 新建包 cn
37、.itcast.struts2新建類 HelloAction測試:action 的類去掉 action 后綴,變成小寫,然后再加上后綴.action【原理分析】為什么能被 struts2和到?掃描 Action 的約定:頁 37根據(jù)約定中的包名規(guī)則和類名后綴規(guī)則(即那四個包下+以 Action 后綴的類),就可以掃描到對應(yīng)的 Action 了。我們這里的 HelloAction 符合要求。Action 的約定:【示例】約定的頁 38結(jié)果集頁面Result約定:【示例】其他測試:頁 39【小結(jié)提醒】:注解是基于約定的,但約定屬于 0 配置開發(fā)的,無法直觀的得到跳轉(zhuǎn)頁面路徑,反而造成可讀性偏差。路
38、徑和8.2. 注解配置開發(fā)主要相對上面好處:結(jié)果集可以自定義,的 action 的名字可以自定義,但 action 的掃描還是約定。(action 還得符合包+類名約定。)注解怎么用?注解是在類代碼中進(jìn)行配置,不需要單獨(dú) XML 文件注解 依賴約定掃描 (Action 還是存在于 action、actions、struts、struts2)主要使用兩個注解:Action位置。和Result,分別用來配置Action路徑和結(jié)果集頁面【示例】單結(jié)果集頁 40【示例】【補(bǔ)充】Actions將一個業(yè)務(wù)方法,為多個路徑頁 41Package 屬性設(shè)置 Namespace名稱空間、ParentPackag
39、e父包相當(dāng)于xml配置的:【擴(kuò)展補(bǔ)充】:如果使用了namespace 則Action 中配置的路徑名字可以不帶/。頁 42小結(jié):提示:約定和注解的選擇?約定也不寫注解,更少寫代碼;注解更清晰,更容易理解。有的企業(yè)會混合使用。知識點(diǎn) :1、2、3、4、5、6、7、8、9、什么是框架?為什么使用框架?MVC 模式? 三層結(jié)構(gòu) ?struts2 是一個 MVC 框架, 表現(xiàn)層框架, 和 struts1、webwork 關(guān)系開發(fā) struts2 應(yīng)用,需要導(dǎo)入哪些 jar 包 (xml 開發(fā)、 注解開發(fā)) 如何配置 struts.xml 配置文件提示struts2 代碼運(yùn)行流程struts2 有哪些配
40、置文件, 加載順序Action 相關(guān)配置 ,Action 路徑 (package namespace + actionname) 默認(rèn) Action 和 Action 默認(rèn)處理類10、11、12、13、14、15、常用常量配置 devMode、Action 擴(kuò)展名配置、動態(tài)方法調(diào)用開啟Action 三種書寫方式Action 的方法調(diào)用 (method 屬性使用, 通配符使用, 動態(tài)方法調(diào)用)Action 方法如何使用 Servlet API (間接和直接)結(jié)果集類型 (dispatcher、 redirect、 redirectAction )struts2 約定零配置開發(fā) 和 注解開發(fā)作業(yè)練
41、習(xí):用戶名用戶名struts2 + DbUtils 框架 登陸功能錯誤,重新登陸 - INPUT正確,重定向主頁 - SUCCESS頁 439. 請求參數(shù)的接收 (兩種 屬性驅(qū)動和模型驅(qū)動)表現(xiàn)層一個職責(zé) , 負(fù)責(zé)接收客戶端提交請求數(shù)據(jù)nnn表現(xiàn)層業(yè)務(wù)層持久層負(fù)責(zé)和客戶端交互 (負(fù)責(zé)數(shù)據(jù)業(yè)務(wù)邏輯處理負(fù)責(zé)和數(shù)據(jù)庫進(jìn)行增刪改查request 、response )struts 的作用:Struts2 提供兩大類(屬性模型封裝、驅(qū)動模型封裝)、三種數(shù)據(jù)封裝的方式:nn方式一:Action 作為 m方式二:Action 中創(chuàng)建式規(guī)則進(jìn)行封裝。,通過成員變量屬性和 setter 方法進(jìn)行封裝。的 m對象
42、和 setter、getter 方法,頁面通過 ognl 表達(dá)n方式三:使用 MDriven 接口(模型驅(qū)動),對請求的數(shù)據(jù)進(jìn)行封裝。搭建測試環(huán)境:新建 web project:struts2_day2 引入 struts2nnnjar 包web.xml 配置struts.xmlFilter頁 449.1. 方式一:Action 作為m方法接收參數(shù)進(jìn)行封裝,通過成員變量屬性和 setter在 Action提供 username、password成員變量生成 setter 方法配置測試:頁 45原理:是由 struts2 的默認(rèn)棧中有一個默認(rèn)的器來完成參數(shù)封裝的兩個1:特點(diǎn) : Action 本
43、身就是 m對象缺點(diǎn): Action層使用。往往還需要,通過代碼手動將數(shù)據(jù)封裝到一個新的 m對象,傳遞給業(yè)務(wù)2問題: Servlet 是單實(shí)例,多線程沒有問題嗎? 題 ?Struts2 Action 封裝數(shù)據(jù),是否存程問Servlet 的開發(fā) ,單實(shí)例,不編寫成員變量,就沒有線程問題Action 是多實(shí)例,每次請求,創(chuàng)建單獨(dú)對象,是:Action 具有 m功能。執(zhí)行過程分析:頁 469.2. 方式二:Action 中創(chuàng)建的 m對象和 setter、getter 方法,頁面通過 ognl 表達(dá)式進(jìn)行封裝。提示:這種類似于第一種。配置修改 頁面 form測試,ok;原理 (必須同時提供 mgette
44、r 和 setter )頁 47階段小結(jié):第一種和第二種封裝方式類似,都是使用的是 Action 的屬性來封裝數(shù)據(jù)。因此,這兩種都統(tǒng)稱為 屬性驅(qū)動封裝數(shù)據(jù)提示:第二種方法也有缺點(diǎn),就是需要使用對象的方式來封裝屬性,代碼有點(diǎn)多。9.3. 方式三:使用 M的數(shù)據(jù)進(jìn)行封裝。Driven 接口(模型驅(qū)動),對請求頁面Action實(shí)現(xiàn) MDriven 接口 ,實(shí)現(xiàn)getM方法頁 48配置底層依賴該器:Driven 接口是否實(shí)現(xiàn)了 M該器會如果實(shí)現(xiàn)了,則自動調(diào)用 getM拿到你要封裝的對象。然后,它會自動將參數(shù)封裝到該對象中的同名成員變量中。原理分析:注意:1 你返回的模型對象必須是可用對象,即是個對象,
45、且對象中有對應(yīng) name 屬性的 setter頁 49方法。下面的示例就無法封裝數(shù)據(jù)。2 模型驅(qū)動優(yōu)先于屬性驅(qū)動 來封裝數(shù)據(jù)。如果兩種方式都存在,則只有在模型驅(qū)動無法封裝數(shù)據(jù)的情況下,才會執(zhí)行屬性驅(qū)動封裝。9.4. 集合類型(Collection)數(shù)據(jù)封裝(了解)數(shù)據(jù)模型不是一個普通的 pojo,如何封裝數(shù)據(jù)。頁 509.4.1.封裝 List 集合對象頁面 collection.jspCollectionAction:配置9.4.2.封裝 Map 集合對象頁面 collection.jsp頁 51CollectionAction:提示:集合數(shù)據(jù)封裝,主要應(yīng)用于批量數(shù)據(jù)錄入情況,但批量錄入還有
46、更好的解決方案。頁 5210.參數(shù)類型轉(zhuǎn)換機(jī)制(兩種局部和全局)struts2 內(nèi)部存在類型轉(zhuǎn)換機(jī)制:定制類型轉(zhuǎn)換器:所有轉(zhuǎn)換器接口 TypeConverter用戶需要對特殊數(shù)據(jù)進(jìn)行轉(zhuǎn)換,需自定義轉(zhuǎn)換器,就必須實(shí)現(xiàn) ognl.TypeConverter 接口,可以采用列的編寫方式:nnn編寫類編寫類編寫類實(shí)現(xiàn)繼承繼承TypeConverter 接口DefaultTypeConverter 類StrutsTypeConverter 類頁 53Struts2 內(nèi)置轉(zhuǎn)換器:10.1. 編寫案例(包含文本、數(shù)字、日期、數(shù)組)頁面 regist.jsp頁 54<formaction="$
47、pageContext.reqontextPath /datatype1.action" method="post">用戶名:<input type="text" name="username"/><br/>:<input type="text" name="age"/><br/>生日:<input type="text" name="birth"/><br/>Acti
48、on:RegistAction頁 55:<input type="checkbox" name="hobby" value="唱歌"/>唱歌<input type="checkbox" name="hobby" value="游泳"/>游泳<input type="checkbox" name="hobby" value="跳舞"/>跳舞<br/><input t
49、ype="submit" value="提交"/></form>配置測試:服務(wù)器可以正常接收 (使用 struts2 內(nèi)置類型轉(zhuǎn)換器 )10.2. 自定義類型轉(zhuǎn)換器例如: 用戶輸入日期格式 月/日/年 , struts2 內(nèi)置轉(zhuǎn)換器無法轉(zhuǎn)換第一步: 編寫自定義轉(zhuǎn)換器類繼承 DefaultTypeConverter覆蓋該方法有兩個層面作用:nn(String -Date) (Date - String )實(shí)現(xiàn)請求數(shù)據(jù),到服務(wù)器端屬性轉(zhuǎn)換Form 數(shù)據(jù)回顯 (需結(jié)合 struts2頁 56注意:value分析:在請求轉(zhuǎn)換數(shù)據(jù)時,是一個 St
50、ring第二步:轉(zhuǎn)換器(兩種)n 局部轉(zhuǎn)換器(只對當(dāng)前 Action 生效 )頁 57ParamconversionAperties提示:局部轉(zhuǎn)換器是屬性名進(jìn)行轉(zhuǎn)換的注意:當(dāng)你配置了局部轉(zhuǎn)換期之后,再運(yùn)行該 action,則該屬性的字段會自動使用自定義的轉(zhuǎn)換器缺點(diǎn):局部轉(zhuǎn)換器是跟表單屬性綁定了。只能用于一個 actionn全局轉(zhuǎn)換器(對所有 Action,該類型數(shù)據(jù)轉(zhuǎn)換生效)perties提示:全局轉(zhuǎn)換器是類型進(jìn)行轉(zhuǎn)換的。頁 58轉(zhuǎn)換器的調(diào)用優(yōu)先級先走自定義,再走默認(rèn)自定義轉(zhuǎn)換器的調(diào)用優(yōu)先級:先局部-再全局(反過來
51、:局部覆蓋了全局)10.3. 類型轉(zhuǎn)換中的錯誤處理在接收請求 參數(shù)時, 必然要進(jìn)行類型轉(zhuǎn)換 ,類型轉(zhuǎn)換如果出錯, Struts2 內(nèi)部提供兩個器:ConversionError器,保存一個錯誤信息; WorkFlow器,如果存在錯誤信息, 自動跳轉(zhuǎn) input 邏輯視圖(一般我們還配置到原來的頁面,讓用戶更正)分析:struts.xml:如果是用戶自定義的類型轉(zhuǎn)換器,其中的異常必須拋出不能捕獲,conversionError 會自動捕獲處理該異常。頁 59如何解決這個問題呢?是否要給客戶提示輸入的格式不正確呢?1解決結(jié)果視圖的錯誤頁面問題:先為 Action 配置 input 視圖。測試:。o
52、k2在跳轉(zhuǎn)后的頁面中顯示類型轉(zhuǎn)換的錯誤信息。1)導(dǎo)入 struts2 的庫2)在頁面上加入<s:fielderror>來輸出類型轉(zhuǎn)換的錯誤信息。頁 60顯示效果注意:3將錯誤信息顯示為更友好的中文信息(這里需要用到 struts2知識,這里先了解)在 Action 類所在包,創(chuàng)建 Action 類名.properties,在文件中配置 invalid.fieldvalue.屬性名=錯誤信息(key 的名字在這里是固定,這個 key 是類型轉(zhuǎn)換錯誤之后默認(rèn)的提示信息的 key)效果:頁 6111.請求參數(shù)校驗機(jī)制(兩種代碼的校驗 和 配置校驗 )請求參數(shù)的輸入校驗途徑一般分兩種:n客
53、戶端校驗 :通過 JavaScript 完成 (jquery validation 插件),目的:過濾正常用戶的誤操作。n服務(wù)器校驗 :通過 java 代碼完成 ,目的:整個應(yīng)用數(shù)據(jù)的最后防線兩者校驗的特點(diǎn):客戶端校驗,更加友好, 用戶可以第一時間知道數(shù)據(jù)輸入有錯誤, 服務(wù)器校驗 更加安全校驗機(jī)制 (考慮系統(tǒng)健壯性 ,服務(wù)器校驗必須要做)我們這里研究的是:在請求數(shù)據(jù)封裝之后, 在 struts2 實(shí)現(xiàn)請求數(shù)據(jù)Struts2 支持校驗方式校驗。n代碼中手動數(shù)據(jù)校驗n Xml 配置規(guī)則進(jìn)行校驗n 基于注解進(jìn)行配置校驗11.1. 在 Action 中通過代碼執(zhí)行數(shù)據(jù)校驗需要編寫代碼, 適用于小型項目
54、先搭建測試環(huán)境:編寫頁面 /demo3/login.jsp或者表單數(shù)據(jù)不多的情況編寫 Action頁 62<h1>登錄:請求數(shù)據(jù)校驗-代碼手動校驗</h1><s:fielderror/><form action="$pageContext.reqontextPath /login.action" method="post">用戶名:<inputtype="text"name="username"/><s:fielderror fieldName="username
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玻璃光學(xué)性能與應(yīng)用考核試卷
- 紙藝工藝品的商業(yè)潛力挖掘考核試卷
- 紡織品進(jìn)出口業(yè)務(wù)流程考核試卷
- 破產(chǎn)法與重整重組法律實(shí)務(wù)考核試卷
- 新型材料項目融資渠道探討考核試卷
- 電機(jī)調(diào)速與變頻技術(shù)實(shí)操考核試卷
- 離婚協(xié)議子女撫養(yǎng)權(quán)變更程序合同
- 跨界電商節(jié)活動期間消費(fèi)者權(quán)益保障與風(fēng)控合同
- 巖土工程地質(zhì)勘察與施工監(jiān)理勞務(wù)合同
- 醫(yī)療保險補(bǔ)充疾病預(yù)防協(xié)議
- 艦艇損害管制與艦艇損害管制訓(xùn)練
- 圍墻拆除重建施工方案
- 2024貴州中考物理二輪中考題型研究 題型八 新情景探究實(shí)驗專項訓(xùn)練 (含答案)
- 2023年高考?xì)v史真題新高考福建卷試題含答案解析
- 四川省綿陽市東辰學(xué)校2023-2024學(xué)年七年級下學(xué)期3月月考語文卷
- DZ/T 0430-2023 固體礦產(chǎn)資源儲量核實(shí)報告編寫規(guī)范(正式版)
- 禁止編入列車的機(jī)車車輛講解
- 過期妊娠課件
- 【農(nóng)業(yè)技術(shù)推廣探究文獻(xiàn)綜述2300字】
- 新生兒腸脹氣課件
- 加油站清明節(jié)節(jié)前安全教育培訓(xùn)
評論
0/150
提交評論