Struts2之Action基礎與配置


Action基礎

Action是什么

  在Struts2中,一個Action類代表一次請求或調用,每個請求的動作都對應於一個相應的Action類,一個Action類是一個獨立的工作單元。也就是,用戶的每次請求,都會轉到一個相應的Action類里面,由這個Action類來進行處理,因此一個Action類代表了用戶的一次請求或調用。簡單來說,Action就是用來處理一次用戶請求的對象。

Action能干什么

public class HelloWorldAction implements Action {  

        private String account;  
        private String password;   

        public String execute() throws Exception {  
            System.out.println("用戶輸入的參數為===" + "account=" + account + ",password=" + password);  
            return "toWelcome";  
        }  

        public String getAccount() {  
            return account;  
        }  

        public void setAccount(String account) {  
            this.account = account;  
        }  

        public String getPassword() {  
            return password;  
        }  

        public void setPassword(String password) {  
            this.password = password;  
        }  

    }  

  根據上面的Action實現,在Struts2里面,Action充當着MVC中模型的角色,也就是Action既封裝了業務數據,又要處理業務功能。在實際的JavaEE開發中,邏輯部分會放到邏輯層去實現,這就變成Action只是去調用邏輯層來進行業務邏輯的處理,並不是真的在Action里面去實現業務邏輯的處理。上面Action的屬性和屬性對應的getter/setter方法,就是用來接收用戶請求的數據,並把這些數據封裝在Action中,在后續處理中可以訪問這些數據。上面Action的實現中的execute方法的實現,你會發現execute方法里面實現的功能,正是前面學習的MVC的控制器部分的功能。從另外一個角度說,Struts2的Action也充當着MVC中控制器的角色。

那Struts2的Action相當於MVC中的控制器還是模型?

  雖然兩種說法都過得去,但是目前大家的共識是把Struts2的Action作為MVC中的模型角色來看待。原因是在Struts2運行的時候,是由Struts2中的前端控制器FilterDispatcher分發並調用相應的Action,此時Action僅僅相當於一次請求的命令處理,層面比較小,再加上已經有FilterDispatcher來做控制器進行分發調度,因此,一般不把 Struts2的Action當作MVC的控制器來看,而是當作MVC的模型來看。

Action的配置

  不管Action采用何種實現方式,要正確運行,都需要在struts.xml中進行配置,這是使用Action的基礎。

<package>的配置

  Action需要在struts.xml中配置才可以使用,而且Action應該配置成為<package>元素的子元素,那么<package>元素的功能是什么?

  <package>元素可以把邏輯上相關的一組Action、Result、Intercepter等元素封裝形成一個獨立的模塊,package可以繼承其他的package,也可以作為父包被其他的package繼承,比如配置“<package name="helloworld"  extends="struts-default">”,helloworld這個包就繼承了struts-default這個包。

       <package>元素有如下屬性:

  name:包的名稱。必須配置

  extends:要繼承的包,后面配置的是被繼承的包的名稱。可選

  namespace:包的命名空間。可選

  abstract:定義包為抽象的,也就是不能包含Action的定義。可選

  namespace配置的是包的命名空間,同一個命名空間里面不能有同名的Action,當然不同的命名空間里面是可以有同名的Action的。類似於Java的包的功能,namespace可以有效的防止action重名的沖突,因為配置了namespace后,在訪問action的時候就需要添加namespace來作為action的前綴。如果不配置namespace,表示是默認的namespace,那么訪問的時候不需要添加namespace前綴。

  abstract用來定義包為抽象的,也就是不能包含Action的定義,但是抽象包可以被其他包繼承,因此里面可以定義其他包需要的元素,比如ResultType、Interceptor等等。

<action>的配置

雖然Action在Struts2的開發中非常重要,但是其配置非常簡單,基本的規則如下:

  <action>元素是<package>元素的子元素,應該配置在<package>元素里面

  <action>元素通常需要配置name和class屬性,其中name是必須的

  <action>元素可以包含其他的子元素:比如<param>、<result>、<interceptor-ref>、<exception-mapping >

通常也就是配置name和class屬性,然后配置<result>子元素。

為何可以不配置<action>的class屬性?

   <package>元素的extends屬性配置“struts-default”,說明了這個包繼承了一個叫“struts- default”的包,這是Struts2默認配置好的各個<package>元素的公用配置。打開它,可以發現這個文件類似於我們熟悉的struts.xml。根元素也是<struts>,<struts>元素下面有一個子元素<package>,這個<package>的name屬性的值正是“struts-default”。看最后的配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />,這說明<action>元素不寫class屬性的時候,默認配置就是使用ActionSupport類。這種做法有什么用?大多數情況下都是需要配置<action>的class屬性的值的,因為我們需要把自己寫的,用來處理請求的Action類配置上去,而不是使用默認的配置。考慮一種情況,在實際開發中對安全性要求較高的web項目,往往把jsp放在WEB-INF文件夾中,這樣可以防止外界直接通過URL來訪問jsp頁面,這時的jsp就一定要是Servlet或Action的后繼頁面,才可以被訪問到。因此,如果我們有一個jsp頁面在WEB-INF下,但在它之前不需要Action訪問邏輯層,相當於需要直接訪問這個jsp頁面。就可以讓這個jsp作為ActionSupport的后繼頁面,使用default-class-ref,可以減少重復配置。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM