Springmvc DispatcherServlet原理及用法解析

网友投稿 258 2022-11-20


Springmvc DispatcherServlet原理及用法解析

DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处。DispatcherServlet 主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

文件上传解析,如果请求类型是 multipart 将通过 MultipartResolver 进行文件上传解析;

通过 HandlerMapping,将请求映射到处理器(返回一个 HandlerExecutionChain,它包括一个处理器、多个 HandlerInterceptor 拦http://截器);

通过 HandlerAdapter 支持多种类型的处理器(HandlerExecutionChain 中的处理器);

通过 ViewResolver 解析逻辑视图名到具体视图实现;

本地化解析;

渲染具体的视图等;

如果执行过程中遇到异常将交给 HandlerExceptionResolver 来解析

DispathcherServlet配置详解

SpringMVC

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring-mvc.xml

1

SpringMVC

/

load-on-startup:表示启动容器时初始化该 Servlet;

url-pattern:表示哪些请求交给 Spring Web MVC 处理, "/" 是用来定义默认 servlet 映射的。也可以如 *.html 表示拦截所有以 html 为扩展名的请求

contextConfigLocation:表示 SpringMVC 配置文件的路径

Spring配置

先添加一个service包,提供一个HelloService类,如下:

@Service

public class HelloService {

public String hello(String name) {

return "hello " + name;

}

}

添加applicationContext.xml

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context

https://springframework.org/schema/context/spring-context.xsd">

expression="org.springframework.stereotype.Controller"/>

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context

https://springframework.org/schema/context/spring-context.xsd">

expression="org.springframework.stereotype.Controller"/>

expression="org.springframework.stereotype.Controller"/>

这个配置文件默认情况下,并不会被自定加载,所有,需要我们在web.xml对其进行配置

contextConfigLocation

classpath:applicationContext.xml

org.springframework.web.context.ContextLoadKdJYKTerListener

首先通过 context-param 指定 Spring 配置文件的位置,这个配置文件也有一些默认规则,它的配置文件名默认就叫 applicationContext.xml ,并且,如果你将这个配置文件放在 WEB-INF 目录下,那么这里就可以不用指定配置文件位置了,只需要指定监听器就可以了。这段配置是 Spring 集成 Web 环境的通用配置;一般用于加载除 Web 层的 Bean(如DAO、Service 等),以便于与其他任何Web框架集成。

contextConfigLohttp://cation: 表示用于加载Bean的配置文件

contextClass: 表示用于加载 Bean的 ApplicationContext 实现类,默认 WebApplicationContext。

在MyController中注入HelloService:

@org.springframework.stereotype.Controller("/hello")

public class MyController implements Controller {

@Autowired

HelloService helloService;

/**

* 这就是一个请求处理接口

* * @param req 这就是前端发送来的请求

* * @param resp 这就是服务端给前端的响应

* * @return 返回值是一个 ModelAndView,Model 相当于是我们的数据模型,

* View 是我们的视图 * @throws Exception

*/

public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {

System.out.println(helloService.hello("javaboy"));

ModelAndView mv = new ModelAndView("hello");

mv.addObject("name", "javaboy");

return mv;

}

}

为了在 SpringMVC 容器中能够扫描到 MyController ,这里给 MyController 添加了 @Controller 注解,同时,由于我们目前采用的 HandlerMapping 是 BeanNameUrlHandlerMapping(意味着请求地址就是处理器 Bean 的名字),所以,还需要手动指定 MyController 的名字。

最后,修改 SpringMVC 的配置文件,将 Bean 配置为扫描形式:

配置完成后,再次启动项目,Spring 容器也将会被创建。访问 /hello 接口,HelloService 中的 hello 方法就会自动被调用。

两个容器

当 Spring 和 SpringMVC 同时出现,我们的项目中将存在两个容器,一个是 Spring 容器,另一个是 SpringMVC 容器,Spring 容器通过 ContextLoaderListener 来加载,SpringMVC 容器则通过 DispatcherServlet 来加载,这两个容器不一样:

从图中可以看出:

ContextLoaderListener 初始化的上下文加载的 Bean 是对于整个应用程序共享的,不管是使用什么表现层技术,一般如 DAO 层、Service 层 Bean;

DispatcherServlet 初始化的上下文加载的 Bean 是只对 Spring Web MVC 有效的 Bean,如 Controller、HandlerMapping、HandlerAdapter 等等,该初始化上下文应该只加载 Web相关组件。

这个是不可能的。因为请求达到服务端后,找DispatcherServlet 去处理,只会去 SpringMVC 容器中找,这就意味着Controller 必须在 SpringMVC 容器中扫描。

2.为什么不在 SpringMVC 容器中扫描所有 Bean?

这个是可以的,可以在SpringMVC 容器中扫描所有 Bean。不写在一起,有两个方面的原因:

为了方便配置文件的管理

在 Spring+SpringMVC+Hibernate 组合中,实际上也不支持这种写法


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:服务端接口设计(服务端接口开发)
下一篇:java实现接口(java实现接口自动化测试)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~