Struts2權威指南筆記

Struts2權威指南筆記html

一、mvc特色包括:java

① 多個視圖能夠對應一個模型web

② 模型返回的數據與顯示邏輯分離spring

③ 應用層被分隔爲三層,下降了各層之間的耦合,提供了應用的可擴展性數據庫

④ 控制層的概念也頗有效,因爲它把不通的模型和不一樣的視圖組合在一塊兒,完成不一樣的請求apache

⑤ Mvc更符合軟件工程化管理的精神編程

二、Struts2框架的大體處理流程:api

① 瀏覽器發送請求,如請求/mypage.action瀏覽器

② 核心控制器FilterDispatcher根據請求決定調用合適的Action緩存

③ Webwork的攔截器鏈自動對請求應用通用功能,例如workflowalidation或文件上傳等功能

④ 回調Actionexecute方法,該execute方法先獲取用戶請求參數,而後執行某種數據庫操做,如查詢、保存數據等。實際上,由於Action只是一個控制器,它會調用業務邏輯組件來處理用戶請求

⑤ Actionexecute方法處理結果信息將被輸出到瀏覽器中

三、Struts2的配置文件,Struts2的配置文件有2份,配置Actionstruts.xml和配置Struts全局屬性的struts.properties文件

四、Struts2的控制器由兩個部分組成:FilterDispatcher和業務控制器Action,實際上,Struts2應用中起做用的業務控制器不是用戶定義的Action,而是系統可以生成的Action代理,但該Action代理以用戶定義的Action爲目標

五、Action類特色

① Action類徹底是一個pojo,所以具備很好的代碼複用性

② Action類無需與servlet API耦合,所以進行單元測試很是簡單

③ Action類的execute方法僅返回一個字符串做爲處理結果,該處理結果可映射到任何的視圖,甚至是另外一個Action

六、配置過程

① 引入jar,例如struts2-core-2.3.15.1.jar,xwork-core-2.3.15.1.jar,ognl-3.0.6.jar

② web.xml配置

<filter>

    <filter-name>struts2</filter-name>

    <filter-class> 

        <!--org.apache.struts2.dispatcher.FilterDispatcher不推薦使用-->

        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    </filter-class>

</filter> 

<filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

這裏要注意FilterDispatcher在2.1.3以後就不推薦使用了,應該使用

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter替代

③ 1234

七、獲取sessionStruts2提供了ActionContext類,該類提供了getSession的方法,可是返回類型是map,不是HttpSession,由Struts2的系列攔截器負責該sessionHttpSession之間的轉換。ActionContext.getContext().getSession()

八、Action中的成員屬性,並不必定用於封裝用戶的請求參數,也多是封裝了Action須要傳入下一個頁面顯示的值。實際上,這些值將被封裝在ValueStack對象中。Struts2將這些屬性值所有封裝在一個叫作struts.valueStack的請求屬性中,可使用

request.getAttribute(「truts.valueStack」)獲取該對象

九、幾個經常使用標籤if/else/iterator/property

<s:iterator value="books" status="index">

<s:if test="#index.odd==true">

<tr style="background-color: #cccccc">

</s:if>

<s:else>

<tr>

</s:else>

<td>書名:</td>

<td><s:property /></td>

</tr>

</s:iterator>

十、使用native2asciic處理資源文件,Struts2默認加載WEB-INF/classes下的資源文件,若是資源文件在包路徑下則要指定到包。

struts.custom.i18n.resources=messageResource

struts.custom.i18n.resources=com.test.messageResource

輸出國際化信息:<s:text name=」messageKey」/>或者<s:property value=」%{getText(「messageKey」)}」/>

十一、ActionSupport實現了Action接口和Validateable接口,提供了數據校驗功能,validate方法會在執行系統的execute方法以前執行,若是fieldErrors中已經包含了數據校驗錯誤,請求將被轉發到input邏輯視圖處。若是使用配置文件校驗,則配置文件與Action位於同一個文件夾中,且命名格式爲:ActionName-alidation.xml

十二、Struts2框架由3個部分組成:核心控制器FilterDispatcher、業務控制器和業務邏輯組件。Struts2框架提供了核心控制器FilterDispatcher,而用戶須要實現業務控制器和業務邏輯組件

Struts2用於處理用戶請求的Action實例,並非用戶實現的業務控制器,而是Action代理-由於用戶實現的業務控制器並無與servlet api耦合,沒法處理用戶請求,而Struts2框架提供了系列攔截器,該系列攔截器負責將HttpServletRequest請求中的參數解析出來,傳入到Action中,並回調Actionexecute方法來處理用戶請求,是典型的AOP處理方式。

1三、業務控制器組件就是用戶實現Action類的實例,須要配置Action3個部分定義:①Action處理的URLAction對應的實現類③Action裏包含的邏輯視圖與物理資源之間的對應關係。

1四、業務控制器不會對用戶請求進行任何實際處理,用戶請求最終由業務邏輯組件負責處理。業務控制器只是中間負責調度的調度器,這也是稱Action爲控制器的緣由。當控制器須要得到業務邏輯組件實例時,一般並不會直接獲取業務邏輯組件實例,而是經過工廠模式來得到業務邏輯組件的實例;或者利用其餘IoC容器(spring容器)來管理業務邏輯組件的實例

1五、全部的MVC框架都須要web應用加載一個核心控制器,對於Struts2框架而言,須要加載FilterDispatcher,只要web應用負責加載FilterDispatcherFilterDispatcher會加載應用的Struts2框架

1六、Struts2核心配置文件struts.xml,默認放在WEB-INF/classes路徑下,可用於模塊化配置

<struts>

<!--經過include元素導入其餘配置文件-->

<include file=」struts-part1.xml」>

...

</struts>

struts.xml中能夠包含的元素:include/constant/bean/package

1七、有效的Struts2屬性

struts.configuration:該屬性指定加載Struts2配置文件的配置文件管理器

struts.locale:指定web應用的默認local

struts.i18n.encoding:指定web應用的默認編碼集

struts.objectFactory:指定Struts2默認的objectFactory bean,默認spring

struts.objectFactory.spring.autoWire:指定spring框架的自動裝配模式,默認name

struts.objectFactory.spring.useClassCache:指定整合spring時是否緩存bean實例,默認true

struts.objectTypeDeterminer:指定Struts2的類型檢測機制,一般支持tigernotiger兩個

struts.multipart.parser:指定處理文件上傳請求框架,支持cospelljakarta等屬性值

struts.multipart.saveDir:指定上傳文件的臨時保存路徑,默認javax.servlet.context.tempdir

struts.multipart.maxSize:指定上傳文件最大字節數

struts.custom.properties:指定Struts2加載用戶自定義的屬性文件,可多個,用」,」分隔

struts.mapper.class:指定將http請求映射到指定Action的映射器,默認映射器根據請求前綴與Actionname屬性完成映射

struts.action.extension:指定須要處理的請求後綴,默認action,多個用」,」分隔

struts.serve.static:設置是否經過jar文件提供靜態內容服務,默認true

struts.serve.static.browserCache:設置瀏覽器是否緩存靜態內容。開發時可設爲false

struts.enable.DynamicMethodInvocation:設置是否支持動態方法調用,默認true

struts.enable.SlashesInActionNames:設置是否容許在Action名中使用斜線,默認false

struts.tag.altSyntax:指定是否容許在標籤中使用表達式語法,一般爲true

struts.devMode:設置應用是否使用開發模式,true時顯示更多、更友好出錯提示

struts.i18n.reload:設置是否每次http請求到達時,系統都從新加載資源文件。開發階段可爲true,發佈時應設置爲false

struts.ui.theme:指定視圖標籤默認的視圖主題,默認xhtml

struts.ui.templateDir:指定視圖主題所需模版文件的位置,默認template,即默認加載template下的模版文件

struts.ui.templateSuffix:指定模版文件後綴,默認值ftl,還容許ftlvmjsp

struts.configuration.xml.reload:設置當struts.xml文件改變後,系統是否自動從新加載該文件,默認false

Struts.velocity.configfile:該屬性指定velocity框架所需的velocity.properties文件位置,默認velocity.properties

struts.velocity.contexts:指定velocity框架的context位置,多個可用」,」分隔

struts.velocity.toolboxlocation:該屬性指定velocity框架的toolbox的位置

struts.url.http.port:該屬性指定web應用所在的監聽端口。只有當須要生成url時,採提供wen應用默認端口

struts.url.https.port:相似struts.url.http.port做用,只是加密服務端口

struts.url.includeParams:指定生成url時是否包含請求參數,可選nonegetall

struts.custom.i18n.resources:指定國際化資源文件名,多個以」,」分隔

struts.dispatcher.parametersWorkaround:對於某些javaEE服務器(weblogic/orion/oc4j),不支持HttpServletRequest調用getParameterMap()方法,此時設置該屬性爲true解決該問題,默認爲false

struts.freemarker.manager.classname:指定使用FreeMarker管理器

struts.freemarker.wrapper.altMap:默認true,一般無需修改

struts.xslt.nocache:指定XSLT Result是否使用樣式表緩存。開發階段可設爲true

struts.configuration.files:指定框架默認加載的配置文件,若須要加載多個用」,」分隔,該屬性默認值爲struts-default.xml,struts-plugin.xml,struts.xml

1八、在struts.xml中定義bean時,有兩個做用:①建立該bean的實例,將該實例做爲Struts2框架的核心組件使用②bean包含的靜態方法須要一個值注入

在第一種用法,由於bean實例每每是做爲一個核心組件使用的,所以須要告訴Struts2容器該實例的做用-就是實現了那個接口(通常用於覆蓋Struts2默認提供的方法)

第二種用法能夠很方便地雲遜不建立某個類的實例,卻能夠接收框架常量。一般要設置static=」true」

對於絕大部分應用而言,無需從新定義Struts2框架的核心組件,也就無需在struts.xml中定義beanBean元素有一下幾個屬性:①classtypenamescopestaticoptional

1九、Struts2配置文件中的常量便可在struts.xml中,也可在struts.properties中配置,加載順序:struts-default.xml->struts-plugin.xml->struts.xml->struts.properties->web.xml,後一個文件中的配置會覆蓋前一個配置值。常量包含兩個屬性:namevalue。若在wen.xml中配置,則可在filter中增長<init-param>,通常常量配置都在struts.xml中配置

20、Struts2框架核心組件就是Action、攔截器等,Struts2框架使用包來管理Action和攔截器等,每一個包就是多個Action、多個攔截器引用的集合。Package元素用於定義包配置,有如下幾個屬性:①name,必填②extends,可選③namespace,可選④abstract,可選,抽象包中不能包含Action定義。注意Struts2的配置文件是從上到下處理的,因此父包要在子包以前定義。

2一、當某個包指定了命名空間後,該包下全部的Action處理的url是命名空間+Action,例如:http://localhost:8080/app/namespace/action.action,還能夠顯示指定根命名空間,經過設置某個包的namespace=」/」來指定根命名空間

2二、一般將Struts2的全部配置文件都放在web應用的WEB-INF/classes路徑下,struts.xml文件包含了其餘的配置文件,Struts2框架自動加載struts.xml文件時,從而完成加載全部配置信息

2三、攔截器容許在Action處理以前,或者Action處理結束以後,插入開發者自定義的代碼。攔截器能夠完成:①進行權限控制②跟蹤日誌③跟蹤系統的性能瓶頸

Struts2容許將多個攔截器組合在一塊兒,造成一個攔截器棧,一個攔截器棧能夠包含多個攔截器,攔截器棧對外也表現成一個攔截器。攔截器和攔截器棧都放在<interceptors>中定義

<interceptors>

<interceptor name="authority" class=""></interceptor>

<interceptor name="log" class=""></interceptor>

<interceptor-stack name="authandlog">

<interceptor-ref name="authority"></interceptor-ref>

<interceptor-ref name="log"></interceptor-ref>

</interceptor-stack>

</interceptors>

使用攔截器/攔截器棧

<action name="myAction" class="">

<result name="success">...</result>

<interceptor-ref name="authority"></interceptor-ref>

</action>

注意:package裏面的元素順序是有要求的,分別是

result-types

interceprots

default-action-ref

default-class-ref

global-result

global-exception-mappings

action(即全部action要放到最後)

2四、Struts2一般直接使用Action來封裝http請求參數,所以,Action類裏還應該包含與請求參數對應的屬性,而且爲該屬性提供對應的settergetter方法,重要的不是屬性而是get/set方法,可在頁面使用Struts2標籤輸出<s:property value=」username」>,系統不會嚴格區分Action裏哪一個屬性是用於封裝請求參數的屬性,哪一個屬性是封裝處理結果的屬性。

2五、Struts2框架提供了ActionContextServletContextAwareServletRequestAwareServletResponseAwareServletActionContext類用於訪問servlet api

2六、必須指出,雖然能夠在Action類中獲取HttpservletResponse,但若是但願經過HttpServletResponse來生成服務器響應是不可能的,由於Action只是控制器,機若是在Action中寫response.getWriter().println(「Hello World」);上面代碼在標準servlet中會生成對客戶端的輸出,但在Struts2Action中沒有任何意義。即不要嘗試直接在Action中生成對客戶端的輸出。

2七、Actionname對應url中的前半部分,若是不指定class,則使用系統默認的actionSupport類處理

2八、動態方法調用是指表單元素的action並非直接等於某個Action的名字,而是以以下形式來指定Formaction屬性

<!--action屬性爲actionNamemethodName的形式-->

action=」ActionName!methodName.action」

對於使用動態方法調用的方法,該方法聲明與系統默認的execute方法的聲明只有方法名不一樣,其餘的如方法參數、返回值類型都應該絕對相同。動態方法調用經過設置struts.enable.DynamicMethodInvocation常量完成

2九、經過指定method屬性,能夠將一個Action類定義成多個邏輯ActionAction類的每一個處理方法被映射成一個邏輯Action

30、action定義中的通配符

<action name=」*Action」 class=」」 method=」{1}」>

Method屬性使用了一個表達式{1},該表達式的值就是name屬性值中的第一個*的值

<action name=」*Action」 class=」com.test.{1}Action」>

表達式也能夠出如今class屬性中,即Struts2容許將一系列的Action配置成一個<action../>元素

<action name=」*_*」 method=」{2}」 class=」com.test.{1}Action」>

Struts2容許在class屬性和method屬性中同時使用表達式

<action name=」*」> 

<retult>/{1}.jsp</result>

</action>

Struts2還能夠在<result .../>子元素中使用表達式

3一、除非請求的urlActionname屬性絕對相同,不然將按前後順序來決定由那個Action來處理用戶請求,所以,應將名爲*Action配置在最後,不然Struts2將使用該Action來處理全部但願使用模式匹配的請求。

3二、對於只是簡單的超連接的請求,能夠經過定義name*Action(Action應該放在最後定義)實現。除此以外,Struts2還容許在容器中定義一個默認的Action,當用戶請求的URL在容器中找不到對應的Action時,系統將使用默認的Action來處理用戶請求。

配置默認Action經過<default-action-ref.../>元素完成

3三、若是配置<result .../>元素時沒有指定location參數,系統將會把<result ...>...</result>中間的字符串當成實際視圖資源;若是沒有指定name屬性,則name屬性採用默認值:success;若是沒有指定type屬性,則採用Struts2的默認結果類型(dispatcher)

3四、Struts2支持的結果類型在struts-default.xml中定義,經常使用的結果類型有:dispatcherredirectredirect-actionchainxsltvelocityfreemarkerstreamplaintext等,結果類型要實現com.opensymphony.xwork.Result

3五、設置結果類型爲plaintext時,能夠配置參數」charSet」

設置爲redirect時重定向都新的頁面,會丟失全部的請求參數、屬性和處理結果

設置爲redirect-action時,能夠配置參數」actionName」,」namespace」

3六、使用請求參數決定結果類型,可使用徹底的ognl表達式:${屬性名.屬性名.屬性名}
<action name=」」 class=」」>

<result name=」input」>/input.jsp</result>

<result type=」redirect」>/edit.action?name=${current.name}</result>

</action>

3七、全局結果對包內全部action都有效,當action中含有匹配的結果時,將覆蓋全局結果

3八、使用模型驅動的action多實現一個ModelDriven的接口,實現該接口並要求實現getModel()方法—該方法用於關聯ActionModel之間的關係

3九、Struts2的異常處理機制是經過在struts.xml文件中配置<exception-mapping.../>元素完成的,配置該元素時,須要指定兩個屬性:exceptionresult

局部異常映射:將<exception-mapping.../>元素做爲<action.../>元素的子元素配置

全局異常映射:將<exception-mapping.../>元素做爲<global-exception-mappings>元素的子元素

若是局部異常映射和全局異常映射配置了同一個異常類型,在該Action內,局部異常會覆蓋全局異常映射

當定義異常映射時,一般:全局異常映射的result屬性值一般不要使用局部結果,局部異常映射的result屬性值既可使用全局結果,也可使用局部結果

輸出異常信息:

<s:property value=」exception」/>輸出異常對象自己

<s:property value=」exception.message」/>

<s:property value=」exceptionStack」/>輸出異常堆棧信息

40、Struts提供了很是強大的類型轉換機制,Struts2的類型轉換是基於OGNL表達式的,只要咱們把html輸入項(表單元素和其餘GET/POST的參數)命名爲合法的OGNL表達式,就能夠充分利用Struts2的類型轉換機制。

4一、Struts2的類型轉換器其實是基於OGNL實現的,在OGNL項目中有一個TypeConverter接口,這個接口就是實現類型轉換器必須實現的接口。不過接口裏的方法太過複雜,OGNL項目還提供一個該接口的實現類:DefaultTypeConverter,經過繼承該類來實現本身的類型轉換器,重寫convertValue方法

4二、文件上傳框架須要完成的邏輯:經過分析HttpServletRequest的二進制流,解析出二進制流中所包含的所有表單域,分析出每一個表單域的類型(是文件域或者普通表單域),並容許開發者以簡單的方式來取得文件域的內容字節、文件名和文件內容等信息,也能夠取得其餘表單域的值

Struts2默認使用jakartacommon-fileupload的文件上傳,也可使用cospell的文件上傳支持,對於開發組而言,使用那種文件上傳支持,幾乎沒有任何區別—只需修改struts.multipart/parser常量,並在web應用中增長相應上傳項目的類庫便可

4三、Struts2文件上傳Action中,若是表單中包含一個name屬性爲xxx的文件域,則對應的Action須要使用3個屬性來封裝該文件域的信息:

類型爲Filexxx屬性封裝了該文件域對應的文件內容

類型爲StringxxxFileName屬性封裝了該文件域對應的文件的文件類型

類型爲StringxxxContectType屬性封裝了該文件域對應的文件的文件類型

除此以外,還能夠配置savePath屬性,經過配置文件設置該屬性的值—這也是典型的依賴注入

<action name=」upload」 class=」」>

<param name=」savePath」>/upload</param>

<result>/succ.jsp</result>

</action>

4四、Struts2中文件上傳攔截器是fileUpload,爲了讓該攔截器起做用,只須要在該Action中配置該攔截器的引用便可。

配置fileUpload攔截器時,能夠爲其指定兩個參數:allowedTypesmaximumSize

當配置fileUpload攔截器時,還必須顯示地爲該Action配置defaultStack的攔截器引用

若是爲了不文件上傳時使用Tomcat的工做 路徑做爲臨時路徑,則應該設置struts.multipart.saveDir屬性,struts.multipart.maxSize該屬性設置整個表單請求內容的最大字節數

4五、配置下載的Action時,須要在配置普通Action的基礎上,再加上額外的download的攔截器引用。除此以外,須要配置一個類型爲stream的結果,配置時須要指定4個屬性:contentType,inputName,contentDisposition,bufferSize,由於stream結果類型的邏輯視圖是返回給客戶端一個輸入流,所以無需指定location屬性。

4六、從代碼角度看,攔截器就是一個類,這個類也包含方法,只是這個方法是個特殊的方法,它會在目標方法調用以前」自動」執行。

4七、AOP的編程方式中,有三個重要概念:目標對象、被插入的處理方法、代理對象

定義攔截器使用<intercepter .../>元素來定義,最簡單格式以下:

<intercepter name=」」 class=」」 />若是還須要在傳入參數,則使用子元素<param .../>

系統爲攔截器指定參數有兩個時機:①定義攔截器是指定參數值,這種參數值是攔截器這個參數的默認參數值②使用攔截器時指定參數值,這種參數值是當在Action中使用該攔截器時動態分配的參數值

一旦定義了攔截器和攔截器棧後,就可使用這個攔截器或攔截器棧來攔截Action了,攔截行爲將會在Actionexecute方法執行前被執行

默認攔截器只有在Action中沒有顯示指定攔截器是纔會起做用,每一個包只能指定一個默認攔截器

自定義攔截器需實現Interceptor接口,重寫intercept(ActionInvocation invocation)方法,該方法得到ActionInvocation參數,這個參數有能夠得到被攔截的Action實例,一旦取得了Action實例,幾乎得到了所有的控制權

若是隻須要攔截某些方法,則可使用Struts2攔截器的方法過濾,繼承MethodFilterInterceptor類,若是用戶須要實現本身的攔截邏輯,則應該重寫doIntercept(ActionInvocation invocation)方法

配置在前面的攔截器,在被攔截方法以前的攔截動做,將會先對用戶請求起做用;若是是在被攔截方法以後的攔截動做,則會後對用戶請求起做用

4八、爲了精肯定義在execute方法執行結束後,在處理Result執行的的動做,Struts2提供了用於攔截結果的監聽器,這個監聽器是經過手動註冊在攔截器內部的,實現攔截結果的監聽器必須實現PreResultListener接口。注意不要在PreResultListener監聽器的beforeResult方法中經過ActionInvocation參數調用invoke方法,否則會陷入死循環。

4九、若是須要在引用攔截器棧時直接覆蓋棧內某個攔截器的屬性值,則在指定須要被覆蓋的屬性時,不能只指定該屬性的屬性名,必須加上該屬性屬於的攔截器名。即

<l攔截器名>.<參數名>

<interceptor-ref name=」」>

<param name=」攔截器名1.name」>更名後的攔截器</param>

</interceptor-ref>

50、Struts2內建攔截器,若是咱們定義的package繼承了Struts2的默認struts-default包,則能夠自由使用下面定義的攔截器,不然必須本身定義這些攔截器

alias:實如今不一樣請求中類似參數別名的轉換

autowiring:自動裝配攔截器,主要用於當Struts2Spring整合時,Struts2可使用自動裝配的方式來訪問Spring容器中的bean

chain:構建一個Action鏈,使當前Action能夠訪問前一個Action的屬性,通常和<result type=」chain」 .../>一塊兒使用

conversionError:負責處理類型轉換錯誤的攔截器,將類型轉換錯誤從ActionContext中取出,並轉換成ActionFieldError錯誤

createSession:負責建立一個HttpSession對象,主要用於那些須要有HttpSession對象才能正常工做的攔截器中

debuggding:當使用Struts2的開發模式時,這個攔截器會提供更多的調試信息

execAndWait:後臺執行Action,負責將等待畫面發送給用戶

exception:負責處理異常,將異常映射爲結果

fileUpload:主要用於文件上傳,負責解析表單中文件域的內容

i18n:負責把所選的語言、區域放入用戶Session

logger:負責日誌記錄,主要是輸出Action的名字

model-driven:用於模型驅動的攔截器,當摸個Action類實現了ModelDriven接口時,負責把getModel()方法的結果堆入ValueStack

scoped-model-driven:若是一個Action實現了一個ScopedModelDriven接口,該攔截器負責從指定生存範圍找出指定的Model,並將經過setModel方法將該Model傳給Action實例

params:這是一個最基本攔截器,負責解析HTTP請求中的參數,並將參數值設置成Action對應的屬性值

prepare:若是Action實現了Preparable接口,將會調用該攔截器的prepare()方法

static-params:負責將xml<action>標籤下<param>標籤中的參數傳入Action

scope:範圍轉換攔截器,能夠將Action狀態信息保存到HttpSession範圍,或者ServletContext範圍

servlet-config:若是某個Action須要直接訪問Servlet API,經過這個攔截器實現

roles:一個JAAS攔截器,只有當瀏覽者取得合適的受權後,才能夠調用被該攔截器攔截的Action

timer:負責輸出Action的執行時間,在分析該Action的性能瓶頸時比較有用

token:這個攔截器主要用於阻止重複提交,它檢查傳到Action中的token,從而防止屢次提交

token-session:做用與token攔截器相似,區別是它把token保存在HttpSession

validation:經過執行在xxxAction-validation.xml中定義的校驗器,完成數據校驗

workflow:負責調用Action類中的validate方法,若是校驗失敗,則返回input的邏輯視圖

大部分時候,開發者無需手動控制這些攔截器,只要咱們定義的包繼承了struts-default包,既能夠直接使用這些攔截器

5一、由於Struts2struts-default包中指定defaultStarck攔截器棧是默認的攔截器棧,所以若是用戶定義的包繼承了struts-default包,則也會將defaultStack攔截器棧做爲默認的攔截器棧。這意味着:若是系統中的Action配置沒有指定攔截器引用,系統會將defaultStack攔截器棧自動做用於該Action

5二、Struts2的標籤庫大大簡化了數據的輸出,也提供了大量標籤來生成頁面效果

Struts2能夠將全部標籤分紅3類:

UI標籤:主要用於生成HTML元素的標籤

UI標籤:主要用於數據訪問、邏輯控制等的標籤

Ajax標籤:用於Ajax支持的標籤

UI標籤又能夠分爲兩類:

表單標籤:表單標籤主要用於生成HTML頁面的form元素,以及普通表單元素的標籤

非表單標籤:非表單標籤主要用於生成頁面上的樹、Tab頁等標籤

UI標籤,也能夠分爲兩類:

流程控制標籤:主要包含用於實現分支、循環等流程控制的標籤

數據訪問標籤:主要包含用於輸出ValueStack中的值,完成國際化等功能的標籤

5三、導入Struts2標籤庫

<%@taglib  prefix=」s」  uri=」/struts-tags」%>

5四、OGNL中,若是須要訪問的屬性屬於根對象,則能夠直接訪問該屬性;不然必須使用一個命名空間,如#bar

Struts2中,系統的ValueStackOGNL的第一個根對象,若是最近的Action存在,則Action上下文是第二個根對象

Struts2不僅根據表達式從ValueStack中取得對象,還能夠直接從對象中獲取屬性。Struts2提供了一個特殊的OGNL PropertyAccessory(屬性訪問器),它能夠自動搜尋棧內的全部實體(從上到下),直到找到與求值表達式匹配的屬性

Struts2使用標準的Context來進行OGNL表達式求值,OGNL處理的頂級對象是一個Context,這個Context對象就是一個Map類型實例。在該OGNLContext中,有一個根對象,這個根對象就是OGNL ValueStack,若是須要訪問ValueStack裏的屬性,直接經過以下方式

#取得ValueStack中的bar屬性

${bar}

此外,Struts2還提供了一些命名對象,這些命名對象與根對象無關,它們只是存在於Stack Context中,因此,訪問這些對象時須要使用#前綴來指明。

parametersr,#parameters[‘foo’]#parameters.foorequest,#request[‘foo’]#request.foosession,#session[‘foo’]#session.fooapplication,#application[‘foo’]#application.fooattr,如過能夠訪問到,則訪問PageContext,不然將依次搜索request->session->servletCOntext

5五、OGNL中的集合操做

直接生成List類型集合的語法爲:{e1,e2,e3}

直接生成Map類型集合的語法爲:#{key1:value1,key2:value2,key3:value3}

OGNL提供兩個元素符:innot in判斷某個元素是否在指定集合中

<s:if test=」’foo’ in {‘foo’,’bar’}」>包含</s:if>

<s:else>不包含</s:else>

此外,OGNL還容許經過某個規則取得集合的子集,有3個操做符支持

?:取出全部符合條件的元素②^:取出符合條件的第一個元素③$:取出符合條件的最後一個元素

Person.relatives.{? #this.gender == ‘mail’}

直接在集合後緊跟.{}運算符代表用於取出該集合的子集,在{}內使用?代表取出全部符合選擇條件的元素,#this表明集合裏的元素

5六、OGNL支持基本的Lambda表達式,經過這種表達式語法,能夠在OGNL中使用一些簡單的函數

5七、Struts2的非UI標籤包括控制標籤和數據標籤,主要用於完成流程控制,以及對ValueStack的控制。

if:用於控制選擇輸出的標籤

elseIf/elseif:if標籤結合使用,用於控制選擇輸出的標籤

else:if標籤結合使用,用於控制選擇輸出的標籤

append:用於將多個集合拼接成一個新的集合

generator:字符串解析器,用於將一個字符串解析成一個集合

iterator:迭代器,用於將集合迭代輸出

merge:將多個集合拼接成一個新的集合,但與append的拼接方式有所不一樣

sort:用於對集合進行排序

subset:用於截取集合的部分元素,造成新的子集合

5八、<s:iterator .../>標籤對集合進行迭代輸出時,能夠指定3個屬性:

value:可選,指定被迭代的集合,若是未指定,則使用ValueStack棧頂的集合

id:可選,指定集合裏元素的ID

status:可選,指定迭代時IteratorStatus實例,經過該實例便可判斷當前迭代元素的屬性。例如是不是最後一個,以及當前迭代元素的索引等

5九、Sort標籤用於對指定的集合元素進行排序,進行排序時,必須提供本身的排序規則,即實現本身的Comparator,本身的Comparator須要實現java.util.COmparator接口,使用時可指定如下屬性

comparator:必填屬性,指定進行排序的Comparator實例②source:可選,指定被排序的集合,若是不指定,則對ValueStack棧頂的集合進行排序

60、數據標籤主要用於提供各類數據訪問相關的功能,包含顯示一個Action裏的屬性,以及生成國際化輸出等功能,主要包括以下幾個:

action:用於在JSP頁面直接調用一個Action,經過指定executeResult參數還可將該Action的處理結果包含到頁面中

bean:用於建立一個JavaBean實例。若是指定id屬性,則能夠將建立的JavaBean實例放入Stack Context

date:用於格式化輸出一個日期,計算指定日期和當前時刻之間的時差

debug:用於在頁面省生成一個調試連接,當單擊該連接時,能夠看到當前ValueStackStack Context中的內容

i18n:指定國際化資源文件的baseName

include:在頁面中包含其餘的jspServlet資源

param:設置參數,一般用做beanurl標籤的子標籤

push:將某個值放入ValueStack棧頂

set:用於設置一個新變量,並能夠將新變量放入指定的範圍內

text:用於輸出國際化信息

url:用於生成一個URL地址

property:用於生成輸出某個值,包括輸出ValueStackStack Context Action Context中值

6一、Struts2提供了兩種基本的整合策略:一種是將Action實例交給Spring容器來負責生成、管理;另一種策略是利用Spring插件的自動裝配方式,當Spring插件建立Action實例後,當即將Spring容器中對應的業務邏輯組件注入Action實例。

6二、Spring爲企業應用的開發提供一個輕量級解決方案,該解決方案包括:基於依賴注入的核心機制,基於AOP的聲明式事物管理,與多種持久層技術的整合,以及優秀的Web MVC框架等

6三、在依賴注入的模式下,建立被調用者的工做再也不由調用者來完成,所以稱爲控制反轉;建立被調用者實例的工做一般由Spring容器來完成,而後注入調用者,所以也稱爲依賴注入

6四、每一個Struts2的插件jar文件都必須包含一個名爲struts-plugin.xml的配置文件,struts-plugin.xml文件的內容與普通的struts.xml文件的內容徹底相同

6五、Struts2包含3中類型的配置文件,加載順序爲:struts-default.xml->struts-plugin.xml->struts.xml,應用相關的配置文件老是最後才加載的,由於應用能夠依賴於插件,每一個差價均可以依賴於Struts2的核心,但插件之間不可相互依賴

6六、Spring容器初始化

一、利用ContextLoaderListener,要求在WEB-INF路徑下有Spring配置文件applicationContext.xml,而且在web.xml中增長以下listener

<listener>

 <listener-class>ora.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

若是有多個配置文件須要載入,則應該使用<context-param>元素來肯定配置文件的文件名。ContextLoaderListener加載時,會查找名爲」contextConfigLocation」的參數,所以,配置context-param時參數名字應該是」contextConfigLocation」,若是應用中的Spring配置文件有多個,則採用以下配置方式

<context-param>

<param-name>contextConfigLoaction</param-name>

<param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml<param-value>

</context-param>

<listener>

 <listener-class>ora.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

若是沒有contextConfigLocation指定配置文件,Spring自動查找WEBB-INF下的applicationContext.xml,若是有contextConfigLocation,則利用該參數指定的配置文件來建立Spring容器,若是沒法找到合適的配置文件,Spring將沒法正常初始化

二、採用load-on-startup Servlet建立ApplicationContext

Spring提供了一個特殊的servlet類:ContextLoaderServlet,該servlet在初始化時,會自動查找WEB-INF/下的」applicationContext.xml」文件

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>org.springframework,web.context.ContextLoaderServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

配置該servlet時,配置了load-on-startup子元素,指定該servlet會隨web應用的啓動而完成初始化,值餘下,該servlet越早完成初始化,但無論多小,Listener都比該servlet更早啓動

servlet僅用於提供」後臺」服務,負責建立Spring容器,無需響應客戶請求,無需配置servlet-mapping,若是有多個配置文件,則一樣要指定contextConfigLocation

6七、採用工廠模式,將控制器與業務邏輯組件的實現分離,從而提供更好的解耦

6八、控制器如何訪問到Spring容器中的業務邏輯組件?爲了讓Action訪問Spring的業務邏輯組件,有兩種策略:

Spring管理控制器,並利用依賴注入爲控制器注入業務邏輯組件

②控制器定位Spring工廠,也就是Spring容器,從Spring容器中取得所需的業務邏輯組件

相關文章
相關標籤/搜索