SpringMvc笔记(持续更新)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: SpringMvc笔记(持续更新)

SpringMvc专题

1.视图解析器

文章目录


前言

SpringMvc笔记(持续更新)

正文

首先,我们得先了解一下 SpringMVC 中的视图。视图的作用是渲染模型数据,将模型里的数据以

某种形式呈

现给客户。

为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定

义了

一个高度抽象的 View 接口。

我们的视图是无状态的,所以他们不会有线程安全的问题。无状态是指对于每一个请求,都会创建

一个 View

对象。

在 SpringMVC 中常用的视图类型:

在Spring MVC中,常用的视图类型包括:

JSP视图:使用JSP(JavaServer Pages)作为模板引擎,生成动态的HTML页面。可以通过在JSP中使用HTML和JSP标签来生成表格。

示例:

@RequestMapping("/table")
public ModelAndView generateTable() {
    List<User> userList = userService.getAllUsers();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("users", userList);
    modelAndView.setViewName("userTable"); // JSP文件名
    return modelAndView;
}

在JSP文件(如userTable.jsp)中,可以使用JSTL(Java Standard Tag Library)和EL(Expression Language)来生成表格:

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Email</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach items="${users}" var="user">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.email}</td>
            </tr>
        </c:forEach>
    </tbody>
</table>

Thymeleaf视图:使用Thymeleaf作为模板引擎,生成动态的HTML页面。Thymeleaf具有类似于JSP的语法,可以方便地进行数据绑定和页面渲染。

示例:

@RequestMapping("/table")
public String generateTable(Model model) {
    List<User> userList = userService.getAllUsers();
    model.addAttribute("users", userList);
    return "userTable"; // Thymeleaf模板文件名
}

在Thymeleaf模板文件(如userTable.html)中,可以使用Thymeleaf的标签和表达式来生成表格:

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Email</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="user : ${users}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.name}"></td>
            <td th:text="${user.email}"></td>
        </tr>
    </tbody>
</table>

这些视图类型可以根据具体需求选择适合的方式来生成表格,并通过控制器将数据传递给视图进行展示。

接下来就是了解视图解析器的作用。View Resolver 负责将处理结果生成 View 视图,View

Resolver 首

先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行

渲染将处理结果

通过页面展示给用户。视图对象是由视图解析器负责实例化。

视图解析器的作用是将逻辑视图转为物理视图,所有的视图解析器都必须实现 ViewResolver 接

口。

SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多

种解析策略,

并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。程序员可以选择

一种视图解析器

或混用多种视图解析器。可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高,

SpringMVC 会按

视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则抛出

ServletException

异常。

解析器类型 说明
XML解析器 用于解析XML格式的数据,包括DOM、SAX和StAX三种方式。DOM方式将整个XML文档加载到内存中,适合处理较小的XML文件;SAX方式以事件驱动的方式逐行解析XML文档,适合处理大型XML文件;StAX方式提供了一种流式处理XML文档的方式,既可以读取XML文档,也可以生成XML文档。
JSON解析器 用于解析JSON格式的数据,包括Jackson和Gson两种方式。Jackson是一个高性能的JSON解析库,支持JSON和Java对象之间的转换,可以方便地将JSON数据转换为Java对象;Gson也是一个常用的JSON解析库,可以将JSON数据转换为Java对象或Map结构。
Properties解析器 用于解析.properties格式的配置文件,可以通过Properties类读取配置文件中的键值对,并将其转换为Java中的Properties对象。
Yaml解析器 用于解析YAML格式的数据,可以通过SnakeYAML库实现。YAML是一种简洁、易读的数据格式,与JSON类似,但比JSON更易读并且支持注释。

不需要视图解析器的场景分析

在分析之前,我们先需要回顾下控制器方法的返回值,此处我们都是以注解@Controller 配置控制

器为例,

控制器的方法返回值其实支持三种方式:

第一种:String 类型。借助视图解析器,可以在指定位置为我们找到指定扩展名的视图。视图可以

是 JSP,

HTML 或者其他的控制器方法上的 RequestMapping 映射地址。前往指定视图的方式,默认是请

求转发,可以通过

redirect:前缀控制其使用重定向。

第二种:void,即没有返回值。因为我们在控制器方法的参数中可以直接使用原始 SerlvetAPI 对

HttpServletRequest 和 HttpServletResponse 对象,所以无论是转发还是重定向都可以轻松实

现,而无需

使用返回值。

第三种:ModelAndView 类型。其实我们跟踪源码可以发现在 DispatcherServlet 中的

doDispatch 方

法执行时,HandlerAdapter 的 handle 方法的返回值就是 ModelAndView,只有我们的控制器

方法定义为 void

时,才不会返回此类型。当返回值是 String 的时候也会创建 ModelAndView 并返回。

通过上面三种控制器方法返回值,我们可以再深入的剖析一下我们请求之后接收响应的方式,其实

无外乎就三

种。

第一种:请求转发

第二种:重定向

第三种:直接使用 Response 对象获取流对象输入。可以是字节流也可以是字符流。

接下来我们就分析,这三种方式的本质区别。

其中请求转发和重定向的区别相信大家已经很熟悉了。但是它们的共同点呢?就是都会引发页面的

跳转。

在我们的实际开发中,如果我们不需要页面跳转,即基于 ajax 的异步请求,用 json 数据交互

时,即可不配

置任何视图解析器。前后端交互是通过 json 数据的,利用@RequestBody 和@ResponseBody

实现数据到 java

对象的绑定(当然还要借助类似 Jackson 开源框架)。

请求参数封装的实现原理

在使用 SpringMVC 实现请求参数封装时,它支持基本类型,POJO 类型和集合类型。其封装原理

其实就是使用

我们原始的 ServletAPI 中的方法,并且配合反射实现的封装。

此处我们以最简单的 String 和 Integer 两个方法为例,带着大家把整个执行过程走一圈。

先来看控制器的方法:

1 @Controller
2
3 public class HelloControler {
4
5 @RequestMapping("hello")
6 public String sayHello(String name,Integer age) {
7
8 System.out.println("控制器方法执行了"+name+","+age);
9 return "success";
10 }
11 }

常用注解的使用场景及实现思路分析:

RequestParam

首先我们要明确,我们的请求参数体现形式是什么样的。

在请求体的 MIME 类型为 application/x-www-form-urlencoded 或者 application/json 的情

况下,

无论 get/post/put/delete 请求方式,参数的体现形式都是 key=value。

再来,通过上一小节我们知道,SpringMVC 是使用我们控制器方法的形参作为参数名称,再使用

request 的

getParameterValues 方法获取的参数。所以才会有请求参数的 key 必须和方法形参变量名称保

持一致的要求。

但是如果形参变量名称和请求参数的 key 不一致呢?此时,参数将无法封装成功。

此时 RequestParam 注解就会起到作用,它会把该注解 value 属性的值作为请求参数的 key 来

获取请求参数

的值,并传递给控制器方法。

1 @Controller
2 public class ParamController1 {
3
4 /**
5 * 处理请求的控制器方法
6 * @return
7 */
8 @RequestMapping("hello")
9 public String sayHello(@RequestParam("username")String name,Integer age) {
10
11 System.out.println("控制器方法执行了"+name+","+age);
12 return "success";
13 }

RequestBody

我们通过源码分析得知,SpringMVC 在封装请求参数的时候,默认只会获取参数的值,而不

会把参数名称一同获取出来,这在我们使用表单提交的时候没有任何问题。因为我们的表单提交,

请求参数是

key=value 的。但是当我们使用 ajax 进行提交时,请求参数可能是 json 格式的:{key:value},

在此种情况

下,要想实现封装以我们前面的内容是无法实现的。此时需要我们使用@RequestBody 注解。

JSP 代码片段:

1 <script src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
2 <script type="text/javascript">
3
4 $(function(){
5
6 $("#ajaxBtn").click(function(){
7
8 $.ajax({
9
10 type:"POST",
11
12 url:"${pageContext.request.contextPath}/hello2",
13
14 dataType:"text",
15
16 data:"{'name':'test','age':18}",
17
18 contentType:"application/json",
19
20 success:function(data){
21
22 alert(data);
23
24 }
25
26 });
27
28
29 });
30
31 })
32
33 </script>
34 <title>SpringMVC</title>
35
36 </head>
37 <body>
38 <button id="ajaxBtn">异步请求</button>
39
40 </body>
41
42 </html>
43

控制器代码片段:

1 @Controller
2 public class ParamController {
3
4 /**
5 * 处理请求的控制器方法
6 * @return
7 */
8
9 @RequestMapping("hello2")
10 public String sayHello2(@RequestBody String body) {
11 System.out.println("控制器方法执行了 2"+body);
12 return "success";
13 }
14 }

明天我们说PathVariable!!!

相关文章
|
3月前
|
SQL 关系型数据库 MySQL
javaweb中实现分页,持续更新……
javaweb中实现分页,持续更新……
|
1月前
|
Java 数据格式 微服务
2024最新首发,全网最全 Spring Boot 学习宝典(附思维导图)
📚 《滚雪球学Spring Boot》是由CSDN博主bug菌创作的全面Spring Boot教程。作者是全栈开发专家,在多个技术社区如CSDN、掘金、InfoQ、51CTO等担任博客专家,并拥有超过20万的全网粉丝。该教程分为入门篇和进阶篇,每篇包含详细的教学步骤,涵盖Spring Boot的基础和高级主题。
111 4
2024最新首发,全网最全 Spring Boot 学习宝典(附思维导图)
|
2月前
|
Java
杨校老师课堂之SpringBoot整合Thymeleaf-登录拦截器
杨校老师课堂之SpringBoot整合Thymeleaf-登录拦截器
17 0
|
存储 移动开发 JSON
前端面试题汇总大全 -- 持续更新!(一)
前端面试题汇总大全 -- 持续更新!
406 0
|
XML Java 应用服务中间件
springboot快速入门【小白也能看懂】
springboot快速入门【小白也能看懂】
115 0
|
3月前
|
存储 设计模式 前端开发
SpringMvc笔记(持续更新)
SpringMvc笔记(持续更新)
SpringMvc笔记(持续更新)
|
XML 存储 设计模式
史上最全SpringMVC面试题(一)
史上最全SpringMVC面试题(一)
|
JSON 前端开发 JavaScript
史上最全SpringMVC面试题(二)
史上最全SpringMVC面试题(二)
|
存储 缓存 JavaScript
前端面试题汇总大全 -- 持续更新!(二)
前端面试题汇总大全 -- 持续更新!
72 0
|
移动开发 编解码 前端开发
前端面试题汇总大全 -- 持续更新!(三)
前端面试题汇总大全 -- 持续更新!
72 0