Struts2的Action配置及使用



一、Struts配置文件

        Struts2默認會加載類加載路徑下的struts.xmlstruts-default.xmlstruts-plugin.xml三類文件,其中struts.xml是開發者定義的默認配置文件,struts-default.xmlStruts2框架自帶的配置文件,而struts-plugin.xml則是Struts2插件的默認配置文件。

        struts.xml配置文件最大的作用是配置Action和請求之間的對應關係,並配置邏輯試圖名和物理視圖資源之間的對應關係。除此之外,struts.xml文件還有一些額外的功能,例如Bean配置、常量配置、導入其他配置文件等。

        Struts2的常量相當於對於Struts2應用整體起作用的屬性,因此Struts2常量常常也被稱爲Struts2屬性。

        雖然Struts2配置常量有三種方式:通過struts.properties文件;通過struts.xml配置文件;通過web應用的web.xml文件。通常推薦在struts.xml文件中定義Struts2屬性,而不是在struts.properties文件中定義Struts2屬性。

        可以將一個struts.xml配置文件分解成多個配置文件,然後在struts.xml文件中包含其他配置文件,示例如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

        "-//Apache SoftwareFoundation//DTD Struts Configuration 2.1.7//EN"

        "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<!--指定Struts 2配置文件的根元素 -->

<struts>

        <!-- 通過include元素導入其他配置文件-->

        <includefile="struts-part1.xml"/>

        <includefile="struts-part2.xml"/>

        ...

</struts>

        被包含的struts-part1.xml文件是標準的Struts2配置文件,一樣包含了DTD信息、Struts2配置文件的根元素等信息。通常,將Struts2的所有配置文件都放在web應用的WEB-INF/classes路徑下,struts.xml文件包含了其他的配置文件,struts.xml文件由Struts2框架負責加載,從而可以將所有配置信息都加載進來。

二、實現Action

1.Action介紹

        Action是應用的核心,開發者需要提供大量的Action類,並在struts.xml文件中配置ActionAction類裏包含了對用戶請求的處理邏輯,Action類也被稱爲業務控制器

        Action類是一個POJO,包含settergetter方法,默認處理用戶請求的方法:execute()方法。

        ActionSupport是一個默認的Action實現類。如果我們配置的Action沒有指定class屬性(即沒有用戶提供Action類),系統自動使用ActionSupport類作爲Action處理類。

2.Action訪問Servlet API

        由於Action類不在於ServletAPI耦合,從而能更輕鬆地測試該ActionWeb應用中通常要訪問的Servlet API就是HttpServletRequestHttpSessionServletContext,這三個接口分別代表JSP內置對象中的requestsessionapplication

方法一:Struts2提供了一個ActionContext類,Struts2Action可以通過該類來訪問Servlet API。類中常用方法如下:

Object get(Object key):相當於HttpServletRequestgetAttribute(Stringname)方法。

Map getApplication():返回一個Map對象,該對象模擬了該應用的ServletContext實例。

static ActionContext getContext():靜態方法,獲取系統的ActionContext實例。

Map getParameters():獲取所有請求參數。類似於HttpServletRequestgetParameterMap().

Map getSession():返回一個Map對象,該Map對象模擬了HttpSession實例。

void setApplication(Map application):傳入一個Mapkey-value,轉換成application的屬性名、屬性值。

void setSession(Map session):傳入一個Mapkey-value,轉換成session的屬性名、屬性值。

方法二:Struts2提供如下幾個接口(需要implements並實現方法):

ServletContextAware:實現該接口的Action可以直接訪問Web應用的ServletContext實例。

ServletRequestAware:實現該接口的Action可以直接訪問用戶請求的HttpServletRequest實例。

ServletResponseAware:實現該接口的Action可以直接訪問服務器響應的HttpServletResponse實例。

方法三:使用ServletActionContext(工具類)訪問Servlet API

static PageContext getPageContext():取得Web應用的PageContext對象。

Static HttpServletRequest getRequest():取得Web應用的HttpServletRequest對象。

Static HttpServletResponse getResponse ():取得Web應用的HttpServletResponse對象。

Static ServletContext getServletContext():取得Web應用的ServletContext對象。

 

3.配置action

        實現了Action處理類之後,就可以在struts.xml文件中配置該Action了。配置Action就是讓Struts2知道哪個Action處理哪個請求,也就是完成用戶請求和Action之間的對應關係。我們可以認爲,ActionStruts2的基本程序單位

3.1包和命名空間

        Struts2使用包來組織Action,因此,將Action定義放在包定義下完成,定義Action通過使用<package…/>下的<action…>子元素來完成,而每個package元素配置一個包。

        Struts2框架中的核心組件就是Action、攔截器等,Struts框架使用包來管理Action、攔截器。

        幾個屬性:

        name:這是一個必須屬性,該屬性指定該包的名字,改名字是該包被其他包引用的key

        extends:該屬性是一個可選屬性,指定該包繼承其他包(從而繼承Action、攔截器)

        namespace:該屬性是一個可選屬性,該屬性定義該包的命名空間。

        abstract:該屬性是一個可選屬性,它指定該包是否是一個抽象包(不包含Action定義)。

        Strut2-core.jar定義了struts-default抽象包,包含了大量結果類型定義、攔截器定義、攔截器引用定義等,這些都是配置普通Action的基礎,所以開發者定義的package通常應該繼承struts-default包。

        如果配置<package…/>時沒有指定namespace屬性,則該包的Action處於默認的包空間下。

        當某個包指定命名空間後,該包下所有的Action處理的URL應該是命名空間+Action名。

        Namespace=”/”爲根命名空間。

        Action順序:先找命名空(包括根命名空間)間下的,再找默認命名空間下的。

3.2Action的基本配置

        Struts2Action名字就是它所處理的URL

        通常需要爲action元素指定一個class屬性,其中class屬性指定了該Action的實現類。

        配置Action時應該配置邏輯試圖和物理視圖資源之間的對應關係,一次一個<result…/>

        Name中開啓斜線支持:將struts.enable.SlashesInActionNames值設置爲true

配置模版如下:

                  <actionname="login" class="org.crazyit.app.action.LoginAction">

                           <!--定義三個邏輯視圖和物理資源之間的映射 -->           

                           <resultname="input">/login.jsp</result>

                           <resultname="error">/error.jsp</result>

                           <resultname="success">/welcome.jsp</result>

                  </action>

3.3分配多個Action的處理邏輯

方法一:使用DMIDynamic Method Invocation

        動態方法調用是指表單元素的action並不是直接等於某個Action的名字,而是以如下形式來指定表單的action屬性:

        action=”ActionName!methodName”(放在javascript)

例子:

        網頁中<inputtype=”submit” value=”註冊” οnclick=”regist();”>//點註冊按鈕調用regist函數

        functionregist(){

                 targetForm = document.forms[0];

                  targetForm.action= “login!regist”;

        }

 

當用戶點擊註冊,系統交給loginActionregist方法處理。

        通過這種方式,我們可以在一個Action中包含多個處理邏輯,並通過爲表單元素指定不同action屬性來提交給Action的不同方法,默認是execute方法。

 

        開啓系統的動態方法調用是通過設置strut.enable. DynamicMethodInvocationtrue

方法二:指定method屬性及使用通配符

示例代碼:

<?xml version="1.0"encoding="GBK"?>

<!DOCTYPE struts PUBLIC

        "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1.7//EN"

        "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>

        <packagename="lee" extends="struts-default">

                  <!--使用模式字符串定義Actionname,指定所有以Action結尾的請求,

                  都可用LoginRegistAction來處理,method屬性使用{1}

                  這個{1}代表進行模式匹配時第一個*所代替的字符串-->

                  <actionname="*Action"class="org.crazyit.app.action.LoginRegistAction"

                           method="{1}">

                           <!--定義邏輯視圖和物理視圖之間的映射關係 -->

                           <resultname="input">/login.jsp</result>

                           <resultname="error">/error.jsp</result>

                           <resultname="success">/welcome.jsp</result>

                  </action>

        </package>

</struts>

        上面的<actionname=”*Action”…/>元素不是定義了一個普通Action,而是定義了一系列的Action,只要用戶請求的URL*Action.action的模式,都可以用該Action來處理。該method屬性使用了一個表達式{1},該表達式的值就是name屬性值中第一個*的值。

        例如:

        用戶請求的URLloginAction.action,則調用lee.LoginRegistAction類的login方法;如果請求的URLregistAction.action,則調用lee.LoginRegistAction類的regist方法;

 

        也可以使用兩個通配符:

        <actionname=”*_*” method=”{2}” class=”actions.{1}”>

 

Action處理的優先級:

        如果有URLabcAction.action的請求,如果struts.xml文件中有abcAction.action則先有它處理,如果沒有,則找*Action**Action並不比*更優先匹配abcAction的請求,而是先找到哪個Action就會由哪個Action來處理用戶的請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章