servlet介绍.doc_第1页
servlet介绍.doc_第2页
servlet介绍.doc_第3页
servlet介绍.doc_第4页
servlet介绍.doc_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA软件工程师ColdWind提供:QQ:347993010 E-mail:ColdWind整理所得,未经允许,不得拷贝! 来自我家 J2EE-Web之Servlet组件 ColdWind2009.1一、什么是ServletServlet是一种用Java语言编写的Web组件,运行于Web服务器端。它扩展了Web服务器的功能,它由Servlet容器管理,能够产生动态网页输出。已逐步取代了CGI。Servlet可以被编译成Java类,由Web服务器动态装入并运行,在运行期间对客户的请求产生响应。通常在J2EE应用中,客户将通过JSP同Servlet进行通信。Servlet将调用EJB。而EJB将通过使用Java数据库连接器(JDBC)同数据库进行通信。二、 Servlet的特点:1 Servlet同CGI的对比相同点:都是Web服务器端组件,都能产生Web动态页面输出不同点:(1)传统CGI对每一个HTTP请求都要产生一个新的进程。如果多个CGI程序执行一个客户端的请求,系统为每一个请求都分配了一个进程,那么打开进程的时间也许占用了大部分执行时间。而对JAVA Servlets来说,在JAVA 虚拟机上,每一个请求由一个小JAVA线程(thread)响应,而不是一个大操作系统进程。类似地,传统CGI如果对同一个CGI程序有N个同时请求,这个CGI程序的代码将被导入内存N次。JAVA Servlets 产生N个线程,但只有一个JAVA Servlets 类的copy。同时JAVA Servlets比CGI有更多的优化选择,像预先计算,打开数据库连接等。 (2) 跨平台性,JAVA Servlets使用JAVA编写,遵循标准API。它能直接或借助插件在几乎所有WEB服务器上运行。2 Servlet的其他特性l 易于编写,功能强大l 与系统资源交互文件、数据库、Applet、Java应用程序等;三、 Servlet的工作过程Web服务器在与客户端交互时,Servlet的工作过程是:1. 在客户端对Web服务器端发出请求。2. Web服务器接收到请求后将其发送给Servlet容器。3. Servlet容器为此产生一个实例对象并调用Servlet API中相应的方法来对 客户端HTTP请求进行处理,然后将处理的响应结果返回给Web服务器。4. Web服务器将从Servlet实例对象中收到的响应结果发送回客户端。四、ServletAPI包Java Servlet API包中提供的类和接口是用于完成客户端与Servlet对象交互的,由两个Java包组成的:javax.servlet和javax.servlet.http.在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的通用接口和类。在javax.servlet.http包中除了实现servlet包中的基本功能外还特别针对于HTTP协议定义了HttpServlet类。ServletAPI的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。在Servlet接口中定义了5个方法,其中有3方法代表了Servlet的生命周期:l init方法,负责初始化Servlet对象l service方法,负责响应客户的请求l destroy方法,当Servlet对象退出生命周期时,负责释放占用的资源Servlet的框架结构如图示从图中可以看出,GenericServlet实现了Servlet接口,而HttpServlet扩展了GenericServlet。当用户开发自己应用于HTTP协议的Servlet类时,Servlet类必须扩展HttpServlet类:l 扩展HttpServlet类如果Servlet类扩展了HttpServlet类,通常不必必须实现service方法,因为HttpServlet类实现了service方法,该方法的声明形式如下: protected void service(HttpServletRequest request HttpServletResponse response) throws ServletException,IOException;在HttpServlet的service方法中,首先从HttpServletRequest对象中获取HTTP请求方式信息,然后再根据请求方式调用相应的方法。例如,如果请求方式为GET,那么调用doGet方法;如果请求方式为POST,那么调用doPost方法。五、 Servlet生命周期Servlet的生命周期开始于一个Servlet被装载到Servlet容器中,结束于被终止或重新装入时,Servlet的生命周期可分为3个阶段;初始化阶段、响应客户请求阶段和终止阶段。在javax.servlet.Servlet接口定义了3个方法init()、service()、destroy(),它们将分别在Servlet的不同阶段被调用。1Servlet容器启动时创建一个Servlet类的实例。2调用这个Servlet实例中的init()方法进行初始化(相当于Java类中的构造方法),在Servlet的整个生命周期中,init方法只会被调用一次,在Servlet的初始化阶段,Servlet容器会为Servlet会为Servlet创建一个ServletConfig对象,用来存放Servlet的初始化信息、如Servlet的一些初始参数。在Servlet类覆盖带参数的init方法,应先调用super.init(config)方法确保参数config引用ServletConfig对象。我们一般在初始阶段进行数据库连接或初始化一些变量等工作。3当一个客户端的请求到达Web服务器时,Web服务器把请求转交给Servlet容器。Servlet容器创建一个请求对象和一个响应对象,在没有对应的处理HTTP请求时,Servlet执行默认的service()方法。当客户端有明确的请求时,Web服务器激活Servlet实例中处理相关请求的方法,将请求对象和响应对象作为参数传递给方法,从请求对象和响应对象中获得需要的信息并处理请求,例如,doGet()或doPost()等方法。4 当更多的客户端请求发生时,Servlet容器创建新的请求对象和响应对象,激活Servlet实例的方法处理请求。Servlet能同时运行多个服务处理多个请求和响应,5 当Web服务器不再需要Servlet实例时,Web服务器将卸载Servlet,调用Servlet类的Destroy()方法是Servlet最后的工作。我们通常在这时关闭数据库连接等。六、Servlet结构 Servlet基本功能结构为:import java.io.*;import javax.servlet.*; /导入Java Servlet API: 标准的Java的扩展程序包import javax.servlet.http.*; /基于HTTP协议,Servelt导入javax.servlet.http包public class BasicServlet extends HttpServletprivate static final String CONTENT_TYPE = text/html; /定义返回客户端文本类型/*Servlet默认程序入口方法*/public void init(ServletConfig config) throws ServletExceptionsuper.init(config); /初始化Servlet变量等/*Servlet默认程序入口方法*/public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException /抛出两个异常String clientIPAddress = request.getRemoteAddr(); /使用request读取客户端与请求有关的信息response.setContentType(CONTENT_TYPE); /使用response指定HTTP应答状态代码PrintWriter out = response.getWriter(); /使用out把应答内容发送到客户端浏览器 /或ServletOutputStream out=response.getOutputStream();out.println(); /输出客户端out.println(BasicServlet);out.println();out.println(Servlet );out.println();/*处理HTTP Get请求方法*/public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException /抛出两个异常 /request读取信息,response指定应答PrintWriter out=response.getWriter(); /响应客户端/*处理HTTP Post请求方法*/public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException /request读取信息, response指定应答PrintWriter out=response.getWriter(); /响应客户端 /*Servlet撤消方法*/public void destroy() /处理Servlet被卸载前的工作 七、HTTP与HttpServletWeb浏览器和服务器通过HTT P协议在Internet上发送和接收消息。HTTP是一种基于请求/响应模式的协议。客房送一个请求,服务器端返回对该请求响应。HTTP使用可靠的TCP连接,默认端口是80。HTTP请求HTTP请求由3个部分构成,分别是:l 请求方法URI协议/版本l 请求头(Request Header)l 请求正文下面是一个HTTP请求的例子:GET/sample.jspHTTP/1.1Accept:image/gif.image/jpeg,*/*Accept-Language:zh-cnConnection:Keep-AliveHost:localhostUser-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)Accept-Encoding:gzip,deflateusername=jinqiao&password=12341. 请求方法URI协议/版本请求的第一行是“方法URL议/版本”:GET/sample.jspHTTP/1.1以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1”代表协议和协议的版本。根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。2请求头(Request Header)请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。Accept:image/gif.image/jpeg.*/*Accept-Language:zh-cnConnection:Keep-AliveHost:localhostUser-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)Accept-Encoding:gzip,deflate.3请求正文请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:username=jinqiao&password=1234在以上的例子的HTTP请求中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。HTTP响应与HTTP请求相似,HTTP响应也由3个部分构成,分别是:l 协议状态版本代码描述l 响应头(Response Header)l 响应正文下面是一个HTTP响应的例子:HTTP/1.1 200 OKServer:Apache Tomcat/5.0.12Date:Mon,6Oct2003 13:23:42 GMTContent-Length:112HTTP响应示例Hello HTTP!1. 协议状态代码描述HTTP响应的第一行类似于HTTP请求的第一行,它表示通信所用的协议是HTTP1.1服务器已经成功的处理了客户端发出的请求(200表示成功):HTTP/1.1 200 OK2. 响应头(Response Header)响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等: Server:Apache Tomcat/5.0.12Date:Mon,6Oct2003 13:13:33 GMTContent-Type:text/htmlLast-Moified:Mon,6 Oct 2003 13:23:42 GMTContent-Length:1123. 响应正文响应正文就是服务器返回的HTML页面:HTTP响应示例Hello HTTP!响应头和正文之间也必须用空行分隔。3HTTPServlet的功能在了解具体的HTTP协议规范后,可以更好地理解HttpServlet的作用,它能够根据客户发出HTTP请求,生成相应的HTTP响应结果。HttpServlet首先必须读取HTTP请求的内容。Servlet容器负责创建HttpRequest对象,并把HTTP请求信息封装到HttpRequest对象中,这大大简化了HttpServlet解析请求数据的工作量。如果没有HttpRequest,HttpServlet只能直接处理Web客户发出的原始的字符数据,有了HttpRequest后,只要调用HttpServletRequest的相关方法,就可以方便地读取HTTP请求中任何一部分信息,HttpServletRequest中读取HTTP请求信息的常用方法参见下表方法描述getCookie()返回HTTP请求的CookiesgetHeader(String name)返回参数指定的HTTP请求的Header数据getRequestURI()返回HTTP请求的URIgetQueryString()返回HTTP请求数据中的查询字符串getMethod()返回HTTP请求方法Servlet容器还向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通过它来生成HTTP响应的每一部分内容,HttpServletResponse提供了生成响应数据Header的方法方法描述addCookie(Cookie cookie)向HTTP响应中加入CookiesetHeader(String name,String value)设置HTTP响应的Header,如果参数name对应的Header已经存在,则覆盖原来的Header数据addHeader(String name,String value)向HTTP响应中加入HeaderServlet容器响应Web客户请求流程的UML时序图在时序图中,从对象A到对象B的箭头,表示A向B发送一条消息,B接收到消息后,将执行相关的操作,因此也可理解为A调用B的方法。例如在UML时序图步骤5,表示Servlet容器调用HttpServlet的service()方法,对于步骤2,箭头的起点和终点都指向Servlet容器,表示Servlet容器调用自身的方法来解析HTTP请求信息。1. Web客户向Servlet容器发出HTTP请求;2. Servlet容器解析Web的HTTP请求;3. Servlet容器创建一个HttpRequest对象,在这个对象中封装了HTTP请求信息;4. Servlet容器创建一个HttpResponse对象;5. Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象为Service方法的参数传给HttpServlet对象;6. HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;7. HttpServlet调用HttpResponse的有关方法,生成响应数据;8. Servlet容器把HttpServlet的响应结果传给Web客户处理请求头Servlet例程 处理请求头Servlet小应用程序import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import java.text.*;public class RequestHeader extends HttpServlet ResourceBundle rb = ResourceBundle.getBundle(LocalStrings); public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException response.setContentType(text/html); PrintWriter out = response.getWriter(); out.println(); out.println(); out.println(); String title = rb.getString(requestheader.title); out.println( + title + ); out.println(); out.println();/ all links relative out.println( + title + ); out.println(); Enumeration e = request.getHeaderNames(); while (e.hasMoreElements() String headerName = (String)e.nextElement(); String headerValue = request.getHeader(headerName); out.println( + headerName); out.println( + headerValue + ); out.println(); public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException doGet(request, response); 八、支持Servlet的Web服务器系统公司Web服务器产品cauchoResinApache Tomcat BEABEA Weblogic Server IBMIBM Websphere Application ServerOracle9iOracle9i Application Server 安装Tomcat在Windows2000的操作系统中安装Tomcat安装Tomcat之前,首先安装JDK,假定JDK安装在C:/j2sdk1.4.2目录下。接下解压缩Tomcat安装文件。然后设定两个环境变量:JAVA_HOME,它是JDK的安装目录。CATALINA_HOME,它是Tomcat的安装目录(1) 打开“控制面板”,选择“系统”图标。(2) 双击“系统”面板,在“高级”标签中的“环境变量”按钮。(3) 单击“系统变量”区域的“新建”按钮,会出现“新建系统变量”对话框,在其中新建JAVA_HOME。变量值为C:j2sdk1.4.2(4) 重复以下步骤,在新建CATALINA_HOME环境变量,变量值为C:jakarta-tomcat测试Tomcat是否安装成功,必须先启动Tomcat服务器。之后可以通过浏览器访问以下URL:http:/localhost:8080/出现如下页面代表成功九、布署Servlet1. 在RESIN中布署2. 在Tomcat中布署十、servlet实际应用【实例1】 将编译好的Servlet类文件保存到Java Web服务器Web应用程序(WebServerName)的“docWEB-INFclasses”目录中,启动Resin(执行httpd.bat)。通过浏览器启动Servlet。在浏览器地址栏中键入:http:/localhost:8080/servlet/MyTestServlet 。import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class MyTestServlet extends HttpServletprivate static finalStringCONTENT_TYPE = text/html;charset=GB2312;/*Initialize global variables*/public void init(ServletConfig config) throws ServletExceptionsuper.init(config);/*Process the HTTP Get request*/public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOExceptionresponse.setContentType(CONTENT_TYPE);PrintWriter out = response.getWriter();out.println();out.println(MyTestServlet小应用程序);out.println();out.println(MyTestServlet小应用程序);out.println();/*Clean up resources*/public void destroy()1. 启动My TestServlet程序,执行结果如下图所示。【实例2】 Servlet输出客户端发送的请求信息,程序名为RequestInfo.java。import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class RequestInfo extends HttpServletpublic void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException/重写doGet()方法response.setContentType(text/html);PrintWriter out=response.getWriter();/*HttpServletResponse对象生成响应*响应对象把含有getWriter()方法返回给一个叫PrintWriter对象*使用PrintWriter的print()和Print()方法以编写Servlet响应返回给客户端*/out.println();out.println();out.println();out.println(Request Information Example);out.println();out.println();out.println(Request Information Example);out.println(Method:+request.getMethod();out.println(Request URI:+request.getRequestURI();out.println(Protocol:+request.getProtocol();out.println(PathInfo:+request.getPathInfo();out.println(Remote Address:+request.getRemoteAddr();out.println();out.println();public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletExceptiondoGet(request,response);/doPost()把请求送给doGet方法启动Request Header程序,执行结果如下图所示。3处理表单Servlet程序在客户端与网络使用者交互的最好形式之一是通过表单(Form)完成的,在Web程序设计中,处理表单提交的数据是获取数据的主要方法。表单数据的提交在HTTP协议中有两种方法:Post方法和Get方法。当使用Post方法时,表单数据由标准的输入设备读入。当使用Get方法时,表单数据由URL上的QUERY_STRING查询字符串传递给表单数据处理程序(Servlet)。HttpServlet会重写doGet()或doPost方法对表单数据进行处理,编程者可以调用HttpServletRequest对象的getParameter()方法,给出变量名称即可取得该变量的值,对于两种方法提交的数据,Servlet程序的处理方法是一样的。当请求的变量不存在时,将会返回一个空字符串(null)。如果变量有多个值,调用getParameterValues()方法将会返回一个明细表(Enumeration)。【实例3】在下面的例子中,用户可以通过两个表单向servlet提交一个正数,其中一个表单的提交方式是Post,另一个表单的提交方式是get,无论用户用哪种方式,服务器的servlet都计算这个数的全部因数,并返回给用户。Query.htmlQuery请输入一个数,提交给servlet(Post)方式);输入一个数,提交给servlet(Get)方式;ComputerFacetor.javaimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class ComputerFacetor extends HttpServlet public void init(ServletConfig config)throws ServletException super.init(config); public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException PrintWriter out=response.getWriter(); response.setContentType(text/html;charset=GB2312); out.println(); out.println(); String number=request.getParameter(number); double n=0; try n=Double.parseDouble(number); out.println( factors of+n+;); for(int i=1;i=n;i+) if(n%i=0) out.println(i); catch(NumberFormatException e) out.print(input number letter please!); public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException doPost(request,response);结果如图:【实例4】 Servlet从客户端读取表单数据,Servlet程序名为Get FormData.java。在客户端的HTML文档文件如下(文件名:读取表单数据.html): Servlet读取表单数据实例 读取表单数据页面 Servlet GetFormData 页面 username: password: Email: homepage: 语句(localhost:8080用于单机调试)是HTML文件中表单数据提交语句,当单击“确认提交”按钮后启动GetFormData程序,GetFormData程序完成表单数据的读取。下图为浏览“读取表单数据页面”的页面。在Java Web服务器端的GetFormData程序如下:import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class GetFormData extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html); PrintWriter out = response.getWriter(); String title = 读取表单数据; out.println(+ + + title + + n + + title + n + n + username: + request.getParameter(username) + n + password:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论