快捷搜索:

JAVA Servlets简介

Servlets是JAVA 2.0中新增的一个全新功能, Servlets是一种采纳JAVA技巧来实现CGI功能的一种技巧。Servlet和CGI一样都是运行在WEB办事器上,用来天生WEB页面。

一、JAVA Servlets为什么优于传统的CGI

JAVA Servlets比传统的CGI或其它CGI类似替代技巧来说,效率更高,应用更方便,功能更强大年夜,更小巧也更便宜:

1)效率,传统CGI对每一个HTTP哀求都要孕育发生一个新的进程。假如某个CGI法度榜样是一个履行异常快的操作,打开进程的光阴大概占用了大年夜部分履行光阴。而对JAVA Servlets来说,在JAVA 虚拟机上,每一个哀求由一个'小'JAVA线程(thread)相应,而不是一个`大年夜`操作系统进程。类似地,传统CGI假如对同一个CGI法度榜样有N个同时哀求,这个CGI法度榜样的代码将被导入内存N次。JAVA Servlets 孕育发生N个线程,但只有一个JAVA Servlets CLASS的copy。同时JAVA Servlets比CGI有更多的优化选择,象预先谋略,打开数据库连接等。

2)方便,JAVA Servlets能自动的粘贴和解码HTML表单数据,读和设置HTTP头,处置惩罚COOKIES,跟踪SESSIONS,等其它大年夜量功能。

3)强大年夜的功能,JAVA Servlets可以很轻易的实现对CGI来说是弗成能或很艰苦的事务。JAVA Servlets能直接和办事器进行通讯而CGI是不能的。

4)JAVA Servlets之间能共享数据,很轻易实现诸如数据库连接池。它能方便的实现治理从REQUEST到REQUEST哀求,简化SESSION和获取前一页面。而CGI之间通讯差,因为每个CGI法度榜样的调用都开始一个新的进程,调用间通讯平日要经由过程文件进行,因而相称迟钝。同一台办事器上的不合CGI法度榜样之间的通讯也相称麻烦。

5)调用光阴:CGI法度榜样是作为零丁历程运行的,平日调用光阴较长,这个间接资源在每次调用的时刻都要发生。在应用说冥器的时刻调用光阴会更长。而内存中的servlet可以异常迅速地加载。

6)安然:有些CGI版本有显着的安然弱点。纵然是应用最新的标准和PERL等说话,系统也没有基础安然框架,而要靠一组事实上的规则。而java定义有完备的安然机制,包括ssl,ca认证,安然政策等规范。

7)小巧,JAVA Servlets应用JAVA编写,遵照标准API。它能直接或借助插件在险些所有WEB办事器上运行。

8)价格低,显然,有很多都是FREE。

Servlet的一些利用范围:

1) 用于处置惩罚HTML表单:经由过程HTTP孕育发生POSTed数据,包括生意订单或信用卡数据。是以servlet可以成为订单处置惩罚系统的一部分,和产品存货数据库一道事情,大概可以用在在线支付系统上。

2)容许人们之间的相助:一个servlet能并发处置惩罚多个哀求;他们可以应用在诸如在线会议这样的同步哀求支持系统。

3) 转送哀求:Servlet可以转送哀求给其他的办事器和servlets。这就容许在镜象同样内容的几个办事器之间平衡负载。按照义务类型或组织范围,可以容许被用来在几个办事器中划分逻辑上的办事器。

4) servlet 编写者们可以定义彼此之间合营事情的激活代理,每个代理者是一个servlet,而且代理者能够在他们之间传送数据。

二、Servlet的布局

在详细掌握servlet之前,须对java说话有所懂得。下面是基于您懂得java根基上的,在Servlet API中最紧张的是Servlet interface. 所有的servlets implement(履行)这个interface, 要领多种:或者是直接的,或者经由过程扩展类(class)履行它,如 HttpServlet。 这个Servlet interface 供给安排servlet与客户端联系的措施. Servlet 编写者可以在他们开拓 servlet法度榜样时供给更多一些或所有的这样措施.

当一个servlet接管来自客户真个调用哀求, 它接管两个工具: 一个是ServletRequest,别的一个是ServletResponse. 这个ServletRequest类概括从客户端到办事器之间的联系, 而 ServletResponse类概括从servlet返回客户真个联系.

ServletRequest interface 可以获取到这样一些信息如由客户端传送的阐述名称,客户正直在应用的协议, 孕育发生哀求并且接管哀求的办事器远端主机名. 它也供给获取数据流的servlet, ServletInputStream, 这些数据是客户端引用中应用HTTP POST 和 PUT 措施递交的. 一个ServletRequest的子类可以让 servlet获取更多的协议特点数据. 例如: HttpServletRequest 包孕获取 HTTP-specific头部信息的措施.

ServletResponse interface 给出响应客户真个servlet措施. 它容许servlet 设置内容长度和回应的mime类型, 并且供给输出流, ServletOutputStream, 经由过程编写者可以发还响应数据. ServletResponse子类可以给出更多 protocol-specific容量的信息。 例如: HttpServletResponse 包孕容许servlet 操作HTTP-specific头部信息的措施.

上面有关类和 interfaces描述构成了一个基础的Servlet框架. HTTP servlets有一些附加的可以供给session-tracking capabilities的措施. servlet编写者可以用这些API在有他人操作时掩护servlet与客户端之间的状态.

三、Servlet的接口

Servlet 从javax包的httpservlet类扩展,在HttpServlet中加入了一些附加的措施,这些措施可以被帮忙处置惩罚HTTP 基础哀求的HttpServlet类中的措施service自动地调用。这些措施有:

doGet 用来处置惩罚HTTP的GET哀求。

这个GET操作仅仅容许客户从HTTP server上"取得"(GET)资本。重载此措施的用户自动容许支持措施HEAD。这个GET操作被觉得是安然的,没有任何的负面影响,对用户来说是很靠得住的。比如,大年夜多半的正规查询都没有副感化。盘算改变存储数据的哀求必须用其他的HTTP措施。这要求措施也必须是个安然的操作。措施doGet的缺省履行将返回一个HTTP的BAD_REQUEST差错。

措施doGet的款式:

protected void doGet(HttpServletResquest request,

HttpServletResponse response)

throws ServletException,

IOException;

doPost 用来处置惩罚HTTP的POST哀求。

这个POST操作包孕了在必须经由过程此servlet履行的哀求中的数据。因为它不能急速取得资本,故对付那些涉及到安然性的用户来说,经由过程POST哀求操作会有一些副感化。

措施doPost的缺省履行将返回一个HTTP的BAD_REQUEST差错。当编写servlet时,为了支持POST操作必须在子类HttpServlet中实现(implement)此措施。

此措施的款式:

protected void doPost(HttpServletResquest request,

HttpServletResponse response)

throws ServletException,

IOException;

doPut用来处置惩罚HTTP的PUT哀求。

此PUT操作模拟经由过程FTP发送一个文件。对付那些涉及到安然性的用户来说,经由过程PUT哀求操作也会有一些副感化。

此措施的款式:

protected void doPut(HttpServletResquest request,

HttpServletResponse response)

throws ServletException,

IOException;

doDelete用来处置惩罚HTTP的DELETE哀求。

此操作容许客户端哀求一个从server移出的URL。对付那些涉及到安然性的用户来说,经由过程DELETE哀求操作会有一些副感化。

措施doDelete的缺省履行将返回一个HTTP的BAD_REQUEST差错。当编写servlet时,为了支持DELETE操作,必须在子类HttpServlet中实现(implement)此措施。

此措施的款式:

protected void doDelete (HttpServletResquest request,

HttpServletResponse response)

throws ServletException,IOException;

doHead 用来处置惩罚HTTP的HEAD哀求。

缺省地,它会在无前提的GET措施履行时期中运行,然则不返回任何数据到客户端。只返回包孕内容信息的长度的header。因为用到GET操作,此措施应该是很安然的(没有副感化)也是可重复应用的。此措施的缺省实现(implement)自动地处置惩罚了HTTPDE的HEAD操作并且不必要经由过程一个子类实现(implement)。

此措施的款式:

protected void doHead (HttpServletResquest request,

HttpServletResponse response)

throws ServletException,

IOException;

doOptions用来处置惩罚HTTP的OPTIONS哀求。

此操作自动地抉择支持什么HTTP措施。比如说,假如一个servlet的作者创建HttpServlet的子类并重载措施doGet,然后措施doOptions会返回下面的header:

Allow:GET,HEAD,TRACE,OPTIONS

一样平常不必要重载措施doOptions。

此措施的款式:

protected void doOptions (HttpServletResquest request, HttpServletResponse response)

throws ServletException,

IOException;

doTrace用来处置惩罚HTTP的TRACE哀求。

此措施的缺省履行孕育发生一个包孕所有在trace哀求中的herder的信息的应答(response)。

在开拓servlet时,多半环境下必要重载此措施。

此措施的款式:

protected void doTrace (HttpServletResquest request,

HttpServletResponse response)

throws ServletException,

IOException;

在开拓以HTTP为根基的servlet中,Servlet开拓者关心措施doGet和措施doPost即可。

四、Servlet的生命周期

假如你写过java的小利用法度榜样(Apple),那Servlet对你来说就不会太难,SZ更为简单由于Servlet不用斟酌图形界面的利用,而与小利用法度榜样一样,Servlet与有一个生命周期。Servlet的生命周期是当办事器装载运行servlets:接管来自客户真个多个哀求并且返回数据给客户端. 然后在删除移开servlets.下面具体描述如下:

1)初始化时期

当一个办事器装载servlet时, 它运行servlet的 init() 措施.

public void init(ServletConfig config) throws ServletException

{ super.init(); //一些初始化的操作,如数据库的连接 }

必要记着的是必然要在init()停止时调用super.init().init()措施不能反复调用,一旦调用便是重装载servlet. 直到办事器调用destroy措施卸载servlet后才能再调用.

2)Servlet的履行时期

在办事器装载初始化servlet后, servlet就能够处置惩罚客户真个哀求. 用 service 措施做到这一点. 每个客户端哀求有它自己service措施: 这些措施接管客户端哀求, 并且发还响应的相应.Servlets能同时运行多个service. 这是很紧张的, 这样, service措施可以按一个thread-safe 样式编写. 如:service措施更新servlet工具中的一个字段field, 这个字段可以同时存取的. 要是某个办事器不能同时并发运行 service措施,也可以用SingleThreadModel interface. 这个 interface 包管不会有两个以上的线程threads并发运行. 在Servlet履行时代其最多的利用是处置惩罚客户真个哀求并孕育发生一个网页。其代码如下:

PrintWriter out = response.getWriter();

out.println("");

out.println("");

out.println("");

out.println("Hello World");

out.println("");

out.close();

3)Servlet停止时期

Servlets不停运行到他们被办事器卸载。在停止的时需地收回在init()措施中应用的资本,在Servlet中是经由过程destory()措施来实现的。

public void destroy()

{

//收受接收在init()中启用的资本,如关闭数据库的连接等。

}

五、Servlet利用实例

现在我们来一个简单的例子来阐明Servlet的利用,其完全成的功能是读取表单的内容并输出到浏览器上。

test.html test.java

姓名:

Email:

意见:

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

public class test extends HttpServlet {

private DBConnectionManager connMgr;

//Initialize global variables

public void init(ServletConfig config) throws ServletException {

super.init(config);

}

//Process the HTTP Get request

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html");

String name=request.getParameter("name");

String mail=request.getParameter("mail");

ServletOutputStream out=response.getOutputStream ();

out.println("");

out.println("");

out.println("");

out.println(name);

out.println("

");

out.println(mail);

out.println("");

out.close();

}

//Process the HTTP Post request

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request,response);

}

public void destroy() {

}

}

把test.html放入web办事器的根目录下,而test.java 这个servlet编译成class后一样平常都放在web办事器的class目录下,在resin中是放在docWEB-INFclasses目录下,而resin能在运行时自动编译,报以是直接报test.java 放在docWEB-INFclasses目录下即可。

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