zoukankan      html  css  js  c++  java
  • 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的职责

    1. Tomcat:The Apache Tomcat software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.
    2. 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

  • 相关阅读:
    Jdbc、Mybatis、Hibernate各自优缺点及区别
    java中的线程池原理
    JVN的理解
    "=="和 equals 方法究竟有什么区别?
    nginx基础之【study one】
    C#,WPF中使用多文本显示数据,并对其数据进行关键字高亮等操作
    C#、WPF中如何自定义鼠标样式
    SSM(Spring + Springmvc + Mybatis)框架面试题
    java基础面试题
    C#关于TreeView树在节点数较多时总是会出现闪烁的问题方法记录
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4463223.html
Copyright © 2011-2022 走看看