Servlet是独立于平台和协议的服务器端的java应用程序,处理请求的信息并将其发送到客户端。
Servlet的客户端可以提出请求并动态获得响应。
Servlet动态生成web页面,担当浏览器或其他客户端发出的请求与HTTP服务器上的数据库或应用程序之间的中间层。
对于所有客户端请求,都只需要创建一次Servlet实例,因此,节省了大量内存。
Part 1 Servlet运行原理
web服务器收到一个http请求后,判断请求内容,若是静态页面数据,自行处理,若为动态数据,交给Servlet容器,Servlet容器找到相应Servlet实例处理;处理结果交给web服务器,再转交给客户端。
针对同一个Servlet,Servlet容器会在第一次收到HTTP请求时建立一个Servlet实例,然后启动一个线程,第二次收到http请求后,Servlet容器无需创建相同Servlet ,仅开启第二个线程来处理请求。
----->多线程的方式有效提高执行效率,降低服务器负担。
Part 2 Servlet 优势
Servlet具有优良的跨平台性;
可移植性良好:java语言编写,Servlet API标准完善,企业编写的Servlet程序可轻松移植到其他服务器中;
执行效率高:Servlet请求到来时激活Servlet,处理完成后等待新请求;新请求产生新线程,而不是进程;
使用方便:可轻松处理HTML表单数据,并读取和设置HTTP头,处理cookie,跟踪会话;
Part 3 基础知识
HttpServlet作为一个抽象类来创建用户自己的Http Servlet. Http Servlet类扩展了GenericServlet类。HttpServlet类的子类必须至少重写doGet()和doPost()方法其中之一。HttpServlet类提供doGet()方法处理GET请求,doPost()处理POST请求:
doGet() :通过GenericServlet 类的service()方法来调用此方法;
doPost(): 通过GenericServlet 类的service()方法来调用此方法;
Part 4 Servlet生命周期
Servlet生命周期由Servlet容器控制,该容器创建Servlet的实例。Servlet的生命周期是指Servlet实例在创建后,响应客户端请求直至销毁的全过程;
其创建取决于Servlet的首次调用。
Servlet生命周期定义了它如何被加载,初始化,以及它如何接受请求,响应请求,提供服务;
代码中,Servlet生命周期由接口javax.servlet.Servlet定义,所有的Servlet必须直接或间接的实现该接口,这样才能在Servlet容器中运行。
Servlet接口定义了生命周期三种方法:
1 init():创建实例后进行初始化。实现ServletConfig接口的对象作为参数进行传递。在初始化过程中,Servlet容器使用ServletConfig接口信息(如Servlet的初始化参数的名称,初始化参数的值,以及Servlet实例名称等)传递给Servlet。
public void init(ServletConfig config)throws ServletException
2 service():响应客户端发出的请求。service()方法接受ServletRequest接口和Servletresponse接口的对象来处理请求和发送响应;
public void service(ServleRequest request,ServletResponse response) throws ServletException,IOException
3 destroy():如果不再有需要请求的对象,则释放Servlet对象;
public void destroy()
Servlet生命周期各阶段:
1.实例化:Servlet容器创建Servlet类的实例对象;
2.初始化:容器调用Servlet的init()方法,通常会申请资源以便后续使用;
3.服务:由容器使用以响应客户对Servlet的请求;
4.破坏:在释放Servlet实例前调用,通常会释放资源;
5.不可用:释放内存中的容器;
[要实例化一个Servlet,容器必须先找到Servlet类,加载servlet类并创建Servlet对象,然后通过调用Servlet的init()方法来初始化Servlet。ServletConfig接口对象作为参数传给init()方法,该接口对象为Servlet提供对ServletContext接口的访问。Servlet容器使用ServletContext接口与Servlet容器进行通信;
如果初始化Servlet失败,则抛出UnavailableException或ServletException异常,并再次尝试对Servlet进行实例化和初始化。然后将ServletRequest和ServletResponse接口作为参数传递给service方法,该方法将处理请求并返回响应。
如果响应请求时发生异常,则容器通过调用destroy()方法卸载实例]
Part 5 Servlet API
在javax.servlet和javax.servlet.http包中的各类和接口如下:
(1)ServletInputStream类
从java.io.InputStream类扩展而来的抽象类,该类创建的对象用于读取客户端请求中的二进制数据,而该类的readLine()方法用于每次读取一行数据;
该方法将从给定偏移处开始的每字节读取到数组中,直到该方法遇到换行符或者读取完一定量的字节数量,该方法返回一个整数来指定实际读取的字节数,到达流尾时返回-1
public int readLine(byte b[],int offset,int length)throws java.io.IOException//b为用于存储读取的数据的字节数组;offset指定方法开始读取字符的起始位置;length读取的最大字节数
(2)ServletOutputStream类
该类创建的对象用于将二进制数据从服务器发送到客户端。具体实现的方法如下:
+ print():将字符串写入客户端。如果发生任何输入或输出异常,则方法print()会引发IOException异常,print()方法接受参数,如char,float,double,int,long,String。
public void print(String str)throws java.io.IOException//str为发送到客户端的字符串
+ println():将字符串写入客户端,紧跟后面输出回车。如果发生任何I/O异常,则会引发IOException
(3)ServletRequest接口
使用ServletRequest接口创建对象,用于使客户端请求信息对Servlet可用。创建的对象作为参数传递至Servlet的service()。
该类实现方法如下:
+ getInputStream():返回客户端请求中的二进制数据,并将其保存在getInputStream对象中
public ServletInputStream getInputStream()throws IOException
+ getParameter():用于获取请求消息一起发送的附加信息-----请求参数
public String getParameter(String str)
+ getContentLength():返回客户端发送的请求的实际长度,如果长度未知,则返回-1
public int getContentLength()
+ getServerName():返回请求发至的服务器名称
public String getServerName()
(4)ServletResponse接口
使用该接口创建的对象用于向客户端提供响应。创建的对象作为参数传递至Servlet的service()方法中。该接口实现的方法如下:
+ getOutpouStream():返回一个ServletOutputStream对象,它被用来发送对客户端的响应
public ServletOutputStream getOutputStream()throws IOException
+ getWriter():返回将字符文本发送到客户端的PrintWriter对象
public PrintWriter getWriter()throws IOException
+ setContentLength():允许用户设置将作为响应放的数据的长度
public void setContentLength(int length)
+ getBufferSize():检索实际的以响应客户端的缓存区大小。若没有使用缓冲区则返回0
public int getBufferSize()
+ setBufferSize():设置将发送到客户端的数据的缓冲区的大小
public void setBufferSize(int size)
(5)HttpServletRequest接口
容器在调用Servlet的doGet()或doPost()方法时,会创建一个HttpServletRequest接口的实例和一个HttpServletResponse接口的实例,作为参数传递给doGet和doPost()方法。该接口代表客户请求,它提供了多种获取请求数据的方法,具体继承层次如图:
(未完结,下午继续)