Struts2
一. Struts2 簡介
Struts2 是一個 MVC 開發模式的框架,用來處理用戶請求,代替 Servlet 職責,是對 Servlet 的一種封裝
二. MVC 開發模式(☆)
MVC 開發模式是把視圖代碼與業務邏輯代碼分離,通過控制層連接視圖代碼與業務邏輯代碼
-
Model:專案中的業務邏輯(業務領域),通常用 JavaBean 實作(dao層,service層)
-
View:專案中的展現,通常用 JSP/HTML 實作
-
Controller:專案中的控制層,通常用 Servlet 實作
| 優點 | 缺點 |
|---|---|
| 高內聚,低耦合 | MVC 層次太多,增加開發作業量,開發效率較慢 |
| 專案結構清晰,利于后期維護 | |
| 業務邏輯清晰,代碼重用性強,適合二次開發與后期維護 |
三. 開發模式,設計模式,框架之間的聯系(☆)
-
開發模式:開發模式是一種編程思想,實作的目標
-
框架:框架就是開發思想的產物
-
設計模式:框架由設計模式實作
開發模式誕生框架,框架由設計模式實作
四. 搭建 Struts2 環境
-
struts-2.3.16.3包下面找到apps/struts2-blank.war空專案,解壓一下專案,把專案中 lib 下的所有 jar 檔案復制到自己專案中 -
在
struts2-blank專案中找到web.xml,把 Struts 核心過濾器復制到專案中,代碼如下:<!-- 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> -
在
struts2-blank專案中 src 下找到struts.xml檔案,復制到自己專案中的 src 目錄下 -
在
struts2-blank專案中 src 下找到log4j.properties檔案,復制到自己專案中的 src 目錄下
五. Struts2 作業原理
-
當服務器啟動的時候,會讀取
web.xml組態檔,實體化,初始化 struts2 的核心過濾器(StrutsPrepareAndExecuteFilter),核心過濾器會默認讀取 src 根目錄下的struts.xml組態檔,加載所有 action 資訊 -
當客戶端向服務器發送請求(action)時,該請求會被核心過濾器攔截,把請求的路徑去
struts.xml檔案中package標簽namespace屬性值和action標簽name屬性值相匹配,交給對應的 action 去處理,默認執行 execute 方法 -
action 中方法執行完畢之后,會回傳一個字串給核心過濾器,核心過濾器去對應的
action標簽中result標簽的name屬性值匹配對應的字串,跳轉頁面
六. Strus2 執行程序(☆)
-
瀏覽器發送一個請求,會到達 Web 服務器 Tomcat,Tomcat 會接收請求
-
Tomcat 會根據專案中的
web.xml配置判斷請求是否符合 Struts2 的核心過濾器(StrutsPrepareAndExecuteFilter)的過濾路徑,如果符合請求會交給 Struts2 處理 -
Struts2 核心過濾器根據請求的 URL,在
sturts.xml中匹配處理 Action 的請求 URL =package標簽namespace屬性 +action標簽的name屬性 -
匹配上后會根據
action標簽中的class屬性匹配上一個 Action,action首先會實體化,默認呼叫execute方法,Action是多實體、執行緒是安全的 -
執行完 execute 方法后,回傳一個字串,對應 Action 標簽下的
result標簽name屬性 -
根據
result標簽中的頁面路徑進行頁面跳轉,把內容呈獻給瀏覽器端
七. 配置訪問后綴名
-
在
struts.xml中配置擴展名的常量,代碼如下:
<constant name="struts.action.extension" value="https://www.cnblogs.com/xiqingbo/p/do,action" /> -
在
web.xml中增加核心過濾器的過濾路徑,代碼如下:<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>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.xi</url-pattern> </filter-mapping> -
在訪問 URL 上增加
.后綴名
<a href="https://www.cnblogs.com/xiqingbo/p/hello/helloworld.action">測驗Hello World!</a>
<a href="https://www.cnblogs.com/xiqingbo/p/hello/helloworld.do">測驗Hello World!</a>
八. 獲取表單引數
Struts 獲取表單引數有三種方式:
-
屬性接收(欄位驅動)
- 把 input 框 name 屬性作為 Action 類中的全域屬性,并且生成 get 與 set 方法,就可以接收表單引數
-
DynamicModel(動態模型)(☆)
-
把所有 input 框 name 屬性封裝成一個類中的屬性
-
在 Action 中把引數物件作為全域屬性,并且生成 get 與 set 方法
-
在 input 框 name 屬性必須使用:引數物件名稱 . 屬性名稱
-
-
ModelDriven(模型驅動)
-
action 類實作一個 ModelDriven 介面,重寫 getModel 方法回傳引數類
-
在 input 框 name 屬性不需要加上 物件名稱 . 屬性名稱,引數類的 get 與 set 方法也不需要了(物體類中的屬性名必須要和表單中 name 屬性名一致,模型驅動可以和欄位驅動聯合使用)
-
注:action 中的屬性生成了 get 方法,會在 request 中存盤一份,可以傳遞到 JSP 頁面上
九. 獲取 WEB 元素(request、response)
獲取 request 有兩種方式:
-
通過 ServletActionContext 類獲取,代碼如下:
HttpServletRequest request = ServletActionContext.getRequest(); -
Action 類實作 ServletRequestAware 介面,重寫 setServletRequest 方法,給全域 request 屬性賦值
public class WebElementAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }
獲取 response 有兩種方式:
-
通過 ServletActionContext 類獲取,代碼如下:
HttpServletResponse response = ServletActionContext.getResponse(); -
Action 類實作 ServletResponseAware 介面,重寫 setServletResponse 方法,給全域 response 屬性賦值
public class WebElementAction extends ActionSupport implements ServletResponseAware { private HttpServletResponse response; @Override public void setServletResponse(HttpServletResponse response) { this.response = response; } }
十. 動態方法呼叫
-
使用感嘆號呼叫其他方法
- 在 struts.xml 中開啟動態方法呼叫,代碼如下:
<constant name="struts.enable.DynamicMethodInvocation" value="https://www.cnblogs.com/xiqingbo/p/true" />- 在訪問 URL 后面:!方法名 . 后綴名
user/login!add.action缺點:暴露了類中的方法名,不推薦使用
-
一個 Action 類中的方法對應一個 action 標簽,代碼如下:(推薦使用)
<action name="dynamicMethodAdd" method="add"> <result name="success">/success.jsp</result> </action> -
通配符
<package name="common" namespace="/" extends="struts-default"> <action name="*_*" method="{2}"> <result>/{1}_{2}.jsp</result> </action> </package>
十一. 結果集型別(☆)
result 標簽 type 屬性的取值
| 型別 | 描述 |
|---|---|
| dispatch | action 轉發到 JSP(默認) |
| redirect | action 重定向到 JSP |
| chain | action 轉發到 action |
| redirectAction | action 重定向到 action |
| json | action 傳遞 JSON 字串到頁面(Ajax) |
| stream | 流的形式(檔案下載) |
十二. 全域結果集
利用包與包之間可以繼承關系,在父包中定義的結果集可以在子包中使用,相當于全域變數
<package name="all" extends="struts-default">
<global-results>
<result name="success">/success.jsp</result>
</global-results>
</package>
十三. OGNL 運算式
OGNL 全稱:Object Graph Navigation Language
OGNL 運算式作用:簡化頁面代碼,提高開發效率
OGNL 是一個強大的運算式,OGNL 只在 Struts2 中使用,離開 Struts2 框架就無效
Struts 標簽庫 == EL 運算式 + JSTL,使用 Struts 標簽庫必須經過 action,不然會拋例外
十四. Struts2 與 Ajax結合(☆)
-
Struts2 與 Ajax 結合需要匯入
struts2-json-plugin-2.3.16.3.jar -
Action 類中把字串變數宣告成全域變數,并且生成 set 與 get
-
在
struts.xml中做如下配置:<!-- ajax --> <!-- json-default 繼承了 struts-default --> <struts> <package name="ajax" namespace="/ajax" extends="json-default"> <action name="ajax" > <result type="json"> <!-- root 名稱是固定寫法,指定 JSON 字串的變數名 --> <param name="root">json</param> </result> </action> </package> </struts>
十五. Struts的攔截器(☆)
-
Struts 的攔截器只能攔截 Action 類,在 Action 類之前之后做一系列動作
// Action 之前動作 String result = invocation.invoke(); // 執行 Action // Action 之后動作 -
可插拔
需要的話就配置上,不需要就不配置
-
攔截器的創建
-
第一種:撰寫一個普通的 Java 類,實作 Interceptor 介面
-
第二種:撰寫一個普通的 Java 類,繼承 AbstractInterceptor 類
-
-
參考攔截器
-
所有的 action 都去默認參考攔截器
<default-interceptor-ref name="myStack"></default-interceptor-ref> -
具體某一個 Action 去參考攔截器
<action name="authAction" > <result name="success">success.jsp</result> <interceptor-ref name="loginInterceptor"></interceptor-ref> </action> -
全域 result 的配置
<!-- 先從當前的 action 去匹配回傳的字串,若沒找到,則去全域 result 里面匹配 --> <global-results> <result name="noLogin" type="redirect">login.jsp</result> <result name="noAuth" type="redirect">noAuth.jsp</result> </global-results>
-
十六. Struts 核心組件(☆)
| 組件 | 描述 |
|---|---|
| StrutsPrepareAndExecuteFilter | 核心過濾器 |
| struts.xml | 主組態檔 |
| Action | 處理請求的類 |
| Result | 跳轉的結果集 |
| struts(OGNL 運算式) | 決議資料 |
十七. 重量級與輕量級(☆)
-
重量級:創建與銷毀消耗較多資源(CPU與記憶體),依賴性比加強,替換很麻煩
-
輕量級:創建與銷毀不需要消耗太多資源,獨立性比較強,替換簡單
Struts 框架就是一個重量級,使用 Struts 后 Tomcat 啟動較慢,Struts 依賴 Tomcat 容器(MVC 開發模式下的框架都是重量級的)
本文來自博客園,作者:Schieber,轉載請注明原文鏈接:https://www.cnblogs.com/xiqingbo/p/java-23.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/444319.html
標籤:Java
