一、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()方法。

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

3.service()

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

   protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
} } else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp); } else if (method.equals(METHOD_POST)) {
doPost(req, resp); } else if (method.equals(METHOD_PUT)) {
doPut(req, resp); } else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp); } else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}

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配置参数

	<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.kiwi.servlet.LoginServlet</servlet-class>
<init-param>
<param-name>data</param-name>
<param-value>1234</param-value>
</init-param>
<init-param>
<param-name>data2</param-name>
<param-value>abcd</param-value>
</init-param>
</servlet>

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

	@Override
public void init(ServletConfig config) throws ServletException{
super.init(config); //1.得到指定参数的值
String data = this.getServletConfig().getInitParameter("data");
System.out.println("data = " + data);
System.out.println("********************"); //2.得到所有的参数
Enumeration<String> datas = this.getServletConfig().getInitParameterNames();
while(datas.hasMoreElements()){
String name = datas.nextElement();
String value = this.getServletConfig().getInitParameter(name);
System.out.println(name + " = " + value);
}
}

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文件中配置初始化参数

	<context-param>
<param-name>email</param-name>
<param-value>123@sina.com</param-value>
</context-param>

在Servlet中访问初始化参数

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

(2)上下文属性

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

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

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

(3)读取资源文件

例如读取Properties文件。

private void readResource(){
//读取资源文件Properties
try{
InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties props = new Properties();
props.load(inputStream); String url = props.getProperty("url");
String username = props.getProperty("username");
String password = props.getProperty("password");
System.out.println("url = " + url + "\nusername = " + username + "\npassword = " + password);
}catch(Exception e){
e.printStackTrace();
}
}

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. Xcode的中常用到的快捷键,印象笔记中常用到的快捷键

    Xcode提供了很多快捷键,灵活使用快捷键可以提升开发效率.但对于初学者来说,一次性的去记住并掌握如此多的快捷键显然是不现实的,本文就是来帮助大家了解在iOS开发过程中,使用最频繁的一些快捷键. 1. ...

  2. css :target

    花了半小时在找如果完成:target的问题 需求:点击<a href="#Main">Main</a>时,会触发:target 效果 结果在网络上没有找到, ...

  3. VUE2.0实现购物车和地址选配功能学习第六节

    第六节 地址列表过滤和展开所有的地址 html:<li v-for="(item,index) in filterAddress">js: new Vue({ el:' ...

  4. Java基础之路(一)下--引用数据类型之数组

    上次我们说了java的基础数据类型,今天我们就来说一下引用数据类型中的数组. 什么是数组 数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合. 数组中的每一个数据称之为数组元素,数 ...

  5. 使用Github Pages和Hexo构建博客

    Github Pages可以创建免费的静态站点,支持自带主题.支持自制页面等,并且可以使用Jekyll或者Hexo等静态博客框架进行管理. 独立博客是博客园等博客平台之外的一个良好补充,相比使用虚拟主 ...

  6. TypeScript设计模式之策略、模板方法

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  7. Java字节码操纵框架ASM小试

    本文主要内容: ASM是什么 JVM指令 Java字节码文件 ASM编程模型 ASM示例 参考资料汇总 JVM详细指令 ASM是什么 ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既 ...

  8. ajax删除数据(不跳转页面)

    以前我们讲的删除是利用嵌入php代码,跳转到另一个页面,从而降低了删除速度,但我们今天讲的利用ajax不仅可以达到不跳页面快速删除,并且能添加特效来美化页面. AJAX = 异步 JavaScript ...

  9. Servlet中编码在过滤器中的使用

    1.先配置web.xml ->配置过滤器 // filter-class 为写的过滤器类 实现 Filter 接口 <filter> <filter-name>Encod ...

  10. SQL server 数据库——数学函数、字符串函数、转换函数、时间日期函数

    数学函数.字符串函数.转换函数.时间日期函数 1.数学函数 ceiling()--取上限  select ceiling(oil) as 油耗上限 from car floor()--取下限 sele ...