Struts2------Result處理&獲取頁面請求參數&API

来源:https://www.cnblogs.com/sanmaotage/archive/2018/01/27/Strust2.html
-Advertisement-
Play Games

Struts2------Result處理&獲取頁面請求參數&API ...


一、Result處理

1.1 說明

  平常我們設置跳轉頁面,是在action標簽裡面加上 result標簽來控制,這種設置的頁面跳轉,稱之為 局部結果頁面;但是我們有時候在很多個action裡面,針對不同的結果進行跳轉時,也有可能跳轉同一個頁面,那麼這個時候就可以配置全局結果頁面。

1.2 局部結果配置eg

<action name="demo01_*" class="com.gaga.web.action.ActionDemo01" method="{1}">
     <result name="error">/error.jsp</result>
</action>

1.3 全局結果配置eg(同一個包下)

<package name="test" extends="struts-default" namespace="/">
    <global-results>
        <result name="error">/error.jsp</result>
    </global-results>
      ....
</package>

1.4 全局結果配置eg(不同的包下)

    <!--把全局的結果抽取到父包裡面  -->
    <package name="base" extends="struts-default" abstract="true">
        <global-results>
            <!--全局的結果: 配置在package裡面的 特點:可以被當前包裡面所有的Action共用; 使用場景:不同的Action需要跳轉到相同的結果的時候eg: 錯誤頁面, msg頁面等  -->
            <result name="error">/msg.jsp</result>
        </global-results>
    </package>

    <package name="test" extends="base" namespace="/">
        <action name="demo01_fun01" class="com.gaga.web.ActionDemo01" method="fun01">
        </action>
        <action name="demo02_fun02" class="com.gaga.web.ActionDemo02" method="fun02">
        </action>
    </package>

1.5 結果的類型

  伺服器響應給瀏覽器的時候,有三種類型:response響應JSON數據&請求轉發 & 重定向。 對於Struts2而言,無非就是Action跳轉(轉發重定向)到頁面,Action跳轉到Action....

1.5.1 Action跳轉頁面

  轉發(預設)

<result name="success" type="dispatcher">/index.jsp</result>

  重定向

<result name="success" type="redirect">/index.jsp</result>

1.5.2 Action跳轉Action

 轉發

<action name="demo01_*" class="com.gaga.web.action.ActionDemo01" method="{1}">
        <result name="success" type="chain">demo02_fun02</result>
</action>
<action name="demo02_*" class="com.gaga.web.action.ActionDemo02" method="{1}">
</action>

 重定向 

<action name="demo01_*" class="com.gaga.web.action.ActionDemo01" method="{1}">
        <result name="success" type="redirectAction">demo02_fun02</result>
</action>
<action name="demo02_*" class="com.gaga.web.action.ActionDemo02" method="{1}">
</action>

1.5.4 其它的結果(用得不多)

  一般來說,我們平常的請求到來,我們要不就是跳轉到 頁面上 ,要不就是跳轉到下一個action 去。 但是除了這兩種結果之外,我們仍然還有一些其他結果類型可以控制.

​   比如: 我們可以返回一個文件數據給客戶端 (比如文件下載).再比如: 我們可以返回一個json字元串給來請求的頁面,而不是重新打開新的頁面 (有點像之前的Ajax請求,返回json數據)

1.5.4.1 響應JSON數據

  • 導入struts-json-plugin-xxx.jar
  • java代碼
public class ActionDemo01 extends ActionSupport {
    private User json;
    
    public User getJson() {
        return json;
    }

    public String fun01(){
        json = new User();
        json.setName("張三");
        json.setAge(18);
        json.setPassword("123456");
        
        return "success";
    }
    
}
  • 配置文件
<struts>
    <package name="test" extends="json-default" namespace="/">
        <action name="demo01" class="com.itheima.web.action.ActionDemo01" method="fun01">
            <result name="success" type="json">
                                <param name="root">json</param><!--這裡的name必須是root  至於這個json 是我們在action裡面的成員 變數 json(屬性)  -->
             </result>
        </action>
    </package>
</struts>

  備註:

  root:配置對象。action類中必須提供一個和root值相同的屬性名稱,且需要提供getter方法。

​   package需要繼承json-default

​   result的type值是json

        param標簽中的內容必須為Action類中的Javabean屬性,該例子中,由於拿取User對象json的方法為getJson(),把get去掉,J變為小寫,即為json,那麼就有了<param name="root">json</param>

1.5.4.2 響應流(文件下載)

  • java代碼
public class ActionDemo01 extends ActionSupport {
    private InputStream stream;
    
    public void setStream(InputStream stream) {
        this.stream = stream;
    }
    public InputStream getStream() {
        return stream;
    }

    public String fun01() throws Exception{
        System.out.println("demo01 執行了...");
        stream = new FileInputStream("E:/data/Desktop/a.jpg");
        
        return "success";
    }
}
  • 配置文件
<struts>
    <package name="test" extends="struts-default" namespace="/">
        <action name="demo01" class="com.itheima.web.action.ActionDemo01"
            method="fun01">
            <result name="success" type="stream">
                <param name="contentType">image/jpeg</param>
                <param name="inputName">stream</param>
                <param name="contentDisposition">attachment;filename="b.jpg"</param>
                <param name="bufferSize">1024</param>
            </result>
        </action>
    </package>
</struts>

  說明  

  contentType:下載文件類型

​   contentDisposition:下載到客戶端時,客戶端文件名稱

​   bufferSize:讀文件的緩存大小

​   inputName:對應要輸出到客戶端流聲明的名稱,也就是說需要和Action裡面聲明的變數名要一致

二、利用Struts2獲取頁面參數

1.  獲取零散數據(即封裝前的數據)

1.1 利用Struts2中的API

  • 利用ActionContext(Action中的上下文)
//1.創建ActionContext對象
ActionContext context = ActionContext.getContext();
//2.獲得所有的請求參數
Map<String, Object> parameters = context.getParamters();
  • 利用ServletActionContext
//1.獲得request對象
HttpServletRequest request = ServletActionContext.getRequest();
//獲取具體參數 requet.getParameter(String key); requet.getParameterValues(String key); requet.getParameterMap();

1.2 利用屬性驅動

  • 頁面
<h1>01使用屬性驅動</h1>
<form method="post" action="${pageContext.request.contextPath }/demo01">
    用戶名:<input type="text" name="username"/><br/>
    密    碼:<input type="password" name="password"/><br/>
    <input type="submit"/>
</form>
  • Action.java
public class ActionDemo01 extends ActionSupport {
    private String username;//和表單裡面的name屬性值要一致,並且提供set方法
    private String password;//和表單裡面的name屬性值要一致,並且提供set方法
    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    public String fun01(){
        System.out.println(username+":"+password);
        return NONE;
    }
}

2. 直接獲取封裝後的數據(即直接獲取對象)

2.1 屬性驅動

  • 頁面
<h1>01使用屬性驅動方式</h1>
<form method="post" action="${pageContext.request.contextPath }/demo01">
    用戶名:<input type="text" name="user.username"/><br/>
    密    碼:<input type="password" name="user.password"/><br/>
    <input type="submit"/>
</form>
  • Action類
public class ActionDemo01 extends ActionSupport {
    //1. User類裡面的欄位屬性需要和表單裡面的name屬性一致, 且提供無參構造
      //2. user需要set和get方法
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    public String fun01(){
        System.out.println(user.toString());
        return NONE;
    }
}

2.2 模型驅動

  • 頁面
<h1>02使用模型驅動方式</h1>
<form method="post" action="${pageContext.request.contextPath }/demo02">
    用戶名:<input type="text" name="username"/><br/>
    密    碼:<input type="password" name="password"/><br/>
    <input type="submit"/>
</form>
  • Action類
public class ActionDemo02 extends ActionSupport implements ModelDriven<User> {
    
    private User user;
    
    public String fun02(){
        System.out.println(user.toString());
        return NONE;
    }
    @Override
    public User getModel() {
        if(user == null){
            user = new User();
        }
        return user;
    }
}

  經驗:實際開發中,

如果要獲得單個(零散)的數據,我們通常用屬性驅動

如果要獲得封裝後的數據, 我們通常用模型驅動

2.3 封裝到List集合(用得不多)

  • 頁面
<h1>01封裝到list</h1>
<form method="post" action="${pageContext.request.contextPath }/demo01">
    用戶名:<input type="text" name="list[0].username"/><br/>
    密    碼:<input type="password" name="list[0].password"/><br/>
    用戶名:<input type="text" name="list[1].username"/><br/>
    密    碼:<input type="password" name="list[1].password"/><br/>
    <input type="submit"/>
</form>
  • Action類
public class ActionDemo01 extends ActionSupport {
    
    private List<User> list;
    
    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public String fun01(){
        System.out.println(list.toString());
        return NONE;
    }
}

2.4 封裝到Map中

  • 頁面
<h1>02封裝到map</h1>
<form method="post" action="${pageContext.request.contextPath }/demo02">
    用戶名:<input type="text" name="map['user1'].username"/><br/>
    密    碼:<input type="password" name="map['user1'].password"/><br/>
    用戶名:<input type="text" name="map['user2'].username"/><br/>
    密    碼:<input type="password" name="map['user2'].password"/><br/>
    <input type="submit"/>
</form>
  • Action類
public class ActionDemo02 extends ActionSupport {
    
    private Map<String, User> map;
    
    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    public String fun02(){
        Set<Entry<String, User>> entrySet = map.entrySet();
        for (Entry<String, User> entry : entrySet) {
            System.out.println(entry.getKey()+":"+entry.getValue().toString());
        }
        return NONE;
    }

三、補充:Struts2中的API訪問

3.1  用ActionContext

  ActionContext是Action的上下文,Struts2自動在其中保存了一些在Action執行過程中所需的對象,比如session, parameters等。Struts2會根據每個執行HTTP請求的線程來創建對應的ActionContext,即一個線程有一個唯一的ActionContext。

  • 創建對象
ActionContext context = ActionContext.getContext();
  • 獲取請求參數
Map<String, Object> parameters = context.getParamters();

3.2  用ServletActionContext

  ServletActionContext繼承ActionContext,因此比ActionContext功能要強大。ServletActionContext提供了多個靜態方法。

//獲得Request對象
HttpServletRequest request = ServletActionContext.getRequest();
//獲得Response對象
HttpServletResponse response = ServletActionContext.getResponse();
//獲得ServletContext
ServletContext servletContext = ServletActionContext.getServletContext();

3.3  通過實現介面

  有如下介面可選

​ ServletContextAware

​ ServletRequestAware

​ ServletResponseAware

​ SessionAware

​ ApplicationAware

eg:

public class ActionDemo03 extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;
    public String fun03() throws IOException{
        HttpServletRequest request = ServletActionContext.getRequest();
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+":"+password);
        return NONE;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }
}

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

-Advertisement-
Play Games
更多相關文章
  • 什麼是高階函數?把函數作為參數傳入,這樣的函數稱為高階函數,函數式編程就是指這種高度抽象的編程範式。 在前面的章節中,我們知道可以用abs()這個函數來得到一個數的絕對值,如: 以上代碼,輸出: 如果,我們把代碼修改下,把abs賦值給一個變數: 以上代碼,輸出: 可見,abs(-100)是函數調用, ...
  • RAC類關係圖: RAC 信號源: 需要導入的頭文件: 冷信號 結果: 熱信號 文本框監聽 結果: Map映射 用於將一個事件流的值操作後的結果產生一個新的事件流。 方法一: 輸入: Hello123 結果為: 方法二: 結果為: Filter函數可以按照之前預設的條件過濾掉不滿足的值 方法一: 輸 ...
  • 申請百度API 1、打開網頁 http://lbsyun.baidu.com/index.php?title=首頁 選擇功能與服務中的地圖,點擊左邊的獲取密匙,然後按照要求申請即可,需要手機和百度賬號及郵箱認證。 激活後可看到後臺頁面,現在可以開始創建應用了,這裡請求校驗方式有兩種,一種是白名單IP ...
  • Spring Boot中除了對常用的關係型資料庫提供了優秀的自動化支持之外,對於很多NoSQL資料庫一樣提供了自動化配置的支持,包括:Redis, MongoDB, 等。 Redis簡單介紹 Redis是Redis是Remote DIctionary Server的縮寫,是目前業界使用最廣泛的記憶體數 ...
  • 1、字元串 主要print的時候‘ ’和“ ”的 結果都是樣的,要註意的就是如果句子中含有’或”是要交叉使用,例如I'am a man.裡面就有’,那麼print的時候就要用雙引號“I'am a man.”,如果是“Apple”is an fruit.就要用單引號‘“Apple” is an fru ...
  • 1、文件上傳原理 將客戶端的文件上傳到伺服器,再將伺服器的臨時文件上傳到指定目錄 2、客戶端配置 提交表單 表單的發送方式為post 添加enctype="multipart/form-data" 3、伺服器端配置 file_uploads = On,支持HTTP上傳 uoload_tmp_dir ...
  • 本文是筆者創建項目 一系列java示常式序的總結。項目位置在 "SimplestJavaDemos" ,歡迎訪問. 以下為正文:   作為一個偽完美主義+拖延癌患者,每次要學習新技術的時候,總是要把它們看的很重很大很難,總是要挑一個最完美的時刻,擁有最完美的心情的時候才開始一個新 ...
  • Redis官方給出兩種思路 第一種:SET key value [EX seconds] [PX milliseconds] NX 第二種:SETNX+GETSET 首先,分別看一下這幾個命令 SET命令 SETNX命令 GETSET命令 接著,看第一種方式 官方給出的思路是這樣的 還有一處,也是類 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...