Servlet

来源:互联网 发布:淘宝模块装修教程 编辑:程序博客网 时间:2024/06/03 22:44

Servlet:
全称Java Servlet,用java编写的服务端程序.Servlet扩展了Web服务器,是一种非常安全的、可移植的、易于使用的Web组件。Servlet也是一种动态加载的模块,为向Web服务器的资源请求提供服务。Servlet完全运行在服务器端的Java虚拟机上,一般将后者称为Servlet容器。

servlet的生命周期与工作原理
servlet生命周期是开发健壮的Servlet的组件的必要条件.
Servlet生命周期完全由Servlet容器掌握,客户端必须经过Servlet容器才能请求Servlet;
Servlet的生命周期:Servlet加载—>实例化—->服务—->销毁
一般地的Servlet的生命周期包含四个阶段
a.加载和实例化
Servlet容器负责加载和实例化Servlet。可以设置为当Servlet容器启动时,创建Servlet实例;如果没有这样设置,那么在容器接收这个Servlet第一个请求时,创建Servlet实例。Servlet容器通过类加载器加载Servlet类,然后,调用的是Servlet的默认构造函数(即不带参数的构造函数,构造函数也称为构造方法或构造器)来创建Servlet的实例。但要注意,用不着去编写Servlet类的构造函数,使用编译器提供的默认构造函数即可。
b.初始化
Servlet实例化后,容器会用调用Servlet的init()方法初始化这个对象.初始化的目的是为了让Servlet对象在处理客户端请求一些初始化的工作,并获取数据库连接和配置信息等等,每个Servlet的init方法只能调用一次,并且必须在容器调用Service()方法之前完成
c.处理请求
Servlet容器调用Servlet的service()方法处理请求。在service()方法中,Servlet实例通过request对象获取客户端的相关信息和请求信息,在处理请求进行后,调用response对象的方法设置响应信息。处理请求是Servlet生命中花费大部分时间做的工作,每个请求都在独立的线程中运行。根据不同请求,service()方法去调用对应方法,如doGet()、doPost()等。
d.服务终止
Servlet容器在移除Servlet实例之前,会调用实例的destroy()方法,以便该实例有机会释放所使用的资源。服务终止发生在当需要释放内存或者容器关闭时,在destroy()方法调用之后,容器会释放该Servlet实例,以便垃圾收集器进行回收。与init()方法一样,destroy()方法也只能调用一次。

HttpServletRequest与HttpServletResponse
a.HttpServletRequest
改对象表示浏览器(http请求),当web服务器得到该请求后,会把请求信息封装一个httpServletRequest对象

b.HttpServletResponse
HttpServletResponse对象代表服务器的响应.这个对象封装了向客户端发送数据,响应头,发送响应状态码的方法.

load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)
1.它的值必须是一个整数,病史servlet应该被载入的顺序
2.当值为0 或者大于0 时,表示容器在应用启动时就加载并初始化这个servlet
3.当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4.正数的值越小,该servlet的优先级越高,应用启动时就越先加载
5.当值相同时,容器就会自己选择顺序来加载。

转发与重定向
1.重定向是,客户端的浏览器的地址栏发发生变化,而转发没有
2.转发可以携带数据,重定向不行
3.重定向发生客户端,转发发生在服务端,客户端是不知道
4.重定向是,客服端发送了两个请求,而转发只发送一个请求

servlet的单例问题
当Servlet被第一次访问后,就被加载到内存,以后该实例对各个请求服务.即在使用中是单例。
多个浏览器访问测试。
因为servlet是单例,因此会出现线程安全问题:比如售票系统,如果不加同步机制,则会出现问题。
(1) 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制 synchronized (对象){ //同步代码 }
(2)如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题

Servlet与Tomcat的关系
这里写图片描述

a.Tomecat 是web的应用服务器,是一个Servlet/JPS容器.Tomcat作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户