1、servlet的生命周期

(1)容器最终要调用service方法为客户进行服务。(此处“容器”指java运行的环境,tomcat是jsp/servlet的容器)

==> 在内存中一个Servlet只有一个实例。针对不同的用户请求,容器采用多线程的机制调用service方法的。
(2)Servlet接口中的常用方法:
==> public void init():初始化。Servlet类被实例化后就执行,且执行一次。由容器进行调用。启动服务器时还没有创建,当第一个人通过浏览器访问某个servlet时调用此方法
==> public void destroy():销毁Servlet对象。由容器进行调用。服务器关闭是,摧毁对象
==> Servlet实例对象和初始化方法,默认情况下,只有第一次访问时才执行,且只执行一次。
(3)利用load-on-startup在应用被Tomcat加载完毕后(此时还没有任何人访问),就实例化并完成初始化Servlet的工作,其中的数字越小代表越先执行

  1. <servlet>startup</servlet>
  2. <servlet-name>HelloServlet</servlet-name>
  3. <servlet-class>com.smalle.servlet.HelloServlet</servlet-class>
  4. <load-on-startup>2</load-on-startup>

2、模板方法设计模式

==> 如果设计与HTTP协议有关的Servlet,一般选择集成javax.servlet.http.HttpServlet==> 不要覆盖其中的service(ServletRequest req,ServletResponse resp)方法,而应该覆盖掉,doXXX方法(doGet、doPost),doXXX就是根据你的请求方式来的。==> HttpServlet中的service方法是典型的模板方法设计模式的具体应用。

3、Servlet配置:url-pattern

(1)一个Servlet可以被映射到多个URL地址上(2)URL地址映射还支持通配符*==> 方式一:以*开头,以扩展名结尾。比如<url-pattern>*.html</url-pattern>==> 方式二:以/前缀开头,以*结尾。 比如<url-pattern>/action/*</url-pattern>(3)多个Servlet使用通配符时,有可能有多==> 以"/"开头(方式二)要比"*"开头(方式一)优先级高==> 都以"/"开头,还是有多个匹配,找最匹配的(4)如果一个Servlet的映射为一个"/",就称之为缺省的Servlet,它负责处理没有映射路径的URL请求的响应。(5)当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。所以无特殊要求在web.xml中尽量不要有缺省的Servlet

4、Servlet中的线程安全问题

==> 在Servlet中定义变量,除非特殊要求,尽量使用局部变量。==> 如果有需要实例变量时,应做同步处理,且同步代码块尽量包围少的代码。==> 解决思路:用synchronized处理,但在实际中不会用,不可能让同一时刻访问网站的用户排队访问

5、拦截器:使用时要实现Filter接口

当用户访问Web工程时就调用拦截器,并且每次访问servlet时还会调用一次拦截器

  1. ==> java代码
  2. public class CharacterEncodingFilter implements Filter{
  3.  
  4. private FilterConfig config;
  5.  
  6. @Override
  7. public void init(FilterConfig config) throws ServletException {
  8. this.config = config;
  9. }
  10.  
  11. @Override
  12. public void doFilter(ServletRequest request, ServletResponse response,
  13. FilterChain chain) throws IOException, ServletException {
  14. // 获取filter初始化的参数值
  15. String encoding = config.getInitParameter("encoding");
  16. if (null != encoding && !"".equalsIgnoreCase(encoding)) {
  17. request.setCharacterEncoding(encoding);
  18. response.setCharacterEncoding(encoding);
  19. System.out.println("从拦截器获得的参数encoding = " + encoding + ", 在servlet执行之前已经设置了字符编码哦。");
  20. }
  21. // 把请求和响应传给过滤链中的下一个调用者或servlet
  22. chain.doFilter(request, response);
  23. }
  24.  
  25. @Override
  26. public void destroy() {
  27. }
  28. }
  29.  
  30. ==> web.xml代码
  31. <!-- 定义一个拦截器CharacterEncodingFilter -->
  32. <filter>
  33. <!-- 过滤器的标识名 -->
  34. <filter-name>characterEncodingFilter</filter-name>
  35. <!-- 过滤器对应的实现类 -->
  36. <filter-class>com.smalle.filter.CharacterEncodingFilter</filter-class>
  37. <!-- 配置初始化参数 -->
  38. <init-param>
  39. <param-name>encoding</param-name>
  40. <param-value>UTF-8</param-value>
  41. </init-param>
  42. </filter>
  43. <filter-mapping>
  44. <!-- 过滤器的标识名 -->
  45. <filter-name>characterEncodingFilter</filter-name>
  46. <!-- 过滤器的URL匹配模式 -->
  47. <url-pattern>/*</url-pattern>
  48. </filter-mapping>

6、监听器:使用时要实现某些接口

(1)Servlet监听器可以使你的应用对某些事情做出反应。每一个监听器都定义了一个回调方法,当对应的事件发现前或发生后,Web容器会自动调用对应监听器实现类中的相应方法。
(2)在ServletApi提供了以下的监听接口:
==> ServletContextListener:应用上下文生命周期的监听器。用于监听Web应用的启动和销毁事件。
==> ServletContextAttributeListener:应用上下文属性事件监听器。用于监听Web应用上下文的属性改变的事件。
==> ServletRequestListener:请求生命周期监听器,用于监听请求的创建和销毁事件。
==> HttpSessionListener:会话生命周期监听器,用于监听会话的创建和销毁事件。
==> HttpSessionActivationListener:会话集合和钝化事件监听器,用于监听会话的激活和钝化的事件。
==> HttpSessionAttributeListener:会话属性事件监听器。用于监听会话中的属性改变事件。
==> HttpSessionBindingListener:会话值绑定事件监听器,知识唯一不需要在web.xml中设定的监听器。
(3)实例

  1. package com.smalle.listener;
  2.  
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletContextEvent;
  5. import javax.servlet.ServletContextListener;
  6.  
  7. public class DemoListener implements ServletContextListener {
  8.  
  9. private ServletContext application = null;
  10.  
  11. //应用上下文初始时会回调的方法
  12. @Override
  13. public void contextInitialized(ServletContextEvent e) {
  14. //初始化一个application对象
  15. System.out.println("DemoListener");
  16. application = e.getServletContext();
  17. this.application.setAttribute("key", "可以在其他地方调用到我");
  18. }
  19.  
  20. public void contextDestroyed(ServletContextEvent e) {}
  21. }
  22. -------------------------------------------------------
  23. package com.smalle.listener;
  24.  
  25. import java.io.IOException;
  26. import javax.servlet.ServletException;
  27. import javax.servlet.http.HttpServlet;
  28. import javax.servlet.http.HttpServletRequest;
  29. import javax.servlet.http.HttpServletResponse;
  30.  
  31. public class DemoServlet extends HttpServlet {
  32.  
  33. private static final long serialVersionUID = 1L;
  34.  
  35. @Override
  36. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  37. throws ServletException, IOException {
  38. String value = (String) getServletConfig().getServletContext().getAttribute("key");
  39. System.out.println("DemoServlet" + value);
  40. }
  41. }
  42. ------------------------------------------------------------
  43. <!-- 注册一个监听器 -->
  44. <listener>
  45. <listener-class>com.smalle.listener.DemoListener</listener-class>
  46. </listener>
  47.  
  48. <servlet>
  49. <servlet-name>DemoServlet</servlet-name>
  50. <servlet-class>com.smalle.listener.DemoServlet</servlet-class>
  51. </servlet>
  52. <servlet-mapping>
  53. <servlet-name>DemoServlet</servlet-name>
  54. <url-pattern>/demoListener</url-pattern>
  55. </servlet-mapping>

(4)利用监听器实现用户在线人数监测:查看项目源代码

servlet(3) - servlet知识点 - 小易Java笔记的更多相关文章

  1. servlet(6) - servlet总结 - 小易Java笔记

    垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...

  2. servlet(4) - servletAPI - 小易Java笔记

    Servlet规范核心类图 1.请求和响应对象 ==> HTTP协议包含请求和响应部分. ==> HttpServletRequest就代表着请求部分 ==> HttpServlet ...

  3. servlet(2) - 利用MyEclipse新建一个servlet - 小易Java笔记

    1.Tomcat在MyEclipse中集成 ==> Window-preferences-MyEclipse-Servers-Tomcat-Tomcat 6.x-点击右侧的Browse,选择你的 ...

  4. servlet(1) - 手写第一个servlet程序 - 小易Java笔记

    声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...

  5. JSP(3) - 9个JSP内置对象 - 小易Java笔记

    1.9个JSP内置对象 内置对象引用名称     对应的类型 request HttpServletRequest response HttpServletResponse config Servle ...

  6. JSP(2) - JSP指令 - 小易Java笔记

    JSP指令是给JSP引擎用的,即给服务器用的.作用是告诉服务器,该如何处理JSP中除了指令之外的内容.包括page.include.taglib三种 基本的语法格式:<%@ 指令名称 属性1=& ...

  7. JSP(1) - JSP简介、原理、语法 - 小易Java笔记

    1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...

  8. servlet(5) - Cookie和session - 小易Java笔记

    1.会话概述 (1)会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. (2)会话过程中的数据不宜保存在request和servle ...

  9. JAVAWEB - Servlet原理及其使用>从零开始学JAVA系列

    目录 Servlet原理及其使用 什么是Servlet Servlet的使用 编写一个Servlet,使用继承HttpServlet的方式 配置web.xml 很简单的几个JSP文件 小提示,如果继承 ...

随机推荐

  1. 软工实践Beta冲刺(5/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  2. Nginx代理实现跨域

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  3. systemtap没找到函数变量

    为啥systemtap没找到函数 hon@station6:~/codebox/stap/net$ sudo stap -L 'kernel.function("sock_recvmsg_n ...

  4. 【bzoj3653】谈笑风生 DFS序+树状数组

    题目描述 给出一棵以1为根的有根树,q次询问,每次询问给出a和k,求点对 (b,c) 的数目,满足:a.b.c互不相同,b与a距离不超过k,且a和b都是c的祖先. 输入 输入文件的第一行含有两个正整数 ...

  5. hdu 1787 GCD Again (欧拉函数)

    GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. P1275 魔板

    题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状态.操作的方式有两 ...

  7. [luoguP3644] [APIO2015]八邻旁之桥(权值线段树)

    传送门 首先如果起点终点都在同一侧可以直接处理,如果需要过桥答案再加1 对于k等于1的情况 桥的坐标为x的话,a和b为起点和终点坐标 $ans=\sum_{1}^{n} abs(a_{i}-x)+ab ...

  8. final变量属性小记

    final 修饰符对于类成员变量来说,具备语法上不可变的特性:对于类成员方法来说,具备语法上子类不可覆盖重写的特性(能被继承的前提下). 但 final 并不限制子类对父类被修饰声明的成员变量进行覆盖 ...

  9. 如何解析Json返回的数据

    Json在Web开发的用处非常广泛,作为数据传递的载体,如何解析Json返回的数据是非常常用的.下面介绍下四种解析Json的方式: Part 1 var list1 = [1,3,4]; alert( ...

  10. 如何优化JQuery each()函数的性能

    如果对jQuery这东西只停留在用的层面,而不知其具体实现的话,真的很容易用出问题来.这也是为什么近期我一直不怎么推崇用jQuery,这框架的API设定就有误导人们走上歧途之嫌. 01 $.fn.be ...