Java web學習(五)

Struts2框架幾乎是目前最優秀的MVC框架之一。Struts2框架是WebWork框架和Struts1框架的結合體。java

  1. Struts2結構體系web

    注:如今StrutsPrepareAndExecuteFilter過濾器已經代替了FilterDispatcher過濾器。apache

    工做原理:當客戶端發送一個HTTP請求時,須要通過一個過濾器鏈,這個過濾器鏈包括ActionContextClearUp過濾器,其餘WEB應用過濾器及StrutsPrepareAndExecuteFilter過濾器,其中StrutsPrepareAndExecuteFilter過濾器是必需要配置的。編程

    當StrutsPrepareAndExecuteFilter過濾器被調用時,ActionMapper將查找須要調用的Action對象,並返回該對象的代理ActionProxy。而後ActionProxy將從配置管理器ConfigurationManager中讀取Struts2的相關配置(struts.xml)。Action容器ActionInvocation調用指定的Action對象,在調用以前須要通過Struts2的一系列攔截器。瀏覽器

    當Action處理請求後,將返回相應的結果視圖,在這些視圖中可使用Struts2標籤顯示數據並控制數據邏輯。而後HTTP請求迴應給瀏覽器,在迴應的過程當中一樣通過過濾器。session

  2. Struts2的用法app

    ①添加jar包框架

    struts2-core,xwork-core,ognl,freemarker,commons-io,commons-fileupload,javassist-GA,asm-commons,asm,commons-langjsp

    ②Struts2框架主要經過一個過濾器將Struts2集成到Web應用中,這個過濾器對象就是org.apache.Struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。經過它Struts2便可攔截Web應用中的http請求,並將這個http請求轉發到指定的Action進行處理,Action根據處理的結果返回給客戶端相應的頁面。所以在Struts2中,過濾器StrutsPrepareAndExecuteFilter是web應用與struts2 API的入口。this

    在web.xml中聲明struts2提供的過濾器 

    <filter>
         <filter-name>struts</filter-name>
         <filter-class>org.apache.struts2.dispatcher.ng.filetr.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
         <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    <filter-pattern>

    ③在web應用的src文件夾下,建立struts.xml,在其中定義Struts2中的Action對象

    <struts>
        <package name="myPackage" extends="struts-default" method="">
            <action name="first" class="">
                 <result name="" type="">/first.jsp</result>
            </action>
       </package>
    </struts>
  3. Action對象

    Action對象主要用來處理http 請求。在struts2 API中,Action對象是一個接口com.opensynphony.xwork.xwork2.Action。在此接口中,定義了五個常量(SUCCESS,NONE,ERROR,INPUT,LOGIN)和一個方法(execute())。

    ①請求參數的注入原理

    在struts2框架中,表單提交的數據會自動注入到與Action對象中相對應的屬性中去,它與Spring IOC注入原理一致,經過Action對象爲屬性提供setter方法進行注入。

    ②Action的基本流程

    當瀏覽器向web容器發送一個HTTP請求時,Web容器就要調用Struts2過濾器的doFilter()方法。此時Struts2接收到HTTP請求,經過Struts2的內部處理機制會判斷這個請求是否與某個Action對象相匹配。若是找到匹配的Action,就會調用Action對象的execute方法,並根據處理結果返回相應的值。而後Struts2經過Action的返回值查找返回值所映射的頁面,最後通過必定的視圖處理後將頁面迴應給瀏覽器。

  4. Struts2的標籤庫

    首先要引入標籤<%@ taglib prefix="s" url="/struts-tags" %>

    ①property 屬性 default value escape

    ②set 屬性 scope value var

    <s:set var="username" value="kaka" scope="request"/>

    <s:property default="none" value="#request.username"/>

    ③a 屬性 action href id method namespace

    ④param 屬性 name value

    ⑤action

    ⑥push 將值推入值棧 value

    ⑦include 屬性 file

    ⑧url 屬性 action method namespace value var

    ⑨if elseif else 屬性 test

    10,iterator 屬性var value

  5.  傳遞參數

    ①直接在Action類中定義屬性和屬性的setter方法。

    ②定義一個對象引用,但在請求參數中必須指定參數鎖對應的實體對象。

    public class UserAction extends ActionSupport {
        private User user;
       public User getUser(){
            return user;
       }
       public void setUser(User user){
            this.user = user;
       }
       public String execute(){
            return SUCCESS;
       }
    }
    <input type="text" name="user.username"/>
    <input type="text" name="user.password"/>

    ③採用ModelDriven模式傳遞參數

    public class UserAction extends ActionSupport implements<User> {
       private User user = new User();
       public User getModel(){
            return this.user;
       }
       public String execute(){
            return SUCCESS;
       }
    }
    <input type="text" name="username"/>
    <input type="text" name="password"/>

    ModelDriven過程:Struts2首先實例化Action對象,而後判斷該對象是否實現了ModelDriven接口,如果,則調用getModel方法來獲取實體對象模型,在以後的操做中對此實體對象進行賦值。

  6. 爲何要使用struts2代替struts1.x

    (1)struts2的execute方法中的參數不會依賴於servletAPI,實現了也servlet解耦,是一種無侵入式的設計。

    (2)struts2提供了攔截器,利用攔截器能夠進行AOP編程,實現權限攔截等功能。

    (3)struts2提供了類型轉換器,咱們能夠很容易地對請求參數轉換成須要的類型。

    (4)提供了同種表現層技術支持,如JSP、freeMarker、velocity等

    (5)能夠對指定的方法進行校驗,能夠輕鬆地實現表單校驗功能

    (6)提供了全局範圍、包範圍和action範圍的國際化資源文件管理實現。

  7. Struts2的攔截器

    攔截器是實現AOP的一種,經過它能夠在Action執行先後進行一些相應的操做。攔截器能在action被調用以前和被調用以後執行一些「代碼」。Struts2框架的大部分核心功能都是經過攔截器來實現的,如防止重複提交、類型轉換、對象封裝、校驗、文件上傳、頁面預裝載等等,都是在攔截器的幫助下實現的。每個攔截器都是獨立裝載的(pluggable),咱們能夠根據實際的須要爲每個action配置它所須要的攔截器。  

    <package name="myFirst" namespace="/" extends="struts-default">
           <interceptors>   
                   <interceptor name="timer"                               class="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
                  <interceptor name="params"
    class="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
    </interceptors>
     
           <action name="login" class="com.asm.LoginAction">
                    <interceptor-ref name="timer"></interceptor-ref>
                    <interceptor-ref name="params"></interceptor-ref>
                    <result name="loginSuccess">/success.jsp</result>
                    <result name="loginFailure">/failure.jsp</result>
           </action>
    </package>

    注意:雖然extends繼承的strust-default自帶有params攔截器,可是當咱們本身引用了攔截器時,繼承struts-default將不會再爲咱們分配默認的攔截器(有點相似構造器),可是咱們仍然能夠經過<interceptor-ref name="defaultStack"/>來繼續使用struts-defalut的攔截器。

  8. 獲取Servlet API

  9. public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
        private String username;
        Map request;
        Map session;
        Map application;
        public String execute() throws Exception {
             request.put("req", "requst屬性");
             session.put("ses", "sesion屬性");
             application.put("app", "application屬性");
             return SUCCESS;
        }
        public void setRequest(Map<String, Object> request) {
             this.request=request;
        }
        public void setSession(Map<String, Object> session) {
             this.session=session;
        }
        public void setApplication(Map<String, Object> application) {
             this.application=application;
        }
        ...省略username的get/set方法 
    }
相關文章
相關標籤/搜索