SpringMVC 的运行流程
今天一个同志在b站回复了我的回复,就是当时学习SpringBoot的时候的评论,大概的问题就是说在thymeleaf中没有办法使用 对象.对象的get方法
,然后我就仔细的研究了一下。
下图大概就是问题
简单来说就是 使用thymeleaf
的each之后,没有办法使用对象的get方法。
这里我就研究了一下SpringMVC的运行流程(之前也有涉及)
下面是之前的研究
先记住几个概念,前端控制器 DispatcherServlet,处理器映射器 HandlerMapping,处理器执行链 HandlerExecutionChain,处理器适配器 HandlerAdapter,视图解析器ViewResolver
1、客户端请求到前端控制器(dispatcherServlet)
2、前端控制器(dispatcherServlet)请求处理器映射器(HandlerMapping),
3、处理器映射器(HandlerMapping)根据url查找相应的处理器(Handler),返回处理器执行链(HandlerExecutionChain)给前端控制器(DispatcherServlet)
4、前端控制器(DispatcherServlet)请求处理器适配器(HandlerAdapter),
5、处理器适配器(HandlerAdapter)执行处理器(Handler),生成ModelAndView,返回ModelAndView给前端控制器(DispatcherServlet)
6、前端控制器(DispatcherServlet)请求视图解析器(ViewResolver)
7、视图解析器(ViewResovler)返回视图对象给前端控制器(DispatcherServlet)
8、最后渲染视图
Spring MVC的流程图
百度一大堆的
文章的主题
说白了,就是知识的科普,随便说说,自己来实现这个过程,就是从controller到View的数据传输。
下面就是实现这个过程,先声明,说思路,如果你照抄代码的很大可能是没有办法正常运行的。目的就是让读者能够真正的懂。
- 定义一个Book类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data // 这里使用的是lombok的@Data注解,如果不使用这个注解,就要自定义getter和setter方法,如何使用lombok得自己百度一下
@AllArgsConstructor // 这个注解就是包含所有参数的构造方法
@NoArgsConstructor // 这个注解就是无参构造方法
public class Book {
Long id;
String bookName;
Date date;
}
- 定义一Controller
@Controller
public class BookController {
@GetMapping(value = "/books")
public String getBooks(Model model){
/**
* 这个类很简单,就是定义一个路径,返回到booksList这个界面,带着model数据
*/
Book book = new Book((long) 1, "数据结构", new Date()); // Book导入自己方才定义的类, Date 也在util中
List<Book> list = new ArrayList<>(); // List和ArrayList很清楚都在java.util中
list.add(book);
model.addAttribute("books", list); // 这里model.add.. 就是用model来保存数据
return "booksList"; // 这里的booksList就是View,就是解析器需要解析的
}
}
- 定义一个视图booksList
<table>
<thead>
<tr>
<td>id</td>
<td>name</td>
<td>date</td>
</tr>
</thead>
<tbody>
<!--这里就是使用thymeleaf来获取数据,前提是文件得有xmlns:th="http://www.thymeleaf.org" 设置-->
<!--th:each 基础使用-->
<tr th:each="book:${books}">
<td th:text="${book.getId()}"></td>
<td th:text="${book.getBookName()}"></td>
<td th:text="${book.getDate()}"></td>
</tr>
</tbody>
</table>
输出:
总结
不用说你们看完之后,代码完全不能用。
我这里提出三个注意点:
1、BookController是否使用了@Controller注解?
2、Book类属性是否有get方法?
3、booksList 上面是否有 设置 <html lang="en" xmlns:th="http://www.thymeleaf.org">
?
慢慢的理解体会,多看一些文章,第一遍可能不懂,但是当你再次遇见,你再去看,你就会懂了。