Struts2 與Servlet API解耦,耦合的訪問方式

来源:http://www.cnblogs.com/s1294/archive/2016/09/02/5834360.html
-Advertisement-
Play Games

一.與Servlet API解耦的訪問方式 1.為了避免與Servlet API耦合在一起,方便Action類做單元測試, Struts2對HttpServletRequest、HttpSession和ServletContext進行了封裝, 構造了三個Map對象來替代這三種對象,在Action中, ...


一.與Servlet API解耦的訪問方式

1.為了避免與Servlet API耦合在一起,方便Action類做單元測試,
  Struts2對HttpServletRequest、HttpSession和ServletContext進行了封裝,
  構造了三個Map對象來替代這三種對象,在Action中,
  直接使用HttpServletRequest、HttpSession、ServletContext對應的Map對象來保存和讀取數據。
  要獲得這三個Map對象,可以使用com.opensymphony.xwork2.ActionContext類

ActionContext - 請求上下文 。就是struts2封裝的request.包含了request,session,application上面這三個都是Map.

public class LoginAction implements Action{
    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;
    }
    
    public String execute() throws Exception {
        if (username.equals("1")&&password.equals("1")) {
            //解耦合 記錄session
            Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("uname", username);
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }
}
     
<!--登錄

登陸成功後,記錄用戶名到Session中,登陸失敗,跳會登陸頁面

 -->
        <action name="loginAction" class="cn.happy.action.LoginAction">
            <result name="success">
            s.jsp
            </result>
            <result name="login">
            login.jsp
            </result>
        </action>

二.與Servlet API耦合的訪問方式

直接訪問 Servlet API將使Action類與Servlet API耦合在一起,Servlet API對象均由Servlet容器來構造,與這些對象綁定在一起,測試過程中就必須有Servlet容器,這樣不便於Action類的測試,但有時候,確實需要訪問這些對象,Struts2同樣提供了直接訪問ServletAPI對象的方式。

要直接獲取Servlet API對象可以使用org.apache.struts2.ServletActionContext類,該類是ActionContext類的子類。

2:向Action中註入ServletAPI對象對應的Map對象

public class LoginAction implements Action,SessionAware {
    private String username;
    private String password;
    private Map<String,Object> map;
    public String execute() throws Exception {
        if (username.equals("1")&&password.equals("1")) {
            //註入map集合
            map.put("uname", username);
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }
       
    public void setSession(Map<String, Object> map) {
        
        this.map=map;
    }
}

//通過ActionContext的子類ServletActionContext實現

public class LoginAction implements Action {
    private String username;
    private String password;
    public String execute() throws Exception {
        if (username.equals("1")&&password.equals("1")) {
           HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("uname", username);
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }

//向Action實例註入Servlet API對象

public class LoginAction implements Action,ServletRequestAware{
    private HttpServletRequest Request;   
     private String username;
    private String password;
    public String execute() throws Exception {
        if (username.equals("1")&&password.equals("1")) {
         //記錄session
          HttpSession session=request.getSession();
          session.setAttribute("uname",username);
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }        
public void setServletRequest(HttpServletRequest arg0) {
        this.request=request;
        
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目介紹:利用Qt實現簡單的學生信息管理 實現功能:實現對信息的添加,刪除,查詢,修改 廢話不多說,直接進入主題:(剛剛學,界面做的不是太美觀,請多包涵) 主界面 - mainWindow && login 一、添加學生 - 1、使用組件有:Dialog 視窗,Label標簽,Line Edit,S ...
  • 之前一直沒搞懂這個怎麼計算的,主要也因為之前沒怎麼用到過這個,但現在想把它搞懂,所以索性一次性搞懂為妙,以後就不用再糾結了哈。 按位運算符就是把數字看作二進位來進行計算的,並且再把計算出來的二進位給它轉換成十進位,也就是最終的結果了。 比如: 7&9 這個是按位與,先不討論與不與的,總之它現在會把7 ...
  • mybatis的映射文件寫法多種多樣,不同的寫法和用法,在實際開發過程中所消耗的開發時間、維護時間有很大差別,今天我就把我認為比較簡單的一種映射文件寫法記錄下來,供大家修改建議,爭取找到一個最優寫法~~: 以User對象和UserMap.xml為例講解,代碼如下: User為用戶實體類(僅作為講解, ...
  • 實習就要結束了,最終要上交的是網上書城項目和一份文檔。接下來簡要介紹一下項目。 項目是根據三層架構來寫,數據訪問層(DAO層)、系統業務邏輯控制處理層(servlet層)、和界面層(jsp)。 首先在DAO層構造好SQL語句,對資料庫進行操作,在servlet層調用Dao層相關方法進行相應的邏輯處理 ...
  • java中獲取網頁的get或post數據的方法有以下三種: getParameter(name); 獲取單參數的方法。 getParameterValues(name); 獲取多參數值的方法,如覆選框的值,返回一個數組 getParameterNames(name); 獲取request中的所有參數 ...
  • RT,you get 是一個視頻離線下載工具, https://github.com/soimort/you get 另一個同類工具 youtube dl 也是python 實現,雖然名為 youtube dl 但是從文檔上看,支持很多網站 https://github.com/rg3/youtub ...
  • 最近由於要做一個爬蟲項目,要對很多網站進行爬取,所以一直都在看這方面的文章。在翻閱了很多資料後,下載了一個curl庫,著實對項目有了很大的幫助。 一、LibCurl基本編程框架libcurl是一個跨平臺的網路協議庫,支持http, https, ftp, gopher, telnet, dict, ...
  • 一.為什麼要進行數據校驗 對於一個web應用而言,所有的應用數據都是通過瀏覽器收集的,用戶的輸入信息是非常複雜的,對於一些用戶操作不熟練,輸入出錯,等網路傳輸不穩定,這些都有可能導致異常輸入。 異常的輸入,輕則導致系統非正常中斷,重則導致系統崩潰,應用程式必須能正常處理表現層接收的異常數據,通常的做 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...