一、Servlet生命周期

1.Servlet生命周期

Serlet加载---->实例化---->服务---->销毁

2.init()

Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。

Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。

在Servlet生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器或客户端首次访问Servlet时装入Servlet。无论有多少客户端访问Servlet,都不会重复执行init()方法。

  1. @Override
  2. public void init(ServletConfig config) throws ServletException{
  3. // TODO Auto-generated method stub
  4. super.init(config);
  5. }

3.service()

它是Servlet的核心,负责响应客户的请求。每当一个客户端请求一个HttpServlet对象时,该对象的service()方法就会调用,而且传递给这个方法一个请求对象HttpServletRequest和响应对象HttpServletResponse对象作为参数。在HttpServlet中已复写了service()方法,该方法会自动判断用户的请求方式而执行不同的doXX()方法。

  1. protected void service(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException, IOException {
  3.  
  4. String method = req.getMethod();
  5.  
  6. if (method.equals(METHOD_GET)) {
  7. long lastModified = getLastModified(req);
  8. if (lastModified == -1) {
  9. // servlet doesn't support if-modified-since, no reason
  10. // to go through further expensive logic
  11. doGet(req, resp);
  12. } else {
  13. long ifModifiedSince;
  14. try {
  15. ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
  16. } catch (IllegalArgumentException iae) {
  17. // Invalid date header - proceed as if none was set
  18. ifModifiedSince = -1;
  19. }
  20. if (ifModifiedSince < (lastModified / 1000 * 1000)) {
  21. // If the servlet mod time is later, call doGet()
  22. // Round down to the nearest second for a proper compare
  23. // A ifModifiedSince of -1 will always be less
  24. maybeSetLastModified(resp, lastModified);
  25. doGet(req, resp);
  26. } else {
  27. resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
  28. }
  29. }
  30.  
  31. } else if (method.equals(METHOD_HEAD)) {
  32. long lastModified = getLastModified(req);
  33. maybeSetLastModified(resp, lastModified);
  34. doHead(req, resp);
  35.  
  36. } else if (method.equals(METHOD_POST)) {
  37. doPost(req, resp);
  38.  
  39. } else if (method.equals(METHOD_PUT)) {
  40. doPut(req, resp);
  41.  
  42. } else if (method.equals(METHOD_DELETE)) {
  43. doDelete(req, resp);
  44.  
  45. } else if (method.equals(METHOD_OPTIONS)) {
  46. doOptions(req,resp);
  47.  
  48. } else if (method.equals(METHOD_TRACE)) {
  49. doTrace(req,resp);
  50.  
  51. } else {
  52. //
  53. // Note that this means NO servlet supports whatever
  54. // method was requested, anywhere on this server.
  55. //
  56. String errMsg = lStrings.getString("http.method_not_implemented");
  57. Object[] errArgs = new Object[1];
  58. errArgs[0] = method;
  59. errMsg = MessageFormat.format(errMsg, errArgs);
  60.  
  61. resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
  62. }
  63. }

4.destroy()

仅执行一次,在服务端卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时会产生其他线程,因此需要确认在调用destroy()时,这些线程终止或完成。

下面是流程图:

步骤:

(1)客户端向Servlet容器发出Http请求。

(2)Servlet容器接收客户端的请求。

(3)Servlet容器创建一个HttpServletRequest对象,将客户端请求的信息封装到这个对象中。

(4)Servlet容器创建一个HttpServletResponse对象。

(5)Servlet容器调用HttpServlet对象的service()方法,把HttpServletRequest对象与HttpServletResponse对象作为参数传给 HttpServlet 对象。

(6)HttpServlet调用HttpServletRequest对象的有关方法,获取Http请求信息。

(7)HttpServlet调用HttpServletResponse对象的有关方法,生成响应数据。

(8)Servlet容器把HttpServlet的响应结果传给客户端。

注意:

(1)load-on-startupweb.xml中的含义

在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet。

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。

为什么不是true和false呢?这是因为如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。

二、ServletConfig对象

在Servlet配置文件中,可以使用一个或者多个<init-param>标签为Servlet配置一些初始化参数。当Web容器创建Servlet对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用Servlet中init()方法时,将ServletConfig对象传递给Servlet。进而我们就能通过ServletConfig对象得到当前Servlet的初始化参数信息。

1.在Web.xml配置参数

  1. <servlet>
  2. <servlet-name>LoginServlet</servlet-name>
  3. <servlet-class>com.kiwi.servlet.LoginServlet</servlet-class>
  4. <init-param>
  5. <param-name>data</param-name>
  6. <param-value>1234</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>data2</param-name>
  10. <param-value>abcd</param-value>
  11. </init-param>
  12. </servlet>

2.在Servlet中init()方法中获取

  1. @Override
  2. public void init(ServletConfig config) throws ServletException{
  3. super.init(config);
  4.  
  5. //1.得到指定参数的值
  6. String data = this.getServletConfig().getInitParameter("data");
  7. System.out.println("data = " + data);
  8. System.out.println("********************");
  9.  
  10. //2.得到所有的参数
  11. Enumeration<String> datas = this.getServletConfig().getInitParameterNames();
  12. while(datas.hasMoreElements()){
  13. String name = datas.nextElement();
  14. String value = this.getServletConfig().getInitParameter(name);
  15. System.out.println(name + " = " + value);
  16. }
  17. }

3.结果

data = 1234
********************

data = 1234

data2 = abcd

三、ServletContext对象

1.ServletContext简介

当Servlet容器在启动一个web应用时,会为它创建唯一的ServletContext对象。当Servlet容器终止一个web应用,则就会销毁它的ServletContext对象。

ServletContext,是一个全局的存储信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request一个用户可以多个。session一个用户一个,而servletContext,所有用户公用一个。所以为了节省空间,提高效率ServletContext中要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

换种方式说,运行在Java虚拟机中每一个web应用程序都有一个与之相关的Servlet上下文。ServletContext对象时Web服务器中的一个已知根路径,Servlet上下文被定位于http://localhost:8080/项目名。/项目名 称为上下文路径,一个ServletContext对象表示了一个Web应用程序的上下文。

Servlet上下文:Servlet上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问,Servlet上下文API用于设置应用程序中所有Servlet共有的信息,Servlet可能需要共享他们之间的共有信息,运行于同一服务器的Servlet有时也会共享资源,如jsp页面、文件和其他Servlet.

举例说明:

如,做一个购物类网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一遍数据库,效率就太低了;所以要用servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。

另外在jsp文件中,application是ServletContext的实例,由jsp容器默认创建,在servlet中调用getServletContext()得到ServletContext的实例。每个应用都会有一个ServletContext对象与之关联,当容器分布在多个虚拟机上时,web应用在所分布的每个虚拟机上都拥有一个ServletContext实例。

2.ServletContext用途

(1)访问web应用的初始化参数和属性

getInitParameter()getInitParameterNames()

应用开发人员利用初始化参数传递配置信息,典型的例子是web管理员的e-mail地址或一个持有关键数据的系统名称。

在Web.xml文件中配置初始化参数

  1. <context-param>
  2. <param-name>email</param-name>
  3. <param-value>123@sina.com</param-value>
  4. </context-param>

在Servlet中访问初始化参数

  1. String email = this.getServletConfig().getInitParameter("email");
  2. System.out.println("email = " + email);

(2)上下文属性

servlet可以通过名称将对象属性绑定到上下文,任何绑定到上下文属性都可以被同一个web应用的其它servlet使用。

setAttribute()getAttribute()getAttributeNames()romoveAttribute()

当信息需要在运行于分布式环境中的servlet之间共享时,信息被放入会话中,存储于数据库中。

(3)读取资源文件

例如读取Properties文件。

  1. private void readResource(){
  2. //读取资源文件Properties
  3. try{
  4. InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
  5. Properties props = new Properties();
  6. props.load(inputStream);
  7.  
  8. String url = props.getProperty("url");
  9. String username = props.getProperty("username");
  10. String password = props.getProperty("password");
  11. System.out.println("url = " + url + "\nusername = " + username + "\npassword = " + password);
  12. }catch(Exception e){
  13. e.printStackTrace();
  14. }
  15. }

JavaWeb总结(一)—Servlet的更多相关文章

  1. JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...

  2. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference

  3. (转)JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...

  4. JavaWeb学习——了解Servlet

    JavaWeb学习——了解Servlet 摘要:本文主要学习了什么是Servlet,以及如何使用Servlet进行开发. 基础知识 背景 随着互联网技术的发展,基于HTTP和HTML的web应用急速增 ...

  5. JavaWeb(二):Servlet

    一.本教程使用的Web容器——Tomcat Tomcat是提供一个支持Servlet和JSP运行的容器.Servlet和JSP能根据实时需要,产生动态网页内容.而对于Web服务器来说, Apache仅 ...

  6. Intellij idea创建javaWeb:实现JSP/Servlet(转)

    转自:https://www.jianshu.com/p/9684e90cf7b5 Intellij idea创建javaWeb:实现JSP/Servlet by_love唯念 关注 2016.12. ...

  7. javaweb学习之Servlet开发(二)

    javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个< ...

  8. JavaWeb基础:Servlet Response

    ServletResponse简介 ServletResponse代表浏览器输出,它提供所有HttpResponse的设置接口,可以设置HttpResponse的响应状态,响应头和响应内容. 生命周期 ...

  9. 在javaweb中通过servlet类和普通类读取资源文件

    javaweb有两种方式读取资源文件 在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在S ...

  10. JavaWeb开发之Servlet

    1. Servlet有关概念和前置知识 1.1 什么是动态网页 如果浏览器在不同时刻或不同条件下访问web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态页面. 动态网 ...

随机推荐

  1. c++ 调用dl里的导出类

    来源:http://blog.csdn.net/yysdsyl/article/details/2626033 动态dll的类导出:CPPDll2->test.h #pragma once // ...

  2. php中的实用分页类

    <table width="100%" border="1" cellpadding="0" cellspacing="0& ...

  3. 一张图理解RACSignal的Subscription过程

    通过下面一张图理解RACSignal的调用过程: 创建signale RACSignal通过子类[RACDynamicSignal createSignal:]方法获得Signal,并将disSubs ...

  4. mysql like 多条

    例如: 有一张表,表中有字段,id ,name ,想模糊查询出表里name 包含 "张三“或者”李四“ 的值 select name from user where ( name like ...

  5. php调去存储过程

    第一步,mysql端建存储过程 DELIMITER $$create procedure mintime()beginselect min(year(htime)) as minnian,max(ye ...

  6. 安全体系(二)——RSA算法详解

    本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 ...

  7. Eclipse插件的各种安装方法

    这篇文章我们总结下安装Eclipse的各种方法,首先一下的步骤都是在版本为“Kepler Service Release 1”的Eclipse下完成的.如果你的Eclipse版本不是"Kep ...

  8. cocos2dx 中文路径编译错误记录

    '/Q' 不是内部或外部命令,也不是可运行的程序1> 或批处理文件.1> 'y' 不是内部或外部命令,也不是可运行的程序1> 或批处理文件.1>C:\Program Files ...

  9. 关于wxpython多线程研究包括(import Publisher错误研究)

    作为一个自动化测试人员,开发基本的应用桌面程序是必须的!最近在研究wxpython相关知识,目前看到多线程一块,发现官方文档介绍说:"在线程中不能修改修改窗口属性!",但是实际情况 ...

  10. 九度OJ题目1080:进制转换(java)使用BigInteger进行进制转换

    题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36). 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成 ...