自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring定義Controller接口的這些方式你肯定不知道

開發(fā) 前端
在這個程序中我們還可以讓這個程序成為一個受應(yīng)用服務(wù)管理的Servlet程序??梢詫⒆⒔飧某葽WebServlet("/others/servlet")。只是換成這個注解還并不能生效,還需要在啟動類(任何配置類上)添加@ServletComponentScan注解。

環(huán)境:Springboot2.4.12

概述

當(dāng)一個請求過來后Spring是如何進(jìn)行處理的?下面簡單的羅列下請個的過程中核心組件

SpringMVC處理的流程:

  1. DispatcherServlet 所有請求的入口
  2. HandlerMapping 將請求地址與處理程序關(guān)聯(lián)
  3. HandlerAdapter 真正處理程序,如執(zhí)行上一步中對應(yīng)的處理程
  4. HandlerMethodArgumentResolver 對參數(shù)進(jìn)行解析,這里面還涉及到很多其它東西
  5. HanlderMethodReturnValueHandler 對返回值進(jìn)行輸出處理
  6. ViewResolver 結(jié)果HandlerAdapter返回的有ModelAndView則會應(yīng)用視圖解析器

常規(guī)Controller定義

@RestController
@RequestMapping("/users")
public class UsersController {
  @GetMapping("/save")
  public Object save(Users users) {
    return users ;
  }
}

上面這個Controller接口是我們最常的定義方法,對于絕大多數(shù)人來說或許也就知道這樣去定義Controller接口,而這種定義Controller方式基本上已經(jīng)可以滿足我們?nèi)粘5乃胁僮髁?。接下來看看其它的定義Controller方法

HttpRequestHandler

@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() ;
  }
}

定義一個類實現(xiàn)HttpRequestHandler接口即可,注意這里注解@Component("/others/chrh")使用的以‘/’ 開頭,為什么這么定義?在概述中說到HandlerMapping是用來將請求地址與處理程序關(guān)聯(lián)起來,在常規(guī)中都是使用@RequestMapping定義接口請求地址,那在這里我們是不能用該注解的,但是又要讓容器知道我們這個接口就必須使用'/'開頭,這樣就會有一個 BeanNameUrlHandlerMapping的HandlerMapping將我們這個Bean進(jìn)行收集保存起來,以 /others/chrh為key,Bean對象為value保存到Map中。

測試

圖片圖片

Controller接口

定義一個Bean實現(xiàn)該即可

@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與之關(guān)聯(lián)

測試

圖片圖片

繼承HttpServlet

這里的判斷依據(jù)就是你的這個Bean是否是Servlet接口類型(有沒有實現(xiàn)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() ;
  }


}

這樣看起來就是個標(biāo)準(zhǔn)的Servlet程序。

如果你只是這樣,那這可運行不起來,你還需要注冊一個
SimpleServletHandlerAdapter。

@Configuration
public class WebConfig implements WebMvcConfigurer {
  @Bean
  public SimpleServletHandlerAdapter simpleServletHandlerAdapter() {
    return new SimpleServletHandlerAdapter() ;
  }
}

測試

圖片圖片

在這個程序中我們還可以讓這個程序成為一個受應(yīng)用服務(wù)管理的Servlet程序??梢詫⒆⒔飧某葽WebServlet("/others/servlet")。只是換成這個注解還并不能生效,還需要在啟動類(任何配置類上)添加@ServletComponentScan注解。

以上就是在SpringMVC中支持的幾種接口定義處理方式。

下一篇文章會對上面幾種實現(xiàn)的方式進(jìn)行源碼分析,一個請求是如何知道使用哪個HandlerMapping的,找到了HandlerMapping又是怎么確定由哪個HandlerAdapter處理的(在上面的例子中,每一種實現(xiàn)他們的實現(xiàn)方法都不一樣,所以一定的需要不同的HandlerAdapter進(jìn)行處理);通過源碼的分析,讓你知其然,知其所以然。關(guān)注我讓你對Spring源碼不再畏懼。

責(zé)任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2018-09-02 15:43:56

Python代碼編程語言

2024-05-08 08:30:38

Controller接口組件

2023-11-15 08:22:42

Java開發(fā)小技巧

2021-08-30 07:49:33

索引ICP Mysql

2019-07-23 15:56:56

Spring Boot部署servlet

2019-07-23 17:52:59

Spring BootJava開發(fā)

2023-11-30 08:32:31

OpenFeign工具

2022-05-05 12:02:45

SCSS函數(shù)開發(fā)

2020-03-05 11:10:18

Left join數(shù)據(jù)庫MySQL

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2014-12-08 10:39:15

2022-07-17 06:53:24

微服務(wù)架構(gòu)

2021-08-10 10:25:16

HTML 網(wǎng)絡(luò)開發(fā)前端開

2018-01-26 08:26:35

RAID陣列組成

2010-08-23 09:56:09

Java性能監(jiān)控

2010-08-06 13:15:35

2011-09-15 17:10:41

2022-10-13 11:48:37

Web共享機(jī)制操作系統(tǒng)

2009-12-10 09:37:43

點贊
收藏

51CTO技術(shù)棧公眾號