SpringMVC 03: 請求和響應的亂碼解決 + SpringMVC響應Ajax請求

請求或響應的中文亂碼問題

  • tomcat9解決了get請求和響應的中文亂碼問題,但是沒有解決post請求或響應的中文亂碼問題

  • tomcat10解決了get和post請求以及響應的中文亂碼問題

  • 考慮到實際項目中伺服器的更新速度(短時間不會都採用tomcat10)為了項目的通用性和可靠性,最好為請求和響應添加應對中文亂碼的方案

  • 通過在web.xml中配置編碼過濾器,對符合通配請求條件的請求可以進行自定義的編碼設置

  • 編碼過濾器一般在web.xml文件中進行其他配置之前配置,儘早解決可能出現的中文亂碼問題

  • web.xml中新增對編碼過濾器的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="//xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 配置編碼過濾器 -->
    <filter>
        <filter-name>encode</filter-name>
        <!-- 底層使用的過濾器 -->
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--
            (ctrl + alt + 點擊上述CharacterEncodingFilter,查看源程式碼,可以看到需要以下參數)
            private String encoding;
            private boolean forceRequestEncoding;
            private boolean forceResponseEncoding
        -->
        <!-- 向底層過濾器的參數賦值,進行編碼的自定義配置 -->
        <init-param>
            <param-name>encoding</param-name>
            <!-- 建議大寫,小寫有時解析不出來-->
            <param-value>UTF-8</param-value>
        </init-param>
        
        <init-param>
            <!-- 對請求的編碼解析採用encoding變數中的編碼方式-->
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        
        <init-param>
            <!-- 對響應的編碼解析採用encoding變數中的編碼方式-->
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>encode</filter-name>
        <!-- 指定對哪些請求進行過濾並進行編碼配置處理-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
</web-app>

控制器中action方法的返回值

  • 控制器中的方法名稱不一定含有action單詞,但是一般習慣於把控制器中的方法稱為action方法

  • 返回String:設置了視圖解析器之後,可以自動拼接前綴和後綴,來作為客戶端請求的資源地址,完成響應頁面的跳轉。還可以拼接字元串,返回指定的路徑

  • 返回Object:使用jackson工具(要添加jackson的依賴)進行轉換,自動將對象或者集合轉為json格式的數據並返回

  • 返回void:無返回值,一般用於ajax請求

  • 返回基本數據類型:用於ajax請求

  • ModelAndView:返回數據和視圖對象(現在用的較少)

響應ajax請求

  • 與前面SpringMVC部落格集中的SpringMVC(指SpringMVC 02)項目相比,新增的配置如下
  • 在pom.xml中添加jackson依賴,為了可以利用SpringMVC自動返回json格式的數據
    <!-- 添加jackson的依賴-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.3</version>
    </dependency>
  • 在webapp/js目錄下添加jQuery函數庫,為了前端可以使用jQuery封裝的ajax()方法,便捷的發送ajax請求
  • webapp/index.jsp如下,是發送ajax請求並回顯後端返回數據的前端介面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index.jsp</title>
    <script src="js/jquery-3.6.1.js"></script>
</head>
<body>
    
<a href="javascript:showUser()">發送ajax請求,獲取用戶資訊列表</a><br>

<div id="userDiv">div,用來顯示伺服器返回的數據</div>

<script type="text/javascript">
    function showUser() {
        //使用jQuery封裝的ajax()發送ajax請求
        $.ajax({
            url:"${pageContext.request.contextPath}/list.action",
            type:"get",
            dataType:"json",
            success:function (userList){
                var data = ""
                $.each(userList, function (i, user){
                    data += user.name + " ---- " + user.age + "<br>"
                })
                //將拼接好的數據回顯在div中
                $("#userDiv").html(data)
              }
            }
        )
    }
</script>
</body>
</html>
  • 新增控制器AjaxRequestAction,action方法上添加註解@ResponseBody,該註解專門用來解析ajax請求
package com.example.controller;

import com.example.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

@Controller
public class AjaxRequestAction {
    
    //只有當請求路徑和ajax請求類型都對上時,目標方法才會被調用
    @RequestMapping("/list")
    @ResponseBody
    public List<User> ajaxRequest(){//User類含有屬性:name(String), age(int),無參和全參構造方法,全屬性的getter,setter,toString方法
        List<User> users = new ArrayList<>();
        User u1 = new User("荷包蛋", 20);
        User u2 = new User("餃子", 21);
        User u3 = new User("橘子", 22);
        users.add(u1);
        users.add(u2);
        users.add(u3);
        return users;//SpringMVC框架會自動將對象數組轉化為json數據格式返回給前端ajax請求
    }
}
  • 在springmvc.xml文件需要新增註解驅動< mvc:annotationdriven /> ,為了用他來解析@ResponseBody註解,響應ajax請求
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="//www.springframework.org/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xmlns:context="//www.springframework.org/schema/context"
       xmlns:mvc="//www.springframework.org/schema/mvc"
       xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd //www.springframework.org/schema/mvc //www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 添加包掃描-->
    <context:component-scan base-package="com.example.controller"/>

    <!-- 這裡暫時不需要配置視圖解析器,因為這裡響應ajax請求,直接將請求到的數據以json格式返回給前端-->

    <!-- 對專門響應ajax請求的註解進行註解的驅動註冊-->
    <mvc:annotation-driven/>
</beans>
  • 部署並啟動tomcat測試
  • 網站首頁(left),發送ajax請求後的首頁(right)如下:從後端獲取到的數據經前端ajax拼接處理並填充在div中顯示

image

Tags: