赞
踩
环境:Springboot2.4.11
当一个请求过来后Spring是如何进行处理的?下面简单的罗列下请个的过程中核心组件
SpringMVC处理的流程:
- @RestController
- @RequestMapping("/users")
- public class UsersController {
- @GetMapping("/save")
- public Object save(Users users) {
- return users ;
- }
- }
上面这个Controller接口是我们最常的定义方法,对于绝大多数人来说或许也就知道这样去定义Controller接口,而这种定义Controller方式基本上已经可以满足我们日常的所有操作了。接下来看看其它的定义Controller方法
- @Component("/others/chrh")
- public class ControllerHttpRequestHandler implements HttpRequestHandler {
- @Override
- public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.setContentType("text/html;charset=utf8");
- PrintWriter out = response.getWriter() ;
- out.print("<h1>你好,HttpRequestHandler</h1>") ;
- out.close() ;
- }
- }
定义一个类实现HttpRequestHandler接口即可,注意这里注解@Component("/others/chrh")使用的以‘/’ 开头,为什么这么定义?在概述中说到HandlerMapping是用来将请求地址与处理程序关联起来,在常规中都是使用@RequestMapping定义接口请求地址,那在这里我们是不能用该注解的,但是又要让容器知道我们这个接口就必须使用'/'开头,这样就会有一个 BeanNameUrlHandlerMapping的HandlerMapping将我们这个Bean进行收集保存起来,以 /others/chrh为key,Bean对象为value保存到Map中。
测试
定义一个Bean实现该即可
- @Component("/others/custom")
- public class CustomController implements Controller {
-
- @Override
- public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
- response.setContentType("text/html;charset=utf8");
- PrintWriter out = response.getWriter() ;
- out.print("<h1>Controller接口</h1>") ;
- out.close() ;
- return null ;
- }
-
- }
Bean的名称还是以'/' 开头,那么还是由BeanNameUrlHandlerMapping与之关联
测试
这里的判断依据就是你的这个Bean是否是Servlet接口类型(有没有实现Servlet接口)。
- @Component("/others/servlet")
- public class ControllerServlet extends HttpServlet {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
- response.setContentType("text/html;charset=utf8");
- PrintWriter out = response.getWriter() ;
- out.print("<h1>你好 HttpServlet</h1>") ;
- out.close() ;
- }
-
- }
这样看起来就是个标准的Servlet程序。
如果你只是这样,那这可运行不起来,你还需要注册一个
SimpleServletHandlerAdapter。
- @Configuration
- public class WebConfig implements WebMvcConfigurer {
- @Bean
- public SimpleServletHandlerAdapter simpleServletHandlerAdapter() {
- return new SimpleServletHandlerAdapter() ;
- }
- }
测试
在这个程序中我们还可以让这个程序成为一个受应用服务管理的Servlet程序。可以将注解改成@WebServlet("/others/servlet")。只是换成这个注解还并不能生效,还需要在启动类(任何配置类上)添加@ServletComponentScan注解。
以上就是在SpringMVC中支持的几种接口定义处理方式。
下一篇文章会对上面几种实现的方式进行源码分析,一个请求是如何知道使用哪个HandlerMapping的,找到了HandlerMapping又是怎么确定由哪个HandlerAdapter处理的(在上面的例子中,每一种实现他们的实现方法都不一样,所以一定的需要不同的HandlerAdapter进行处理);通过源码的分析,让你知其然,知其所以然。关注我让你对Spring源码不再畏惧。
完毕!!!
求个关注+转发
公众:Springboot实战案例锦集
给个关注+转发谢谢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。