springmvc的DispatcherServlet在工作时是以单例模式工作的吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springmvc的DispatcherServlet在工作时是以单例模式工作的吗?相关的知识,希望对你有一定的参考价值。

是只有一个实例来处理所有的请求吗?

是。

DispatcherServlet的本质还是一个servlet,生命周期是跟随容器的,所以只有一个实例。但是请求发起时的request和respone每次都是一个新实例。

另外要注意的是spring框架在原来的基础上改进了,前端控制器的(DispatcherServlet)跟之前的Servlet作用相似,都是用来接收用户请求。

扩展资料:

Servlet不是框架,而是java库里面的一个类,Servlet是服务器端运行的一个程序。当web容器启动的时候并且执行的时候,Servlet类就会被初始化。

另外用户通过浏览器输入url时,请求到达Servlet来接收并且根据servlet配置去处理。通常项目中会用到不同的web容器,在eclipse里面创建一个javaweb项目,会有一个WEB-INF的文件夹。

除此之外为了不轻易被外界访问到,这个文件夹底下的文件都是受保护的。文件夹中包括了一个很重要的配置文件,web.xml,要实现的不同Servlet也要在这里配置才能使用。

参考技术A DispatcherServlet的本质还是一个servlet,它的生命周期是跟随容器的,所以只有一个实例。
但是请求发起时的request和respone每次都是一个新实例。

SpringMVC概述+SpringMVC运行流程+SpringMVC搭建

SpringMVC

SpringMVC概述

首先我们了解一下经典的MVC模式,MVC全称Model View Controller,M指业务模型,V指用户界面,C指控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。Spring MVC属于SpringFrameWork的后续产品。

SpringMVC是Spring框架的一个模块,SpringMVC和Spring无需通过中间整合层进行统一整合,已经融合在Spring Web Flow里面。SpringMVC是一个基于MVC的web框架,方便前后端进行数据的传输。SpringMVC拥有控制器,接收外部请求,解析参数传给服务层。

SpringMVC的运行流程

我们回顾一下我们使用Servlet来完成web项目,如下图:

在这里插入图片描述

使用Servlet来完成web项目时,我们通过Servlet来处理用户页面和数据库之间的数据交互,那时候我们所有的Servlet层代码都需要我们自己去写入,并且会有大量的“重复”代码,严重降低了我们开发的效率,使我们不能专注于业务,SpringMVC就可以很好的为我们解决这一问题。

在这里插入图片描述

1.用户向服务器发送请求,请求被Spring前置控制器DispatcherServlet捕获;

2.前端控制器DispatcherServlet接收到请求后,调用映射处理器HandlerMapping。处理器HandlerMapping根据请求的url找到处理该请求的处理器Handler(即Controller),将处理器Handler返回给前端控制器DispatcherServlet。

3.DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。在填充Handler的入参过程中,根据配置,Spring会做出一些额外的工作:

(1)HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应消息。

(2)数据转换:对请求消息进行数据转换。如String转换为Integer、Double等。

(3)数据格式化:对请求消息进行数据格式化。如将字符串转换为格式化数字或格式化日期等等。

(4)数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。

4.Handler控制器执行完毕后,会向DispatcherServlet返回一个ModelAndView对象。

5.根据返回的ModelAndView,选择一个适合的ViewResolver视图解析器(必须是已经注册到Spring中的视图解析器)返回给DispacherServlet;

6.ViewResolver结合Model和View来渲染视图;

7.将渲染后的结果响应给客户端。

搭建SpringMVC

搭建完整的SpringMVC项目需要在spring的基础上进行,大家可以阅读我的这几篇文章进行学习

学习Spring之前必读的文章,Spring框架第0章(Spring核心+优点+体系结构+简单搭建)

Spring框架的IOC设计思想+Spring的Bean管理

一文搞懂SpringAOP(面向切面编程)

Spring事务特征+Spring事务管理+实现+Spring七种事务传播行为+集成MyBatis

1.导入SpringMVC的相关jar包

<!--SpringMVC依赖的jar包-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

如果使用jsp的el表达式,还需要导入jstl的jar包

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!--加servlet-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

2.配置DispatcherServlet

DispatcherServlet是从HttpServlet中继承而来。所以它是一个标准的Servlet,因此我们需要在web.xml文件中进行配置,使它在启动时加载Spring配置文件。

在web.xml文件中配置:

	<!--配置spring核心请求分发的的DisPatcherServlet-->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--把Spring的配置文件交给contextConfogLocation-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>
        </init-param>
        <!--服务器启动时就初始化DispatcherServlet和启动 spring-->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <!--
        请求映射
        所有的请求都会进入DispatcherServlet(分发器)
    -->
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3.开启SpringMVC注解

在Spring.xml文件中配置开启SpringMVC注解

<!--开启SpringMVC的注解功能-->
<mvc:annotation-driven></mvc:annotation-driven>

4.配置视图解析器

在Spring.xml文件中配置视图解析器

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    <!--控制器返回的所有视图界面的prefix(前缀)都要为value-->
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <!--控制器返回的所有视图界面的suffix(后缀)都要为value-->
    <property name="suffix" value=".jsp"></property>
</bean>

5.控制器类的搭建

我们使用@Controller注解标签标记SpringMVC的Controller对象,即控制器类。同时,我们也要使用RequestMapping注解来标记请求地址映射,可用在类或方法上。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


@Controller//扫描到这个类后交给IOC管理,用于创建对象,默认是单例的,多线程情况下线程不安全
@RequestMapping(path = "/user")//指定一个映射的地址,属性为value或path都一样,可以指定多个,
public class UserController {

    @RequestMapping(path = "/toLogin")//指定请求方式
    public ModelAndView toLogin() {
        System.out.println("toLogin");
        ModelAndView mv = new ModelAndView("login");;
        return mv;
    }

}

这时当我们要访问toLogin()方法是的路径就是/user/toLogin

以上是关于springmvc的DispatcherServlet在工作时是以单例模式工作的吗?的主要内容,如果未能解决你的问题,请参考以下文章

springMVC配置文件位置及名称

07.SpringMVC之静态资源

springBoot学习笔记内嵌tomcat和springmvc

springBoot学习笔记内嵌tomcat和springmvc

SpringMVC配置servlet的URL

@RequestMapping映射请求