快捷搜索:

Servlet简介

servlet简介

servlet容器:

认真处置惩罚客户哀求、把哀求传送给servlet并把结果返回给客户。不合法度榜样的容器实际实现可能有所变更,但容器与servlet之间的接口是由servletAPI定义好的,这个接口定义了servlet容器在servlet上要调用的措施及通报给servlet的工具类。

servlet的生命周期:

lservlet容器创建servlet的一个实例

l容器调用该实例的init()措施

l假如容器对该servlet有哀求,则调用此实例的service()措施

l容器在销毁本实例前调用它的destroy()措施

l销毁并标记该实例以供作为垃圾网络

一旦哀求了一个servlet,就没有法子阻拦容器履行一个完备的生命周期。

容器在servlet首次被调用时创建它的一个实例,并维持该实例在内存中,让它对所有的哀求进行处置惩罚。容器可以抉择在任何时刻把这个实例从内存中移走。在范例的模型中,容器为每个servlet创建一个零丁的实例,容器并不会每接到一个哀求就创建一个新线程,而是应用一个线程池来动态的将线程分配给到来的哀求,然则这从servlet的不雅点来看,效果和为每个哀求创建一个新线程的效果相同。

servlet API

servlet接口:

public interface Servlet

它的生命周期由javax.servlet.servlet接口定义。当你在写servlet的时刻必须直接或间接的实现这个接口。一样平常趋向于间接实现:经由过程从javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在实现servlet接口时必须实现它的五个措施:

init():

public void init(ServletConfig config) throws ServletException

一旦对servlet实例化后,容器就调用此措施。容器把一个ServletConfig工具传统给此措施,这样servlet的实例就可以把与容器相关的设置设置设备摆设摆设数据保存起来供今后应用。假云云措施没有正常停止就会抛出一个ServletException。一旦抛出该非常,servlet就不再履行,而随后对它的调用会导致容器对它从新载入并再次运行此措施。接口规定对任何servlet实例,此措施只能被调用一次,在任何哀求通报给servlet之前,此措施可以在不抛出非常的环境下运行完毕。

service():

public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException

只有成功初始化后此措施才能被调用场置惩罚用户哀求。前一个参数供给造访初始哀求数据的措施和字段,后一个供给servlet构造相应的措施。

destroy():

public void destroy()

容器可以在任何时刻终止servlet办事。容器调用此措施前必须给service()线程足够光阴来停止履行,是以接口规定当service()正在履行时destroy()不被履行。

getServletConfig():

public ServletConfig getServletConfig()

在servlet初始化时,容器通报进来一个ServletConfig工具并保存在servlet实例中,该工具容许造访两项内容:初始化参数和ServletContext工具,前者平日由容器在文件中指定,容许在运行时向sevrlet通报有关调整信息,后者为servlet供给有关容器的信息。此措施可以让servlet在任何时刻得到该工具及设置设置设备摆设摆设信息。

getServletInfo():

public String getServletInfo()

此措施返回一个String工具,该工具包孕servlet的信息,例如开拓者、创建日期、描述信息等。该措施也可用于容器。

GenericServlet类

Public abstract class GenericServlet implants Servlet,ServletConfig,Serializable

此类供给了servlet接口的基础实现部分,其service()措施被申明为abstract,是以必要被派生。init(ServletConfig conf)措施把servletConfig工具存储在一个private transient(私有临时)实例变量里,getServletConfig()措施返回指向本工具的指针,假如你重载此措施,将不能应用getServletConfig来得到ServletConfig工具,假如确凿想重载,记着要包孕对super.config的调用。2.1版的API供给一个重载的没有参数的init()措施。现在在init(ServletConfig)措施停止时有一个对init()的调用,只管今朝它是空的。2.1版API里面,此类实现了ServletConfig接口,这使得开拓者不用得到ServletConfig工具环境下直接调用ServletConfig的措施,这些措施是:getInitParameter(),getInitParameterNames(),getServletContext。此类还包孕两个写日志的措施,它们实际上调用的是ServletContext上的对应措施。log(String msg)措施将servlet的名称和msg参数写到容器的日志中,log(String msg,Throwable cause)除了包孕servlet外还包孕一个非常。

HttpServlet类

该类扩展了GenericServlet类并对servlet接口供给了与HTTP更相关的实现。

service():

protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException

public void service(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException

该措施作为HTTP哀求的分发器,这个措施在任何时刻都不能被重载。当哀求到来时,service()措施抉择哀求的类型(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把哀求分发给响应的处置惩罚措施(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每个do措施具有和第一个service()相同的形式。为了相应特定类型的HTTP哀求,我们必须重载响应的do措施。假如servlet收到一个HTTP哀求而你没有重载响应的do措施,它就返回一个阐明此措施对本资本弗成用的标准HTTP差错。

getLatModified():

protected long getLastModified(HttpServletRequest req)

该措施返回以毫秒为单位的的自GMT光阴1970年1月1日0时0分0秒依附的近来一次改动servlet的光阴,缺省是返回一个负数表示光阴未知。当处置惩罚GET哀求时,调用此措施可以知道servlet的近来改动光阴,办事器就可抉择是否把结果从缓存中去掉落。

HttpServletRequest接口

public interface HttpServletRequest extends ServletRequest

所有实现此接口的工具(例如从servlet容器通报的HTTP哀求工具)都能让servlet经由过程自己的措施造访所有哀求的数据。下面是一些用来获取表单数据的基础措施。

getParameter()

public String getParameter(String key)

此措施试图将根据查询串中的关键字定位对应的参数并返回其值。假如有多个值则返回列表中的第一个值。

getParameterValues():

public String[] getParameterValues(String key)

假如一个参数可以返回多个值,比如复选框聚拢,则可以用此措施得到对应参数的所有值。

GetParameterNames():

Public Enumeration getParameterNames()

此措施返回一个Enumeration工具,包孕对应哀求的所有参数名字列表。

HttpServletResponse接口

public interface HttpServletResponse extends servletResponse

servlet容器供给一个实现该接口的工具并经由过程service()措施将它通报给servlet。经由过程此工具及其措施,servlet可以改动相应头并返回结果。

setContentType():

public void setContentType(String type)

在给调用者发还相应前,必须用此措施来设置HTTP相应的MIME类型。可所以任何有效的MIME类型,当给浏览器返回HTML是便是”text/html”类型。

getWriter():

public PrintWriter getWriter()throws IOException

此措施将返回PrintWriter工具,把servlet的结果作为文本返回给调用者。PrintWriter工具自动把Java内部的UniCode编码字符转换成精确的编码以使客户端能够涉猎。

getOutputStream():

public ServletOutputStream getOutputStream() throws IOException

此措施返回ServletOutputStream工具,它是java.io.OutputStream的一个子类。此工具向客户发送二进制数据。

setHeader():

public void setHeader(String name,String value)

此措施用来设置送回给客户的HTTP相应头。有一些快捷的措施用来改变某些常用的相应头,但无意偶尔也必要直接调用此措施。

编译前提

必要从http://java.sun.com/products/servlet/ 得到一份JSDK的拷贝,并把servlet.jar移动到JDK安装目录下的jrelibext目录下。假如是JDK1.1,则移动到lib下,并在CLASSPATH中加入servlet.jar的绝对路径。

运行前提

必要Apache Jserv,Jrun Servlet Exec,Java Web Server,Weblogic,WebSphere,Tomcat,Resin等servlet办事器端法度榜样。

简单典型

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException

{

response.setContentType("text/html");

PrintWriter out = response.getWriter();

out.println("");

out.println("");

out.println("");

out.println("");

out.println("Hello World!");

out.println("");

out.println("");

}

}

servlet的机能和效率

一个servlet仅被初始化一次而履行多次,是以极小的低效性也会跟着光阴的增添而孕育发生很很大年夜的影响。在代码中必要斟酌String工具的应用,假如孕育发生HTML相应必要用到很多字符串时,不应该为每一个字符串天生一个String工具,由于这会孕育发生大年夜量的String和StringBuffer工具,造成大年夜量的工具构造耗损和垃圾网络包袱,办理的法子是一行一行的把所有必要写入的直接写入PrintWriter中,或者创建一个StringBuffer工具,并应用append()措施将文本加入。

及时回送

无意偶尔,法度榜样必要花费很长光阴履行,在这种环境下应该回送给客户端一些信息,而不是长光阴显示白屏,这可以在履行到必然程度就回送一些器械,可以应用PrintWriter的flush()措施强制将现有的内容回送给浏览器。

您可能还会对下面的文章感兴趣: