java web(Servlet、Filter、Listener、<context-param>)
参考:
1、JavaWeb三大组件(Servlet、Filter、Listener)
2、一个web项目web.xml的配置中<context-param>配置作用
Servlet:
1、接收请求数据:
我们都知道客户端请求会被封装成HttpServletRequest对象,里面包含了请求头、参数等各种信息。
2、处理请求:
通常我们会在service、doPost或者doGet方法进行接收参数,并且调用业务层(service)的方法来处理请求。
3、完成响应:
处理完请求后,我们一般会转发(forward)或者重定向(redirect)到某个页面,转发是HttpServletRequest中的方法,重定向是HttpServletResponse中的方法,两者是有很大区别的。
4、创建加载时机
Servlet可以在第一次接收请求时被创建,也可以在在服务器启动时就被创建,这需要在web.xml的< servlet>中添加一条配置信息 < load-on-startup>5< /load-on-startup>,当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,当是一个负数时或者没有指定时,则指示容器在该servlet被请求时才加载。
5、重要方法
5.1 void init(ServletConfig):
servlet的初始化方法,只在创建servlet实例时候调用一次,Servlet是单例的,整个服务器就只创建一个同类型Servlet
5.2 void service(ServletRequest,ServletResponse):
1、servlet的处理请求方法,在servle被请求时,会被马上调用,每处理一次请求,就会被调用一次。ServletRequest类为请求类,ServletResponse类为响应类。
2、缺省的service功能是调用与 HTTP 请求的方法相应的 do 功能。例如,如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
5.3 doGet(ServletRequest,ServletResponse):
当一个客户通过 HTML 表单发出一个 HTTP GET 请求或直接请求一个 URL 时,doGet() 方法被调用。与 GET 请求相关的参数添加到 URL 的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用 doGet() 方法。
5.4 doPost(ServletRequest,ServletResponse):
当一个客户通过 HTML 表单发出一个 HTTP POST 请求时,doPost() 方法被调用。与 POST 请求相关的参数作为一个单独的 HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用 doPost() 方法。
5.5 void destory()
1、servlet销毁之前执行的方法,只执行一次,用于释放servlet占有的资源,通常Servlet是没什么可要释放的,所以该方法一般都是空的
2、缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。
3、当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个 Servlet 在运行 service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。
5.6 ServletConfig getServletConfig():
1、获取servlet的配置信息的方法,所谓的配置信息就是WEB-INF目录下的web.xml中的servlet标签里面的信息。
2、 getServletConfig() 方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和 ServletContext。ServletContext 接口提供有关 servlet 的环境信息。
5.7 String getServletInfo():
获取servlet的信息方法,getServletInfo() 方法是一个可选的方法,它提供有关 servlet 的信息,如作者、版本、版权。
Filter:
1、功能
filter与servlet在很多的方面极其相似,但是也有不同,例如filter和servlet一样都又三个生命周期方法,同时他们在web.xml中的配置文件也是差不多的、但是servlet主要负责处理请求,而filter主要负责拦截请求,和放行。
2、url-mapping三种匹配规则:
精确匹配 —— 如/foo.htm,只会匹配foo.htm这个URL。
路径匹配 —— 如/foo/*,会匹配以foo为前缀的URL。
后缀匹配 —— 如*.htm,会匹配所有以.htm为后缀的URL。
3、执行filter的顺序:
如果有多个过滤器都匹配该请求,顺序决定于web.xml filter-mapping的顺序,在前面的先执行,后面的后执
4、四种拦截方式:REQUEST、FORWARD、INCLUDE、ERROR
4.1 REQUEST:
直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST
4.2 FORWARD:
转发访问执行过滤器。包括RequestDispatcher#forward()方法、< jsp:forward>标签都是转发访问;
4.3 INCLUDE:
包含访问执行过滤器。包括RequestDispatcher#include()方法、< jsp:include>标签都是包含访问;
4.4 ERROR:
当目标资源在web.xml中配置为< error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
Listener:
1、它可以监听Application、Session、Request对象,当这些对象发生变化就会调用对应的监听方法。
2、常用的WebListener:
2.1 ServletContext
(ServletContextListener:用于监听Web的启动及关闭)
(ServletContextAttributeListener:用于监听ServletContext范围内属性的改变)
典型应用:定时器扫描、系统启动时加载全局属性对象(如全局数据库连接、缓存信息)等和系统全局相关的操作
2.2 HttpSession
(HttpSessionListener:用于监听用户session的开始及结束)
(HttpSessionAttributeListener:用于监听HttpSession范围内的属性改变)
典型应用:统计在线用户数,记录访问日志等和用户相关的操作
2.3 ServletRequest
(ServletRequestListener:用于监听用户请求)
(ServletRequestAttributeListener:用于监听ServletRequest范围属性的改变)
典型应用:读取用户请求参数用于控制流程,记录用户的访问历史记录等。
context-param:
1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
2. 紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3. 容器将<context-param></context-param>转化为键值对,并交给ServletContext.这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.
4. conetxt-param应该用来配合Servlet、Listener和Filter来使用。
web.xml中ServletContext 、context-param、Listener、Filter、Servlet的启动加载顺序
1、基本顺序
ServletContext -> context-param -> listener -> filter -> servlet
2、特殊点-servlet
可以在web.xml的配置中指定<load-on-startup>1</load-on-startup>参数。
当参数为正数时,容器在加载的时候就初始化servlet,数值越小启动优先级越高。
当参数为负数或者不存在时,则第一次被调用时初始化servlet。
3、特殊点-filter
filter的初始化顺序和它们出现在web.xml中的前后次序有关,先出现的先初始化,此外,filter-mapping必须出现在filter配置之后。
当一个请求匹配到多个filter-mapping时,filter们会按照filter-mapping配置出现的先后顺序来依次调用doFilter()方法。