SpringMVC 響應(yīng)數(shù)據(jù)和結(jié)果視圖從環(huán)境搭建到實戰(zhàn)全解析
在 SpringMVC 框架中,響應(yīng)數(shù)據(jù)與結(jié)果視圖是連接后端業(yè)務(wù)邏輯與前端展示的核心環(huán)節(jié)。無論是頁面跳轉(zhuǎn)、數(shù)據(jù)傳遞,還是異步 JSON 交互,都需要通過合理的響應(yīng)方式實現(xiàn)。本文將從開發(fā)環(huán)境搭建入手,詳細講解 Controller 方法返回值分類、轉(zhuǎn)發(fā)與重定向機制,以及 JSON 異步交互的實現(xiàn),附帶完整代碼示例與避坑指南,幫助開發(fā)者系統(tǒng)掌握 SpringMVC 響應(yīng)邏輯。
一、開發(fā)環(huán)境搭建(基礎(chǔ)準備)
在實現(xiàn)響應(yīng)功能前,需先完成 SpringMVC 基礎(chǔ)環(huán)境配置,包括 Maven 依賴、Web 組件配置和核心配置文件,確??蚣苣苷_\行。
1. Maven 坐標配置(pom.xml)
核心依賴包括 SpringMVC 核心包、Servlet/JSP 支持包,以及后續(xù) JSON 轉(zhuǎn)換所需的 Jackson 依賴。為避免版本沖突,統(tǒng)一鎖定 Spring 版本為 5.0.2.RELEASE。
<properties>
<!-- 統(tǒng)一 Spring 版本 -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!-- 1. Spring 核心依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 2. Servlet/JSP 依賴(scope=provided:服務(wù)器已內(nèi)置,僅編譯時用) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 3. JSON 轉(zhuǎn)換依賴(后續(xù)異步交互用) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>2. Web.xml 配置(核心組件)
Web.xml 需配置兩個關(guān)鍵組件:中文亂碼過濾器(解決請求 / 響應(yīng)亂碼)和前端控制器 DispatcherServlet(SpringMVC 入口)。
(1)中文亂碼過濾器
攔截所有請求,統(tǒng)一設(shè)置編碼為 UTF-8,避免中文在傳遞過程中出現(xiàn)亂碼。
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 設(shè)置請求編碼 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 可選:同時設(shè)置響應(yīng)編碼(部分場景需額外配置) -->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 攔截所有請求 -->
</filter-mapping>(2)前端控制器 DispatcherServlet
作為 SpringMVC 的核心入口,負責(zé)接收所有請求并轉(zhuǎn)發(fā)到對應(yīng)的 Controller。需配置 SpringMVC 配置文件路徑,并設(shè)置服務(wù)器啟動時初始化(load-on-startup=1)。
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加載 SpringMVC 核心配置文件(classpath 表示類路徑下) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 服務(wù)器啟動時初始化(優(yōu)先級 1,數(shù)值越小優(yōu)先級越高) -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 攔截所有 .do 結(jié)尾的請求(避免攔截靜態(tài)資源如 CSS/JS) -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>3. SpringMVC 核心配置(springmvc.xml)
SpringMVC 配置文件需完成注解掃描、視圖解析器、注解驅(qū)動和靜態(tài)資源放行四項核心配置,確保 Controller 能被掃描、頁面能正確跳轉(zhuǎn)、靜態(tài)資源不被攔截。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1. 注解掃描:僅掃描 Controller 所在包(避免掃描 Service/Dao 層) -->
<context:component-scan base-package="com.springmvc.controller" />
<!-- 2. 視圖解析器:拼接物理視圖路徑(邏輯視圖名 → 實際頁面路徑) -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/" /> <!-- 頁面所在目錄(WebRoot 下) -->
<property name="suffix" value=".jsp" /> <!-- 頁面后綴 -->
<!-- 示例:邏輯視圖名 "suc" → 拼接后:/pages/suc.jsp -->
</bean>
<!-- 3. 啟用 SpringMVC 注解驅(qū)動:讓 @RequestMapping、@RequestBody 等注解生效 -->
<mvc:annotation-driven/>
<!-- 4. 靜態(tài)資源放行:避免 CSS/JS/圖片被 DispatcherServlet 攔截 -->
<mvc:resources location="/css/" mapping="/css/**"/> <!-- 匹配 /css/ 下所有資源 -->
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
</beans>二、Controller 方法返回值分類(核心)
SpringMVC 中,Controller 方法的返回值決定了響應(yīng)方式,主要分為 String 類型、void 類型和 ModelAndView 類型,不同返回值適用于不同場景。
1. 返回 String 類型(最常用)
核心作用:
返回邏輯視圖名,通過視圖解析器(InternalResourceViewResolver)拼接為物理視圖路徑(prefix + 邏輯視圖名 + suffix),適用于簡單的頁面跳轉(zhuǎn)場景。
代碼示例:
package com.springmvcy.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user") // 類級別的請求路徑(統(tǒng)一前綴)
public class UserController {
// 方法級別的請求路徑:完整請求路徑為 /user/save1.do
@RequestMapping("/save1.do")
public String save1() {
System.out.println("執(zhí)行用戶保存業(yè)務(wù)(save1)");
// 返回邏輯視圖名 "suc" → 視圖解析器拼接為:/pages/suc.jsp
return "suc";
}
}關(guān)鍵注意點:
- 若返回值以
forward:或redirect:開頭(如return "forward:/pages/suc.jsp"),則不經(jīng)過視圖解析器,直接按指定路徑跳轉(zhuǎn)(詳見下文 “轉(zhuǎn)發(fā)與重定向”)。 - 邏輯視圖名需與實際頁面目錄匹配(如
return "user/list"對應(yīng)/pages/user/list.jsp)。
2. 返回 void 類型
默認行為:
若方法返回 void,SpringMVC 會默認查找 “當前請求路徑.jsp”(如請求 /user/save2.do,默認查找 /user/save2.jsp),而該頁面通常不存在,會導(dǎo)致 404 錯誤。因此,返回 void 時需手動通過 HttpServletRequest 或 HttpServletResponse 處理響應(yīng)。
常用場景與代碼示例:
@RequestMapping("/save2.do")
public void save2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("執(zhí)行用戶保存業(yè)務(wù)(save2)");
// 場景1:請求轉(zhuǎn)發(fā)(服務(wù)器內(nèi)部跳轉(zhuǎn),地址欄不變,可共享 request 數(shù)據(jù))
request.getRequestDispatcher("/pages/suc.jsp").forward(request, response);
// 場景2:直接響應(yīng)文本(無需跳轉(zhuǎn)頁面,如接口返回簡單提示)
// response.setContentType("text/html;charset=UTF-8"); // 解決響應(yīng)中文亂碼
// response.getWriter().print("用戶保存成功!");
// 場景3:重定向(客戶端跳轉(zhuǎn),地址欄改變,不可共享 request 數(shù)據(jù))
// response.sendRedirect(request.getContextPath() + "/pages/suc.jsp");
}關(guān)鍵注意點:
- 手動處理響應(yīng)時,需注意中文亂碼:通過
response.setContentType("text/html;charset=UTF-8")設(shè)置響應(yīng)編碼。 - 重定向時需拼接項目上下文路徑(
request.getContextPath()),避免路徑錯誤(如response.sendRedirect(request.getContextPath() + "/pages/suc.jsp"))。
3. 返回 ModelAndView 類型
核心作用:
ModelAndView 是 SpringMVC 提供的 “數(shù)據(jù) + 視圖” 封裝類,可同時存儲頁面所需數(shù)據(jù)(Model)和視圖路徑(View),適用于 “業(yè)務(wù)處理后需傳遞數(shù)據(jù)到頁面” 的場景(如列表查詢后傳遞數(shù)據(jù)到頁面展示)。
代碼示例:
@RequestMapping("/save3.do")
public ModelAndView save3() {
System.out.println("執(zhí)行用戶保存業(yè)務(wù)(save3)");
// 1. 創(chuàng)建 ModelAndView 對象
ModelAndView mv = new ModelAndView();
// 2. 存入頁面所需數(shù)據(jù)(相當于 request.setAttribute("msg", "用戶名已存在"))
// 頁面可通過 EL 表達式 ${msg} 獲取該數(shù)據(jù)
mv.addObject("msg", "保存失?。河脩裘汛嬖冢埜鼡Q用戶名");
// 可存入多個數(shù)據(jù):mv.addObject("user", new User("張三", 20));
// 3. 設(shè)置邏輯視圖名(視圖解析器拼接為 /pages/error.jsp)
mv.setViewName("error");
// 返回 ModelAndView 對象,SpringMVC 自動處理數(shù)據(jù)傳遞與頁面跳轉(zhuǎn)
return mv;
}關(guān)鍵注意點:
mv.addObject()存入的數(shù)據(jù)默認存儲在 request 域中,生命周期與 request 一致(僅當前請求有效)。- 若需長期存儲數(shù)據(jù)(如用戶登錄信息),需手動將數(shù)據(jù)存入 session 域(
request.getSession().setAttribute("user", user))。
三、SpringMVC 轉(zhuǎn)發(fā)與重定向(返回 String 實現(xiàn))
在實際開發(fā)中,頁面跳轉(zhuǎn)常需區(qū)分 “轉(zhuǎn)發(fā)” 和 “重定向”,SpringMVC 支持通過返回 String 類型實現(xiàn)這兩種跳轉(zhuǎn)方式,無需手動操作 HttpServletRequest/HttpServletResponse。
1. 請求轉(zhuǎn)發(fā)(forward:)
核心特點:
- 服務(wù)器內(nèi)部跳轉(zhuǎn),地址欄 URL 不變。
- 可共享 request 域中的數(shù)據(jù)(如轉(zhuǎn)發(fā)前存入的
request.setAttribute("data", xxx)可在目標頁面獲?。?。 - 跳轉(zhuǎn)路徑可為相對路徑或絕對路徑,不經(jīng)過視圖解析器。
代碼示例:
@RequestMapping("/save4.do")
public String save4() {
System.out.println("執(zhí)行用戶保存業(yè)務(wù)(save4)");
// 方式1:轉(zhuǎn)發(fā)到具體頁面(絕對路徑)
// return "forward:/pages/suc.jsp";
// 方式2:轉(zhuǎn)發(fā)到其他 Controller 方法(完整請求路徑)
return "forward:/user/findAll.do";
}2. 重定向(redirect:)
核心特點:
- 客戶端跳轉(zhuǎn)(服務(wù)器返回 302 狀態(tài)碼,瀏覽器重新發(fā)起請求),地址欄 URL 改變。
- 不可共享 request 域數(shù)據(jù)(因是新請求,原 request 已銷毀)。
- 跳轉(zhuǎn)路徑需寫絕對路徑(通常需拼接項目上下文路徑),不經(jīng)過視圖解析器。
- 無法直接訪問 WEB-INF 目錄下的資源(Tomcat 等服務(wù)器禁止客戶端直接訪問 WEB-INF)。
代碼示例:
@RequestMapping("/save5.do")
public String save5() {
System.out.println("執(zhí)行用戶保存業(yè)務(wù)(save5)");
// 方式1:重定向到具體頁面(需拼接項目上下文路徑,避免路徑錯誤)
// return "redirect:" + request.getContextPath() + "/pages/suc.jsp";
// 方式2:重定向到其他 Controller 方法(完整請求路徑)
return "redirect:/user/findAll.do";
}轉(zhuǎn)發(fā)與重定向?qū)Ρ缺恚?/h4>
| 對比維度 | 請求轉(zhuǎn)發(fā)(forward) | 重定向(redirect) |
|---|---|---|
| 跳轉(zhuǎn)方式 | 服務(wù)器內(nèi)部跳轉(zhuǎn) | 客戶端跳轉(zhuǎn)(瀏覽器重新請求) |
| 地址欄 URL | 不變 | 改變 |
| request 數(shù)據(jù)共享 | 可共享 | 不可共享 |
| 路徑處理 | 可相對路徑,不經(jīng)過視圖解析器 | 需絕對路徑,不經(jīng)過視圖解析器 |
| 訪問 WEB-INF | 可訪問(服務(wù)器內(nèi)部跳轉(zhuǎn)) | 不可訪問(客戶端禁止訪問 WEB-INF) |
四、響應(yīng) JSON 數(shù)據(jù)(異步交互核心)
在前后端分離項目中(如 Vue/React 前端 + SpringMVC 后端),后端通常需返回 JSON 格式數(shù)據(jù)而非頁面。SpringMVC 通過 @RequestBody(接收前端 JSON)和 @ResponseBody(返回 JSON)注解,結(jié)合 Jackson 依賴實現(xiàn) JSON 交互。
1. 核心依賴與注解說明
(1)依賴前提:
需確保已導(dǎo)入 Jackson 相關(guān)依賴(見本文 “Maven 坐標配置” 部分),Jackson 負責(zé)將 Java 對象轉(zhuǎn)為 JSON 字符串,或反之。
(2)關(guān)鍵注解:
| 注解 | 作用 | 適用位置 |
|---|---|---|
| @RequestBody | 將前端傳入的 JSON 字符串轉(zhuǎn)為 Java 對象 | Controller 方法參數(shù)前 |
| @ResponseBody | 將 Java 對象轉(zhuǎn)為 JSON 字符串響應(yīng)前端 | Controller 方法前或類前 |
2. 實體類準備(User.java)
JSON 轉(zhuǎn)換依賴實體類的 getter 方法(Jackson 通過 getter 讀取屬性值),需確保實體類實現(xiàn) Serializable 接口(序列化規(guī)范),并提供完整的 getter/setter 方法。
package com.springmvc.entity;
import java.io.Serializable;
// 實體類:對應(yīng)前端傳遞的 JSON 數(shù)據(jù)結(jié)構(gòu)
public class User implements Serializable {
private String username; // 用戶名
private Integer age; // 年齡
// 無參構(gòu)造(JSON 反序列化需)
public User() {}
// 有參構(gòu)造(可選)
public User(String username, Integer age) {
this.username = username;
this.age = age;
}
// 必須提供 getter/setter 方法(Jackson 依賴 getter 序列化)
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
@Override
public String toString() {
return "User{" + "username='" + username + "', age=" + age + "}";
}
}3. 前端 AJAX 代碼(JSP 頁面)
前端通過 AJAX 發(fā)送 JSON 數(shù)據(jù),并指定 contentType: "application/json;charset=UTF-8",告訴后端 “當前傳遞的是 JSON 格式數(shù)據(jù)”。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC JSON 交互</title>
<!-- 引入 jQuery(需確保 js 目錄已配置靜態(tài)資源放行) -->
<script src="/js/jquery.min.js" type="text/javascript"></script>
<script>
$(function() {
$("#btnSubmit").click(function() {
// 1. 構(gòu)造 JSON 數(shù)據(jù)(與后端 User 實體類屬性對應(yīng))
let userData = JSON.stringify({
"username": "張三",
"age": 25
});
// 2. 發(fā)送 AJAX 請求
$.ajax({
type: "post", // 請求方式(JSON 傳遞需用 post)
url: "/user/save6.do", // 請求路徑
contentType: "application/json;charset=UTF-8", // 關(guān)鍵:聲明請求數(shù)據(jù)格式為 JSON
data: userData, // 傳遞的 JSON 數(shù)據(jù)
dataType: "json", // 期望后端返回 JSON 格式數(shù)據(jù)
success: function(res) { // 響應(yīng)成功回調(diào)(res 為后端返回的 JSON 對象)
alert("用戶名:" + res.username + ",年齡:" + res.age);
},
error: function() { // 響應(yīng)失敗回調(diào)
alert("請求失敗,請重試!");
}
});
});
});
</script>
</head>
<body>
<button id="btnSubmit">提交用戶數(shù)據(jù)(AJAX)</button>
</body>
</html>4. 后端 Controller 代碼
通過 @RequestBody 接收前端 JSON 并轉(zhuǎn)為 User 對象,處理業(yè)務(wù)后,通過 @ResponseBody 將處理后的 User 對象轉(zhuǎn)為 JSON 響應(yīng)前端。
@RequestMapping("/save6.do")
// @ResponseBody:將返回的 User 對象轉(zhuǎn)為 JSON 響應(yīng)前端
@ResponseBody
public User save6(@RequestBody User user) { // @RequestBody:將前端 JSON 轉(zhuǎn)為 User 對象
System.out.println("接收前端傳遞的用戶數(shù)據(jù):" + user); // 打?。篣ser{username='張三', age=25}
// 模擬業(yè)務(wù)處理:如修改用戶名和年齡
user.setUsername("張三_已處理");
user.setAge(user.getAge() + 1);
// 直接返回 User 對象,@ResponseBody 自動轉(zhuǎn)為 JSON
return user;
}5. 關(guān)鍵避坑點:
- 前端必須指定
contentType: "application/json;charset=UTF-8":否則后端無法識別 JSON 格式,@RequestBody會解析失敗。 - 實體類必須有 無參構(gòu)造:Jackson 反序列化(JSON → Java 對象)時需調(diào)用無參構(gòu)造創(chuàng)建對象。
- 靜態(tài)資源放行:確保 jQuery 等靜態(tài)資源已通過
mvc:resources配置放行,避免 404 錯誤。 - 中文亂碼:若響應(yīng) JSON 包含中文亂碼,可在 SpringMVC 配置文件中配置消息轉(zhuǎn)換器(如下):
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>五、核心總結(jié)與最佳實踐
1. 響應(yīng)方式選型建議
| 業(yè)務(wù)場景 | 推薦返回值類型 | 關(guān)鍵技術(shù)點 |
|---|---|---|
| 簡單頁面跳轉(zhuǎn)(無數(shù)據(jù)傳遞) | String | 邏輯視圖名 + 視圖解析器 |
| 頁面跳轉(zhuǎn)需傳遞數(shù)據(jù) | ModelAndView | mv.addObject() 存數(shù)據(jù) |
| 手動處理響應(yīng)(如直接輸出文本) | void | HttpServletRequest/HttpServletResponse |
| 頁面跳轉(zhuǎn)(轉(zhuǎn)發(fā) / 重定向) | String(帶 forward:/redirect:) | 不經(jīng)過視圖解析器,絕對路徑跳轉(zhuǎn) |
| 前后端分離異步交互 | Java 對象(配合 @ResponseBody) | @RequestBody 接收 JSON,Jackson 轉(zhuǎn)換 |
2. 核心配置與避坑清單
- 環(huán)境配置:確保
DispatcherServlet加載 SpringMVC 配置文件,mvc:annotation-driven已啟用。 - 靜態(tài)資源:通過
mvc:resources放行 CSS/JS/ 圖片,避免被 DispatcherServlet 攔截。 - 中文亂碼:請求亂碼用
CharacterEncodingFilter,響應(yīng)亂碼用response.setContentType()。 - JSON 交互:導(dǎo)入 Jackson 依賴,確保實體類有 getter / 無參構(gòu)造,前端指定
contentType: application/json。
通過本文的講解,相信開發(fā)者已能掌握 SpringMVC 響應(yīng)數(shù)據(jù)與結(jié)果視圖的核心用法。在實際開發(fā)中,需根據(jù)業(yè)務(wù)場景選擇合適的響應(yīng)方式,同時注意配置規(guī)范與細節(jié),避免常見錯誤,提升開發(fā)效率與系統(tǒng)穩(wěn)定性。
到此這篇關(guān)于SpringMVC 響應(yīng)數(shù)據(jù)和結(jié)果視圖從環(huán)境搭建到實戰(zhàn)全解析的文章就介紹到這了,更多相關(guān)SpringMVC 響應(yīng)數(shù)據(jù)和結(jié)果視圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Json字符串直接轉(zhuǎn)換為對象的方法(包括多層List集合)
下面小編就為大家?guī)硪黄狫ava中Json字符串直接轉(zhuǎn)換為對象的方法(包括多層List集合)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
關(guān)于如何正確地定義Java內(nèi)部類方法詳解
在Java中,我們通常是把不同的類創(chuàng)建在不同的包里面,對于同一個包里的類來說,它們都是同一層次的,但其實還有另一種情況,有些類可以被定義在另一個類的內(nèi)部,本文將詳細帶你了解如何正確地定義Java內(nèi)部類,需要的朋友可以參考下2023-05-05
springboot中自定義異常以及定制異常界面實現(xiàn)過程解析
這篇文章主要介紹了springboot中自定義異常以及定制異常界面實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解
這篇文章主要介紹了Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
MyBatis深入解讀動態(tài)SQL的實現(xiàn)
動態(tài) SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態(tài) SQL,可以徹底擺脫這種痛苦2022-04-04

