【SSH2(理論篇)】--Struts2配置詳解

zhang_xinxiu發表於2014-05-02

      上篇部落格討論了SSH2框架模型,在開發過程中發現SSH2的開發模型其實類似於經典的三層模式,在每一層中分別新增了不同的框架,顯示層使用的是Struts2進行配置的,業務邏輯層使用的是Spring配置,資料持久層則採用的是Hibernate,開發模式簡單易懂,接下來將會分別從三層著手討論每一層的執行內容。


一、Struts體系簡介


       struts,是Apache軟體基金會(ASF)贊助的一個開源專案,它通過採用Java Servlet/JSP技術,實現了基於Java EE Web應用的Model-View-Controller〔MVC〕設計模式的應用框架〔WebFramework〕,是MVC經典設計模式中的一個經典產品。


 1、Struts1


         Struts1是Struts最早的版本,該框架以ActionServlet作為系統的核心控制器,整個應用由客戶端請求驅動。對於整個Struts1而言,控制器是它的核心,Struts1的控制器由兩部分組成:核心控制器和業務邏輯控制器。其中的業務邏輯控制器就是使用者自定義的Action,它是由開發者提供的。


                                                             圖1 Struts1程式執行流程圖       
       當使用者傳送一個HTTP請求時,該請求會被ActionServlet攔截到,ActionServlet對請求進行解析,解析完成後會ActionServlet會有兩種不同的回應方式,如果使用者請求的只是URL,則ActionServlet將會直接將請求轉發給使用者,否則的話將該請求轉發給對應的業務邏輯控制器,業務邏輯控制器呼叫相應的模型處理使用者請求。

2、Struts2


         Struts1雖然功能強大,但是遺留下了很多問題,其中最主要的是Struts1和JSP/Servlet的耦合性過高,在它的處理流程中都是直接在JSP/Servlet之間轉發、處理請求,這就限制了Struts1的發展。因為Struts1的顯示層使用的是JSP,如果遇到了其它的處理頁面,Struts1就顯得無能為力,另外一方面Struts1同樣受制於Servlet API,嚴重依賴於Web伺服器,一旦脫離了Web伺服器,測試就會很困難。由於Struts1的設計缺陷及使用年代的久遠,所以產生了Struts2。
         Struts2相對於Struts1發生了巨大的改變,這種改變主要表現在處理核心上,Struts2是以WebWork為核心(xwork-core-2.2.3.jar),採用攔截器的機制來處理使用者請求。它整合了Struts1和WebWork,將兩者合二為一,不僅擁有Struts1豐富的頁面標籤,而且還擁有WebWork的處理核心。從它的改變上也可以Struts2是WebWork的更新產品。              
            
                                                  圖2 WebWork/Struts2的處理核心
    
    從圖可以看出,一個請求在 Struts2 框架中的處理大概分為以下幾個步驟:
        (1) 客戶端初始化一個指向 Servlet 容器(例如 Tomcat)的請求;
        (2) 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做 ActionContextCleanUp 的可選過濾器,這個過濾器對於 Struts2 和其他框架的整合很有幫助,例如:SiteMesh Plugin);
        (3) 接著 FilterDispatcher 被呼叫,FilterDispatcher 詢問 ActionMapper 來決定這個請求是否需要呼叫某個 Action;
        (4) 如果 ActionMapper 決定需要呼叫某個 Action ,FilterDispatcher 把請求的處理交給ActionProxy;
        (5) ActionProxy 通過 Configuration Manager 詢問框架的配置檔案,找到需要呼叫的 Action 類;
        (6) ActionProxy 建立一個 ActionInvocation 的例項。
        (7) ActionInvocation 例項使用命名模式來呼叫,在呼叫 Action 的過程前後,涉及到相關攔截(Intercepter)的呼叫。
        (8) 一旦 Action 執行完畢,ActionInvocation 負責根據 struts.xml 中的配置找到對應的返回結果。
        返回結果通常是(但不總是,也可能是另外的一個 Action 鏈)一個需要被表示的 JSP 或者 FreeMarker的模版。在表示的過程中可以使用 Struts2 框架中繼承的標籤。在這個過程中需要涉及到 ActionMapper。
        學過設計模式的程式設計師能夠看出,在這個處理核心中使用了設計模式,在請求訪問Action的過程中使用了代理模式和工廠模式,FilterDispatcher沒有直接來呼叫相應的Action而是通過代理,另外在ActionProxy工廠中建立ActionInvocation例項來呼叫相應的Action,設計的很巧妙。

二、Struts2的配置檔案

          Struts2 相關的配置檔案有 web.xml,struts.xml,struts.properties,struts-default.xml,velocity.properties,struts-default.vm。其中 web.xml,struts.xml 是必須的,其它的配置檔案可選擇。它們在 web 應用中的功能如下:
          web.xml:包含所有必須的框架元件的 web 部署描述符。
          Struts.xml:配置包含 result/view 型別、action 對映、攔截器等的 Struts2 的主要配置檔案。
          Struts.properties:配置 struts2 的框架屬性。
          Struts-default.xml:在檔案在 struts-action-x.x.jar 中,該檔案是應該被包含在 struts.xml中的預設配置。
          Welocity.properties:重寫了 velocity 的配置檔案。
          Struts-default.vm:相對於 velocity 的預設配置。

<struts>
	<!-- Struts 2的全域性變數,該屬性設定了去除請求過程中的"名稱.action"字尾".action"--> 
	<constant name="struts.action.extension" value=","></constant>
	
	<!-- Struts 2的Action必須放在Package包中--> 
	<package name="default" extends="struts-default"> 
		<!-- 定義一個login的Action,實現類為LoginAction --> 
		 <action name="login" class="com.action.LoginAction"> 
			<!-- 配置Action返回成功時,轉入Success.jsp頁面--> 
			 <result name="success">success.jsp</result>
			  <!-- 配置Action返回cancel時重定向到Welcome的Action--> 
			 <result name="cancel" type="redirectAction">Welcome</result> 
			 <!-- 配置Action返回expired時重定向到ChangePassword的Action鏈 --> 
			 <result name="expired" type="chain">ChangePassword</result>   
		</action> 
		
		<action name="Welcome" class="com.action.welcome">
    		<result name="cancel">Welcome.jsp</result>
    	       </action>
		
	</package> 
</struts>

    在上面的Struts2.xml檔案中,定義了兩個action,並使用constant設定了全域性變數,其中struts.action.extension屬性設定檔案的action顯示與否,值“,”表示所有action的名稱後面可以不加action作為字尾。

    標籤中的type能夠指定轉向的資源型別,轉向的資源多樣既可以是JSP,也可以是其它型別的檔案。另外在package標籤中可以新增屬性namespace,學習過xml的應該知道它指的是名稱空間,它的作用是將標籤進行分類,放到不同的空間內。


三、Struts2的標籤庫


        Struts2的標籤庫也是Struts的重要組成部分,這些標籤內容是在Struts1開始就有的,標籤庫提供了豐富的功能,基本上可以替代HTML標籤。Struts2的標籤使用方法類似於HTMLJSP標籤,不同的是標頭檔案的註冊方法,而且Struts2的標籤頁面程式碼相較於JSPHTML頁面更簡潔,如下面的示例。

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<s:form method="post" action="loginaction">
		<s:textfield label="名字" name="name"/> 
		<s:textfield label="年紀" name="age"/> 
		<s:textfield label="喜歡的顏色" name="answer"/> 
		<s:submit/>
	</s:form>
</body>
</html>

四、Struts2配置


    在開發的web專案中想要使用Struts2就必須要事先配置好相應的Struts環境,需要去官方網站下載相應的Struts2壓縮包,然後把相應的jar包引入WebContent/WEB-INF/lib資料夾內,接下來還要在目錄WebContent/WEB-INF下的web.xml檔案中新增Struts2的FilterDispatcher,最後在專案的src資料夾內新增相應的struts.xml將action等內容寫入該配置檔案內。

         Struts2官方下載地址:http://struts.apache.org/downloads.html

         lib庫中引入的jar包需要根據專案需求確定,不同的功能引入的jar也不相同,如果基本的應用的話只需要引入下面的四個jar包:

                   common-logging-版本號.jar:Jakarta的通用日誌記錄包,用於通用日誌處理。log4j是最好用的;

                    freemarker-版本號.jar

                    ognl-版本號.jar:OGNL表示式語言,struts2支援該EL

                    struts2-core-版本號.jar:struts2的核心庫;

                    xwork-core-版本號.jar:webwork的核心庫,由於Struts2是由xwork的延伸,有些類依然關聯著xwork的類

 

    引入jar包後還需要在web.xml中新增struts的FilterDispatcher,具體配置如下程式碼:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Web</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- Struts的FilterDispatchor -->
  <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>
</web-app>

        filter元素用於指定Web容器中的過濾器。在請求和響應物件被servlet處理之前或之後,可以使用過濾器對這兩個物件進行操作。

        filter-mapping元素用來宣告Web應用中的過濾器對映。過濾器可被對映到一個servlet或一個URL模式。將過濾器對映到一個servlet中會造成過濾器作用於servlet上。將過濾器對映到一個URL模式中則可以將過濾器應用於任何資源,只要該資源的URLURL模式匹配。過濾是按照部署描述符的filter-mapping元素出現的順序執行的。

     最後在專案的src資料夾內新增相應的struts.xml

<!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.action.extension" value=","></constant>
    <package name="login" extends="struts-default">
    	<action name="loginaction" class="com.action.loginAction">
    		<result name="success">success.jsp</result>
    		<result name="error">error.jsp</result>
    		<result name="cancel" type="redirectAction">Welcome</result>
    	</action>
    	
    	<action name="Welcome" class="com.action.welcome">
    		<result name="cancel">Welcome.jsp</result>
    	</action>
    </package>
    
</struts>

         Struts的配置比較簡單,經過上面的配置後可以實現基本的頁面跳轉的功能,其中的web.xml檔案中的過濾器不僅可以struts同樣可以配置其它的框架在使用的時候多多積累吧,另外struts.xml也是必不可少的,頁面的action、interceptor等,使用方法將會在下篇文章中討論。


結語

    

     文章討論了struts的基本結構,從struts的發展歷程瞭解了struts的內部執行機制,從執行機制看出struts2其實是webwork增強版,它整合了webwork作為處理的核心,所以它屬於重量級框架。想要使用struts必須經過配置,並通過使用對映來實現動態的功能。



相關文章