在Java Web開發中,客户端與服務器之間的數據交互是核心環節,涉及數據格式轉換、請求參數傳遞、文件上傳以及用户狀態保持等關鍵技術。本文將系統梳理JSON與Java對象的轉換、URL參數獲取、文件上傳、Cookie與Session機制等核心內容,結合實際代碼示例與場景類比,幫助開發者掌握Java Web數據交互的實現方法。

Json是客户端和服務器進行交互的一種數據格式。

它使用一個字符串來表示對象或者數組等元素。
數組用[]表示,對象使用{}表示,屬性和值之間使用:來進行分割,鍵值對之間使用,來分割。

下面我們來講一下Java的對象和Json之間如何進行轉換:

ObjectMapper objectMapper = new ObjectMapper();的作用

ObjectMapper是 Jackson 庫(Java 中處理 Json 的常用庫)的核心類,作用是實現 Java 對象和 Json 字符串之間的相互轉換

  1. Java 對象轉 Json:通過writeValueAsString(對象)方法,把 JavaBean(如UserInfo)序列化為 Json 格式的字符串;
  2. Json 轉 Java 對象:通過readValue(Json字符串, 目標類.class)方法,把 Json 字符串反序列化為對應的 Java 對象;

Java對象轉Json

@Test
    void testObject2Json() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        //創建Java對象
        UserInfo userInfo = new UserInfo();
        userInfo.setName("張三");
        userInfo.setGender(1);
        userInfo.setAge(18);

        //Java對象轉json
        String s=objectMapper.writeValueAsString(userInfo);
        System.out.println(s);
    }

Json轉Java對象

@Test
    void testJson2Object() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        //定義一個json字符串
        String s = "{\"age\":18,\"gender\":1,\"name\":\"張三\"}\n";
        //json轉對象
        UserInfo userInfo=objectMapper.readValue(s,UserInfo.class);
        System.out.println(userInfo);
    }

在請求中傳遞Json對象

@RequestMapping("r11")
//    @RequestBody表示傳遞的是一個json格式的字符串
    public String r11(@RequestBody UserInfo userInfo){
        userInfo.getName();
        return userInfo.toString();
    }

我們再Postman中應該這樣構造請求:

JavaWeb核心篇(6)——Ajax-_字符串

從URL中獲取數值

//從url中獲取參數
    @RequestMapping("/article/{articleId}")
    public String r12(@PathVariable Integer articleId){
        return "獲取文章id: "+articleId;
    }

    //也可以同時獲取多個參數,並重命名
    @RequestMapping("/article/{type}/{articleId}") //後面寫的{}參數在發送請求的時候必須要傳。
    public String r13(@PathVariable Integer articleId,@PathVariable("type") Integer articleType){
        return "獲取文章ID:"+articleId +",type: "+articleType;
    }

JavaWeb核心篇(6)——Ajax-_字符串_02


這裏需要注意的當我們寫了兩個數值的位置,就要在URL中傳輸兩個參數。

以“r13”這個方法為例,我們必須要同時傳入type和articleId這兩個參數。

同時我們也可以對傳入的參數進行重命名:比如在這個方法裏我們就把type重命名為articleType.

上傳文件

//上傳文件
    @RequestMapping("/r13")
    //下面這個@RequestPart ("file11")MultipartFile file 表示把請求時輸入的file11賦值給new出來的file對象(相當於是重命名)
    public String r13(@RequestPart ("file11")MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("D:\\temp\\" +file.getOriginalFilename()));
        return "文件上傳成功";
    }

在Postman中應該像下面這樣發送請求:

JavaWeb核心篇(6)——Ajax-_Java_03


JavaWeb核心篇(6)——Ajax-_#json_04


最終我們在這個路徑之下也找到了剛剛要上傳的文件。

Cookie和Session

我們以去醫院看病為例,去醫院我們首先需要在該家醫院建檔,所新建的這個檔中就包含了我們每個人的基本信息(姓名,身份證號等等)。
建檔完成之後,醫院會給我們一張診療卡(這張卡片上通常會有一個ID)。
之後我們就會拿着這張診療卡去掛號,看病,取藥。

這個診療卡的作用十分關鍵,醫生就是通過這個診療卡上的ID去醫院的服務器上查詢資料,而醫院的服務器中就存儲了病人的詳細信息。

在上述過程中,這個診療卡就相當於是Cookie,而病人的詳細信息就相當於是session.

所以通過上述這個場景我們便不難發現:
診療卡(Cookie)存儲在用户自己手裏(對應 Cookie是存儲在客户端上的),而檔案(Session)只存在醫院服務器(對應 Session是存儲在服務器上的)。
診療卡(Cookie)只有ID(輕量標識),並不包含完整的個人信息(大量數據),完整信息都在服務器(Session)裏。

無狀態協議

HTTP協議本身是"無狀態"的協議。
"無狀態"意味着:
在默認情況下,HTTP協議的客户端與服務器之間的每次通信都是獨立的,前後請求之間沒有直接關聯。

但在實際開發中,我們經常需要保持請求之間的關聯關係。
例如,用户登錄網站後,再次訪問時服務器需要識別該用户是否已登錄。
這個功能就是通過Cookie和Session機制實現的。

JavaWeb核心篇(6)——Ajax-_#json_05


上圖中的“令牌”通常就存儲在Cookie字段當中。

服務器這邊就需要存儲“令牌”的信息,以及令牌所相對應的用户的信息。這個就是Session需要處理的工作。

由於服務器同⼀時刻收到的請求是很多的.
所以服務器就需要清楚區分每個請求是屬於哪個⽤户, 於是就需要在服務器這邊記錄每個請求以及與⽤户的信息的對應關係.

Session是服務器為了保存⽤户信息⽽創建的⼀個特殊的對象。

JavaWeb核心篇(6)——Ajax-_#json_06

SessionID

Session本質上是一個哈希表結構,用於存儲鍵值對數據。其中Key對應SessionID,Value則保存用户相關信息。以診療卡為例,其中的ID就相當於SessionID的作用。

Session 默認是保存在內存中的. 如果重啓服務器則 Session 數據就會丟失.

Cookie 和 Session 的區別

  1. Cookie 是客户端保存⽤户信息的⼀種機制,Session 是服務器端保存⽤户信息的⼀種機制。
  2. Cookie 和 Session之間主要是通過 SessionId 關聯起來的, SessionId 是 Cookie 和 Session 之間的橋樑。
  3. Cookie 和 Session 經常會在⼀起配合使⽤,但是不是必須配合。
  4. Session 中的sessionId 也不需要⾮得通過 Cookie/Set-Cookie 傳遞, 也可以通過URL傳遞。

JavaWeb核心篇(6)——Ajax-_#json_07

結語

本文介紹了JSON與Java對象的轉換、請求參數傳遞、文件上傳,以及Cookie與Session的狀態保持機制,結合代碼示例與場景類比。在實際開發中,需根據業務場景選擇合適的參數傳遞方式與狀態保持方案,同時注意Session的持久化與Cookie的安全性,確保應用的高效與可靠。