Struts2框架原理
Struts2提供了基于MVC應(yīng)用程序的開發(fā)模式,從而使應(yīng)用程序結(jié)構(gòu)更加清晰,同時(shí)也簡(jiǎn)化了Web應(yīng)用程序的開發(fā)。
Struts2的組成結(jié)構(gòu)
?
主要包括控制器組件(包括核心控制器StrutsPrepareAndExecuteFilter、業(yè)務(wù)控制器Action)、模型組件(包括業(yè)務(wù)邏輯組件和數(shù)據(jù)庫訪問組件)和視圖組件。
- 模型組件:實(shí)現(xiàn)業(yè)務(wù)邏輯的模塊,由JavaBean或EJB構(gòu)成。
- 視圖組件:主要有HTML、JSP和Struts2標(biāo)簽等視圖技術(shù)。
- 控制器組件:控制器組件主要由核心控制器和業(yè)務(wù)控制器Action組成。
Struts2框架結(jié)構(gòu)
?
工作流程
?
Struts2框架的核心控制器負(fù)責(zé)攔截由<url-pattern>/*</url-pattern>指定的所有用戶請(qǐng)求,當(dāng)用戶請(qǐng)求到達(dá)時(shí),該Filter會(huì)過濾用戶的請(qǐng)求。當(dāng)請(qǐng)求轉(zhuǎn)入Struts2框架處理時(shí)會(huì)先經(jīng)過一系列的攔截器,然后再到Action。Struts2對(duì)用戶的每一次請(qǐng)求都會(huì)創(chuàng)建一個(gè)Action并運(yùn)行,根據(jù)其運(yùn)行返回的值,按Result配置信息,跳轉(zhuǎn)到新的服務(wù)(進(jìn)入視圖或Action)。
具體流程:
在開發(fā)基于Struts2的Web應(yīng)用程序,開發(fā)者主要的任務(wù)就是設(shè)計(jì)Action、在配置文件內(nèi)配置Action信息,以及編寫視圖的工作。
必須的配置信息
?
1)在配置文件web.xml中配置Struts2的啟動(dòng)信息
Struts2通過StrutsPrepareAndExecuteFilter過濾器來啟動(dòng),即需要在web.xml文件中添加Struts2的啟動(dòng)配置信息。
<!--定義Struts2的核心控制器Filter--> <!--這里是用過濾器作為控制器--> <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)向的頁面--> <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ī)定的過濾器要求執(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的很多核心功能都是通過攔截器來實(shí)現(xiàn)的,例如,從請(qǐng)求中把請(qǐng)求參數(shù)封裝到Action、文件上傳和數(shù)據(jù)驗(yàn)證等都是通過攔截器實(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配置。
?
-
name屬性:配置包時(shí)必須指定name屬性,該name屬性值可以任意取名,但是必須唯一。如果其他包要繼承該包,必須通過該屬性進(jìn)行引用。
- namespace屬性:包的namespace屬性用于定義該包的命名空間,命名空間做為訪問該包下Action的路徑的一部分。默認(rèn)命名空間為“/”(空字符串)。
- extends屬性:通常每個(gè)包都應(yīng)該繼承struts-default包,該包是在struts2-core.jar文件中的struts-default.xml中定義的,給出了Struts2框架的核心配置信息。
<action>元素的常見屬性:
- 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)簽中的常見屬性:
- name:指定Action邏輯視圖名稱,默認(rèn)值為success。
- type:指定結(jié)果類型所定向的文件類型:JSP文件、Action類等,默認(rèn)為JSP頁面。
?
Struts2的控制層及Action設(shè)計(jì)與配置
?開發(fā)基于Struts2的Web應(yīng)用程序時(shí),Action是程序的核心。
開發(fā)人員需要根據(jù)業(yè)務(wù)邏輯實(shí)現(xiàn)特定的Action類,并在struts.xml文件中配置Action。Action類中包含了對(duì)用戶請(qǐng)求的處理邏輯,因此,也把Action稱為Action業(yè)務(wù)控制器。
一般來說,每個(gè)Action類都有一個(gè)或多個(gè)方法來實(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)傳參
無論使用什么方式,設(shè)計(jì)Action類都必須滿足一下條件:
(使用第3種的方式向Action中傳值)
Action訪問Web資源
?
在Struts2中,Action類和Web對(duì)象之間沒有任何直接關(guān)系,但是Action作為業(yè)務(wù)邏輯控制器,經(jīng)常要訪問Web資源。
Struts2提供了ActionContext類與ServletActionContext類用于Action訪問Web資源,并且ServletActionContext類直接繼承了ActionContext類。
在Action中訪問Web對(duì)象有4種方式:
- 通過ServletActionContext直接訪問Web對(duì)象——Servlet依賴容器方式;
- 通過ActionContext訪問——Map依賴容器方式;
- 通過IoC訪問Servlet對(duì)象——Map IoC方式;
- 通過IoC訪問Servlet對(duì)象——Servlet IoC方式。
Struts2框架視圖與攔截器技術(shù)
?
Struts2框架專門提供了自己的標(biāo)簽庫、OGNL表達(dá)式和國際化處理方式;
另外,Struts2框架的重要特定是采用攔截器技術(shù)實(shí)現(xiàn)對(duì)各類請(qǐng)求的攔截和過濾。
1)Struts2的攔截器
攔截器(Interceptor)是Struts2的核心組成部分。攔截器動(dòng)態(tài)攔截Action調(diào)用的對(duì)象,它提供一種機(jī)制,使開發(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)方法過濾,就需要繼承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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6. H.264/AVC编码器原理
- 下一篇: 屏蔽属性