- Java EE輕量級解決方案:S2SH
- 邵峰晶編著
- 1979字
- 2018-12-30 08:33:21
2.1 Struts2概述
Struts2是以WebWork的設計思想為核心,吸收Struts1的部分優點后建立的一個兼容WebWork和Struts1的MVC框架。Struts2的目標是使Web開發變得更加容易。
2.1.1 Struts2起源背景
從2001年Struts框架誕生開始,作為MVC模式的第一個實現,Struts一直都是MVC領域中最流行的MVC框架,擁有廣泛的市場支持。但隨著Java EE項目復雜性的不斷增高,Struts的缺陷也逐漸顯露出來,大量的開發人員、軟件公司開始選擇更好的MVC解決方案,如JSF和Tapestry等。正是在這種背景下,Struts2框架誕生了。Struts2整合了兩個優秀的MVC框架(Struts1和WebWork)的優點,從而保證了Struts2作為實際開發框架的成熟性。Struts2保留了Struts1的簡單易用性,并且充分利用了WebWork的攔截器機制(AOP思想),是一個具有高度可擴展性的框架。
Struts2框架誕生后,取代了原有的Struts和WebWork框架,Struts2的開發團隊也是由Struts和WebWork兩個團隊組成的,保證了技術體系的延續。而且WebWork不再推出新的版本,原來使用Struts和WebWork的開發人員都將轉入使用Struts2框架。基于這種背景,Struts2在短時間內迅速成為MVC領域最流行的框架。
2.1.2 Struts2框架結構
Struts2中大量使用攔截器來處理用戶請求,從而允許用戶的業務邏輯控制器與Servlet API分離。如圖2-1所示,用戶請求提交給Struts2的核心控制器FilterDispatcher,FilterDispatcher根據請求調用相應的Action的execute()方法,并根據處理結果顯示相應的JSP頁面。其中,針對一些通用的功能,Struts2框架內置了許多攔截器,這些攔截器組成一個攔截器鏈,攔截器鏈會自動對請求應用這些通用性的功能。

圖2-1 Struts2框架結構
注意 有關攔截器的種類以及配置等詳細信息參見實踐 2 的知識拓展。
2.1.3 Struts2控制器組件
Struts2的控制器組件是整個框架的核心,實際上,所有MVC框架都是以控制器組件為核心的。Struts2的控制器由兩部分組成:FilterDispatcher和業務控制器Action。
1. FilterDispatcher
FilterDispatcher是一個Servlet過濾器,它是Struts2的核心組件,作用于整個Web應用程序,需要在web.xml中進行配置。
在web.xml中配置FilterDispatcher的代碼如下所示。
<filter> <!-- 配置Struts2框架的核心Filter --> <filter-name>struts2</filter-name> <filter-class> <!-- 配置Struts2核心Filter的實現類 --> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
上述配置文件配置了FilterDispatcher過濾器,該過濾器對所有請求都進行過濾處理。
任何需要與Web應用整合的MVC框架都需要借助web.xml配置文件。通常MVC框架都需要在Web應用中加載一個核心控制器,對于Struts2框架而言,就是加載FilterDispatcher組件。只要Web應用加載了FilterDispatcher,FilterDispatcher就會加載并應用Struts2框架。因為FilterDispatcher是過濾器,故讓Web應用加載FilterDispatcher時只需要在web.xml中使用<filter>及<filter-mapping>元素配置FilterDispatcher即可。
2. Action
Action是Struts2的業務控制器,如代碼2-1所示是一個Struts2的Action示例。
【代碼2-1】LoginAction.java
public class LoginAction { // 用戶名 private String userName; // 密碼 private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } /** * 控制業務流程轉向 * 返回一個字符串,可映射到任何視圖或Action */ public String execute() { System.out.println("姓名為:" + userName); // 判斷用戶名為“haier”且密碼為“soft”,則返回success,否則返回error if ("haier".equals(userName) && "soft".equals(password)) { return "success"; } return "error"; } }
通過上述代碼可以發現Action無須實現任何接口,也無須繼承任何Struts2的基類,該Action類完全是一個POJO,具有很高的可重用性。
Struts2中的Action類有如下優勢:
Action類完全是一個POJO,具有良好的代碼重用性;
Action類無須與Servlet API耦合,因此無論是應用還是測試都非常簡單;
Action類的execute()方法僅返回一個字符串作為處理結果,該處理結果可映射到任何的視圖或另一個Action。
注意 實際上,Struts2應用中起作用的業務控制器不是用戶定義的Action,而是系統生成的Action代理類,該Action代理類以用戶定義的Action為代理目標。
2.1.4 Struts2的配置文件
Struts2創建系統的Action代理時,需要使用Struts2的配置文件,在此文件中需要對用戶定義的Action進行相關信息的配置。
Struts2的配置文件有兩種:
配置Action的struts.xml文件;
配置Struts2全局屬性的struts.properties文件。
1. struts.xml
在struts.xml文件中需要配置系統用到的Action。在配置Action時,需要指定該Action的實現類,并指定該Action處理結果與視圖資源之間的映射關系。
如代碼2-2所示是struts.xml配置文件的示例。
【代碼2-2】struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 指定Struts2處于開發階段,可以進行調試 --> <constant name="struts.devMode" value="true" /> <!-- Struts2的Action都必須配置在package里 --> <package name="p1" extends="struts-default" namespace="/admin"> <!-- 定義一個login的Action,實現類為com.haiersoft.LoginAction --> <action name="login" class="com.haiersoft.LoginAction"> <!-- 配置execute()方法返回值所對應的頁面 --> <result name="error">/error.jsp</result> <!-- 如果result標簽不配置name屬性,其默認為success --> <result>/success.jsp</result> </action> </package> </struts>
在上述struts.xml文件中,聲明了一個Action,并指定了Action的實現類,同時定義了多個result元素來指定execute()方法的返回值和視圖資源之間的映射關系。例如:
<result name="error">/error.jsp</result>
表示當execute()方法的返回值是“error”字符串時,跳轉到網站根目錄下的error.jsp頁面。
2. struts.properties
在struts.properties文件中可以配置Struts2的全局屬性,如代碼2-3所示。
【代碼2-3】struts.properties
#指定Web應用的默認的編碼集,相當于調用HttpServletRequest的setCharacterEncoding方法 struts.i18n.encoding=GBK #當struts.xml修改后是否從新加載該文件,在開發階段最好打開 struts.configuration.xml.reload=true #設置瀏覽器是否緩存靜態內容,開發階段最好關閉 struts.serve.static.browserCache=false
上述struts.properties文件中以key-value鍵值對的形式指定了Struts2應用的全局屬性。
2.1.5 Struts2的標簽庫
Struts2的標簽庫也是Struts2框架的重要組成部分,提供了非常豐富的功能,這些標簽不僅提供了表示層數據處理,而且提供了基本的流程控制功能,還提供了國際化、Ajax支持等功能。通過使用Struts2的標簽,開發者可以最大限度地減少頁面代碼的編寫。有關Struts2標簽庫的詳細內容請參見本書第4章。
2.1.6 Struts2的處理步驟
Struts2框架對Web請求處理的具體步驟如下所述。
01 客戶端瀏覽器發送一個請求,例如:/mypage.action。
02 這個請求經過核心控制器FilterDispatcher過濾處理,FilterDispatcher將請求轉交給相應的Action代理。
03 Action代理通過配置文件中的信息找到對應的Action類,創建Action對象并調用其execute()方法。
04 在調用Action的過程前后,涉及相關攔截器的調用。攔截器鏈自動對請求應用通用功能,例如,自動化工作流、驗證或文件上傳等功能。
05 一旦Action執行完畢,Action代理根據struts.xml中的配置信息找到execute()方法返回值對應的結果。返回結果通常是視圖資源(如JSP頁面)或另一個Action。
- ServiceNow Application Development
- Android開發精要
- Visual Basic編程:從基礎到實踐(第2版)
- PhpStorm Cookbook
- Java程序設計:原理與范例
- 大模型RAG實戰:RAG原理、應用與系統構建
- Python時間序列預測
- HTML5從入門到精通(第4版)
- Android嵌入式系統程序開發:基于Cortex-A8(第2版)
- Elasticsearch Essentials
- Magento 2 Beginners Guide
- Parallel Programming with Python
- Distributed Computing with Python
- PhantomJS Cookbook
- TypeScript High Performance