Bootstrap

第23周Java主流框架入门-SpringMVC 1.SpringMVC入门与数据绑定

Spring MVC 课程笔记

课程介绍

本课程将深入学习 Spring MVC,这是 Spring 生态系统中重要的 Web 应用框架。课程分为四个阶段:

  1. Spring MVC 入门:学习如何使用 Spring MVC 开发 Web 应用程序。
  2. 数据绑定技术:掌握如何从请求中获取数据,并将数据返回给客户端。
  3. RESTful 开发风格:学习 RESTful 开发的注意事项及其适用场景。
  4. 拦截器使用:了解如何使用拦截器对请求进行预处理。

学习内容

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 开发:
  1. REST 的具体要求:了解 RESTful 的核心概念和设计原则。
  2. 在 Spring MVC 中实现 REST:学习如何在 Spring MVC 中编写符合 REST 风格的代码。
  3. JSON 对象的序列化:掌握 Spring MVC 中如何将数据序列化为 JSON 格式,并返回给客户端。
  4. 跨域问题:分析跨域问题的来源以及解决办法,学习如何在 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 中接收请求参数的两种方法

  1. 直接使用 Controller 方法的参数接收
  2. 通过 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 请求
  1. 修改表单 HTML 代码:
    <form action="/um/p" method="post">
        <input name="username" />
        <input name="password" />
        <br />
        <input type="submit" value="提交" />
    </form>
    
  2. 在 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. 测试运行

  1. 访问 http://localhost,输入用户名和密码,点击提交。
  2. 控制台将会打印出 Java Bean 中接收的数据。
  3. 示例输出:
    Username: admin, Password: 123456
    

5. 注意事项

  1. 属性名需保持一致:Java Bean 的属性名必须与请求参数的 name 属性一致,否则无法自动注入。
  2. 自动类型转换:如果参数类型不匹配(如前端传递的是非数字,但后台设置的是 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 设置默认值

  • 如果希望在参数缺失时为其赋一个默认值,可以通过 @RequestParamdefaultValue 属性来实现。
  • 示例:
    @RequestParam(value = "subject", defaultValue = "Java") String subject
    

4. 相对路径与绝对路径的区别

表单的 action 属性设置为 ./apply,这是相对路径的写法。那么,相对路径和绝对路径的区别是什么呢?

4.1 URI 相对路径
  • 相对路径是 基于当前页面所在的目录 进行资源定位。
  • 示例:./applyapply 表示当前页面同级的 apply 资源。
  • 优点:不依赖于应用的上下文路径设置,便于在不同的上下文路径下正常工作。
4.2 URI 绝对路径
  • 绝对路径是 从根目录 开始指定的路径,需要包含应用的上下文路径。
  • 示例:/myapp/apply 表示从应用 myapp 的根目录下的 apply 资源。
  • 使用绝对路径时,一旦改变上下文路径(例如更改应用名称),所有路径都需要修改。
示例解释
  1. 表单的 action="./apply" 表示当前表单将提交到相对路径 apply
  2. 如果浏览器访问的是 http://localhost:8080/myapp/form.html,那么表单的提交路径将会是 http://localhost:8080/myapp/apply
  3. 相对路径的好处在于 无论上下文路径如何设置,表单总能正确提交到对应的处理方法。
正确与错误的使用
  • 正确./apply(相对路径),在不同的上下文路径下都能正常工作。
  • 错误:直接使用 /apply(绝对路径),会导致上下文路径变化时无法找到资源。

解决Spring MVC中文乱码问题

课程概述

在Spring MVC中,默认情况下对中文支持不好,容易出现乱码问题。本节将讲解如何在各种情况下解决中文乱码问题。

中文乱码的由来

  • 中文乱码的根源来自于字符集。
  • 计算机识别自然语言依赖于字符集,字符集类似计算机的字典。
  • 早期Tomcat版本默认使用 ISO-8859-1 字符集,该字符集仅支持英文、拉丁文、数字和标准符号,对中文不支持,导致中文乱码。

解决思路

  • 将原有的 ISO-8859-1 转换为 UTF-8 编码。
  • UTF-8Unicode 的八位交换格式,能够支持世界上各种语言,包括中文。

解决步骤

要解决Spring MVC中中文乱码的问题,需要按照以下三个步骤进行配置:

1. 解决 GET 请求的乱码问题

  • 修改 Tomcatserver.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. 解决响应输出的乱码问题

  • 配置 SpringHttpMessageConverter
    • 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 中,有两种主要的响应输出方式:

  1. 直接返回响应文本:使用 @ResponseBody 注解,将方法的返回值直接作为响应输出。
  2. 页面视图渲染:使用 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 进行整合,主要分为以下三步:

  1. 引入 FreeMarker 和 Spring 上下文支持的依赖。
  2. 配置 Spring MVC 使用 FreeMarker 作为模板引擎。
  3. 配置 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. 配置完成后测试

  1. 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;
        }
    }
    
  2. /WEB-INF/ftl/ 目录下创建 test.ftl 文件,编写模板:
    <h1>${u.username}</h1>
    
  3. 启动应用并在浏览器中访问 http://localhost/fm/test,页面将显示 Andy

6. 发布时确保依赖正确

  • 在引入新依赖后,需确保 Tomcat 中的 Deployment 配置包含这些依赖,否则运行时可能会找不到类。
  • 在配置面板中检查并手动添加新的依赖。

7. 总结

  • 引入依赖:包括 FreeMarker 和 Spring 上下文支持。
  • 配置 Spring MVC:通过 viewResolver 启用 FreeMarker。
  • 配置 FreeMarker:设置模板路径和编码格式。
  • FreeMarker 语法:与之前在 Servlet 环境中使用一致,只是整合方式不同。

;