官术网_书友最值得收藏!

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。

主站蜘蛛池模板: 朝阳区| 海丰县| 东平县| 保康县| 乌苏市| 乾安县| 六枝特区| 方正县| 射洪县| 察隅县| 台北县| 无极县| 河曲县| 柳河县| 张家港市| 景德镇市| 淮阳县| 韶关市| 铅山县| 咸阳市| 开江县| 南召县| 齐河县| 泰来县| 禄劝| 大竹县| 乌兰察布市| 衡水市| 水富县| 隆回县| 屏边| 海丰县| 右玉县| 隆子县| 福海县| 五华县| 林西县| 石林| 清丰县| 乌审旗| 富源县|