day03-模型數據

来源:https://www.cnblogs.com/liyuelian/archive/2023/02/06/17096717.html
-Advertisement-
Play Games

模型數據 1.數據放入request 說明:開發中,控制器/處理器中獲取的數據如何放入request域,然後在前端(vue/jsp/...)取出顯示? 先來看一個例子 應用實例需求:表單提交信息,後端獲取信息,並通過request轉發到另一個頁面,顯示信息。 需要知道的是:前端提交的數據,sprin ...


模型數據

1.數據放入request

  • 說明:開發中,控制器/處理器中獲取的數據如何放入request域,然後在前端(vue/jsp/...)取出顯示?

先來看一個例子

應用實例需求:表單提交信息,後端獲取信息,並通過request轉發到另一個頁面,顯示信息。

image-20230206181733509 image-20230206181746223

需要知道的是:前端提交的數據,springmvc會自動地封裝到java對象中,同時 springmvc 會自動地將其放入request 域中,這樣我們就可以在跳轉的下一個頁面取出數據。


  1. mode_date.jsp提交數據:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>model_data</title>
    </head>
    <body>
    <form action="vote/vote05" method="post">
      主人id:<input type="text" name="id"/><br/>
      主人名:<input type="text" name="name"/><br/>
      寵物id:<input type="text" name="pet.id"/><br/>
      寵物名:<input type="text" name="pet.name"/><br/>
      <input type="submit" value="添加主人和寵物"/><br/>
    </form>
    </body>
    </html>
    
  2. VoteHandler.java:

    springmvc會自動將數據封裝到Javabean中,並將獲取的model模型放入到request域中。

    package com.li.web.requestparam;
    
    import com.li.entity.Master;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @author 李
     * @version 1.0
     */
    @RequestMapping(value = "/vote")
    @Controller
    public class VoteHandler {
        /**
         * 1.提交的數據->springmvc會自動地封裝到 java對象
         * ->同時 springmvc 會自動地將其放入request域中
         * 2.這樣就可以在跳轉的下一個頁面取出數據
         */
        @RequestMapping(value = "/vote05")
        public String test05(Master master) {
            //springmvc會自動的把獲取的model模型放入request域中,名字就是 master
            return "vote_ok";
        }
    }
    
  3. 轉發的頁面 vote_ok.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>vote_ok</title>
    </head>
    <body>
    <h1>取出request域中的信息</h1>
    主人的id=${requestScope.master.id}
    主人的名字=${requestScope.master.name}
    寵物的id=${requestScope.master.pet.id}
    寵物的名字=${requestScope.master.pet.name}
    </body>
    </html>
    

訪問mode_date.jsp,提交數據:

image-20230206184133385

轉發頁面vote_ok.jsp成功地拿到了request域中的信息:

image-20230206184201411

從上述代碼中可以看出springmvc會自動將獲取的model數據添加到request域中。同時我們也可以手動添加修改數據,並放入到request域中,有如下三種方式:

1.1方式1-通過HttpServletRequest放入request域

  1. 這種方式就是原生的javaweb方式,可以在request域中以k-v形式,直接放入普通字元串,也可以放入對象

  2. 同時springmvc 自動放入request域的model也可以被修改

  3. 註意:springmvc放入request域中的對象的key值,是按照對象的類型(首字母小寫)存放的,和方法的形參名無關

修改VoteHandler.java:

@RequestMapping(value = "/vote05")
public String test05(Master master100, HttpServletRequest request) {
    //1.springmvc會自動的把獲取的model模型放入request域中,名字就是 master
    //2.也可以手動添加數據到request域中
    request.setAttribute("address", "beijing");
    //3.同時可以修改 master的屬性值
    master100.setName("hahahah");
    //4.分析一下springmvc預設存放對象到request域中,屬性名是如何確定的?
    //  是按對象的類型(首字母小寫)放入的,和方法的形參名無關
    //  因此我們在轉發的頁面按照該名稱是可以拿出來的
    return "vote_ok";
}

mode_date.jsp不變,vote_ok.jsp添加address獲取。

提交數據:

image-20230206190545490

轉發頁面獲取的數據:

image-20230206190608418

1.2方式2-通過請求的方法參數Map<String,Object>放入request域

springmvc會遍歷map,將map中的k-v存放到request域中。因此你會發現在轉發頁面中,直接通過${requestScope.key}也可以獲取屬性的數據。

修改VoteHandler.java:

/**
 * 演示通過Map<String,Object>設置數據到request域
 */
@RequestMapping(value = "/vote06")
public String test06(Master master, Map<String, Object> map) {
    //需求是通過map對象,添加屬性到request域中
    map.put("address", "tianjin");
    //原理分析:springmvc會遍歷map,將map中的k-v存放到request域中
    //因此你會發現在轉發頁面中,直接通過${requestScope.address}也可以獲取address的數據
    return "vote_ok";
}

model_data.jsp不變

vote_ok.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>vote_ok</title>
</head>
<body>
<h1>取出request域中的信息</h1>
主人的address=${requestScope.address}
主人的id=${requestScope.master.id}
主人的名字=${requestScope.master.name}
寵物的id=${requestScope.master.pet.id}
寵物的名字=${requestScope.master.pet.name}
</body>
</html>

model_data.jsp:

image-20230206191844823

vote_ok.jsp:

image-20230206191849974

註意事項:

  1. 我們知道,表單提交的數據會被springmvc自動封裝成對象,並放入request域中。而且springmvc會掃描map,將裡面的k-v也放到request域中。

  2. 這意味著,如果map的中某個key和之前自動封裝的對象同名,那麼在springmvc掃描map的時候,原先的request的對象的屬性值會被map中同名key的value值覆蓋

1.3方式3-通過返回ModelAndView對象實現request域數據

  1. 表單數據被springmvc封裝到master對象
  2. master對象被springmvc封裝到request域中
  3. ModelAndView的屬性也會被springmvc放入到request域中
  4. 因此轉發的頁面中可以通過request域獲取到所有數據

修改 VoteHandler.java:

//演示通過返回ModelAndView對象,將數據放入到request域中
@RequestMapping(value = "/vote07")
public ModelAndView test07(Master master) {
    ModelAndView modelAndView = new ModelAndView();
    //放入屬性到 ModelAndView對象
    modelAndView.addObject("address", "shanghai~~");
    //指定要跳轉的視圖名稱
    modelAndView.setViewName("vote_ok");
    return modelAndView;
}

model_data.jsp不變

vote_ok.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>vote_ok</title>
</head>
<body>
<h1>取出request域中的信息</h1>
主人的address=${requestScope.address}
主人的id=${requestScope.master.id}
主人的名字=${requestScope.master.name}
寵物的id=${requestScope.master.pet.id}
寵物的名字=${requestScope.master.pet.name}
</body>
</html>

model_data.jsp:

image-20230206200644063

vote_ok.jsp:可以看到在ModelAndView中的數據已經被放入到了request對象中,因此可以直接獲取

image-20230206200724038

註意事項:

  1. 從本質上看,請求響應的方return "xxx",只是返回了一個字元串,其實本質上底層是返回了一個ModelAndView 對象,只是預設被封裝起來了。

  2. ModelAndView 既可以包含 model 數據,也可以包含視圖信息。

  3. ModelAndView 對象的 addObject 方法可以添加key-val數據,添加的數據預設被 springmvc 掃描放在request域中。

  4. ModelAndView 對象的 setView 方法可以指定視圖名稱。

  5. 這裡ModelAndView 被 springmvc 掃描,將屬性放入request域中的操作,和之前map被springmvc掃描非常相似。同樣的,ModelAndView中的屬性被放入request域中時,如果request域中已經有同名屬性了,那麼將會進行覆蓋操作。

2.數據放入session

  • 說明:開發中,控制器/處理器中獲取的數據如何放入session域,然後在前端(vue/jsp/...)取出顯示?

應用實例

仍然以之前的例子說明:

image-20230206181733509 image-20230206202910589
  1. model_date.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>model_data</title>
    </head>
    <body>
    <h1>添加信息[測試session]</h1>
    <form action="vote/vote08" method="post">
      主人id:<input type="text" name="id"/><br/>
      主人名:<input type="text" name="name"/><br/>
      寵物id:<input type="text" name="pet.id"/><br/>
      寵物名:<input type="text" name="pet.name"/><br/>
      <input type="submit" value="添加主人和寵物"/><br/>
    </form>
    </body>
    </html>
    
  2. 修改VoteHandler.java

    //演示如何將數據設置到session域中
    @RequestMapping(value = "/vote08")
    public String test08(Master master,HttpSession session) {
        //master對象預設放在request域中
        //因此要手動將數據放入session中
        session.setAttribute("master",master);
        session.setAttribute("address","guangzhou");
        return "vote_ok";
    }
    
  3. vote_ok.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>vote_ok</title>
    </head>
    <body>
    <h1>取出session域中的信息</h1>
    主人的address=${sessionScope.address}<br/>
    主人的id=${sessionScope.master.id}<br/>
    主人的名字=${sessionScope.master.name}<br/>
    寵物的id=${sessionScope.master.pet.id}<br/>
    寵物的名字=${sessionScope.master.pet.name}
    </body>
    </html>
    

model_data.jsp:

image-20230206203843271

vote_ok.jsp:

image-20230206203849600

3.@ModelAttribute實現prepare方法

3.1基本說明

開發中,有時需要使用某個前置方法(如prepareXXX,名稱隨意)給目標方法準備一個模型對象

  1. @ModelAttribute 註解可以實現這樣的需求
  2. 在某個方法上添加了@ModelAttribute註解後,這個方法就是前置方法。在調用該Handler的任何一個方法時,都會先調用這個前置方法。

應用實例

  1. 修改VoteHandler.java,增加方法,並測試。

    @RequestMapping(value = "/vote09")
    public String test09() {
        System.out.println("test09被調用...");
        return "vote_ok";
    }
    
    @RequestMapping(value = "/vote10")
    public String test10() {
        System.out.println("test10被調用...");
        return "vote_ok";
    }
    
    /**
     * 1.當 Handler的一個方法被 @ModelAttribute 修飾時,這個方法就是前置方法
     * 2.該 Handler中的其他方法被調用時,都會先調用這個前置方法
     * 3.類似spring的aop的前置通知
     * 4.前置方法會切入到其他方法前執行[底層還是aop機制]
     */
    @ModelAttribute
    public void prepareModel() {
        System.out.println("prepareModel()---完成準備工作");
    }
    
  2. 分別在瀏覽器中方法test09,test10方法

    image-20230206205955916
  3. 後臺輸出:可以看到每次目標方法被訪問前,都會調用前置方法prepareModel()

    image-20230206210025190

3.2@ModelAttribute的最佳實踐

  • 修改用戶信息(就是這種機制的經典應用),流程如下:
    1. 在修改前,在前置方法中從資料庫查出這個用戶的數據
    2. 在修改方法(目標方法)中,可以使用前置方法的(從資料庫查出的)用戶數據
    3. 如果表單中對用戶的某個屬性修改了,則以新的數據為準。如果沒有修改或不能修改,就以前置方法查出的用戶數據為準,就保持原來的值。

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

-Advertisement-
Play Games
更多相關文章
  • 使用語法結構創建的對象 function fn(){ var name="RoastDuck"; } 使用構造器創建的對象 function Duck() { this.name = []; this.age = []; } var RoastDuck = new Duck(); 使用 Object ...
  • When it comes to inheritance, JavaScript only has one construct: objects. Each object has a private property which holds a link to another object call ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 什麼是 Lunchbox.js Lunchbox.js 是 Three.js 的 Vue 3 自定義渲染器。 你可以把它想象成 Vue 的 react-three-fiber。 該庫通過組件提供對原始 Three.js 對象和類的訪問,例 ...
  • Web 伺服器是一種用於存儲,處理和傳輸Web內容的軟體。它是一種特殊類型的伺服器,具有處理 HTTP 請求並向瀏覽器返回 Web 頁面和其他內容的能力。Web伺服器支持多種編程語言,如 PHP,JavaScript,Ruby,Python 等,並且支持動態生成 Web 頁面。常見的 Web 伺服器 ...
  • 在做selenium web自動化的時候,有時通過selenium定位不到,或無法操作元素,這個時候就需要通過js來 定位/操作元素,然後通過selenium自帶的execute_script()方法去執行js語句。下麵介紹幾種js的定位方法。 一.ID id的值都是唯一的,所以當存在id欄位時可優 ...
  • Delete ␍eslint(prettier/prettier)錯誤 今天在用HBuilder開發uniapp項目時,想換成vscode進行開發,但是用vscode打開之前的項目,eslint報錯一片紅 解決方案: 方案一:一個一個文件的選擇,具體操作如下,手動把CRLF換成LF。缺點:文件太多, ...
  • 本文主要介紹在Node.js應用中, 如何用全鏈路信息存儲技術把全鏈路追蹤數據存儲起來,併進行相應的展示,最終實現基於業界通用 OpenTracing 標準的 Zipkin 的 Node.js 方案。 ...
  • 這篇文章主要描述分散式互斥方法,包括什麼是分散式互斥,分散式互斥地三種方法:集中式方法、分散式方法和令牌環方法。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...