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