分享
 
 
 

JAVA Servlets简介

王朝java/jsp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

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("

");

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有