MVC
1、Struts2由傳統的Struts1和WebWork兩個經典的MVC框架發展起來。
2、Java Web 應用的結構經歷了Model 1 和 Model 2 兩個時代。
3、在Model 1 時代下,整個Web應用幾乎全部由JSP頁面組成,JSP頁面接受處理客戶端的請求,對請求處理後直接作出響應。用少量的JavaBean來處理數據庫的連接、數據庫訪問等操作。
4、Model 1 的模式實現比較簡單,使用與快速開發小規模項目。但從工程化的角度看,它的侷限性非常明顯:JSP頁面身兼View 和Controller兩種角色,將控制邏輯好表現邏輯混雜在一起,從而導致代碼的重用性非常低,增加了應用的擴展性和維護的難度。
5、Model 2 已經是基於MVC架構的設計模式。在Model 2 架構中,Servlet 作爲前端控制器,負責接收客戶端發送的請求,在Servlet 中只包含邏輯和簡單的前端處理;然後,調用後端的JavaBean來完成實際的邏輯處理,最後轉發到響應的JSP頁面顯示邏輯。如下圖所示:
6、在Model 2 模式下,JSP不再承擔控制器的責任,它僅僅是表現層角色,僅僅用於將結果呈獻給用戶,JSP頁面的請求與Servlet(控制器)交互,而Servlet負責與後臺的JavaBean通信,在Model 2 模式下,模型(Model)由JavaBean充當,視圖(View)由JSP頁面充當,而控制器(Controller)則由Servlet充當。
7、從某種程度上講,Model 2 爲了降低系統後期維護的複雜度,卻導致前期開發的更高複雜度。
8、MVC思想將一個應用分成三個基本部分,Model(模型)、View(視圖)和Controller(控制器),這三個部分以最少的耦合協同工作,從而提高應用的可擴展性和可維護性。
9、在經典的MVC模式中,事件由控制器處理,控制器根據事件的類型改變模型或視圖,反之亦然。具體地說,每個模型對應一系列視圖列表,這種對應關係通常採用註冊來完成,即:把多個視圖註冊到同一個模型,當模型發生改變時,模型想所有註冊過的視圖發送通知,接下來,視圖從對應的模型中獲得信息,然後完成視圖的更新。
10、從設計模式的角度來看,MVC思想非常類似於觀察者模式,但與觀察者模式存在少許差別:觀察者模式先的觀察者和被觀察者可以是兩個相互對等的對象,但對於MVC而言,被觀察者往往只是單純的數據體,而觀察者則是單純的視圖頁面。
11、MVC的特點:
·多個視圖可以對應一個模型,按MVC設計模式,一個模型對應多個視圖,可以減少代碼複製及代碼的維護量,一旦模型發生改變,也易於維護。
·模型返回的數據與顯示邏輯分離。模型數據可以應用任何的顯示技術,例如使用JSP頁面、Velocity模板或者直接產生Excel文檔等。
·應用分爲三層,降低了各層之間的耦合,提供了應用的可擴展性。
·控制層的概念也很有效,由於它把不同 的模型和不同的視圖組合在一起,完成不同的請求,因此,控制層可以說是包含了用戶請求權限的概念。
·MVC更符合工程化管理的精神。不同的層各司其職,每一層組件具有相同的特徵,有利於通過工程化和工具化產生管理程序代碼。
配置Struts 2
1、需要添加到WEB-INF/lib目錄中的jar包:commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar、freemarker-2.3.16.jar、javassist-3.7.ga.jar、ognl-3.0.jar、struts2-core-2.2.1.jar、xwork-core-2.2.1.jar。除此之外,如果需要在Web應用中使用Struts2的更多特性,則需要將相應的JAR文件複製到WEB-INF/lib路徑下。
2、如果需要在DOS或者Shell窗口下手動編譯Struts2相關的程序,則還應該將struts2-core-2.2.1.jar和xwork-core-2.2.1.jar添加到系統的CLASSPATH環境變量中。
3、web.xml文件中配置struts2:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、使用Struts2功能至少需要一個struts.xml配置文件,這個配置文件默認放在Web應用的類加載路徑下(通常就是WEB-INF/classes路徑)。
5、Struts 2 的Action通常繼承於ActionSupport基類。
6、在struts.xml配置文件中配置Action:
<action name=”login” class=”org.crazyit.app.action.LoginAction”>
<result name=”input”>/login.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/welcome.jsp</result>
</action>
7、Struts 2 應用的開發步驟:
① 在web.xml文件中定義核心Filter來攔截用戶請求。
② 如果以POST方式提交請求,則定義包含表單數據的JSP頁面。如果僅僅是以GET方式發送請求,則無需經過這一步。
③ 定義處理用戶請求的Action類。
④ 配置Action
⑤ 配置處理結果和物理視圖資源之間的對應關係。
⑥ 編寫視圖資源。
8、當Servlet或Filter收到攔截用戶請求後,如果知道應該創建哪個Action實例?這裏有2種解決方案:
① 利用配置文件。
② 利用約定(Convention)。
9、Struts 2 中的請求/響應流程:
10、常常把StrutsPrepareAndExecuteFilter稱爲核心控制器,把XxxAction稱爲業務控制器。
11、在Struts 2 框架的控制下,用戶請求不再向JSP頁面發送,而是由核心控制器StrutsPrepareAndExecuteFilter來“調用”JSP頁面來生成響應,此處的調用不是直接調用,而是將請求forward到指定的JSP頁面。
12、struts.xml配置文件的最大作用就是配置Action和請求之間的對應關係,並配置邏輯視圖名和物理視圖資源之間的對應關係。除此之外,struts.xml文件還有一些額外的功能,例如Bean配置、配置常量、導入其他配置文件等。
13、可以使用struts.properties文件來管理常量,在struts2-core-2.2.1.jar壓縮文件的org/apache/struts2目錄下有一個default.properties文件,該文件裏爲struts2的所有常量都指定了默認值,可以通過查看該文件來了解struts2所支持的常量。
14、Struts 2 默認會加載類路徑下的struts.xml、struts-default.xml、struts-plugin.xml三個文件,其中struts.xml是開發者自定義的默認配置文件,struts-default.xml是Struts 2 框架自帶的配置文件,而struts-plugin.xml是Struts 2 插件的默認配置文件。
15、如下代碼在struts.xml中配置了一個常量,該常量即可代替struts.properties文件中爲Struts 2 配置屬性:
<constant name=”struts.custom.i18n.resources” values=”mess” />
16、在web.xml文件中配置StrutsPrepareAndExecuteFilter時也可以配置Struts 2 常量,此時採用爲StrutsPrepareAndExecuteFilter配置初始化參數的方式來配置Struts 2 常量,如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter</filter-class>
<init-param>struts.custom.i18n.resources</init-param>
<param-value>mess</param-value>
</filter>
17、通常推薦在struts.xml文件中定義Struts 2 屬性,而不是在struts.properties文件中定義,之所以保留使用struts.properties文件定義屬性的方式,主要是爲了保持與WebWork的向後兼容性。
18、通常,Struts 2 框架按如下搜索順序加載Struts 2 常量:
·struts-default.xml
·struts-plugin.xml
·struts.xml
·struts.properties
·web.xml
如果多個文件配置了同一個Struts 2 常量,則後一個文件中的配置值會覆蓋前面文件中的對應值。
19、爲了避免struts.xml文件過於龐大、臃腫,提高struts.xml文件的可讀性,可以將一個struts.xml文件拆分成多個配置文件,然後在struts.xml文件中包含之:
<struts>
<include file=”struts-part1.xml />
...
</struts>