Servlet 的生命周期

类加载、实例化,init方法,service方法,destroy方法。关于这点,后面会有详细介绍。

什么是容器?

因为Servlet没有main方法,所以它受控于另一个Java应用,这个应用就叫容器。而Tomcat就是这样一个容器之一。

容器的作用

容器来管理和运行Servlet。具体负责以下几项:

1.通信支持:让Servlet与Web服务器对话,而不需要自己建立ServerSocket、监听端口、创建流等。容器知道自己和Web服务器的协议。

2.生命周期管理:负责加载类、实例化和初始化Servlet、调用Servlet方法,并使Servlet实例能够被垃圾回收。

3.多线程支持:容器自动为每个Servlet请求创建一个新的Java线程,针对客户的请求,如果Servlet已经运行完相应的HTTP服务方法,这个线程就会挂掉。

4.声明方式实现安全:利用容器可以使用XML部署描述文件来配置和修改安全性,而不必将其硬编码到Servlet类代码中。

不用重新编译,就能修改和管理安全配置,不亦快哉!

5.最关键的是支持JSP:容器负责吧JSP翻译成java.

Servlet为什么是Servlet?

一般来说,绝大部分的Servlet中都是httpServlet,绝大部分的httpServlet都会覆盖doGet()或者doPost()方法。

doPost()或者doGet()方法里面的参数,就是创建的请求和响应对象的引用。

容器怎么找到Servlet?

一种通用的方法就是使用部署描述符文件将URL映射到Servlet。

这样的好处有很多,其中最大的好处就是:非程序员也可以修改和部署你的web应用。


简言之,Servlet的存在就是要为客户服务,Servlet的任务就是得到一个请求,再发回一个响应。


servlet家族

如图所示

Servlet生命周期的三大重要时刻

1.init():

在Servlet实例创建之后,并在为客户请求提供服务之前,容器要对Servlet调用此方法。

如果有初始化代码(比如得到一个数据库连接,或者向其他对象注册)就要覆盖此方法。

2.service():

第一个客户请求到来时,容器开始一个新线程,或者从线程池分配一个县城,并调用Servlet的service()方法。

3.doPost()/doGet()

主要在这里写业务代码。

注意:容器为每一个请求都提供一个单独的线程运行。

ServletConfig对象

  • 每一个Servlet都有一个ServletConfig对象。

  • 用于访问ServletContext。

ServletContext对象(AppContext)

  • 每一个Web应用有一个ServletContext。

  • 用于访问Web应用的参数

  • 用于得到服务器信息,包括容器名和容器版本。

关于请求和响应

请求:

HttpServletRequest和HttpServletResponse接口由谁来实现?

答:由容器来实现。

http请求方法除了POST和GET还有那些?

HEAD -----只要求得到GET返回的首部部分,所以这有点想GET,但是响应中没有体。

TRACE-----要求请求消息回送,这样客户能看到另一端接受了什么。以便排错。

PUT----指出要把所包含的信息放在请求的URL上。

DELETE----删除请求Url的一个资源。

OPTIONS----要求得到一个HTTP方法列表。

CONNECT----要求连接以便建立隧道。

POST和GET的区别

区别一:POST有消息体。GET方法对请求参数有限制,参数数据只能放在请求行的内容中。而且POST方法可以发送较大的数据。

区别二:安全性的问题。GET方法,参数的数据会显示到输入地址栏里面,是明文显示。

区别三:使用场合不同。GET 方法仅仅用来得到某些东西。对服务器不能做出任何改变。POST则用户发送数据来进行处理。

响应:

响应是要返回给客户。这是浏览器得到、解析并呈现给用户的东西。一般来说,要用响应得到一个输出流,通常是Writer,并使用这个流写出HTML,返回去给客户。但是应该还有其他办法。

大多数情况下,使用响应是为了向客户发回数据,会对响应调用两个方法:setContentType()和getWriter().

  • setContentType():

函数功能:告诉浏览器返回了什么,这样浏览器才能根据响应的内容,调用适当的辅助应用,来展现之。这里的内容类型就是MIME类型。

常用的MIME类型:

text/html

application/pdf

video/quicktime

application/java

image/jpeg

application/jar

application/octet-stream

application/x-zip

关于输出响应:

ServletResponse接口只提供了两个流可供选择:ServletOutputStream用于输出字节,PrintWriter用于输出字符数据。

PrintWriter writer = response.getWriter();

writer.println("some text and HTML");

ServletOutputStream out = response.getOutputStream();

out.write(aByteArray);

PrintWriter 实际上包装了ServletOutputStream.关于装饰器模式,请参见博文http://www.cnblogs.com/xuehanlee/p/4603998.html

设置响应首部和增加响应首部

response.setHeader();

response.addHeader();

这两种方法顾名思义,只有在响应中还没有首部时,才一样,如果响应中已经有了首部,则后者是增加一个值,而前者会覆盖现有的值。

Servlet重定向

response.sendRedirect("url");

这个方法能使浏览器重新发一个请求,来请求url对应的资源。此时浏览器上的地址会发生变化。

Servlet分派

重定向让浏览器重新发一条请求,而分派则是让服务器去指派资源来完成任务,此时用户根本不知道里面发生了什么,总之,最后服务器顺利的将资源呈现在浏览器。过程对于用户来说是完全透明的。

Servlet 浅谈(一)的更多相关文章

  1. Servlet 浅谈(三)

    关于Session 关于http协议后面会有一系列文章专门介绍.这里就大概了解一下:首先需要知道一点:HTTP是无状态的. 什么是无状态呢? 客户与服务器建立连接.发出请求.得到响应.关闭连接.整个流 ...

  2. Servlet 浅谈(二)

    如何获取初始化参数 容器在初始化的时候,会为了这个Servlet创建一个唯一的ServletConfig,容器会从DD读出Servlet的初始化参数,并把这个参数交给ServletConfig,然后S ...

  3. 浅谈Tomcat和Servlet

    本文浅谈下对Tomcat和Servlet总体的理解,初学时有用过一段时间,但当时疲于应对如何xml配置和使用,对他们的理解就像是一个黑匣子.现在回顾一下帮助自己加深网络的理解.开始还是先推荐我看的文章 ...

  4. jsp内置对象浅谈

    jsp内置对象浅谈 | 浏览:1184 | 更新:2013-12-11 16:01 JSP内置对象:我们在使用JSP进行页面编程时可以直接使用而不需自己创建的一些Web容器已为用户创建好的JSP内置对 ...

  5. 【架构】浅谈web网站架构演变过程

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  6. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  7. 浅谈PHP代码设计结构

    浅谈PHP代码设计结构 您的评价:       还行  收藏该经验       coding多年,各种代码日夜相伴,如何跟代码友好的相处,不光成为职业生涯的一种回应,也是编写者功力的直接显露. 如何看 ...

  8. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

    1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...

  9. 1.1浅谈Spring(一个叫春的框架)

    如今各种Spring框架甚嚣尘上,但是终归还是属于spring的东西.所以在这里,个人谈一谈对spring的认识,笔者觉得掌握spring原理以及spring所涉及到的设计模式对我们具有极大的帮助.我 ...

随机推荐

  1. 详解AJAX核心 —— XMLHttpRequest 对象 (上)

    我要说的内容都是非常基础的内容,高手就免看了,如果看了欢迎给点意见啊.新手或者对低层还不是很了解的人可以看看,帮助理解与记忆. XMLHttpRequest 对象是AJAX功能的核心,要开发AJAX程 ...

  2. 求1+2+3+...+n的值,要求不能使用乘除法,for、while、if、else、switch、case、等关键字及条件判断语句(JAVA)

    采用递归和三目表达式注意红色字体一定不能写成n-- 1 package com.hunag; public class Sum { static int sum; public static int ...

  3. Linux下安装oracle11g

    1.安装环境: Linux:Redhat Enterprise Linux 6.3 64位 Oracle:Oracle Database 11g for Linux x86-64 64位 2.修改操作 ...

  4. WdatePicker日历控件使用方法(转)

    转自:http://www.cnblogs.com/weixing/archive/2011/08/15/2139431.html WdatePicker日历控件使用方法   1. 跨无限级框架显示 ...

  5. NodeJS初学者实战之旅(I) —— 介绍、目录

    旅行之初 作为一个工作了两年多后端开发人员,未接触过NodeJS,对它的认知也仅仅停留在“可以使用JavaScript代码编写服务端程序”上.最近空闲时间 较多,便想来啃它一啃.但是没有一个实际的玩意 ...

  6. Mysql优化之创建高性能索引(一)

    1.索引基础 索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.但是不恰当的索引随着数据量的增加,也会使整个数据库的性能下降. 举个例子: ; 如果在id上建立索引 ...

  7. python虚拟环境Virtualenvwrapper无法升降级虚拟环境软件解决方法

    virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够在没有权限的情况下安装新套件,不同应用可以使用不同的套件版本,套件升级不影响其他应用. Virtaulen ...

  8. SignalR实现实时日志监控

    .net SignalR实现实时日志监控   摘要 昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错.当然,网上也有很多成熟的类似的监控系统 ...

  9. ALM11客户端安装办法

    使用HP公司的QC11(ALM11.0)做项目缺陷管理,发现QC只支持IE7,IE8.其实可以通过安装ALM自已提供的浏览器就行了. 第一步:关闭UAC(用户账户控制) 第二步:打开ie,将ie-in ...

  10. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...