从网络的早期阶段开始,人们就希望他们的网络服务器不仅能够显示静态文档,通用网关接口(CGI) 扩展了服务器的能力,但其代价是增加了额外的处理进程。FastCGI则把外部CGI 处理进程同网络服务器更紧密地集成在一起,另外,对于专有的,诸如NSAPI 和ISAPI 这样的服务器API,它们直接把外部进程以服务器插件的形式集成到服务器中。现在有了Java servlets,它们的功能强大,可以快速替代你现有的CGI程序。

什么是servlets?

就象applet扩充了网络浏览器的能力一样,servlets这个Java部件,扩充了网络服务器的能力。对于任何种类的服务器端的处理,Servlets可以作为server-side includes使用或者作为CGI程序(在JavaSoft的Java Web server中可以作为插件)执行。 Servlets可以移植,不象CGI和专有的API模块,你可以利用Java的“编写一次,到处运行”的机制,在你的企业中配置网络应用程序。Servlets的运行也很稳固,在 servlet 中你创建了一个数据库连接,下一次你访问servlet时连接仍然存在,这同CGI 程序不一样。Servlets也具有扩展性,所以你可以使用面向对象的程序设计方法,来减少开发时间。Servlets可以运行在任何支持servlet的网络服务器上。目前,servlet SDK除了支持JavaSoft的Java Web server,还支持Netscape, Apache 和IIS,以及大量第三方的网络服务器。

JSDK导游

为了创建servlets,你需要Java servlet SDK (JSDK),它可以从JavaSoft网站下载。JSDK包含诸如javax.servlet,javax.servlet.http等包,其中包含有你自己创建servlets时所需要的类和接口。对于sun.servlet 包来说,其中包含了网络服务器用来运行servlets所需要的类。 (对Servlet的支持通常是通过服务器插件的形式)。一旦你有了JSDK,你只要创建GenericServlet类的子类,并且重载若干方法。GenericServlet 定义了你应该重载的三种主要方法: init(), service()和destroy()。

init() :初始化你的servlet,诸如打开数据库连接。

destroy():在applet运行结束后,清除servlet 自身。

service():每次调用servlet时,就调用service()方法。有两个对象 ServletRequest和ServletResponse需要传送给servlet,用于处理客户请求。

为了帮助处理基于Web 的事务,JSDK 在 javax.servlet.http包中有个HttpServlet类。HttpServlet是从GenericServlet中派生出来的,它提供了service()的一个实现,该实现用于自动处理GET, HEAD和POST的请求。

HttpServlet类中的方法有doGet()和doPost()。一个典型的CGI servlet只需要实现doGet()和doPost()方法。 doGet()和doPost()的参数为HttpServletRequest和HttpServletResponse。

HttpServletRequest是个接口,该接口提供了从客户的请求获取信息的一些方法。例如, getParameter()方法返回在客户请求中的关键字/值对(或者从请求串中取得,或者从POSTed数据中取得)。

HttpServletResponse提供了输出流,使得servlet把HTML格式的输出返回给客户。

基本Servlet代码

代替你的CGI

下面为一段可以取代CGI程序的基本的servlet代码。Servlet完成如下的简单事情:列出由HTML表单搜集的关键字/值对(key/value)。

BasicCGIServlet处理POST,也用同样处理GET。所以doPost()和doGet()都调用doService()。doService()可以在子类中重载,以实现更多特定的功能。

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

public class BasicCGIServlet extends HttpServlet {

public BasicCGIServlet () {

super();

}

public void doPost (HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doService(req, resp);

}

public void doGet (HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

doService(req, resp);

}

protected synchronized void doService (HttpServletRequest req,

HttpServletResponse resp) throws ServletException, IOException {

// get an output stream to write to

ServletOutputStream out = resp.getOutputStream();

// set the content type for the response

resp.setContentType (\\"text/html\\");

// optionally you should also set any special content-encoding

// and content length response headers, and return status codes

// write out the response!

out.println (\\"<body

bgcolor=\\\\"white\\\\">\\");

out.println (\\" \\");

out.println (\\"

\\");

for (Enumeration e = req.getParameterNames(); e.hasMoreElements(); ) {

String key = (String) e.nextElement();

out.println (\\"

\\");

}

out.println (\\"

Key Value
\\" + key + \\" \\" + req.getParameter(key) +

\\"

\\");

}

}

当调用req.getParameterNames()时,servlet请求对象读入表单数据,并且把它解码为关键字/值对(事实上,一旦第一次调用getParameterNames(),或者getParameterValues(),或者getParameter()

时,就进行解码)。 getParameterNames()返回所有关键字的列举。getParameter()返回同特定关键字相对应的值。当servlet请求被解析成关键字/值对时,每个关键字的值保存在String数组中,以便可以处理一个关键字有多个值的情况。调用getParameterValues(),返回的是String数组,而调用 getParameter()后,则仅返回String数组中的第一个元素。

你也许会注意到doService()是个同步化的方法。这是因为servlets 通常是在多线程环境下运行的。因为网络服务器创建的servlet对象只有一个实例,所以servlet必须能够对同时发生的请求提供服务。因此,Servlets需要确保:这些请求在访问共享资源时保持同步。这些共享资源包括实例变量,数据库连接和文件流等。

运行你的servlet

一旦编写好servlet,并且编译成功之后,你可以把它放到网络服务器中servlet别名目录中。就同服务器中的cgi-bin别名目录的作用一样,任何放在servlet 目录中的文件,一旦被作为url的一部分被请求时,将被作为servlets执行。例如,BasicCGIServlet可以通过如下的url调用: http://mycompany.com/servlet/BasicCGIServlet。你既可以直接调用该url (并且传送给servlet一个请求关键字/值对的串),也可以通过HTML表单中的一个动作来调用。要了解更多的支持servlet的网络服务器的信息,请参阅JSDK中的有关文档信息。

进一步的用法

GenericServlet和 HttpServlet提供了一个构建servlets的固定的基类。通过重载service()方法,你可以在它们的基础上进行构建。例如,你可以加入对响应缓存的支持(请参见HttpServlet 中的getLastModified()),也可以加入对HTTP 1.1方法的支持,等等。你甚至可以构建一个扩展的模板引擎。(有谁真的喜欢在他们的程序中内置HTML代码呢?)

另外一个用法是对JSDK进行扩展,使之除了支持标准的application/x-www-form-urlencoded mime 类型之外,还支持其他类型的表单编码。例如,你可以加入对multipart/form-data mime类型的支持,用于处理通过HTTP上载文件。接口方法getParameterNames(), getParameterValues()等等,都是在sun.servlet包中实现的,所以你需要配置JSDK ,以便加入这些支持。还有一种变通的方法,你可以自己实现有关方法,但那样做,就需要复制代码或者改变JSDK的语义。上面的这些方法都是可行的,但是没有哪一种是完美无缺的。

结论

现在你应该会自己创建Java servlets了,它们可以用来代替传统的Perl和C/C++ CGI程序。 Java的面向对象的特性和“编写一次,到处运行”的机制使得Java servlets的编写很简单。Servlet的稳固性,可以解决有关状态管理问题,而这些都是只用一次的CGI程序解决实际问题时通常会遇到的难题。 Servlets可以利用Java语言的所有功能,包括JDBC和RMI。由于大多数网络服务器都加入了对servlet的支持,Java将迅速成为开发企业级应用程序的一种可选语言。

转载于:https://www.cnblogs.com/liangxiaofeng/p/4910979.html

用Java Servlets代替CGI相关推荐

  1. flex java red5_使用 Flex 和Java servlets 将文件上传到 RED5 服务器的步骤

    本文使用一个 demo 来演示如何使用 Flex 和 Java servlets 上传一个任意类型的本地文件到 RED5 服务器.使用的是 Flex 的 FileReference 接口,该接口可以对 ...

  2. 深入Java Servlets网络编程 西安电子科技大学出版社

    <script type="text/javascript"> google_ad_client = "pub-8800625213955058"; ...

  3. java cgi_使用Java语言编写CGI程序

    公共网关界面(CGI)是一种编程标准,符合标准的程序(CGI程序),通过WEB服务器与 运行WEB浏览器的客户进行交互.这些程序允许WEB开发者通过浏览器传送动态信 息(通常嵌于HT ML中).CGI ...

  4. ajax 连接java,如何使用Ajax连接到Java servlets?

    你需要做一个XML HTTP请求的Servlet为你需要在你的HTML的JavaScript一个XML HTTP对象/ JSP页面 var myxmlhttpobj=new GetXmlHttpObj ...

  5. jmeter吞吐量_进阶Spring Boot---Tomcat与Undertow 吞吐量对比

    测试工具:Jmeter Apache JMeter是Apache开发的基于Java的压力测试工具.对于压力测试软件,它最初是为Web应用程序测试而设计的,但后来扩展到其他测试领域.它可以用来测试静态和 ...

  6. Apache/Tomcat/JBOSS/Nginx(2)

    三.性能测试: 将分别测试3种软件在对动态页面和静态页面请求及并发时的响应时间 l 静态页面搜狐首页 LIGHTTPD n/-c(ab参数) cpu% Mem RequestsperSecond Ti ...

  7. 某大型银行深化系统之十四:技术架构

    传送门☞轮子的专栏☞转载请注明☞http://blog.csdn.net/leverage_1229 技术架构 在上述功能架构中,除了核心层外,应用层及服务层都包括了用户UI界面,因此服务中包括了Ma ...

  8. AMZI! PROLOG白皮书

    一.Amzi! Prolog+ 逻辑服务器概述 Amzi!架构体系使用示例详细的说明,如何使用Amzi!逻辑服务器将Amzi! Prolog与传统的编程语言集成在一起. 二.规则.Prolog及Amz ...

  9. servlet对java的重要性_初学者为什么还需要了解Servlets

    Servlets对web 服务的重要性 在展现层框架大行其道的今天,Servlet与JSP这2个重要的JAVA WEB标准实现已经被人逐渐的遗忘了,对于初学者来说,对于Servlet与JSP一般更是抱 ...

最新文章

  1. tensorflow入门(二)
  2. guava cache简单学习笔记
  3. 计算机基础课教学心得,计算机基础教学心得
  4. [UWP]用Shape做动画(2):使用与扩展PointAnimation
  5. 定义了浮动元素后margin-bottom失效的解决办法
  6. CUDA从入门到精通(四):加深对设备的认识
  7. java 图形立即显示_java 图形显示
  8. mysql 内存 256m_解决mySQL占用内存超大问题
  9. 单词查找树(信息学奥赛一本通-T1337)
  10. IPV4与IPV6的区别(史上最详细)
  11. 全国土壤阳离子交换量CEC空间分布数据
  12. 成都Uber优步司机奖励政策(2月22日)
  13. php怎么把png转化为doc文件,怎么把PNG图片转换成Word文字
  14. Mutual Information Neural Estimation梳理
  15. idea 集成Git 遇到的问题 与解决
  16. [心灵] 我对这个世界充满了想象力和好奇心
  17. outlook邮件模板_如何在Microsoft Outlook中创建和使用电子邮件模板
  18. 问题:未连接到互联网 代理服务器出现问题,或者地址有误。
  19. 关于长尾应用的一些思考
  20. win7母机上的vmware12中Ubuntu16中安装复制粘贴工具

热门文章

  1. Leetcode: LRU Cache
  2. zookeeper 应用开发
  3. Symbol Mc1000 声音的设置以及播放
  4. Spring Cloud构建微服务架构-Hystrix监控面板
  5. 如何开启并配置CITRIX Xenserver的SNMP服务
  6. * 类描写叙述:字符串工具类 类名称:String_U
  7. Github Page创建个人主页以及绑定域名
  8. 记录每个用户的操作记录(命令)
  9. 提高 Web 站点性能的最佳实践
  10. 【转】C# split 几种使用方法