⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servlet简介.htm

📁 写给JSP初级程序员的书
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://eps.www85.cn4e.com/java/article/devshow.asp?id=154 -->
<HTML><HEAD><title>csdn_Servlet简介</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>TD {
	FONT-FAMILY: "Verdana", "Arial", "宋体"; FONT-SIZE: 9pt
}
A {
	COLOR: #660000; TEXT-DECORATION: underline
}
A:hover {
	COLOR: #660000; TEXT-DECORATION: none
}
.line {
	LINE-HEIGHT: 14pt
}
</STYLE>

<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>
<table>
  <TBODY>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT  size=3>Servlet简介 <BR><FONT 
      size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300>servlet简介<BR>servlet容器:<BR><BR>负责处理客户请求、把请求传送给servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与servlet之间的接口是由servletAPI定义好的,这个接口定义了servlet容器在servlet上要调用的方法及传递给servlet的对象类。<BR><BR>servlet的生命周期:<BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servlet容器创建servlet的一个实例<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器调用该实例的init()方法<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果容器对该servlet有请求,则调用此实例的service()方法<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器在销毁本实例前调用它的destroy()方法<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;销毁并标记该实例以供作为垃圾收集<BR><BR>一旦请求了一个servlet,就没有办法阻止容器执行一个完整的生命周期。<BR><BR>容器在servlet首次被调用时创建它的一个实例,并保持该实例在内存中,让它对所有的请求进行处理。容器可以决定在任何时候把这个实例从内存中移走。在典型的模型中,容器为每个servlet创建一个单独的实例,容器并不会每接到一个请求就创建一个新线程,而是使用一个线程池来动态的将线程分配给到来的请求,但是这从servlet的观点来看,效果和为每个请求创建一个新线程的效果相同。<BR><BR>servlet&nbsp;API<BR>servlet接口:<BR><BR>public&nbsp;interface&nbsp;Servlet<BR><BR>它的生命周期由javax.servlet.servlet接口定义。当你在写servlet的时候必须直接或间接的实现这个接口。一般趋向于间接实现:通过从javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在实现servlet接口时必须实现它的五个方法:<BR><BR>init():<BR><BR>public&nbsp;void&nbsp;init(ServletConfig&nbsp;config)&nbsp;throws&nbsp;ServletException<BR><BR>一旦对servlet实例化后,容器就调用此方法。容器把一个ServletConfig对象传统给此方法,这样servlet的实例就可以把与容器相关的配置数据保存起来供以后使用。如果此方法没有正常结束就会抛出一个ServletException。一旦抛出该异常,servlet就不再执行,而随后对它的调用会导致容器对它重新载入并再次运行此方法。接口规定对任何servlet实例,此方法只能被调用一次,在任何请求传递给servlet之前,此方法可以在不抛出异常的情况下运行完毕。<BR><BR>service():<BR><BR>public&nbsp;void&nbsp;service(ServletRequest&nbsp;req,ServletResponse&nbsp;res)&nbsp;throws&nbsp;ServletException,IOException<BR><BR>只有成功初始化后此方法才能被调用处理用户请求。前一个参数提供访问初始请求数据的方法和字段,后一个提供servlet构造响应的方法。<BR><BR>destroy():<BR><BR>public&nbsp;void&nbsp;destroy()<BR><BR>容器可以在任何时候终止servlet服务。容器调用此方法前必须给service()线程足够时间来结束执行,因此接口规定当service()正在执行时destroy()不被执行。<BR><BR>getServletConfig():<BR><BR>public&nbsp;ServletConfig&nbsp;getServletConfig()<BR><BR>在servlet初始化时,容器传递进来一个ServletConfig对象并保存在servlet实例中,该对象允许访问两项内容:初始化参数和ServletContext对象,前者通常由容器在文件中指定,允许在运行时向sevrlet传递有关调度信息,后者为servlet提供有关容器的信息。此方法可以让servlet在任何时候获得该对象及配置信息。<BR><BR>getServletInfo():<BR><BR>public&nbsp;String&nbsp;getServletInfo()<BR><BR>此方法返回一个String对象,该对象包含servlet的信息,例如开发者、创建日期、描述信息等。该方法也可用于容器。<BR><BR>GenericServlet类<BR>Public&nbsp;abstract&nbsp;class&nbsp;GenericServlet&nbsp;implants&nbsp;Servlet,ServletConfig,Serializable<BR><BR>此类提供了servlet接口的基本实现部分,其service()方法被申明为abstract,因此需要被派生。init(ServletConfig&nbsp;conf)方法把servletConfig对象存储在一个private&nbsp;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&nbsp;msg)方法将servlet的名称和msg参数写到容器的日志中,log(String&nbsp;msg,Throwable&nbsp;cause)除了包含servlet外还包含一个异常。<BR><BR>HttpServlet类<BR>该类扩展了GenericServlet类并对servlet接口提供了与HTTP更相关的实现。<BR><BR>service():<BR><BR>protected&nbsp;void&nbsp;service(HttpServletRequest&nbsp;req,HttpServletResponse&nbsp;res)&nbsp;throws&nbsp;ServletException,IOException<BR><BR>public&nbsp;void&nbsp;service(HttpServletRequest&nbsp;req,HttpServletResponse&nbsp;res)throws&nbsp;ServletException,IOException<BR><BR>该方法作为HTTP请求的分发器,这个方法在任何时候都不能被重载。当请求到来时,service()方法决定请求的类型(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把请求分发给相应的处理方法(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每个do方法具有和第一个service()相同的形式。为了响应特定类型的HTTP请求,我们必须重载相应的do方法。如果servlet收到一个HTTP请求而你没有重载相应的do方法,它就返回一个说明此方法对本资源不可用的标准HTTP错误。<BR><BR>getLatModified():<BR><BR>protected&nbsp;long&nbsp;getLastModified(HttpServletRequest&nbsp;req)<BR><BR>该方法返回以毫秒为单位的的自GMT时间1970年1月1日0时0分0秒依赖的最近一次修改servlet的时间,缺省是返回一个负数表示时间未知。当处理GET请求时,调用此方法可以知道servlet的最近修改时间,服务器就可决定是否把结果从缓存中去掉。<BR><BR>HttpServletRequest接口<BR>public&nbsp;interface&nbsp;HttpServletRequest&nbsp;extends&nbsp;ServletRequest<BR><BR>所有实现此接口的对象(例如从servlet容器传递的HTTP请求对象)都能让servlet通过自己的方法访问所有请求的数据。下面是一些用来获取表单数据的基本方法。<BR><BR>getParameter()<BR><BR>public&nbsp;String&nbsp;getParameter(String&nbsp;key)<BR><BR>此方法试图将根据查询串中的关键字定位对应的参数并返回其值。如果有多个值则返回列表中的第一个值。<BR><BR>getParameterValues():<BR><BR>public&nbsp;String[]&nbsp;getParameterValues(String&nbsp;key)<BR><BR>如果一个参数可以返回多个值,比如复选框集合,则可以用此方法获得对应参数的所有值。<BR><BR>GetParameterNames():<BR><BR>Public&nbsp;Enumeration&nbsp;getParameterNames()<BR><BR>此方法返回一个Enumeration对象,包含对应请求的所有参数名字列表。<BR><BR>HttpServletResponse接口<BR>public&nbsp;interface&nbsp;HttpServletResponse&nbsp;extends&nbsp;servletResponse<BR><BR>servlet容器提供一个实现该接口的对象并通过service()方法将它传递给servlet。通过此对象及其方法,servlet可以修改响应头并返回结果。<BR><BR>setContentType():<BR><BR>public&nbsp;void&nbsp;setContentType(String&nbsp;type)<BR><BR>在给调用者发回响应前,必须用此方法来设置HTTP响应的MIME类型。可以是任何有效的MIME类型,当给浏览器返回HTML是就是”text/html”类型。<BR><BR>getWriter():<BR><BR>public&nbsp;PrintWriter&nbsp;getWriter()throws&nbsp;IOException<BR><BR>此方法将返回PrintWriter对象,把servlet的结果作为文本返回给调用者。PrintWriter对象自动把Java内部的UniCode编码字符转换成正确的编码以使客户端能够阅读。<BR><BR>getOutputStream():<BR><BR>public&nbsp;ServletOutputStream&nbsp;getOutputStream()&nbsp;throws&nbsp;IOException<BR><BR>此方法返回ServletOutputStream对象,它是java.io.OutputStream的一个子类。此对象向客户发送二进制数据。<BR><BR>setHeader():<BR><BR>public&nbsp;void&nbsp;setHeader(String&nbsp;name,String&nbsp;value)<BR><BR>此方法用来设置送回给客户的HTTP响应头。有一些快捷的方法用来改变某些常用的响应头,但有时也需要直接调用此方法。<BR><BR>编译条件<BR>需要从http://java.sun.com/products/servlet/&nbsp;获得一份JSDK的拷贝,并把servlet.jar移动到JDK安装目录下的\jre\lib\ext目录下。如果是JDK1.1,则移动到\lib下,并在CLASSPATH中加入servlet.jar的绝对路径。<BR><BR>运行条件<BR>需要Apache&nbsp;Jserv,Jrun&nbsp;Servlet&nbsp;Exec,Java&nbsp;Web&nbsp;Server,Weblogic,WebSphere,Tomcat,Resin等servlet服务器端程序。<BR><BR>简单范例<BR>import&nbsp;java.io.*;<BR><BR>import&nbsp;javax.servlet.*;<BR><BR>import&nbsp;javax.servlet.http.*;<BR><BR>&nbsp;<BR><BR>public&nbsp;class&nbsp;HelloWorld&nbsp;extends&nbsp;HttpServlet&nbsp;{<BR><BR>&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException,&nbsp;ServletException<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType("text/html");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;=&nbsp;response.getWriter();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;html&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;body&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;head&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;title&gt;Hello&nbsp;World!&lt;/title&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;/head&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;body&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;h1&gt;Hello&nbsp;World!&lt;/h1&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;/body&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&lt;/html&gt;");<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>}<BR><BR>servlet的性能和效率<BR>一个servlet仅被初始化一次而执行多次,因此极小的低效性也会随着时间的增加而产生很很大的影响。在代码中需要考虑String对象的使用,如果产生HTML响应需要用到很多字符串时,不应该为每一个字符串生成一个String对象,因为这会产生大量的String和StringBuffer对象,造成大量的对象构造消耗和垃圾收集负担,解决的办法是一行一行的把所有需要写入的直接写入PrintWriter中,或者创建一个StringBuffer对象,并使用append()方法将文本加入。<BR><BR>及时回送<BR>有时,程序需要花费很长时间执行,在这种情况下应该回送给客户端一些信息,而不是长时间显示白屏,这可以在执行到一定程度就回送一些东西,可以使用PrintWriter的flush()方法强制将现有的内容回送给浏览器。<BR><BR>&nbsp;<BR><BR><BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -