Spring MVC 课程笔记
课程介绍
本课程将深入学习 Spring MVC,这是 Spring 生态系统中重要的 Web 应用框架。课程分为四个阶段:
- Spring MVC 入门:学习如何使用 Spring MVC 开发 Web 应用程序。
- 数据绑定技术:掌握如何从请求中获取数据,并将数据返回给客户端。
- RESTful 开发风格:学习 RESTful 开发的注意事项及其适用场景。
- 拦截器使用:了解如何使用拦截器对请求进行预处理。
学习内容
1. Spring MVC 入门
Spring MVC 框架介绍
-
MVC 架构模式:
- Model(模型):代表业务逻辑和数据,与 Java 代码中的业务部分对应。
- View(视图):界面部分,用于与用户交互,如显示查询结果、接收表单输入。
- Controller(控制器):中介,接收视图传入的数据,调用业务逻辑,并将结果返回视图。
-
为什么使用 Spring MVC:
- 传统的 Servlet 使用较为复杂,Spring MVC 提供了更简便的方式,简化 Web 应用程序的开发。
- 作为一个轻量级 Web MVC 框架,Spring MVC 替代了传统的 J2EE Servlet,简化了开发过程。
- 基于 Spring IoC 容器,所有的 Controller 和 Service 对象都由 Spring 统一管理,提高程序的健壮性和稳定性。
Spring MVC 版本变迁
- 当前课程使用 Spring 5,提出了新要求:
- 最低支持 JDK 8 和 J2EE 7。
- Servlet 版本最低为 3.1。
- Tomcat 版本需要在 8.5 以上。
- Spring 5 新特性:支持响应式编程,基于事件的编程风格,适合构建对事件做出响应的应用程序。了解其概念有助于更深入理解 Spring 5。
Spring MVC 官网文档
- 官网地址:Spring.io
- 主要项目:Spring Framework, Spring Boot, Spring Cloud 等。
- 文档入口:在官网的
Projects
下找到Spring Framework
,点击Spring MVC
即可查看相关文档。最新版本为 5.1.9.RELEASE。
2. 参数接收和数据绑定
- 数据绑定:如何从客户端请求中获取数据并将数据返回到客户端。
- 学习如何在 Spring MVC 中使用数据绑定实现参数接收和返回。
3. URL Mapping
- 了解 URL Mapping 的概念,与传统 J2EE 的 Servlet 类似。
- 学习如何在 Spring MVC 中将控制器(Controller)与特定 URL 进行绑定。
4. 中文乱码问题
- 分析请求和响应中可能出现的中文乱码问题。
- 了解在 Spring MVC 中如何解决中文乱码问题。
5. 拦截器的使用
- 拦截器:类似于 J2EE 中的过滤器,但更加高级。
- 作用:对客户端请求进行统一的预处理,从而实现 Spring MVC 中的一些高级功能。
- Controller:在 Spring MVC 中是最核心的部分,处理请求并产生响应,确保 View 和 Model 之间的解耦。
6. RESTful 开发风格
RESTful 是一种程序编码的风格,通过 HTTP 协议对外暴露接口,并根据请求返回对应的数据。
我们将从以下四个方面学习 RESTful 开发:
- REST 的具体要求:了解 RESTful 的核心概念和设计原则。
- 在 Spring MVC 中实现 REST:学习如何在 Spring MVC 中编写符合 REST 风格的代码。
- JSON 对象的序列化:掌握 Spring MVC 中如何将数据序列化为 JSON 格式,并返回给客户端。
- 跨域问题:分析跨域问题的来源以及解决办法,学习如何在 RESTful 开发中处理跨域请求。
RESTful 的重要性
- RESTful 开发风格已经成为 Java 应用开发中的主流,特别是在互联网项目中,几乎随处可见。
- 学习 RESTful 开发是本课程的重点,请大家认真掌握。
总结
- Spring MVC 的优势:通过控制器将 View 和 Model 解耦,提高程序的可维护性。
- Spring 5 新特性:尽管响应式编程没有在本课程中详细讲解,但理解其背景和应用场景有助于更深入了解 Spring 生态系统。
- 继续学习:课程将以最新版本的 Spring MVC 为基础,深入讲解各个功能模块。
2. URL Mapping 和数据绑定
课程介绍
在前面的课程中,我们学习了 Spring MVC 的基本入门和环境配置。在实际工作中,Spring MVC 还有许多细节需要掌握。本节主要讲解 Spring MVC 中的 URL Mapping 和数据绑定技术。
学习内容
2.1. 什么是 URL Mapping?
- URL Mapping 是将 URL 与 Controller 中的方法进行绑定,使 Spring MVC 能够通过 URL 触发后端代码。
- 在 Web 应用中,每个对外暴露的接口都通过一个 URL 地址来访问。
###2. 2. 常见的 URL Mapping 注解
@RequestMapping
:通用的 URL 绑定注解,可以用于 GET、POST 及其他 HTTP 请求类型。@GetMapping
:用于绑定 GET 请求的简写注解。@PostMapping
:用于绑定 POST 请求的简写注解。
Spring MVC 课程笔记:请求参数接收
学习内容
1. Spring MVC 中接收请求参数的两种方法
- 直接使用 Controller 方法的参数接收。
- 通过 Java Bean 方式进行接收。
这两者都是 Spring MVC 中最常用的接收数据的方式。
2. 使用 Controller 方法参数接收请求参数
示例:接收 POST 请求的参数
假设我们有一个表单,包含两个输入项:
<form action="/um/p" method="post">
<input name="username" />
<input name="password" />
<input type="submit" value="提交" />
</form>
在 Controller 中,可以直接通过方法参数接收这些数据:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FormController {
@PostMapping("/um/p")
public String handlePostRequest(String username, String password) {
System.out.println("Username: " + username + ", Password: " + password);
return "This is POST method";
}
}
注意:方法中的参数名必须与表单中 name
属性的值一致,这样 Spring MVC 就会自动将请求中的数据注入到方法参数中。
类型转换
Spring MVC 还支持自动的类型转换。例如,假设 password
只能是数字,可以直接将方法参数声明为 long
类型:
public String handlePostRequest(String username, long password) {
// ...
}
如果表单中的 password
输入非数字,将会抛出 NumberFormatException
并产生 400 错误。
3. GET 请求中的参数接收
GET 请求中的参数通常通过 URL 中的查询字符串来传递,例如:
http://localhost/um/g?manager_name=Lily
在 Controller 方法中,可以直接使用方法参数接收:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@RestController
public class FormController {
@GetMapping("/um/g")
public String handleGetRequest(@RequestParam("manager_name") String managerName) {
System.out.println("Manager Name: " + managerName);
return "This is GET method";
}
}
使用 @RequestParam
注解
@RequestParam
注解可以处理参数名与方法参数名不一致的情况。- 即使 URL 参数为
manager_name
,方法参数可以任意命名,例如managerName
,通过@RequestParam("manager_name")
进行映射。
4. 示例代码讲解
修改 HTML 表单并接收 POST 请求
- 修改表单 HTML 代码:
<form action="/um/p" method="post"> <input name="username" /> <input name="password" /> <br /> <input type="submit" value="提交" /> </form>
- 在 Controller 中接收并打印参数:
@PostMapping("/um/p") public String handlePostRequest(String username, long password) { System.out.println("Username: " + username + ", Password: " + password); return "This is POST method"; }
Spring MVC 课程笔记:使用 Java Bean 接收请求参数
课程介绍
在上一节课中,我们学习了使用 Controller 方法参数来接收请求数据。本节将介绍另一种接收数据的方式:使用 Java Bean。这种方法能够简化参数接收,特别是在需要处理大量参数时更为便捷。
学习内容
1. Java Bean 与参数接收的区别
在前面的示例中,我们通过方法参数接收请求数据:
public String handlePostRequest(String username, String password) {
// 处理逻辑
}
这种方式虽然简洁,但如果有 100 个输入项时,手动列举所有参数既不直观也不便于维护。为了解决这个问题,Spring MVC 提供了一种更高效的做法:使用 Java Bean,直接将请求参数注入到对象中。
2. 使用 Java Bean 接收请求参数的示例
2.1 创建 Java Bean
首先创建一个 Java Bean 类来表示要接收的数据:
public class User {
private String username;
private long password;
// Getters and Setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public long getPassword() {
return password;
}
public void setPassword(long password) {
this.password = password;
}
}
2.2 修改 Controller 方法
在 Controller 中使用 Java Bean 作为方法参数,Spring MVC 会自动将请求参数注入到对应的 Java Bean 属性中:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/um/p1")
public String handlePostRequest(User user) {
System.out.println("Username: " + user.getUsername() + ", Password: " + user.getPassword());
return "This is POST method with Java Bean";
}
}
说明:
- 通过直接使用
User
对象作为方法参数,Spring MVC 会自动创建User
对象并将请求参数注入对应的属性。
2.3 修改 HTML 表单
<form action="/um/p1" method="post">
<input name="username" />
<input name="password" />
<br />
<input type="submit" value="提交" />
</form>
3. 使用 Java Bean 的优势
- 简化代码:无需逐个列举方法参数,直接将请求数据注入到 Java Bean 对象中。
- 便于维护:减少了重复的
set
操作,尤其是在需要处理大量参数时更加高效。 - 自动类型转换:Spring MVC 会根据 Java Bean 的属性类型自动进行数据类型转换。
4. 测试运行
- 访问
http://localhost
,输入用户名和密码,点击提交。 - 控制台将会打印出 Java Bean 中接收的数据。
- 示例输出:
Username: admin, Password: 123456
5. 注意事项
- 属性名需保持一致:Java Bean 的属性名必须与请求参数的
name
属性一致,否则无法自动注入。 - 自动类型转换:如果参数类型不匹配(如前端传递的是非数字,但后台设置的是
long
类型),会抛出NumberFormatException
。
6. Java Bean 与方法参数的优缺点对比
方式 | 优点 | 缺点 |
---|---|---|
方法参数 | 适合处理少量参数,简单明了 | 参数过多时维护困难 |
Java Bean | 适合处理大量参数,自动注入,易于维护 | 需要创建额外的 Java Bean 类,增加开发量 |
Spring MVC 课程笔记:综合训练与路径设置
课程介绍
在前面的课程中,我们学习了如何在 Spring MVC 环境下接收单个参数以及如何利用实体类来接收参数。本节将通过一个学员调查问卷的表单,进行综合训练,学习如何在 Spring MVC 中处理复合数据的接收,并了解相对路径与绝对路径的使用。
学习内容
1. 综合案例:学员调查问卷表单
- 我们将模拟一个包含多个输入项的表单,演示如何在 Spring MVC 中处理复合数据。
- 表单示例包含以下内容:
- 姓名输入框(
name
) - 技术方向的下拉选择框(
subject
) - 多个学习目的的复选框(
purpose
)
- 姓名输入框(
2. Spring MVC 中处理复合数据的方式
- 可以使用 数组 或 List 来接收复合数据,例如复选框中的多个选项。
- 使用
@RequestParam
注解可以为参数设置默认值,防止参数缺失时出现null
。
示例代码
假设我们的表单如下:
<form action="./apply" method="post">
姓名: <input name="name" /><br/>
技术方向:
<select name="subject">
<option value="Java">Java</option>
<option value="Python">Python</option>
<option value="JavaScript">JavaScript</option>
</select><br/>
学习目的:
<input type="checkbox" name="purpose" value="1"/> 提升技能
<input type="checkbox" name="purpose" value="2"/> 转行
<input type="checkbox" name="purpose" value="3"/> 找到高薪工作
<input type="checkbox" name="purpose" value="4"/> 兴趣爱好
<br/>
<input type="submit" value="提交"/>
</form>
在 Spring MVC 控制器中,可以使用如下代码处理表单的提交:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FormController {
@PostMapping("/apply")
public String handleFormSubmission(
@RequestParam("name") String name,
@RequestParam("subject") String subject,
@RequestParam(value = "purpose", required = false) String[] purposes) {
// 处理提交的数据
System.out.println("Name: " + name);
System.out.println("Subject: " + subject);
if (purposes != null) {
for (String purpose : purposes) {
System.out.println("Purpose: " + purpose);
}
}
return "Form submitted successfully!";
}
}
说明:
- 数组接收:使用
String[] purposes
来接收复合数据。 - 默认值设置:可以通过
@RequestParam(value = "purpose", required = false)
来防止缺少参数时抛出异常。
3. 使用 @RequestParam
设置默认值
- 如果希望在参数缺失时为其赋一个默认值,可以通过
@RequestParam
的defaultValue
属性来实现。 - 示例:
@RequestParam(value = "subject", defaultValue = "Java") String subject
4. 相对路径与绝对路径的区别
表单的 action
属性设置为 ./apply
,这是相对路径的写法。那么,相对路径和绝对路径的区别是什么呢?
4.1 URI 相对路径
- 相对路径是 基于当前页面所在的目录 进行资源定位。
- 示例:
./apply
或apply
表示当前页面同级的apply
资源。 - 优点:不依赖于应用的上下文路径设置,便于在不同的上下文路径下正常工作。
4.2 URI 绝对路径
- 绝对路径是 从根目录 开始指定的路径,需要包含应用的上下文路径。
- 示例:
/myapp/apply
表示从应用myapp
的根目录下的apply
资源。 - 使用绝对路径时,一旦改变上下文路径(例如更改应用名称),所有路径都需要修改。
示例解释
- 表单的
action="./apply"
表示当前表单将提交到相对路径apply
。 - 如果浏览器访问的是
http://localhost:8080/myapp/form.html
,那么表单的提交路径将会是http://localhost:8080/myapp/apply
。 - 相对路径的好处在于 无论上下文路径如何设置,表单总能正确提交到对应的处理方法。
正确与错误的使用
- 正确:
./apply
(相对路径),在不同的上下文路径下都能正常工作。 - 错误:直接使用
/apply
(绝对路径),会导致上下文路径变化时无法找到资源。
解决Spring MVC中文乱码问题
课程概述
在Spring MVC中,默认情况下对中文支持不好,容易出现乱码问题。本节将讲解如何在各种情况下解决中文乱码问题。
中文乱码的由来
- 中文乱码的根源来自于字符集。
- 计算机识别自然语言依赖于字符集,字符集类似计算机的字典。
- 早期Tomcat版本默认使用
ISO-8859-1
字符集,该字符集仅支持英文、拉丁文、数字和标准符号,对中文不支持,导致中文乱码。
解决思路
- 将原有的
ISO-8859-1
转换为UTF-8
编码。 UTF-8
是Unicode
的八位交换格式,能够支持世界上各种语言,包括中文。
解决步骤
要解决Spring MVC中中文乱码的问题,需要按照以下三个步骤进行配置:
1. 解决 GET 请求的乱码问题
- 修改
Tomcat
的server.xml
文件:- 打开
server.xml
文件,找到<Connector port="8080">
标签。 - 添加
URIEncoding="UTF-8"
属性:<Connector port="8080" URIEncoding="UTF-8" />
- 注意:Tomcat 8.0 之后的版本默认使用
UTF-8
,无需额外设置。8.0 之前的版本需要手动添加该属性。
- 打开
2. 解决 POST 请求的乱码问题
- 配置
web.xml
中的CharacterEncodingFilter
:- 在
web.xml
中增加字符编码过滤器,指定UTF-8
。
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 过滤器将
ISO-8859-1
编码转换为UTF-8
,确保 POST 请求中文不乱码。
- 在
3. 解决响应输出的乱码问题
- 配置
Spring
的HttpMessageConverter
:- 在
Spring
配置文件中添加消息转换器,指定UTF-8
编码:
<bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> <value>text/html;charset=UTF-8</value> </list> </property> </bean>
- 这样可以保证 HTTP 响应输出中文时不会出现乱码。
- 在
课程笔记:Spring MVC 响应输出
1. 响应输出的两种方式
在 Spring MVC 中,有两种主要的响应输出方式:
- 直接返回响应文本:使用
@ResponseBody
注解,将方法的返回值直接作为响应输出。 - 页面视图渲染:使用
ModelAndView
对象结合模板引擎(如 JSP、FreeMarker 等)生成页面视图。
1.1 @ResponseBody
注解
- 作用:直接生成响应体的数据,不涉及任何视图。
- 应用场景:通常用于返回简单的字符串、JSON 或 XML 结构化数据。
- 示例代码:
@GetMapping("/example") @ResponseBody public String example() { return "Hello, World!"; }
- 配置影响:
StringHttpMessageConverter
可以影响响应字符串的输出格式,例如编码设置。
1.2 ModelAndView
对象
- 作用:将数据和视图绑定在一起,通过模板引擎动态渲染页面。
- 应用场景:当需要在页面上展示动态生成的数据时使用。
- 示例代码:
@GetMapping("/showView") public ModelAndView showView() { ModelAndView mav = new ModelAndView("/view.jsp"); mav.addObject("message", "Welcome to the view!"); return mav; }
2. @ResponseBody
注解的详细使用
- 直接产生响应文本,不涉及视图操作。
- 返回的内容可以是字符串、JSON、XML,格式受
StringHttpMessageConverter
配置影响。
2.1 JSON 数据输出
- 在实际项目中,常使用
@ResponseBody
返回 JSON 数据,提供给客户端使用。
3. 使用 ModelAndView
渲染视图
3.1 ModelAndView
的基本用法
- 绑定模型数据和视图,并返回页面。
- 示例代码:
@GetMapping("/showView") public ModelAndView showView() { ModelAndView mav = new ModelAndView("/view.jsp"); return mav; }
- 创建 JSP 文件
/view.jsp
,并在其中编写 HTML 内容进行显示。
3.2 动态数据绑定
- 通过
ModelAndView.addObject()
方法将数据对象绑定到视图。 - 示例:
@GetMapping("/userView") public ModelAndView userView(@RequestParam int userId) { User user; if (userId == 1) { user = new User("Lily"); } else if (userId == 2) { user = new User("Smith"); } ModelAndView mav = new ModelAndView("/userView.jsp"); mav.addObject("user", user); return mav; }
- 在 JSP 中使用 EL 表达式动态显示数据:
<h2>User Name: ${user.userName}</h2>
3.3 ModelAndView
的作用
- 将数据生成过程与页面展示过程进行解耦。
- 使前端和后端可以独立开发,前端不需要了解数据生成的细节,只需要约定好数据名称和格式。
4. MVC 模式中的解耦设计
- 通过
ModelAndView
对象,前端工程师和后端工程师可以各司其职:- 前端负责页面布局和样式。
- 后端负责数据处理和业务逻辑。
- 设计优势:符合 MVC 模式的解耦理念,提高开发效率和代码可维护性。
5. 小结
@ResponseBody
适用于简单的数据响应,直接输出文本、JSON、XML 等内容。ModelAndView
适用于复杂的页面展示,将数据与视图绑定,通过模板引擎生成动态页面。- MVC 模式通过
ModelAndView
实现了视图和数据的解耦,提高了开发效率。
课程笔记:Spring MVC 中的 ModelAndView 使用
1. ModelAndView 对象
ModelAndView
是 Spring MVC 中用于绑定数据和页面的核心对象,主要用于页面跳转和数据传递。
1.1 addObject
方法
- 作用:将数据对象绑定到当前请求中,以便在页面中显示。
- 数据可以是任意有效的 Java 对象。
- 默认情况下,数据存放在请求中,这意味着数据在请求转发时有效。
1.2 页面跳转的请求转发和重定向
- 请求转发:默认情况下,
ModelAndView
通过请求转发将页面和数据绑定在一起,控制器和视图共享同一个请求对象。 - 页面重定向:通过在视图名称前加
redirect:
实现重定向,例如:ModelAndView mav = new ModelAndView("redirect:/home");
- 请求转发与页面重定向的区别:
- 请求转发:共享同一个请求对象,不改变地址栏 URL。
- 页面重定向:创建新的请求,地址栏 URL 会改变。
2. 绝对路径与相对路径
- 绝对路径:以
/
开头,表示从应用的根路径开始。例如:mav.setViewName("/views/home.jsp");
- 相对路径:不以
/
开头,相对于当前请求的路径。例如:mav.setViewName("home.jsp");
- 开发建议:使用绝对路径可以减少因目录变化而带来的维护问题。
3. 使用 ModelAndView
设置视图名称
- 可以在创建
ModelAndView
对象时设置视图名称:ModelAndView mav = new ModelAndView("/view.jsp");
- 或者通过
setViewName
方法动态设置:mav.setViewName("/view.jsp");
4. 结合 ModelMap
与字符串返回值
- 可以使用
ModelMap
对象结合方法返回字符串实现与ModelAndView
类似的功能。 - 示例代码:
@GetMapping("/showView") public String showView(@RequestParam int userId, ModelMap model) { User user = new User("Lily"); model.addAttribute("user", user); return "/view.jsp"; }
ModelMap
:用于将数据添加到模型中,供视图使用。- 返回字符串:表示视图的名称。
4.1 @ResponseBody
注解的影响
- 如果方法返回
String
并且使用了@ResponseBody
注解,则直接将字符串作为响应体。 - 如果没有
@ResponseBody
,则String
作为视图名称,并结合ModelMap
数据渲染页面。
4.2 不使用 ModelMap
的情况
- 在某些情况下,可以仅返回视图名称而不传递数据,此时可以省略
ModelMap
参数。
5. 总结
- ModelAndView:用于绑定数据和页面,实现请求转发或重定向。
- 请求转发与重定向:了解两者的区别及使用场景。
- 绝对路径与相对路径:推荐使用绝对路径减少维护问题。
- 结合字符串和
ModelMap
:可以实现与ModelAndView
类似的功能。 @ResponseBody
的影响:根据是否使用该注解,方法返回的String
意义不同。
6. 其他注意事项
- 在实际开发中,需注意
String
返回值的使用语境(是否使用@ResponseBody
注解)。 - 尽量减少路径依赖,使用绝对路径会更加稳定。
课程笔记:Spring MVC 中的 ModelAndView 使用
1. ModelAndView 对象
ModelAndView
是 Spring MVC 中用于绑定数据和页面的核心对象,主要用于页面跳转和数据传递。
1.1 addObject
方法
- 作用:将数据对象绑定到当前请求中,以便在页面中显示。
- 数据可以是任意有效的 Java 对象。
- 默认情况下,数据存放在请求中,这意味着数据在请求转发时有效。
1.2 页面跳转的请求转发和重定向
- 请求转发:默认情况下,
ModelAndView
通过请求转发将页面和数据绑定在一起,控制器和视图共享同一个请求对象。 - 页面重定向:通过在视图名称前加
redirect:
实现重定向,例如:ModelAndView mav = new ModelAndView("redirect:/home");
- 请求转发与页面重定向的区别:
- 请求转发:共享同一个请求对象,不改变地址栏 URL。
- 页面重定向:创建新的请求,地址栏 URL 会改变。
2. 绝对路径与相对路径
- 绝对路径:以
/
开头,表示从应用的根路径开始。例如:mav.setViewName("/views/home.jsp");
- 相对路径:不以
/
开头,相对于当前请求的路径。例如:mav.setViewName("home.jsp");
- 开发建议:使用绝对路径可以减少因目录变化而带来的维护问题。
3. 使用 ModelAndView
设置视图名称
- 可以在创建
ModelAndView
对象时设置视图名称:ModelAndView mav = new ModelAndView("/view.jsp");
- 或者通过
setViewName
方法动态设置:mav.setViewName("/view.jsp");
4. 结合 ModelMap
与字符串返回值
- 可以使用
ModelMap
对象结合方法返回字符串实现与ModelAndView
类似的功能。 - 示例代码:
@GetMapping("/showView") public String showView(@RequestParam int userId, ModelMap model) { User user = new User("Lily"); model.addAttribute("user", user); return "/view.jsp"; }
ModelMap
:用于将数据添加到模型中,供视图使用。- 返回字符串:表示视图的名称。
4.1 @ResponseBody
注解的影响
- 如果方法返回
String
并且使用了@ResponseBody
注解,则直接将字符串作为响应体。 - 如果没有
@ResponseBody
,则String
作为视图名称,并结合ModelMap
数据渲染页面。
4.2 不使用 ModelMap
的情况
- 在某些情况下,可以仅返回视图名称而不传递数据,此时可以省略
ModelMap
参数。
5. 总结
- ModelAndView:用于绑定数据和页面,实现请求转发或重定向。
- 请求转发与重定向:了解两者的区别及使用场景。
- 绝对路径与相对路径:推荐使用绝对路径减少维护问题。
- 结合字符串和
ModelMap
:可以实现与ModelAndView
类似的功能。 @ResponseBody
的影响:根据是否使用该注解,方法返回的String
意义不同。
6. 其他注意事项
- 在实际开发中,需注意
String
返回值的使用语境(是否使用@ResponseBody
注解)。 - 尽量减少路径依赖,使用绝对路径会更加稳定。
课程笔记:Spring MVC 与 FreeMarker 整合
1. 整合步骤概述
Spring MVC 默认使用 JSP 作为模板引擎,但也支持 FreeMarker。本节课讲解如何将 FreeMarker 与 Spring MVC 进行整合,主要分为以下三步:
- 引入 FreeMarker 和 Spring 上下文支持的依赖。
- 配置 Spring MVC 使用 FreeMarker 作为模板引擎。
- 配置 FreeMarker 本身的参数。
2. 第一步:引入依赖
在 pom.xml
中添加以下依赖:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
这两个依赖分别提供 FreeMarker 及其与 Spring MVC 的整合支持。
3. 第二步:配置 Spring MVC 使用 FreeMarker
在 applicationContext.xml
中添加以下配置:
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="suffix" value=".ftl" />
</bean>
contentType
:指定渲染输出时使用的 MIME 类型和字符集。suffix
:定义所有 FreeMarker 模板文件的扩展名为.ftl
。
4. 第三步:配置 FreeMarker 参数
配置 FreeMarker 自身的设置:
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<property name="freemarkerSettings">
<props>
<prop key="default_encoding">UTF-8</prop>
</props>
</property>
</bean>
templateLoaderPath
:模板文件的存放路径,建议放在/WEB-INF/ftl/
中,保证安全性。default_encoding
:设置模板与数据渲染时使用的字符集。
5. 配置完成后测试
- 在
controller
包中创建FreeMarkerController
类,并添加以下代码:@Controller @RequestMapping("/fm") public class FreeMarkerController { @GetMapping("/test") public ModelAndView showTest() { ModelAndView mav = new ModelAndView("/test"); User user = new User("Andy"); mav.addObject("u", user); return mav; } }
- 在
/WEB-INF/ftl/
目录下创建test.ftl
文件,编写模板:<h1>${u.username}</h1>
- 启动应用并在浏览器中访问
http://localhost/fm/test
,页面将显示Andy
。
6. 发布时确保依赖正确
- 在引入新依赖后,需确保 Tomcat 中的
Deployment
配置包含这些依赖,否则运行时可能会找不到类。 - 在配置面板中检查并手动添加新的依赖。
7. 总结
- 引入依赖:包括 FreeMarker 和 Spring 上下文支持。
- 配置 Spring MVC:通过
viewResolver
启用 FreeMarker。 - 配置 FreeMarker:设置模板路径和编码格式。
- FreeMarker 语法:与之前在 Servlet 环境中使用一致,只是整合方式不同。