中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Struts2之Action接收請求參數和攔截器詳解

發布時間:2020-08-31 13:46:03 來源:腳本之家 閱讀:143 作者:曉夢蝶 欄目:編程語言

技術分析之在Struts2框架中使用Servlet的API

1. 在Action類中也可以獲取到Servlet一些常用的API

需求:提供JSP的表單頁面的數據,在Action中使用Servlet的API接收到,然后保存到三個域對象中,最后再顯示到JSP的頁面上。

提供JSP注冊的頁面,演示下面這三種方式     

 <h4>注冊頁面</h4>
        <form action="${ pageContext.request.contextPath }/xxx.action" method="post">
          姓名:<input type="text" name="username" /><br/>
          密碼:<input type="password" name="password" /><br/>
          <input type="submit" value="注冊" />
        </form>

2. 完全解耦合的方式

如果使用該種方式,Struts2框架中提供了一個類,ActionContext類,該類中提供一些方法,通過方法獲取Servlet的API

一些常用的方法如下

  1. static ActionContext getContext()                                                      -- 獲取ActionContext對象實例
  2. java.util.Map<java.lang.String,java.lang.Object> getParameters()          -- 獲取請求參數,相當于request.getParameterMap();
  3. java.util.Map<java.lang.String,java.lang.Object> getSession()               -- 獲取的代表session域的Map集合,就相當于操作session域。
  4. java.util.Map<java.lang.String,java.lang.Object> getApplication()           -- 獲取代表application域的Map集合
  5. void put(java.lang.String key, java.lang.Object value)                           -- 注意:向request域中存入值。

3. 使用原生Servlet的API的方式(常用到)

Struts2框架提供了一個類,ServletActionContext,該類中提供了一些靜態的方法

具體的方法如下

  1. getPageContext()
  2. getRequest()
  3. getResponse()
  4.  getServletContext()

技術分析之結果頁面的跳轉

1. 結果頁面存在兩種方式

全局結果頁面

> 條件:如果<package>包中的一些action都返回success,并且返回的頁面都是同一個JSP頁面,這樣就可以配置全局的結果頁面。

> 全局結果頁面針對的當前的包中的所有的Action,但是如果局部還有結果頁面,會優先局部的。使用的標簽是           

 <global-results>
  <result>/demo3/suc.jsp</result>
 </global-results>

局部結果頁面   

<result>/demo3/suc.jsp</result>  

2. 結果頁面的類型

結果頁面使用<result>標簽進行配置,包含兩個屬性

> name    -- 邏輯視圖的名稱

> type    -- 跳轉的類型,值一些,需要掌握一些常用的類型。常見的結果類型去struts-default.xml中查找。

  1. dispatcher        -- 轉發.type的默認值.Action--->JSP
  2. redirect            -- 重定向.    Action--->JSP
  3. chain                -- 多個action之間跳轉.從一個Action轉發到另一個Action.    Action---Action
  4. redirectAction    -- 多個action之間跳轉.從一個Action重定向到另一個Action.    Action---Action
  5. stream            -- 文件下載時候使用的

技術分析之Struts2框架的數據封裝

1. 為什么要使用數據的封裝呢?

  1. 作為MVC框架,必須要負責解析HTTP請求參數,并將其封裝到Model對象中
  2. 封裝數據為開發提供了很多方便
  3. Struts2框架提供了很強大的數據封裝的功能,不再需要使用Servlet的API完成手動封裝了!!    

2. Struts2中提供了兩類數據封裝的方式?

第一種方式:屬性驅動

> 提供對應屬性的set方法進行數據的封裝。

表單的哪些屬性需要封裝數據,那么在對應的Action類中提供該屬性的set方法即可。

表單中的數據提交,最終找到Action類中的setXxx的方法,最后賦值給全局變量。

注意0:Struts2的框架采用的攔截器完成數據的封裝。

注意1:這種方式不是特別好:因為屬性特別多,提供特別多的set方法,而且還需要手動將數據存入到對象中.

注意2:這種情況下,Action類就相當于一個JavaBean,就沒有體現出MVC的思想,Action類又封裝數據,又接收請求處理,耦合性較高。

> 在頁面上,使用OGNL表達式進行數據封裝。

在頁面中使用OGNL表達式進行數據的封裝,就可以直接把屬性封裝到某一個JavaBean的對象中。

在頁面中定義一個JavaBean,并且提供set方法:例如:private User user;

頁面中的編寫發生了變化,需要使用OGNL的方式,表單中的寫法:<input type="text" name="user.username">

注意:只提供一個set方法還不夠,必須還需要提供user屬性的get和set方法!!!

> 先調用get方法,判斷一下是否有user對象的實例對象,如果沒有,調用set方法把攔截器創建的對象注入進來,

/**
屬性驅動方式,把數據封裝到JavaBean的對象中
@author Administrator
 */
public class Regist2Action extends ActionSupport{
  
  private static final long serialVersionUID = 6556880331550390473L;
  
  // 注意二:屬性驅動的方式,現在,要提供是get和set方法
  private User user;
  public User getUser() {
    System.out.println("getUser...");
    return user;
  }
  public void setUser(User user) {
    System.out.println("setUser...");
    this.user = user;
  }
  
  public String execute() throws Exception {
    System.out.println(user);
    return NONE;
  }

}

第二種方式:模型驅動

> 使用模型驅動的方式,也可以把表單中的數據直接封裝到一個JavaBean的對象中,并且表單的寫法和之前的寫法沒有區別!

> 編寫的頁面不需要任何變化,正常編寫name屬性的值

> 模型驅動的編寫步驟:

手動實例化JavaBean,即:private User user = new User();

必須實現ModelDriven<T>接口,實現getModel()的方法,在getModel()方法中返回user即可!!

/**
模型驅動的方式
  實現ModelDriven接口
 必須要手動實例化對象(需要自己new好)
@author Administrator
 */
public class Regist3Action extends ActionSupport implements ModelDriven<User>{
  
  private static final long serialVersionUID = 6556880331550390473L;
  
  // 必須要手動實例化
  private User user = new User();
  // 獲取模型對象
  public User getModel() {
    return user;
  }
  
  public String execute() throws Exception {
    System.out.println(user);
    return NONE;
  }

}

技術分析之Struts2把數據封裝到集合中

1. 封裝復雜類型的參數(集合類型 Collection 、Map接口等)

2. 需求:頁面中有可能想批量添加一些數據,那么現在就可以使用上述的技術了。把數據封裝到集合中

3. 把數據封裝到Collection中

因為Collection接口都會有下標值,所有頁面的寫法會有一些區別,注意:

<input type="text" name="products[0].name" />

在Action中的寫法,需要提供products的集合,并且提供get和set方法。

4. 把數據封裝到Map中

Map集合是鍵值對的形式,頁面的寫法

<input type="text" name="map['one'].name" />

Action中提供map集合,并且提供get和set方法

代碼: 

/**
屬性驅動的方式,把數據封裝到map集合中
@author Administrator
 */
public class Regist5Action extends ActionSupport{
  
  private static final long serialVersionUID = 6556880331550390473L;
  
  private Map<String, User> map;
  public Map<String, User> getMap() {
    return map;
  }
  public void setMap(Map<String, User> map) {
    this.map = map;
  }

  public String execute() throws Exception {
    System.out.println(map);
    return NONE;
  }

}

案例總結之Struts2的攔截器技術

1. 攔截器的概述

攔截器就是AOP(Aspect-Oriented Programming)的一種實現。(AOP是指用于在某個方法或字段被訪問之前,進行攔截然后在之前或之后加入某些操作。)

過濾器:過濾從客服端發送到服務器端請求的

攔截器:攔截對目標Action中的某些方法進行攔截

  1. 攔截器不能攔截JSP
  2.  攔截到Action中某些方法

2. 攔截器和過濾器的區別

1)攔截器是基于JAVA反射機制的,而過濾器是基于函數回調的

2)過濾器依賴于Servlet容器,而攔截器不依賴于Servlet容器

3)攔截器只能對Action請求起作用(Action中的方法),而過濾器可以對幾乎所有的請求起作用(CSS JSP JS)

攔截器 采用 責任鏈 模式

> 在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈

> 責任鏈每一個節點,都可以繼續調用下一個節點,也可以阻止流程繼續執行

在struts2 中可以定義很多個攔截器,將多個攔截器按照特定順序 組成攔截器棧 (順序調用 棧中的每一個攔截器 )

 3. Struts2的核心是攔截器,看一下Struts2的運行流程

自定義攔截器和配置

1. 編寫攔截器,需要實現Interceptor接口,實現接口中的三個方法

 protected String doIntercept(ActionInvocation invocation) throws Exception {
      // 獲取session對象
      User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
      if(user == null){
        // 說明,沒有登錄,后面就不會執行了
        return "login";
      }
      return invocation.invoke();
    }

 2. 需要在struts.xml中進行攔截器的配置,配置一共有兩種方式

 <!-- 定義了攔截器 第一種方式
    <interceptors>
      <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/>
    </interceptors>
    -->
    
    <!-- 第二種方式:定義攔截器棧 -->
    <interceptors>
      <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/>
      <!-- 定義攔截器棧 -->
      <interceptor-stack name="myStack">
        <interceptor-ref name="DemoInterceptor"/>
        <interceptor-ref name="defaultStack"/>
      </interceptor-stack>
    </interceptors>
    
    <action name="userAction" class="com.itheima.demo3.UserAction">
      <!-- 只要是引用自己的攔截器,默認棧的攔截器就不執行了,必須要手動引入默認棧
      <interceptor-ref name="DemoInterceptor"/>
      <interceptor-ref name="defaultStack"/>
      -->
      
      <!-- 引入攔截器棧就OK -->
      <interceptor-ref name="myStack"/>
    </action>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永仁县| 丰镇市| 大方县| 临沂市| 五大连池市| 霍邱县| 靖江市| 大化| 松原市| 石阡县| 绥德县| 肇源县| 马关县| 大冶市| 芦溪县| 绵竹市| 咸阳市| 都兰县| 新和县| 北碚区| 越西县| 昆明市| 郯城县| 辉南县| 盘锦市| 富川| 晋宁县| 湘潭市| 平遥县| 台湾省| 沙洋县| 响水县| 宁强县| 玉环县| 昆明市| 漳浦县| 宽城| 聊城市| 宁陕县| 崇义县| 娄底市|