Struts2筆記_值棧

来源:https://www.cnblogs.com/ends-earth/archive/2019/04/20/10739156.html
-Advertisement-
Play Games

A.值棧概述 值棧(ValueStack),通俗的來說就是Struts2裡面用來管理和存儲數據的東西。struts2項目部署運行後,底層會創建一個action實例,同時也會在記憶體上劃分一塊區域,這個區域就是值棧,該值棧對象會貫穿整個Action生命周期,用來存儲這個過程中的數據。 B.值棧結構 首先 ...


A.值棧概述

  值棧(ValueStack),通俗的來說就是Struts2裡面用來管理和存儲數據的東西。struts2項目部署運行後,底層會創建一個action實例,同時也會在記憶體上劃分一塊區域,這個區域就是值棧,該值棧對象會貫穿整個Action生命周期,用來存儲這個過程中的數據。

 

B.值棧結構

  首先,我們一起去看看struts2中值棧在哪裡。找到xwork-core--->com.opensymphony.xwork2.util------>ValueStack

               

這個ValueStack是介面,裡面沒有具體功能實現,並不能拿來直接用,查看它的實現類,發現是OgnlValueStack,也就是說,真正起作用的,底層創建的實例是該實現類。值棧中有兩個主要區域:

1.root區域.

  點進去看看這個root到底是什麼?

public class CompoundRoot extends ArrayList   //原來root其實就是一個ArrayList集合,只不過裡面添加了出棧和進棧的方法,也就是說它變成棧了,不過還是遵循list集合

  CompoundRoot:存儲了Action的實例,是ognl的root對象,struts2對原先ognl的root對象改進,使用CompoundRoot自定義棧(擴展了ognl),它讀取Action屬性值時會先從棧頂對象中找對應的屬性,找不到繼續找棧中其他對象,找到則停止。

2.context區域

   (註: transient是聲明對象不允許被序列化) 這裡context其實是OgnlContext的上下文。它是一個map結構,裡面存放了一些引用。

    parameters:該Map中包含當前請求的請求參數。

    request::該Map中包含當request對象中的所有屬性。

    session:該Map中包含當session對象中的所有屬性

    application:該Map中包含當application對象中的所有屬性

    attr:該Map按照如下順序來檢索某一個屬性:request,session,application.

 3.ActionContext和ValueStack的關係

通過查看源碼可以知道,在ActionContext創建時,也會創建一個ValueStack對象,並且將該對象給ActionContext。即ActionContext裡面有一個valueStack引用,而ValueStack裡面也有ActionContext的應用。這一點,我們可以通過利用ActionContext獲取Servlet原生API的方式就可以看出。主要就是獲取值棧裡面的Servlet對象。

C.值棧的使用。

1.獲取值棧對象。(同一個Action中獲取到的值棧是同一個)

  ---通過ActionContext對象來獲取值棧

  

//        通過ActionContext對象來獲取ValueStack對象(其實是一個父類引用指向子類方法)
        ValueStack stack1 = ActionContext.getContext().getValueStack();

 

  

   ---通過request對象來獲取

ValueStack stack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

 

2.操作值棧

  一般操作值棧都是指操作root區域。

  •   在Action中提供屬性的get方法方式。(這裡直接演示表單提交方式,簡單類型和對象類型)
action類中
private
User user; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String useStack() { System.out.println(user.getName()); return SUCCESS; }

jsp頁面

從值棧裡面取出值:
    <s:property value="user.name"/>-----------------<s:property value="password"/>
    <s:debug></s:debug>

運行結果

通過上述可以知道,預設情況下,會將Action對象壓入到值棧中,所以其中的屬性也在值棧中。在jsp頁面顯示時直接寫屬性名,如果是對象,由於用get方法對象不一定在棧頂,所以要用對象名.屬性名。屬性不要重覆

  • 手動操作值棧(註意被壓入棧中的都是對象,你傳什麼類型,底層會被封裝成對象,可以自已push對象和普通屬性,看看root區)

action頁面

public  String  handUseStack() {
         ValueStack stack = ActionContext.getContext().getValueStack();
         
         stack.push(user); //只是用來保存對象,將對象壓入到棧中,傳普通屬性底層會包裝成類對象
         stack.set("password", password); //只要用set方法,底層會創建一個map集合,但是你看不到裡面的屬性和屬性值。這是因為這個map集合沒有set和get方法,不過沒關係,雖然顯示空,但是可以取出來。  
return SUCCESS; }

jsp頁面(與將Action自動壓入棧時取對象值有區別,只需要使用屬性名就可以取)

dy>
    從值棧裡面取出值:
    <s:property value="name"/>-----------------<s:property value="password"/>
    <s:debug></s:debug>

運行結果:

  

 

3.操作Context區域 

由於context區域裡面封裝了域對象,所以直接利用域對象就可以達到我們操作context的目的

  action頁面

 

public String useContext() {
//        利用Action中內置對象獲取request對象,向域中存值。其他的域都是一樣
        ServletActionContext.getRequest().setAttribute("user", user);
        ServletActionContext.getRequest().setAttribute("password", password);
        return SUCCESS;
    }

 

jsp頁面(取值還是和上面root區一樣,只不過要加上一個#聲明)

 

從context裡面取出值:
    <s:property value="#request.user.name"/>+..........+<s:property value="#request.password"/>
    <s:debug></s:debug>

運行結果

 

 

如上圖所示,都存到了contex區域裡面了,普通屬性直接屬性名,如password,對象就直接用對象.屬性 如 user.name.

 


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

-Advertisement-
Play Games
更多相關文章
  • //javascript代碼 $$(".bb").addEvent('change',function(e){ var order_item_id = this.get('order_item_id'); var product_name= this.value; new Request.JSON(... ...
  • AQS 概述 AQS(隊列同步器,AbstractQueuedSynchronizer),是用來構建鎖或其他同步組件的核心基礎框架(比如 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch) AQS的底層結構是:一個整型變數st ...
  • 你是否想過生成一份屬於你的微信個人數據報告,瞭解你的微信社交歷史。現在,我們基於python對微信好友進行全方位數據分析,包括:昵稱、性別、年齡、地區、備註名、個性簽名、頭像、群聊、公眾號等。 其中,在分析好友類型方面,主要統計出你的陌生人、星標好友、不讓他看我的朋友圈的好友、不看他的朋友圈的好友... ...
  • go 調用windows dll 的方法 ,代碼如下: ...
  • 第一個自己手寫的代碼~ If 與 Elif #pass 用法 寫代碼前加的兩行首碼 第二行顯示的告訴python解釋器,用什麼編碼來執行源代碼,一般在python2使用,python3可用可不用。 ...
  • unsafe.Pointer其實就是類似C的void *,在golang中是用於各種指針相互轉換的橋梁。uintptr是golang的內置類型,是能存儲指針的整型,uintptr的底層類型是int,它和unsafe.Pointer可相互轉換。uintptr和unsafe.Pointer的區別就是:u ...
  • 時隔三個多月,我終於想起我還有個博客,其實也不是忘了我這個博客,只是平時工作繁忙沒時間去寫博客,故今晚騰出時間來記錄一下上次工作中遇到的一個問題,給園友們分享出來,以免入坑。 上個星期在工作中使用JdbcTemplate執行了一個select * from table where id in (?, ...
  • 創建進程,守護進程,進程鎖Lock,進程通信IPC,JoinableQueue模塊簡介,進程池 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...