Spring Mvc中DispatcherServlet和Servlet的区别小结
在web开发过程中开始接触的是servlet,用来处理用户请求。这几年随着spring 框架越来越成熟,几乎成了java web开发界的主流框架。既然这么受欢迎肯定有它的优点,spring框架在原来的基础上改进了,前端控制器的(DispatcherServlet)跟之前的Servlet作用相似,都是用来接收用户请求。前几天还有小一届的学弟问我这两个东西的区别,觉得还是有必要写篇文章记录下,方便以后的学习。
Servlet介绍
1.Servlet不是框架,它是java库里面的一个类,Servlet是服务器端运行的一个程序。
2.当web容器启动的时候并且执行的时候,Servlet类就会被初始化。
3.用户通过浏览器输入url时,请求到达Servlet来接收并且根据servlet配置去处理。
通常项目中会用到不同的web容器,我这里用到是比较常见的Tomcat。在eclipse里面创建一个java web项目,会有一个WEB-INF的文件夹,为了不轻易被外界访问到,这个文件夹底下的文件都是受保护的。文件夹中包括了一个很重要的配置文件,web.xml,我们要实现的不同Servlet也要在这里配置才能使用。servlet在web.xml中的配置如下:
<servlet>
<servlet-name>LoginServlet</servlet-name> 3 <servlet-class>demo.servlet.LoginServlet</servlet-class> 4
</servlet> <servlet-mapping>
<servlet-name>LoginServlet</servlet-name> 2 <url-pattern>login</url-pattern> 1 </servlet-mapping>
访问顺序为1—>2—>3—>4,其中2和3的值必须相同。
url-pattern 标签中的值是要在浏览器地址栏中输入的 url,可以自己命名,这个 url 访问名为 servlet-name 中值的 servlet,两个 servlet-name 标签的值必须相同,因为通过 servlet 标签中的 servlet-name 标签映射到 servlet-class 标签中的值,最终访问 servlet-class 标签中的 class。
servlet配置
这里有个重要的类:
httpServlet,
这个类的底层实现也是继承了Servlet这个接口类,Servlet定义了下面几个方法。(有的方法的参数省略了)
init():
用于容器初始化。
getServlet():
获取配置信息。
service():
请求转发
getServletInfo():
获取servlet信息
destory():
容器销毁
2.Spring 中的DispatcherServlet
2.1
SpringMvc主要也是通过DispatcherServlet实现了Servlet这个接口,又叫前端控制器,来自前端的请求会先到达这里,它负责到后台去匹配合适的handler。DispatcherServlet的主要工作流程如下:
前端请求到达DispatcherServlet。
前端控制器请求HandlerMappering 查找Handler。
如果查找到存在的处理器,进一步去调用service和dao层
返回结果再到controller层,渲染具体的视图,返回结果给页面。
1、jsp页面(登录)
<div class="content">
<form action="login.do" method="post">
用户名:<input type="text" name="userName">
<p>
密 码:<input type="password" name="password">
<p>
<input class="submit" type="submit" value="登录">
</form>
</div>
2. dispatcherServlet在web.xml中的配置如下图:

上面这段xml的意思就是,所有的以.do结尾的action都让org.springframework.web.servlet.DispatcherServlet这个类来处理。load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。这时servlet不用初始化,而是交给容器去处理。
注:
load-on-startup:
表示容器启动时自动初始化该Servlet。
url-pattern
:表示拦截所有的.do请求。
3、然后加载sringMVC-servlet.xml配置文件。
<!-- 可以扫描controller、service、...
这里让扫描controller,指定controller的包
-->
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.qunar.fresh2017.controller"></context:component-scan>
4、然后开始扫描controller这个类,找到login.do。这时是通过注解来找到自己所需要的方法。
/**
* 用户登录时,检查数据库中是否存在此人
*
* @param userName 输入的用户名
* @param password 输入的用户密码
* @param httpSession 设置session
* @return 登陆成功返回登录成功,否则返回登录失败
*/
@RequestMapping("login.do")
public String login(String userName, String password, HttpSession httpSession,
HttpServletRequest request,HttpServletResponse resp) throws UnsupportedEncodingException { User user = UserDao.SelectForLogin(userName, password); //数据中查找此人
Optional<User> userPresent = Optional.of(user);
if (userPresent.isPresent()) { Cookie cookie = new Cookie("nickName", URLEncoder.encode(user.getNickName(), "utf-8"));
cookie.setMaxAge(24 * 60 * 60 * 7);
resp.addCookie(cookie);
request.setAttribute("nickName",user.getNickName());
resp.setCharacterEncoding("utf-8");
LOGGER.info("数据库里有这个人");
return "welcome";
} else {
LOGGER.info("数据库里没有这个人");
} return "loginerror";
}
@RequestMapping("login.do") 这个注解是SpringMVC中的一个注解,该注解说明的是,对于login.do的请求,
通过注解标签下面的方法进行响应。相当于方法的一个URL。
https://baijiahao.baidu.com/s?id=1571917020386745&wfr=spider&for=pc
spring框架已经是java web开发很主流的框架,这个框架有很多优点当然也有它的不足之处,比于之前的servlet,它一定程度上简化了开发人员的工作,使用servlet的话需要每个请求都去在web.xml中配置一个servlet节点,而Spring 中的DispatcherServlet他会拦截所有的请求,进一步去查找有没有合适的处理器,一个前端控制器就可以。
Tomcat和SpringMVC的职责
- Tomcat:The Apache Tomcat software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.
- SpringMVC:Spring推出的基于Servlet标准的MVC框架实现。
正是因为上面的定义,程序员经常把Tomcat是一个Servlet容器,其实Tomcat实现的功能比这个要更多一些。
由上面两个的职责描述,可以看出SpringMVC和Tomcat的结合点是Servlet。其实SpringMVC的DispatchServlet实现了HttpServlet,那么SpringMVC在Tomcat看来,其实就是一个Servlet。
SpringMVC的改变
我们上面说过,SpringMVC也是Servlet的实现,只不过SpringMVC增加了一个DispatchServlet,所有的http请求都是映射到这个Servlet上,请求进入到这个Servlet中之后,就算进入到了框架之中了,由这个Servlet来统一的分配http请求到各个Controller。
https://blog.csdn.net/achenyuan/article/details/77246395#tomcat下servlet的配置文件webxml
Spring Mvc中DispatcherServlet和Servlet的区别小结的更多相关文章
- Spring mvc中@RequestMapping 6个基本用法小结
Spring mvc中@RequestMapping 6个基本用法小结 小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: @RequestMa ...
- 转:Spring mvc中@RequestMapping 6个基本用法小结
Spring mvc中@RequestMapping 6个基本用法小结 发表于3年前(2013-02-17 19:58) 阅读(11698) | 评论(1) 13人收藏此文章, 我要收藏 赞3 4 ...
- spring mvc中DispatcherServlet如何得到ModelAndView的
首先看下面这种张图,这张图说明了spring mvc整体的流程. 本文讲的就是如何从DispatcherServlet中得到ModerAndView的过程. 首先看DispatherServlet这个 ...
- Spring mvc中@RequestMapping 6个基本用法小结(转载)
小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: @RequestMapping(value="/departments" ...
- Spring mvc中DispatcherServlet详解
简介 DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,而且与spring IOC容器无缝集成,从而可以获得Spring的优势 ...
- Spring mvc 中 DispatcherServlet 的学习和理解
上图表示当客户请求来到时,spring架构作出响应的流程,可以从图中看到看到请求分发的中心就是 DispatcherServlet 类,DispatcherServlet的任务是将请求发送给Sprin ...
- Spring MVC中DispatcherServlet工作原理探究
转:http://blog.csdn.net/zhouyuqwert/article/details/6853730 下面类图将主要的类及方法抽离出来,以便查看方便,根据类的结构来说明整个请求是如何工 ...
- Spring MVC中注解: @ModelAttribute 与@RequestParam区别
相关链接 : https://blog.csdn.net/huang343/article/details/77491096
- Spring MVC中的Controller是Serlvet吗?
1. Controller不是Servlet DispatcherServler是Spring MVC中的唯一Servlet,(这点可通过查看FrameworkServlet的子类确认) Servle ...
随机推荐
- 如何在CentOS 7中添加新磁盘而不用重启系统
导读 对大多数系统管理员来说扩充 Linux 服务器的磁盘空间是日常的工作之一.因此这篇文章会通过使用 Linux 命令,在 CentOS 7 系统上演示一些简单的操作步骤来扩充您的磁盘空间而不需要重 ...
- [React] Refactor a Class Component with React hooks to a Function
We have a render prop based class component that allows us to make a GraphQL request with a given qu ...
- 实现一个类似Chrome新功能提示的popoup
先让我们看一下Chrome的popup是什么样的: 这个“直接搜索网页”与“在打开的标签页之间切换”就是两个功能导航,还做了一个动画效果,会不停的上下晃. 我通过WindowManager的addVi ...
- “建议127:Lock与synchronized是不一样的问题”实际验证
近期又一次翻看 "编写高质量代码:改善Java程序的151个建议" 一书的时候看到"建议127"的文章中作者提供的測试用例存在一些值得商榷的地方. 在使 ...
- 广州高清卫星地图 用百度卫星地图server下载 含标签、道路数据叠加 可商用
广州高清卫星地图的地图展示图片各自是15级别.17级别.19级别的地图.一般来说17级别的地图图片就行用于商用.地图包包括一整张高级别的图片,如要全图浏览请用专业图片处理软件PS等打开. 一般来说互联 ...
- 查找文件工具find
与locate.whereis命令相比,find具有本质的区别: 首先,find是从指定的位置进行遍历查找(可以理解为对文件和目录进行逐一查找). 其次,find可以查找具有某一类特征的文件(例如查找 ...
- python发送邮件实例1
文件形式的邮件 #!/usr/bin/env python3 #coding: utf-8 import smtplib from email.mime.text import MIMEText fr ...
- Linux中more和less命令用法(转)
一.more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 ...
- 【BIRT】交叉报表中出现空值设置为默认值
在使用BIRT做交叉报表的时候,往往会出现有些维度下的值是空值,例如如下报表: 那么我们可以为这些空值给出默认值,例如"-" 具体操作如下: 点击上图的[Cross Tab]后选中 ...
- Android异步下载
概述 实现App常见下载公共 支持通知栏显示 支持 暂停.取消功能,使用Service.AsyncTask实现异步下载.特点简单.实用.方便源码扩展修改 详细 代码下载:http://www.demo ...