日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Struts2框架原理

發(fā)布時(shí)間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2框架原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Struts2提供了基于MVC應(yīng)用程序的開(kāi)發(fā)模式,從而使應(yīng)用程序結(jié)構(gòu)更加清晰,同時(shí)也簡(jiǎn)化了Web應(yīng)用程序的開(kāi)發(fā)。

Struts2的組成結(jié)構(gòu)


?

主要包括控制器組件(包括核心控制器StrutsPrepareAndExecuteFilter、業(yè)務(wù)控制器Action)、模型組件(包括業(yè)務(wù)邏輯組件和數(shù)據(jù)庫(kù)訪問(wèn)組件)和視圖組件。

  • 模型組件:實(shí)現(xiàn)業(yè)務(wù)邏輯的模塊,由JavaBean或EJB構(gòu)成。
  • 視圖組件:主要有HTML、JSP和Struts2標(biāo)簽等視圖技術(shù)。
  • 控制器組件:控制器組件主要由核心控制器和業(yè)務(wù)控制器Action組成。

Struts2框架結(jié)構(gòu)


?

  • StrutsPrepareAndExecuteFilter是整個(gè)Struts2的核心控制器,根據(jù)ActionMapper的結(jié)果來(lái)決定是否處理請(qǐng)求,如果ActionMapper指出該URL應(yīng)該被Struts2處理,就執(zhí)行Action處理,并停止過(guò)濾器鏈上還沒(méi)有執(zhí)行的過(guò)濾器。
  • ActionMapper提供了HTTP請(qǐng)求與Action執(zhí)行之間的映射,即ActionMapper判斷請(qǐng)求是否應(yīng)該被Struts處理。若需要Struts2處理,ActionMapper返回一個(gè)對(duì)象來(lái)描述請(qǐng)求對(duì)應(yīng)的ActionInvocation的信息。(注意不是返回ActionInvocation的對(duì)象)
  • ActionProxy是一個(gè)特別的中間層,位于Action和xwork之間,可以根據(jù)需求引入更多的實(shí)現(xiàn)方式,比如通過(guò)WebService來(lái)實(shí)現(xiàn)等。
  • ConfigurationManager是xwork配置的管理中心,可以理解為struts.xml配置文件在內(nèi)存中的對(duì)應(yīng)。
  • struts.xml是Struts2的應(yīng)用配置文件,負(fù)責(zé)URL與Action之間映射的配置,以及執(zhí)行后頁(yè)面跳轉(zhuǎn)的Result配置等。
  • ActionInvocation:調(diào)用并執(zhí)行Action,它擁有一個(gè)Action實(shí)例和這個(gè)Action所依賴的攔截器實(shí)例。
  • Interceptor(攔截器):自動(dòng)攔截Action,提供了在Action運(yùn)行之前或Result運(yùn)行之后可能需要執(zhí)行的某功能代碼。類似javax.servlet.Filter。
  • Action:是Struts2中的動(dòng)作執(zhí)行單元(執(zhí)行類),用來(lái)處理用戶請(qǐng)求,并封裝業(yè)務(wù)所需要的數(shù)據(jù)。
  • Result:是不同視圖類型的抽象封裝模型,不同的視圖類型會(huì)對(duì)應(yīng)不同的Result實(shí)現(xiàn),Struts2中支持多種視圖類型,比如JSP、FreeMarker等。
  • Templates:各種視圖類型的頁(yè)面模板,比如JSP就是一種模板頁(yè)面技術(shù)。
  • TagSubsystem:Struts2的標(biāo)簽庫(kù),它抽象了3種不同的視圖技術(shù):JSP、velocity和freemarker,可以在不同的視圖技術(shù)中直接使用這些標(biāo)簽。
  • 工作流程


    ?

    Struts2框架的核心控制器負(fù)責(zé)攔截由<url-pattern>/*</url-pattern>指定的所有用戶請(qǐng)求,當(dāng)用戶請(qǐng)求到達(dá)時(shí),該Filter會(huì)過(guò)濾用戶的請(qǐng)求。當(dāng)請(qǐng)求轉(zhuǎn)入Struts2框架處理時(shí)會(huì)先經(jīng)過(guò)一系列的攔截器,然后再到Action。Struts2對(duì)用戶的每一次請(qǐng)求都會(huì)創(chuàng)建一個(gè)Action并運(yùn)行,根據(jù)其運(yùn)行返回的值,按Result配置信息,跳轉(zhuǎn)到新的服務(wù)(進(jìn)入視圖或Action)。

    具體流程:

  • 客戶發(fā)送請(qǐng)求給StrutsPrepareAndExecuteFilter。
  • StrutsPrepareAndExecuteFilter詢問(wèn)ActionMapper,該請(qǐng)求是否是一個(gè)Struts2請(qǐng)求(即是否返回一個(gè)非空的ActionMapping對(duì)象)。
  • 若ActionMapper認(rèn)為該請(qǐng)求是一個(gè)Struts2請(qǐng)求,則StrutsPrepareAndExecuteFilter把請(qǐng)求交給ActionProxy處理。
  • ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,確定需要調(diào)用的Action類及Action方法。
  • ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例,并進(jìn)行初始化。
  • ActionInvocation實(shí)例在調(diào)用Action的過(guò)程前后,涉及相關(guān)攔截器(Interceptor)的調(diào)用。
  • Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。調(diào)用結(jié)果的execute()方法(或配置指定的方法),渲染結(jié)果。
  • 執(zhí)行各個(gè)攔截器Invocation.invoke()之后的代碼。
  • 把結(jié)果發(fā)送到客戶端。
  • 在開(kāi)發(fā)基于Struts2的Web應(yīng)用程序,開(kāi)發(fā)者主要的任務(wù)就是設(shè)計(jì)Action、在配置文件內(nèi)配置Action信息,以及編寫視圖的工作。

    必須的配置信息


    ?

    1)在配置文件web.xml中配置Struts2的啟動(dòng)信息

    Struts2通過(guò)StrutsPrepareAndExecuteFilter過(guò)濾器來(lái)啟動(dòng),即需要在web.xml文件中添加Struts2的啟動(dòng)配置信息。

    <!--定義Struts2的核心控制器Filter--> <!--這里是用過(guò)濾器作為控制器--> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsAndexecuteFilter </filter-class> </filter><!--配置Struts2可以處理的Action請(qǐng)求--> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

    2)在當(dāng)前Web應(yīng)用的classpath下添加struts2的配置文件struts.xml。

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <!--配置文件的頭信息--><struts> <!--各種配置信息--></struts>

    ?struts2.xml配置舉例:

    <struts> <package name="default" namespace="/" extends="struts-default"> <!--opadd是配置調(diào)用Action方法executeAdd的名稱--> <action name="opadd" class="com.action.AddAction" method="executeAdd"> <!--根據(jù)方法executeAdd()的返回值,確定所要轉(zhuǎn)向的頁(yè)面--> <result name="+">positive.jsp</result> <result name="-">negative.jsp</result> </action> </package> </struts>

    struts2的配置


    ?

    1)web.xml配置文件

    在使用Struts2框架時(shí),必須在web.xml中配置支持Struts2的主控制器。目前所使用的主控制器是StrutsPrepareAndExecuteFilter類,主要負(fù)責(zé)接收所有請(qǐng)求,并按規(guī)定的過(guò)濾器要求執(zhí)行相應(yīng)的請(qǐng)求,在web.xml配置文件中配置,系統(tǒng)啟動(dòng)時(shí),自動(dòng)創(chuàng)建該控制器。

    2)struts-default.xml配置文件

    struts-default.xml配置文件是Struts2框架默認(rèn)加載的配置文件,該文件存放在struts2-core.jar中,可以從中查找Struts2默認(rèn)的各種配置信息。

    該配置文件提供了一些標(biāo)準(zhǔn)的核心配置,Struts2的很多核心功能都是通過(guò)攔截器來(lái)實(shí)現(xiàn)的,例如,從請(qǐng)求中把請(qǐng)求參數(shù)封裝到Action、文件上傳和數(shù)據(jù)驗(yàn)證等都是通過(guò)攔截器實(shí)現(xiàn)的。struts-deful.xmlt定義了這些攔截器和result類型。

    Struts2每次啟動(dòng)都會(huì)自動(dòng)加載struts-default.xml文件,需要在配置文件struts.xml中繼承在struts-default.xml中配置的包struts-default即可。

    3)struts.xml配置文件

    struts.xml配置文件是Struts2默認(rèn)的核心配置文件。Struts2應(yīng)用的各個(gè)組件及其關(guān)系均在該文件中聲明并配置。

    主要配置有:常量配置、導(dǎo)入(包含)配置文件、包配置及包配置下的Action配置。

  • 常量配置:在開(kāi)發(fā)階段或運(yùn)行階段,可以設(shè)置一些常量(屬性)值,設(shè)置Struts2運(yùn)行或者開(kāi)發(fā)時(shí)的環(huán)境,從而滿足需求。 <!--指定應(yīng)用的編碼集,相當(dāng)于調(diào)用HttpServletRequest.setCharacterEncoding方法--> <constant name="struts.il8n.encoding" value="UTF-8"/>

    ?

  • 包配置:Struts2框架的核心組件就是Action、攔截器等,Struts2框架使用包來(lái)管理Action和攔截器等。每個(gè)包就是多個(gè)Action、多個(gè)攔截器或攔截器引用的集合。在實(shí)際應(yīng)用中,應(yīng)該把一組業(yè)務(wù)功能相關(guān)的Action和攔截器放在同一個(gè)包下面。 <package name="default" namespace="/" extends="struts-default">
    • name屬性:配置包時(shí)必須指定name屬性,該name屬性值可以任意取名,但是必須唯一。如果其他包要繼承該包,必須通過(guò)該屬性進(jìn)行引用。

    • namespace屬性:包的namespace屬性用于定義該包的命名空間,命名空間做為訪問(wèn)該包下Action的路徑的一部分。默認(rèn)命名空間為“/”(空字符串)。
    • extends屬性:通常每個(gè)包都應(yīng)該繼承struts-default包,該包是在struts2-core.jar文件中的struts-default.xml中定義的,給出了Struts2框架的核心配置信息。
  • Action配置:Struts2種Action類的配置能夠讓Struts2知道Action的存在,并可以通過(guò)調(diào)用該Action來(lái)處理用戶請(qǐng)求。Struts2使用包來(lái)組織和管理Action。(Action類必須配置在“包”下,在一個(gè)“包”下可以配置多個(gè)Action) <action name="opadd" class="com.action.AddAction" method="executeAdd"> <!--根據(jù)方法executeAdd()的返回值,確定所要轉(zhuǎn)向的頁(yè)面--> <result name="+">positive.jsp</result> <result name="-">negative.jsp</result> </action>

    <action>元素的常見(jiàn)屬性:

    • name;指定客戶端發(fā)送請(qǐng)求的地址映射名稱,是必選項(xiàng)
    • class:指定Action對(duì)應(yīng)的實(shí)現(xiàn)類,默認(rèn)值為ActionSupport類
    • method:指定Action類中的處理方法名,默認(rèn)值為Action中的execute方法

        <result>標(biāo)簽中的常見(jiàn)屬性:

    • name:指定Action邏輯視圖名稱,默認(rèn)值為success。
    • type:指定結(jié)果類型所定向的文件類型:JSP文件、Action類等,默認(rèn)為JSP頁(yè)面。

    ?

    Struts2的控制層及Action設(shè)計(jì)與配置


    ?開(kāi)發(fā)基于Struts2的Web應(yīng)用程序時(shí),Action是程序的核心。

    開(kāi)發(fā)人員需要根據(jù)業(yè)務(wù)邏輯實(shí)現(xiàn)特定的Action類,并在struts.xml文件中配置Action。Action類中包含了對(duì)用戶請(qǐng)求的處理邏輯,因此,也把Action稱為Action業(yè)務(wù)控制器。

    一般來(lái)說(shuō),每個(gè)Action類都有一個(gè)或多個(gè)方法來(lái)實(shí)現(xiàn)用戶請(qǐng)求的處理,其中每個(gè)方法都會(huì)返回一個(gè)String類型的處理結(jié)果,該String值用于決定需要跳轉(zhuǎn)(轉(zhuǎn)向或重定向)到哪個(gè)視圖的或者另一個(gè)Action。對(duì)于一個(gè)Action,需要傳入值和傳出值,即由請(qǐng)求傳值給Action,Action處理加工后傳值給視圖(或另一個(gè)Action)。

    • 普通的Java類作為Action類與屬性驅(qū)動(dòng)傳參。
    • 繼承ActionSupport實(shí)現(xiàn)Action與屬性驅(qū)動(dòng)傳參
    • 領(lǐng)域?qū)ο髮傩则?qū)動(dòng)的Action設(shè)計(jì)與屬性傳參
    • 模型驅(qū)動(dòng)(Model-Driven)的Action類與模型驅(qū)動(dòng)傳參

    無(wú)論使用什么方式,設(shè)計(jì)Action類都必須滿足一下條件:

  • Action類,每個(gè)屬性都有setter/getter方法,必須具有無(wú)參構(gòu)造方法;
  • 該類除所必需的屬性外,通常有一個(gè)execute()方法(或自定義方法),該方法無(wú)任何參數(shù)且返回字符串類型的值。
  • JSP頁(yè)面與Action參數(shù)傳遞:JSP頁(yè)面中使用的輸入域?qū)傩?#xff08;name屬性值、EL表達(dá)式中的屬性名)必須與Action類定義中的屬性名稱相同。
  • (使用第3種的方式向Action中傳值)

    Action訪問(wèn)Web資源


    ?

    在Struts2中,Action類和Web對(duì)象之間沒(méi)有任何直接關(guān)系,但是Action作為業(yè)務(wù)邏輯控制器,經(jīng)常要訪問(wèn)Web資源。

    Struts2提供了ActionContext類與ServletActionContext類用于Action訪問(wèn)Web資源,并且ServletActionContext類直接繼承了ActionContext類。

    在Action中訪問(wèn)Web對(duì)象有4種方式:

    • 通過(guò)ServletActionContext直接訪問(wèn)Web對(duì)象——Servlet依賴容器方式;
    • 通過(guò)ActionContext訪問(wèn)——Map依賴容器方式;
    • 通過(guò)IoC訪問(wèn)Servlet對(duì)象——Map IoC方式;
    • 通過(guò)IoC訪問(wèn)Servlet對(duì)象——Servlet IoC方式。

    Struts2框架視圖與攔截器技術(shù)


    ?

    Struts2框架專門提供了自己的標(biāo)簽庫(kù)、OGNL表達(dá)式和國(guó)際化處理方式;

    另外,Struts2框架的重要特定是采用攔截器技術(shù)實(shí)現(xiàn)對(duì)各類請(qǐng)求的攔截和過(guò)濾。

    1)Struts2的攔截器

    攔截器(Interceptor)是Struts2的核心組成部分。攔截器動(dòng)態(tài)攔截Action調(diào)用的對(duì)象,它提供一種機(jī)制,使開(kāi)發(fā)者可以定義一個(gè)特定的功能模塊,這個(gè)模塊可以在Action執(zhí)行前或者執(zhí)行后運(yùn)行,也可以在一個(gè)Action執(zhí)行之前阻止Action執(zhí)行。

    攔截器分為兩類:

    • Struts2提供的內(nèi)建攔截器;
    • 用戶自定義的攔截器。

    1.自定義實(shí)現(xiàn)攔截器:

    Struts2提供了Interceptor接口,以及對(duì)該接口實(shí)現(xiàn)的一個(gè)抽象攔截器類(AbstractInterceptor)。創(chuàng)建攔截器類可以實(shí)現(xiàn)Interceptor接口,也可以直接繼承AbstractInterceptor類。

    Struts2還提供了一個(gè)MethodFilterInterceptor類,該類是AbstractInterceptor類的子類,若要實(shí)現(xiàn)方法過(guò)濾,就需要繼承MethodFilterInterceptor,設(shè)計(jì)方法攔截器。

    攔截器創(chuàng)建之后,需要在Struts.xml中注冊(cè)聲明;并在Action的配置中引用該攔截器,還要引用系統(tǒng)默認(rèn)的攔截器棧(因?yàn)橐坏┠硞€(gè)Action引用了自定義的攔截器,Struts2默認(rèn)的攔截器就不會(huì)在起作用了)。

    <package><interceptors><!--注冊(cè)聲明攔截器--> <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor></interceptors><action name="test_interceptor" class="com.Action.Test_InterceptorAction"><!--在Action中引入自定義攔截器--> <interceptor-ref name="myInterceptor"/> <!--在Action中引入默認(rèn)攔截器棧--> <interceptor-ref name="defaultStack"/></action></package>

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/dudududu/p/8596508.html

    總結(jié)

    以上是生活随笔為你收集整理的Struts2框架原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。