| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring 框架:过滤器 vs 调度器 Servlet vs 拦截器 vs 控制器 -> 正文阅读 |
|
[Java知识库]Spring 框架:过滤器 vs 调度器 Servlet vs 拦截器 vs 控制器 |
什么是过滤器? ? 如上图所示,过滤器是 Web 服务器的 Servlet 容器的一部分。它不属于任何框架,如 Struts 或 Spring。过滤器用于处理请求,甚至可以在请求到达 Servlet 之前将其阻塞。它还可以对响应进行操作,并在到达客户端之前对其进行修改 Spring Security?使用过滤器进行身份验证和授权。Spring Security 可以拦截所有传入和传出的流量,因此 Spring Security 可以在 Spring MVC 框架之外使用。 以下是我们可以使用 servlet 过滤器执行的任务列表:
Spring MVC 和 Dispatcher Servlet ? Spring MVC 是基于模型-视图-控制器 (MVC)?设计模式?的最流行的 Java Web 框架。Spring MVC 的核心元素是 Dispatcher Servlet,它是处理所有请求的前端控制器,并为 Spring 框架内的所有请求提供入口点。它负责将传入的 HTTP 请求定向到应用程序的所有其他处理程序和控制器。它与 Spring IOC 容器完全集成,支持 Spring 的所有特性。 在 Spring Boot 出现之前,Dispatcher Servlet 是在 web.xml 文件中声明的,如下: <web-app> <servlet> <servlet-name>example</servlet-name> <servlet <b>class</b>> org.springframework.web.servlet.DispatcherServlet </servlet-<b>class</b>> <load-on-startup>1</load -on-startup> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>*.test</url-pattern> </servlet-mapping> </web-app> 这个DispatcherServlet是实际的Servlet,它继HttpServlet承自基类。?Spring Boot 为Spring MVC?提供了开箱即用的支持,而无需为 Dispatcher Servlet 定义任何配置。 Spring Boot 提供了spring-boot-starter-web库,用于使用?Spring MVC?开发 Web 应用程序。自动配置是?Spring Boot?的重要特性之一,使用它,Spring Boot会自动注册和配置 DispatcherServlet 。因此,我们不需要在 web.xml 文件中手动注册DispatcherServlet 默认情况下,spring-boot-starter-web starter 将DispatcherServlet配置为 URL 模式“/”。 但是,如果需要,我们可以使用server.servlet 自定义 URL 模式。 * application.properties文件中如下: server.servlet.context-path=/hello spring.mvc.servlet.path=/world 通过上面的配置,DispatcherServlet被配置为处理 URL 模式/world并且根上下文路径将是/hello。因此,DispatcherServlet监听http://localhost: 8080 /hello/world 什么是处理程序拦截器? HandlerInterceptor是?Spring MVC 框架?的一部分,它们位于 DispatcherServlet 和控制器之间。它们用于在到达控制器之前或呈现视图之前和之后拦截请求。 例如,我们可以使用拦截器在向控制器发送请求之前添加请求头,并在向客户端发送响应之前添加响应头。 处理程序拦截器减少重复并允许更细粒度的功能,例如:
Spring 拦截器是一个扩展HandlerInterceptorAdapter类或实现HandlerInterceptor接口的类。 HandlerInterceptor包含三个主要方法:
? 如上图所示,在调用控制器之前调用了 preHandle 方法。控制器类执行完毕后,执行 postHandle 方法。一旦视图被渲染,请求和响应都准备好了,然后执行 afterCompletion 方法。 什么是控制器? 在 Spring Boot 中,控制器类负责处理传入的 REST API 请求、准备模型以及返回要呈现为响应的视图。Spring 中的控制器类由@Controller 或@RestController 注释进行注释。 控制器 @Controller 用于将类标记为 Spring MVC 控制器。@Controller注释是通用构造型注释的特化@Component。使用 Controller 注解可以将类识别为 Spring 管理的组件。我们可以使用 Controller 在 Spring MVC 中返回一个视图。 ? 如果我们使用 Controller,我们可以有返回视图的处理程序以及返回 JSON 响应到 API 的处理程序。在这种情况下,我们需要在每个需要返回 JSON 响应的处理程序方法上使用?@ResponseBody 在下面的示例中,我们使用了Controller注释并使用了 2 个处理程序方法。第一个方法返回一个名为 hello.jsp 或 hello.html 的视图,而第二个方法是一个 Rest API,它以?JSON?的形式返回员工对象。这是因为将对象转换为 JSON 响应的ResponseBody注释: @Controller @RequestMapping(<font>"employees"</font><font>) <b>public</b> <b>class</b> MVCController { @GetMapping(</font><font>"/hello"</font><font>) <b>public</b> String hello(Locale locale, Model model) { Date date = <b>new</b> Date(); model.addAttribute(</font><font>"serverTime"</font><font>, formattedDate); <b>return</b> </font><font>"hello"</font><font>; } @GetMapping(value = </font><font>"/{name}"</font><font>) @ResponseBody <b>public</b> Employee getEmployeeByName(@PathVariable String name) { <b>return</b> employee; } } </font> 因此,使用 Controller 注释,我们可以将它用作返回 View 的 MVC 控制器,也可以通过在 Handler Methods 上使用 ResponseBody 来使用它。 Rest控制器 如今,大多数应用程序都使用由前端框架(如 Angular/React JS 等)使用的 Rest API,这些框架期望 JSON 响应,这与期望呈现 JSP 页面的旧应用程序不同。因此,我们现在主要使用 Rest Controller,而不是使用 MVC Controller。 ? RestController 用于在?@RestController 注释?的帮助下制作宁静的 Web 服务。此注解用于类级别,并允许类处理客户端发出的请求。 RestController 允许您处理所有?REST API?,例如 GET、POST、Delete 和 PUT 请求。 @RestController = @Controller + @ResponseBody 在下面的示例中,我们看到使用了 RestController 而不是 Controller 注释。我们不需要为处理程序方法指定 ResponseBody,因为它已经在 RestController 注释中实现。 @RestController @RequestMapping(<font>"employees"</font><font>) <b>public</b> <b>class</b> MVCController { @GetMapping(value = </font><font>"/{name}"</font><font>) <b>public</b> Employee getEmployeeByName(@PathVariable String name) { <b>return</b> employee; } } </font> 因此,如果我们希望我们的控制器只处理 Rest API,那么我们可以使用 RestController 注解。 总结 在本文中,我们详细了解了 Filter、Dispatcher Servlet、Handler Interceptor 和 Controller。过滤器是 Servlet Container 的一部分,而其他三个组件是 Spring Framework 的一部分。本文的重要内容是这些组件的执行顺序。过滤器首先被执行,然后是 Dispatcher Servlet、Handler Interceptor,最后是 Controller。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 8:52:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |