成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

環(huán)境:Springboot2.4.12

概述

當(dāng)一個(gè)請(qǐng)求過(guò)來(lái)后Spring是如何進(jìn)行處理的?下面簡(jiǎn)單的羅列下請(qǐng)個(gè)的過(guò)程中核心組件

SpringMVC處理的流程:

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

常規(guī)Controller定義

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

上面這個(gè)Controller接口是我們最常的定義方法,對(duì)于絕大多數(shù)人來(lái)說(shuō)或許也就知道這樣去定義Controller接口,而這種定義Controller方式基本上已經(jīng)可以滿足我們?nèi)粘5乃胁僮髁恕=酉聛?lái)看看其它的定義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() ;
  }
}

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

測(cè)試

圖片圖片

Controller接口

定義一個(gè)Bean實(shí)現(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的名稱還是以'/' 開(kāi)頭,那么還是由BeanNameUrlHandlerMapping與之關(guān)聯(lián)

測(cè)試

圖片圖片

繼承HttpServlet

這里的判斷依據(jù)就是你的這個(gè)Bean是否是Servlet接口類型(有沒(méi)有實(shí)現(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() ;
  }


}

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

如果你只是這樣,那這可運(yùn)行不起來(lái),你還需要注冊(cè)一個(gè)
SimpleServletHandlerAdapter。

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

測(cè)試

圖片圖片

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

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

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

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

2018-09-02 15:43:56

Python代碼編程語(yǔ)言

2024-05-08 08:30:38

Controller接口組件

2023-11-15 08:22:42

Java開(kāi)發(fā)小技巧

2021-08-30 07:49:33

索引ICP Mysql

2019-07-23 17:52:59

Spring BootJava開(kāi)發(fā)

2019-07-23 15:56:56

Spring Boot部署servlet

2023-11-30 08:32:31

OpenFeign工具

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2022-05-05 12:02:45

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

2020-03-05 11:10:18

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

2014-12-08 10:39:15

2021-08-10 10:25:16

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

2022-07-17 06:53:24

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

2010-08-23 09:56:09

Java性能監(jiān)控

2011-09-15 17:10:41

2021-02-01 23:23:39

FiddlerCharlesWeb

2022-10-13 11:48:37

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

2009-12-10 09:37:43

2018-01-26 08:26:35

RAID陣列組成
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 狠狠操狠狠操 | av电影一区 | 亚洲国产欧美一区二区三区久久 | 免费黄色在线 | 日韩中文字幕在线播放 | 午夜播放器在线观看 | 911精品国产 | 99久久中文字幕三级久久日本 | 日韩av免费在线观看 | 免费色网址 | 亚洲福利一区 | 999久久久| 久久久国产精品 | 亚洲三区在线观看 | 中文在线一区二区 | 欧美精品一区二区三区蜜臀 | 亚洲欧美一区二区三区在线 | 亚洲精品日韩精品 | 国产精品成人久久久久 | a级毛片免费高清视频 | 日韩精品一区二 | 国产色 | 日韩无 | 亚洲午夜视频在线观看 | 日本污视频 | 天天操综合网 | 亚洲激情在线 | 美女久久 | 91精品中文字幕一区二区三区 | 国产精品国产成人国产三级 | 免费一级片 | 精品欧美| 精品无码久久久久久国产 | 日韩字幕| 久久综合久 | 国产精品一区一区三区 | 欧美在线视频不卡 | h视频免费在线观看 | 国产一区二区三区久久久久久久久 | 一级做a爰片久久毛片 | 欧美精品日韩精品国产精品 |