Servlet进阶API

每个Servlet都必须由web容器读取Servlet设置信息(标注或者web.xml)、初始化。
对于每个Servlet的设置信息,web容器会为其生成一个ServletConfig作为代表对象,从中可以取得Servlet初始化参数,以及代表整个web应用
程序的ServletContext对象。
Web容器启动后,会读取Servlet设置信息,将Servlet类加载并实例化,并为每个Servlet设置信息产生一个ServletConfig对象,而后调用Servlet接口的
init()方法,并将产生的ServletConfig对象当做参数传入。
这个过程只会在创建Servlet实例后发生一次。
GenericServlet:
  1. @Override
  2. public void init(ServletConfig config) throws ServletException {
  3. this.config = config;
  4. this.init();
  5. }
  1. public void init() throws ServletException {
  2. // NOOP by default
  3. }

ServletConfig相当于Servlet的设置信息代表对象。

可以使用标注设置Servlet初始参数
  1. */
  2. @WebServlet(name = "FiveServlet",
  3. urlPatterns = {"/five.do"},
  4. initParams = {
  5. @WebInitParam(name = "name", value = "xiya"),
  6. @WebInitParam(name = "age", value = "24")
  7. })
  1. private String name;
  2. private String age;
  3. @Override
  4. public void init() throws ServletException {
  5. name = getInitParameter("name");
  6. age = getInitParameter("age");
  7. }

或者web.xml

  1. <servlet>
  2. <servlet-name>FiveServlet</servlet-name>
  3. <servlet-class>FiveServlet</servlet-class>
  4. <init-param>
  5. <param-name>name</param-name>
  6. <param-value>xiya</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>age</param-name>
  10. <param-value>25</param-value>
  11. </init-param>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>FiveServlet</servlet-name>
  15. <url-pattern>/five.do</url-pattern>
  16. </servlet-mapping>

web.xml中的设置会覆盖标注的设置。(标注的name属性需要和web.xml的<servlet-name>匹配)。


ServletContext:作为整个Web应用程序的代表。

应用程序事件、监听器

Web容器管理Servlet/JSP相关的对象生命周期,我们可以使用监听器处理对HttpServletRequest对象、HttpSession对象,ServletContext对象的生成、销毁事件,实际上就是我们编写回调函数,然后由Web容器来调用。

HttpServletRequest事件、监听器

ServletRequestListener:是生命周期监听器。
ServletRequestAttributeListener是属性改变监听器。
  1. public interface ServletRequestListener extends EventListener {
  2.  
  3. /**
  4. * The request is about to go out of scope of the web application.
  5. * The default implementation is a NO-OP.
  6. * @param sre Information about the request
  7. */
  8. public default void requestDestroyed (ServletRequestEvent sre) {
  9. }
  10.  
  11. /**
  12. * The request is about to come into scope of the web application.
  13. * The default implementation is a NO-OP.
  14. * @param sre Information about the request
  15. */
  16. public default void requestInitialized (ServletRequestEvent sre) {
  17. }
  18. }

测试代码:

  1. import javax.servlet.*;
  2. import javax.servlet.annotation.WebListener;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8.  
  9. /**
  10. * Created by N3verL4nd on 2017/3/1.
  11. */
  12. @WebListener
  13. @WebServlet(name = "ListenerServlet", urlPatterns = {"/listener.do"})
  14. public class ListenerServlet extends HttpServlet implements ServletRequestListener, ServletRequestAttributeListener{
  15.  
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. System.out.println("doPost");
  18. }
  19.  
  20. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  21. System.out.println("doGet");
  22. request.setAttribute("name", "xiya");
  23. request.setAttribute("name", "xiya1");
  24. }
  25.  
  26. @Override
  27. public void requestDestroyed(ServletRequestEvent sre) {
  28. System.out.println("requestDestroyed");
  29. }
  30.  
  31. @Override
  32. public void requestInitialized(ServletRequestEvent sre) {
  33. System.out.println("requestInitialized");
  34. }
  35.  
  36. @Override
  37. public void attributeAdded(ServletRequestAttributeEvent srae) {
  38. System.out.println("attributeAdded");
  39. System.out.println("attributeAdded: " + srae.getName() + " " + srae.getValue());
  40. }
  41.  
  42. @Override
  43. public void attributeRemoved(ServletRequestAttributeEvent srae) {
  44. System.out.println("attributeRemoved");
  45. System.out.println("attributeRemoved: " + srae.getName() + " " + srae.getValue());
  46. }
  47.  
  48. @Override
  49. public void attributeReplaced(ServletRequestAttributeEvent srae) {
  50. System.out.println("attributeReplaced");
  51. System.out.println("attributeReplaced:" + srae.getName() + " " + srae.getValue());
  52. }
  53. }

访问:http://localhost:8080/jspRun/listener.do

输出:
requestInitialized

attributeReplaced

attributeReplaced:org.apache.catalina.ASYNC_SUPPORTED true

doGet

attributeAdded

attributeAdded: name xiya

attributeReplaced

attributeReplaced:name xiya

requestDestroyed

HttpSession事件、监听器

  1. public interface HttpSessionListener extends EventListener {
  2.  
  3. /**
  4. * Notification that a session was created.
  5. * The default implementation is a NO-OP.
  6. *
  7. * @param se
  8. * the notification event
  9. */
  10. public default void sessionCreated(HttpSessionEvent se) {
  11. }
  12.  
  13. /**
  14. * Notification that a session is about to be invalidated.
  15. * The default implementation is a NO-OP.
  16. *
  17. * @param se
  18. * the notification event
  19. */
  20. public default void sessionDestroyed(HttpSessionEvent se) {
  21. }
  22. }

在HttpSession对象初始化或结束前,分别调用sessionCreated()与sessionDestroyd()方法。

ServletContext事件、监听器

  1. import javax.servlet.ServletContextEvent;
  2. import javax.servlet.ServletContextListener;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebListener;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10.  
  11. /**
  12. * Created by N3verL4nd on 2017/3/1.
  13. */
  14. @WebListener
  15. @WebServlet(name = "ContextListenerServlet", urlPatterns = {"/contextListener.do"})
  16. public class ContextListenerServlet extends HttpServlet implements ServletContextListener{
  17. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18.  
  19. }
  20.  
  21. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  22. System.out.println("doGet");
  23. }
  24.  
  25. @Override
  26. public void contextInitialized(ServletContextEvent sce) {
  27. System.out.println("contextInitialized");
  28. }
  29.  
  30. @Override
  31. public void contextDestroyed(ServletContextEvent sce) {
  32. System.out.println("contextDestroyed");
  33. }
  34. }

[2017-03-01 04:02:31,096] Artifact jspRun:war exploded: Artifact is being deployed, please wait...

[2017-03-01 04:02:31,097] Artifact WeiBo:war exploded: Artifact is being deployed, please wait...

contextInitialized

[2017-03-01 04:02:31,448] Artifact jspRun:war exploded: Artifact is deployed successfully

[2017-03-01 04:02:31,450] Artifact jspRun:war exploded: Deploy took 354 milliseconds

由此可见,当整个Web应用程序加载Web容器之后,容器会生成一个ServletContext对象。

重新部署后的日子信息:
[2017-03-01 04:03:53,921] Artifact jspRun:war exploded: Artifact is being deployed, please wait...

[2017-03-01 04:03:53,922] Artifact WeiBo:war exploded: Artifact is being deployed, please wait...

contextDestroyed

contextInitialized

[2017-03-01 04:03:54,580] Artifact jspRun:war exploded: Artifact is deployed successfully

[2017-03-01 04:03:54,580] Artifact jspRun:war exploded: Deploy took 659 milliseconds

[2017-03-01 04:03:55,270] Artifact WeiBo:war exploded: Artifact is deployed successfully

[2017-03-01 04:03:55,270] Artifact WeiBo:war exploded: Deploy took 1,348 milliseconds

注:
生命周期监听器与属性改变监听器都必须使用@WebListener或在web.xml中设置,容器才会知道要加载、读取监听器的相关设置。

过滤器

它是介于Servlet与浏览器之间,可以拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应。
在Servlet/JSP中要实现过滤器,必须实现Filter接口。并且需要使用@WebFilter标注或在web.xml中定义过滤器。
  1. public interface Filter {
  2. public default void init(FilterConfig filterConfig) throws ServletException {}
  3. public void doFilter(ServletRequest request, ServletResponse response,
  4. FilterChain chain) throws IOException, ServletException;
  5. public default void destroy() {}
  6. }

Filter接口的doFilter()方法类似于Servlet接口的service()方法。当请求来到容器,而容器发现调用Servlet的service()方法前,可以应用某过滤器,就会

调用该过滤器的doFilter()方法。
如果调用FilterChain的doFilter()方法,就会运行下一个过滤器,如果没有下一个过滤器,就会调用Servlet的service()方法。
如果没有调用FilterChain的doFilter(),则请求就不会继续交给接下来的过滤器或目标Servlet,这就是所谓的拦截请求。


JSP&Servlet学习笔记----第5章的更多相关文章

  1. JSP&Servlet学习笔记----第3章

    Web容器是JSP/Servlet唯一认识的HTTP服务器. HTTP是基于请求/响应的无状态通信协议. 流程: 1.请求来到HTTP服务器 2.HTTP服务器将请求转交给Web容器 3.Web容器创 ...

  2. JSP&Servlet学习笔记----第6章

    JSP与Servlet是一体两面的关系. JSP最终还是被编译为Servlet. <%@page contentType="text/html;charset=UTF-8" ...

  3. JSP&Servlet学习笔记----第4章

    HTTP是基于请求/响应的无状态的通信协议. 使服务器记得此次请求与之后请求关系的方式,叫做会话管理. 隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息.仅适用于一些简单的状态 管理,如 ...

  4. JSP&Servlet学习笔记----第1/2章

    HTML(HyperText Markup Language):超文本标记语言 HTTP(HyperText Transfer Protocol):超文本传输协议 URL(Uniform Resour ...

  5. jsp&servlet学习笔记

    1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...

  6. 【JSP&Servlet学习笔记】5.Servlet进阶AIP、过滤器与监听器

    Servlet接口上,与生命周期及请求服务相关的三个方法是init().service()与destory()方法.当Web容器加载Servlet类并实例化之后,会生成ServletConfig对象并 ...

  7. JSP Servlet学习笔记——使用fileupload上传文件

    关键代码如下: index.jsp <body> <center> <h3>文件上传</h3> <font color="red&quo ...

  8. 【JSP&Servlet学习笔记】4.会话管理

    Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...

  9. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

随机推荐

  1. 「Luogu P1435」回文字串 解题报告

    题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...

  2. Tomcat黑窗口中对于中文乱码问题的解决

    存在的问题: 如标题,下图所示,启动tomcat时黑窗口中中文乱码,影响查看程序打印信息 解决方案: tomcat安装/解压目录中,conf 文件夹下 logging.properties 文件中,代 ...

  3. Dockerfile文件记录(用于后端项目部署)

    Dockerfile文件记录(用于后端项目部署) 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理) 此文结合另一篇博客共同构成后端服 ...

  4. zTree 节点勾选取消勾选 选中取消选中

    zTreeObj.cancelSelectedNode function 举例 取消当前所有被选中节点的选中状态 var treeObj = $.fn.zTree.getZTreeObj(" ...

  5. linux下安装cmake方法(1)---下载压缩包

    OpenCV 2.2以后的版本需要使用Cmake生成makefile文件,因此需要先安装cmake:还有其它一些软件都需要先安装cmake 1.在linux环境下打开网页浏览器,输入网址:http:/ ...

  6. 【转】C#中base关键字的几种用法:base()

    转:https://blog.csdn.net/cplvfx/article/details/82982862 base其实最大的使用地方在面相对象开发的多态性上,base可以完成创建派生类实例时调用 ...

  7. Java 从入门到进阶之路(二十二)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...

  8. 浅析PHP类的自动加载和命名空间

    php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...

  9. Oracle索引大全

    文档结构如下: 前言: Oracle 官方文档对索引的描述真是弱透了,对索引的说明就是一坨……,support也没有很好的资料,下面还是用的官方上的内容经过自己的整理加上网上的资料. 索引类型: 索引 ...

  10. Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 哎呦喂,按照以往的惯例今天周六我的安排应该是待在家学学猫叫啥的.但是今年这种日子就可能一去不复返了,没法办法啊.前 ...