在这个程序中我们还可以让这个程序成为一个受应用服务管理的Servlet程序 。可以将注解改成@WebServlet("/others/servlet") 。只是换成这个注解还并不能生效 , 还需要在启动类(任何配置类上)添加@ServletComponentScan注解 。环境:Springboot2.4.12
概述当一个请求过来后Spring是如何进行处理的?下面简单的罗列下请个的过程中核心组件
SpringMVC处理的流程:
- DispatcherServlet 所有请求的入口
- HandlerMApping 将请求地址与处理程序关联
- HandlerAdapter 真正处理程序 , 如执行上一步中对应的处理程
- HandlerMethodArgumentResolver 对参数进行解析 , 这里面还涉及到很多其它东西
- HanlderMethodReturnValueHandler 对返回值进行输出处理
- ViewResolver 结果HandlerAdapter返回的有ModelAndView则会应用视图解析器
@RestController@RequestMapping("/users")public class UsersController {@GetMapping("/save")public Object save(Users users) {return users ;}}
上面这个Controller接口是我们最常的定义方法 , 对于绝大多数人来说或许也就知道这样去定义Controller接口 , 而这种定义Controller方式基本上已经可以满足我们日常的所有操作了 。接下来看看其它的定义Controller方法HttpRequestHandler
@Component("/others/chrh")public class ControllerHttpRequestHandler implements HttpRequestHandler {@Overridepublic 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中 。测试
![Spring定义Controller接口的这些方式你肯定不知道](http://img.jiangsulong.com/230908/16055K952-0.jpg)
文章插图
图片
Controller接口【Spring定义Controller接口的这些方式你肯定不知道】定义一个Bean实现该即可
@Component("/others/custom")public class CustomController implements Controller {@Overridepublic 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与之关联测试
![Spring定义Controller接口的这些方式你肯定不知道](http://img.jiangsulong.com/230908/16055Ic0-1.jpg)
文章插图
图片
继承HttpServlet这里的判断依据就是你的这个Bean是否是Servlet接口类型(有没有实现Servlet接口) 。
@Component("/others/servlet")public class ControllerServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected 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 。
@Configurationpublic class WebConfig implements WebMvcConfigurer {@Beanpublic SimpleServletHandlerAdapter simpleServletHandlerAdapter() {return new SimpleServletHandlerAdapter() ;}}
测试![Spring定义Controller接口的这些方式你肯定不知道](http://img.jiangsulong.com/230908/16055HW8-2.jpg)
文章插图
图片
在这个程序中我们还可以让这个程序成为一个受应用服务管理的Servlet程序 。可以将注解改成@WebServlet("/others/servlet") 。只是换成这个注解还并不能生效 , 还需要在启动类(任何配置类上)添加@ServletComponentScan注解 。
推荐阅读
- 何谓真朋友 真朋友的定义是什么?
- SpringBoot实现多数据源配置详解
- 使用了Spring的事件机制真香!
- 小年怎么解释 小年如何定义
- Spring中Bean的作用域Scope你知道多少?如何自定义作用域?
- SpringBoot整合Druid进行SQL监控、SQL慢查询
- Spring Boot业务系统如何实现海量数据高效实时搜索
- SpringBoot的Cacheable缓存注解
- Spring为什么建议构造器注入
- 下一代Java微服务:从Spring Boot到Quarkus的迁移指南