【SSH2(理論篇)】--Struts2配置詳解
上篇部落格討論了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的標籤使用方法類似於HTML及JSP標籤,不同的是標頭檔案的註冊方法,而且Struts2的標籤頁面程式碼相較於JSP及HTML頁面更簡潔,如下面的示例。
<%@ 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模式中則可以將過濾器應用於任何資源,只要該資源的URL與URL模式匹配。過濾是按照部署描述符的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必須經過配置,並通過使用對映來實現動態的功能。
相關文章
- Struts2 XML配置詳解XML
- 【SSH2(實踐篇)】--Struts2檔案上傳下載例項
- Struts2中 Result型別配置詳解型別
- Struts2的properties配置檔案詳解
- Struts2第九篇【OGNL、valueStack詳解】
- Java Struts2 的請求處理流程詳解Java
- Struts2原理詳解
- RocketMQ - 理論篇MQ
- struts2標籤詳解 .
- 跨域-理論篇跨域
- GraphQL分享理論篇
- 【diffusion】擴散模型詳解!理論+程式碼模型
- 微服務·理論篇(二)微服務
- Struts2的OGNL標籤詳解
- struts2 action中result引數詳解
- PHP效能優化 -理論篇PHP優化
- linux下QOS:理論篇Linux
- 理論+實驗 詳解Oracle安裝部署過程Oracle
- 征程6 NV12 理論與程式碼詳解
- 磁碟分割槽對齊詳解與配置 - Windows篇Windows
- 博弈論詳解
- 詳解Diffusion擴散模型:理論、架構與實現模型架構
- 深入理解hashmap(二)理論篇HashMap
- 設計模式總結(理論篇)設計模式
- Laravel 之 Application---理論篇LaravelAPP
- Oracle體系結構理論篇Oracle
- State設計模式上篇(理論篇)設計模式
- 從理論走向實踐,多角度詳解Cloud NativeCloud
- Android 中自定義 View、ViewGroup 理論基礎詳解AndroidView
- Android中自定義View、ViewGroup理論基礎詳解AndroidView
- Struts2配置後ClassNotFoundExceptionException
- SpringBoot第二篇:配置檔案詳解一Spring Boot
- MyBatis 配置詳解MyBatis
- zookeeper 配置詳解
- .htaccess配置詳解
- mysql配置詳解MySql
- iptables配置詳解
- nginx配置詳解Nginx