亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入Struts 1.1

2019-11-17 06:33:27
字體:
來源:轉載
供稿:網友

王和全(ok_winnerboy@sina.com)
2003年 8 月

作為基于MVC模式的Web應用最經典框架,Struts已經正式推出了1.1版本,該版本在以往版本的基礎上,提供了許多激動人心的新功能。本文就將帶你走進Struts 1.1去深入地了解這些功能。

說明:希望本文的讀者能有一定的Struts使用基礎。

1、Model 2

Struts是基于Model 2之上的,而Model 2是經典的MVC(模型-視圖-控制器)模型的Web應用變體,這個改變主要是由于網絡應用的特性--HTTP協議的無狀態性引起的。Model 2的目的和MVC一樣,也是利用控制器來分離模型和視圖,達到一種層間松散耦合的效果,提高系統靈活性、復用性和可維護性。在多數情況下,你可以將Model 2與MVC等同起來。

下圖表示一個基于java技術的典型網絡應用,從中可以看出Model 2中的各個部分是如何對應于Java中各種現有技術的。

在利用Model 2之前,我們是把所有的表示邏輯和業務邏輯都集中在一起(比如大雜燴似的jsp),有時也稱這種應用模式為Model 1,Model 1的主要缺點就是緊耦合,復用性差以及維護成本高。

2、Struts 1.1 和Model 2

既然Struts 1.1是基于Model 2之上,那它的底層機制也就是MVC,下面是Struts 1.1中的MVC實現示意圖:


圖解說明:其中不同顏色代表MVC的不同部分:紅色(控制器)、紫色(模型)和綠色(視圖)

首先,控制器(ActionServlet)進行初始化工作,讀取配置文件(struts-config.xml),為不同的Struts模塊初始化相應的ModuleConfig對象。比如配置文件中的Action映射定義都保存在ActionConfig集合中。相應地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。

提示:模塊是在Struts 1.1中新提出的概念,在稍后的內容中我們將具體介紹,你現在可以簡單地把模塊看作是一個子系統,它們共同組成整個應用,同時又各自獨立。Struts 1.1中所有的處理都是在特定模塊環境中進行的。模塊的提出主要是為了解決Struts 1.0中單配置文件的問題。

控制器接收HTTP請求,并從ActionConfig中找出對應于該請求的Action子類,假如沒有對應的Action,控制器直接將請求轉發給JSP或者靜態頁面。否則控制器將請求分發至具體Action類進行處理。

在控制器調用具體Action的execute方法之前,ActionForm對象將利用HTTP請求中的參數來填充自己(可選步驟,需要在配置文件中指定)。具體的ActionForm對象應該是ActionForm的子類對象,它其實就是一個JavaBean。此外,還可以在ActionForm類中調用validate方法來檢查請求參數的合法性,并且可以返回一個包含所有錯誤信息的ActionErrors對象。假如執行成功,ActionForm自動將這些參數信息以JavaBean(一般稱之為form bean)的方式保存在Servlet Context中,這樣它們就可以被其它Action對象或者JSP調用。

Struts將這些ActionForm的配置信息都放在FormBeanConfig集合中,通過它們Struts能夠知道針對某個客戶請求是否需要創建相應的ActionForm實例。

Action很簡單,一般只包含一個execute方法,它負責執行相應的業務邏輯,假如需要,它也進行相應的數據檢查。執行完成之后,返回一個ActionForward對象,控制器通過該ActionForward對象來進行轉發工作。我們主張將獲取數據和執行業務邏輯的功能放到具體的JavaBean當中,而Action只負責完成與控制有關的功能。遵循該原則,所以在上圖中我將Action對象歸為控制器部分。

提示:其實在Struts 1.1中,ActionMapping的作用完全可以由ActionConfig來替代,只不過由于它是公共API的一部分以及兼容性的問題得以保留。ActionMapping通過繼續ActionConfig來獲得與其一致的功能,你可以等同地看待它們。同理,其它例如ActionForward與ForwardConfig的關系也是如此。

下圖給出了客戶端從發出請求到獲得響應整個過程的圖解說明。

下面我們就來具體地討論一下其中的每個部分,在這之前,先來了解一下模塊的概念。

3、模塊

我們知道,在Struts 1.0中,我們只能在web.xml中為ActionServlet指定一個配置文件,這對于我們這些網上的教學例子來說當然沒什么問題,但是在實際的應用開發過程中,可能會有些麻煩。因為許多開發人員都可能同時需要修改配置文件,但是配置文件只能同時被一個人修改,這樣肯定會造成一定程度上的資源爭奪,勢必會影響開發效率和引起開發人員的抱怨。

在Struts 1.1中,為了解決這個并行開發的問題,提出了兩種解決方案:

  1. 多個配置文件的支持
  2. 模塊的支持

支持多個配置文件,是指你能夠為ActionServlet同時指定多個xml配置文件,文件之間以逗號分隔,比如Struts提供的MailReader演示例子中就采用該種方法。

  <!-- Action Servlet Configuration -->  <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param>  <param-name>config</param-name>  <param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml</param-value> </init-param>  <load-on-startup>1</load-on-startup>  </servlet>

這種方法可以很好地解決修改沖突的問題,不同的開發人員可以在不同的配置文件中設置自己的Action、ActionForm等等(當然不是說每個開發人員都需要自己的配置文件,可以按照系統的功能模塊進行劃分)。但是,這里還是存在一個潛在的問題,就是可能不同的配置文件之間會產生沖突,因為在ActionServlet初始化的時候這幾個文件最終還是需要合并到一起的。比如,在struts-config.xml中配置了一個名為sUCcess的<forward>,而在struts-config-registration.xml中也配置了一個同樣的<forward>,那么執行起來就會產生沖突。

為了徹底解決這種沖突,Struts 1.1中引進了模塊(Module)的概念。一個模塊就是一個獨立的子系統,你可以在其中進行任意所需的配置,同時又不必擔心和其它的配置文件產生沖突。因為前面我們講過,ActionServlet是將不同的模塊信息保存在不同的ModuleConfig對象中的。要使用模塊的功能,需要進行以下的預備工作:

1、為每個模塊預備一個配置文件

2、配置web.xml文件,通知控制器

決定采用多個模塊以后,你需要將這些信息告訴控制器,這需要在web.xml文件進行配置。下面是一個典型的多模塊配置:

<init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param> <param-name>config/customer</param-name>  <param-value>/WEB-INF/struts-config-customer.xml</param-value></init-param><init-param>  <param-name>config/order</param-name> <param-value>/WEB-INF/struts-config-order.xml</param-value></init-param>

要配置多個模塊,你需要在原有的一個<init-param>(在Struts 1.1中將其對應的模塊稱為缺省模塊)的基礎之上,增加模塊對應的<init-param>。其中<param-name>表示為config/XXX的形式,其中XXX為對應的模塊名,<param-value>中還是指定模塊對應的配置文件。上面這個例子說明該應用有三個模塊,分別是缺省模塊、customer和order,它們分別對應不同的配置文件。

3、預備各個模塊所需的ActionForm、Action和JSP等資源

但是要注重的是,模塊的出現也同時帶來了一個問題,即如何在不同模塊間進行轉發?有兩種方法可以實現模塊間的轉發,一種就是在<forward>(全局或者本地)中定義,另外一種就是利用org.apache.struts.actions.SwitchAction。

下面就是一個全局的例子:

    ...     <struts-config> ...  <global-forwards>  <forward name="toModuleB"   contextRelative="true"     path="/moduleB/index.do"   redirect="true"/>    ...  </global-forwards>   ...       </struts-config>

可以看出,只需要在原有的path屬性前加上模塊名,同時將contextRelative屬性置為true即可。此外,你也可以在<action>中定義一個類似的本地<forward>。

  <action-mappings> <!-- Action mapping for PRofile form --> <action path="/login"  type="com.ncu.test.LoginAction"   name="loginForm"      scope="request"       input="tile.userLogin" validate="true">      <forward name="success" contextRelative="true" path="/moduleA/login.do"/>  </action>   </action-mappings>

假如你已經處在其他模塊,需要轉回到缺省模塊,那應該類似下面這樣定義,即模塊名為空。

<forward name="success" contextRelative="true" path="/login.do"/>

此外,你也可以使用org.apache.struts.actions.SwitchAction,例如:

    ...    <action-mappings>  <action path="/toModule"  type="org.apache.struts.actions.SwitchAction"/>   ...        </action-mappings>      ...

4、ActionServlet

我們首先來了解MVC中的控制器。在Struts 1.1中缺省采用ActionServlet類來充當控制器。當然假如ActionServlet不能滿足你的需求,你也可以通過繼續它來實現自己的類。這可以在/WEB-INF/web.xml中來具體指定。

要把握ActionServlet,就必須了解它所扮演的角色。首先,ActionServlet表示MVC結構中的控制器部分,它需要完成控制器所需的前端控制及轉發請求等職責。其次,ActionServlet被實現為一個專門處理HTTP請求的Servlet,它同時具有servlet的特點。在Struts 1.1中它主要完成以下功能:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91老司机精品视频| 91精品在线国产| 日韩av毛片网| 亚洲电影免费观看高清完整版| 成人av色在线观看| 国产日韩欧美自拍| 九九热精品在线| 亚洲欧美日韩一区在线| 国产精品久久久久免费a∨大胸| 欧美激情xxxx| 性欧美办公室18xxxxhd| 一本色道久久综合狠狠躁篇怎么玩| 国产精品久久久久久久久久久不卡| 国产91热爆ts人妖在线| 最近2019好看的中文字幕免费| 欧美资源在线观看| 亚洲free性xxxx护士白浆| 91中文精品字幕在线视频| 亚洲国产欧美一区二区丝袜黑人| 国内自拍欧美激情| 国产日韩欧美视频在线| 色悠久久久久综合先锋影音下载| 成人a级免费视频| 91精品成人久久| 亚洲一区二区免费在线| 久久伊人精品天天| 亚洲电影免费观看| 欧美一二三视频| 亚洲精品影视在线观看| 日韩少妇与小伙激情| 26uuu亚洲国产精品| 日韩免费在线免费观看| 欧美性极品xxxx娇小| 日韩在线国产精品| 欧美激情性做爰免费视频| 亚洲а∨天堂久久精品9966| 欧美性猛交xxxx乱大交蜜桃| 国产成人黄色av| 欧美日韩爱爱视频| 国产精品久久久久久av福利| 91视频九色网站| 最新91在线视频| 久久综合伊人77777| 国产成人自拍视频在线观看| 国产成人精品久久| 国产69精品99久久久久久宅男| 91av视频在线播放| 欧美丝袜一区二区| 欧美视频在线免费看| 国产精品第七十二页| 亚洲高清福利视频| 68精品国产免费久久久久久婷婷| 九色精品免费永久在线| 富二代精品短视频| 欧美噜噜久久久xxx| 亚洲一区久久久| 热门国产精品亚洲第一区在线| 日本最新高清不卡中文字幕| 亚州国产精品久久久| 亚洲黄一区二区| 成人免费视频在线观看超级碰| 亚洲欧美日韩精品久久奇米色影视| 中文亚洲视频在线| 美日韩精品视频免费看| 精品国产31久久久久久| 中文字幕久久亚洲| 亚洲人成在线观看| 久久天堂电影网| 久久精品视频中文字幕| 久久久女人电视剧免费播放下载| 宅男66日本亚洲欧美视频| 日韩免费视频在线观看| 欧美黑人一级爽快片淫片高清| 久久久黄色av| 国产精品一区二区三区久久| 国产精品777| 国产日韩欧美视频| 青青草成人在线| 国产精品99免视看9| 欧美亚洲视频一区二区| 色综合久久天天综线观看| 国产精品久久久久久av下载红粉| 欧美激情一区二区三区在线视频观看| 久久青草精品视频免费观看| 中文欧美在线视频| 欧美在线激情网| 国产91精品最新在线播放| 亚洲自拍欧美色图| 亚洲一区国产精品| 国内精品免费午夜毛片| 久久99精品久久久久久噜噜| 亚洲高清av在线| 精品国产乱码久久久久久天美| 日韩三级影视基地| 精品无人区太爽高潮在线播放| 91久久久久久久久久久| 97在线免费视频| 欧美另类在线观看| 狠狠躁夜夜躁人人躁婷婷91| 国产精品青青在线观看爽香蕉| 国产日韩精品入口| 懂色aⅴ精品一区二区三区蜜月| 日韩av在线免费观看| 亚洲欧美国产视频| 欧美激情亚洲精品| 久久久久久久久久婷婷| 精品成人在线视频| 久久国产精品电影| 精品成人69xx.xyz| 欧美一性一乱一交一视频| 国产成人在线播放| 国产精品久久久久久婷婷天堂| 在线看片第一页欧美| 亚洲欧美日本另类| 亚洲国产精品女人久久久| 在线亚洲国产精品网| 亚洲高清av在线| 久久久久九九九九| 欧美色视频日本高清在线观看| 精品福利一区二区| 精品中文字幕视频| 亚洲欧洲日产国码av系列天堂| 伊人久久大香线蕉av一区二区| 国产精品海角社区在线观看| 国产热re99久久6国产精品| 午夜精品www| 国产精品久久不能| 日韩av手机在线| 欧美亚洲国产成人精品| 91精品视频在线播放| 亚洲国产精品大全| 精品女同一区二区三区在线播放| 日韩欧美在线一区| 欧美丰满片xxx777| 国内精品模特av私拍在线观看| 97在线观看视频国产| 亚洲女人天堂色在线7777| 亚洲韩国欧洲国产日产av| 2019中文字幕在线免费观看| 国产精品高潮在线| 欧美精品久久久久久久久久| 国产欧美一区二区白浆黑人| 国产在线拍偷自揄拍精品| 国产女人精品视频| 欧美激情精品久久久久久黑人| 91精品国产色综合| 奇米一区二区三区四区久久| 中文字幕亚洲欧美日韩在线不卡| 在线观看免费高清视频97| 久久久久久这里只有精品| 欧美丰满少妇xxxxx做受| 国产成人福利夜色影视| 日韩国产中文字幕| 久久综合五月天| 庆余年2免费日韩剧观看大牛| 欧美人在线观看| 国产精品91一区| 中文字幕日韩欧美在线| 亚洲精品天天看| www.日韩欧美| 亚洲free性xxxx护士白浆| 国产精品99久久久久久人| 久青草国产97香蕉在线视频| 欧美重口另类videos人妖|