01

作者: 咸鱼佬 | 来源:发表于2018-01-05 21:40 被阅读3次

    前言

    其实不知从何说起,但是有一篇好文章https://mp.weixin.qq.com/s/s77m4K272p6qm4VmEDdbCw 关于web 开发的一部分历史,还有一本必读的书籍就是 head first servlet and jsp 。真的是非常经典,但是以现在框架的成熟,很少人去单纯的使用servlet 进行后台开发,当我以前做android的时候,就经常用servlet ,但是也是一知半解。

    其实按道理说,servlet 出现时取代当时的cgi,或者说,在java 语言上,servlet就是cgi,但是更甚于它。其实服务器本身只能处理静态的页面,每个用户相同的请求拿到的数据是应该的,当我们尝试通过访问服务器获取当前时间的时候,单纯的服务器是无法给我们准确返回的,这个时候就需要服务器调用外部的程序来实现了,通过外部程序完成这个功能,生成一个静态页面返回给服务器,再返回个用户,而这个外部程序就是servlet。
    那么谁来管理着这些servlet呢,那就出现了tomcat这个容器,tomcat完全遵循servlet和jsp规范
    我的另外一篇笔记 https://mubu.com/doc/2xsNXY_WY0

    servlet 和 jsp规范中三个重要的对象

    Listener

    常见的的监听器就是context,request 的监听器了吧!我们经常在Spring MVC 项目中,在web.xml 经常要配置一个servletContextListener

    org.springframework.web.context.ContextLoaderListener
    

    这个就是继承了contextListener,当tomcat容器启动时做一些初始化的工作。
    而每当处理请求的时候,只需要我们在处理请求方法申明传过来的参数,就能获取到,其实就是在requestlistener 中框架帮我们完成(....瞎猜.....)

    生命周期

    Listener在当web容器启动的时候,去读取每个web应用的web.xml配置文件,当配置文件中配有filter和listener时,web容器实例化listener,listener是当某个事件发生时,调用它特定方法,如HttpSessionListener,当创建一个session时会调用它的sessionCreated()方法,当servlet容器关闭或者重新加载web应用时lister对象被销毁。

    Filter

    老实说,我最近才发现这个角色,是在惭愧
    Filter生命周期

    web.xml 中声明的每个 filter 在每个虚拟机中仅仅只有一个实例。

    (1) 加载和实例化
    Web 容器启动时,即会根据 web.xml 中声明的 filter 顺序依次实例化这些 filter。
    (2) 初始化
    Web 容器调用 init(FilterConfig) 来初始化过滤器。容器在调用该方法时,向过滤器传递 FilterConfig 对象,FilterConfig 的用法和 ServletConfig 类似。利用 FilterConfig 对象可以得到 ServletContext 对象,以及在 web.xml 中配置的过滤器的初始化参数。在这个方法中,可以抛出 ServletException 异常,通知容器该过滤器不能正常工作。此时的 Web 容器启动失败,整个应用程序不能够被访问。实例化和初始化的操作只会在容器启动时执行,而且只会执行一次。
    (3) doFilter
    doFilter 方法类似于 Servlet 接口的 service 方法。当客户端请求目标资源的时候,容器会筛选出符合 filter-mapping 中的 url-pattern 的 filter,并按照声明 filter-mapping 的顺序依次调用这些 filter 的 doFilter 方法。在这个链式调用过程中,可以调用 chain.doFilter(ServletRequest, ServletResponse) 将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用 RequestDispatcher 的 forward 和 include 方法,以及 HttpServletResponse 的 sendRedirect 方法将请求转向到其它资源。需要注意的是,这个方法的请求和响应参数的类型是 ServletRequest 和 ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。
    (4) 销毁
    Web 容器调用 destroy 方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。

    image.png image.png

    来源:http://blog.csdn.net/sunxianghuang/article/details/52107376

    Filter使用例子

    servlet

    http://blog.csdn.net/sunxianghuang/article/details/52107376
    这篇文章吧

    加载顺序

    context-param、listener、 filter、 servlet的加载顺序不是配置时先后顺序的影响
    但是filter之间的加载顺序受位置前后影响

    框架

    struts2 和 Spring MVC 的区别
    http://www.cnblogs.com/zhengbin/p/5596525.html

    Spring 是容器,Tomcat 又是容器,什么关系?

    这个是刚刚想到的,
    https://zhidao.baidu.com/question/328799516806805645.html
    其实java web 项目都是基于servlet 的,Spring 作为的容器只是为其他bean service 提供生命周期的管理,而这些对象其实还是运行在servlet 中的,而tomcat 则是管理者servlet生命周期的


    相关链接

    http://edu.51cto.com/course/2116.html
    http://blog.csdn.net/sunxianghuang/article/details/52107376
    http://blog.csdn.net/javawebxy/article/details/50514046
    http://blog.csdn.net/wl_xt?q=Filter
    http://www.cnblogs.com/youxin/p/5329065.html
    http://www.cnblogs.com/zhengbin/p/5596525.html
    https://www.zhihu.com/question/31565442

    相关文章

      网友评论

        本文标题:01

        本文链接:https://www.haomeiwen.com/subject/ipfenxtx.html