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管理
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在工作时是以单例模式工作的吗?的主要内容,如果未能解决你的问题,请参考以下文章
springBoot学习笔记内嵌tomcat和springmvc