用Java Servlets代替CGI

从网络的早期阶段开始,人们就希望他们的网络服务器不仅能够显示静态文档,通用网关接口(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 (\\"

KeyValue
\\" + 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的位域的使用

From: http://dev.yesky.com/374/2645874.shtml 计算机C语言初学者入门讲座   一、位域   有些信息在存储时&#xff0c;并不需要占用一个完整的字节&#xff0c; 而只需占几个或一个二进制位。例如在存放一个开关量时&#xff0c;只有0和1 两种状态&#xff0c; 用一…

Windows 7下实现×××连接自动创建

在完成了Windows XP下自动创建并配置连接后&#xff0c;其实我们还需要对Windows 7下自动配置做一个介绍&#xff0c;因为目前实际上很多企业也已经开始进行了大批量的Windows 7的使用&#xff0c;而且很多用户目前也在逐渐向Windows 7系统迈进&#xff0c;那么如何让Windows 7…

FPGA Verilog实现一个脉冲波形变换

一、波形变换需求 二、思路 &#xff08;1&#xff09;脉冲边沿提取&#xff0c;得到波形的上升沿r_rise和下降沿r_fall &#xff08;2&#xff09;将上升沿r_rise延迟一节拍r_r_rise&#xff0c;r_rise更新上一周期的周期和脉宽并清空上一次的脉冲周期计数和脉宽周期计数&am…

[react] 状态管理器它精髓是什么?

[react] 状态管理器它精髓是什么&#xff1f; 统一的数据管理 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

夺命雷公狗jquery---22-bind为jquery对象绑定多个相关事件

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script src"js/jquery.js"></script><script>//页面载入ready方法$(function(){$(img).bind({mouseover:function(){$(#result…

STM32 DSP库的使用方法

一、工程中如何添加DSP库 在keil5软件中点击 Pack&#xff0c;CMISIS组件选择DSP资源&#xff0c;可以选择Source源码或者Library库导入到项目中&#xff0c;点击OK&#xff0c;可以在项目树中看到该资源已经导入了工程。 二、 如何使用DSP库 DSP库对浮点计算做了优化和增强&…

SharePoint 2010-随机出现的页面性能问题

有个客户, 服务器的配置巨牛, 24核CPU, 64GB内存, 这样的三台机器组成了一个SharePoint 2010的服务器场. 就是这样牛的配置, 出现了性能问题. 看performance log, 发现CPU, 内存都资源非常充裕, 问题发生的时候request/sec的值也非常的低. 问题发生的频率很低, 一天十次以内. …

[react] 在使用react过程中什么时候用HOC?

[react] 在使用react过程中什么时候用HOC&#xff1f; 给组件增加额外的功能 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

C++使用Json作为数据包装格式的通信

From: http://blog.sina.com.cn/s/blog_4ae178ba01014eve.html http://blog.csdn.net/chenziwen/article/details/5785932 Json大家都耳熟能详了吧&#xff1f;现在Json广泛用于各类通信&#xff0c;特别是基于Http协议的通信&#xff0c;一般的服务端动态脚本语言都有库支持…

iOS开发多线程篇—线程的状态

iOS开发多线程篇—线程的状态 一、简单介绍 线程的创建&#xff1a; self.thread[[NSThread alloc]initWithTarget:self selector:selector(test) object:nil]; 说明&#xff1a;创建线程有多种方式&#xff0c;这里不做过多的介绍。 线程的开启&#xff1a; [self.thread star…

Qt 编写应用程序升级的配置文件json 生成工具

通过此工具将需要更新的应用程序和相关目录下的依赖文件配置成json格式的升级文件&#xff0c;客户端版本监控软件通过读取此json文件&#xff0c;对比相应字段&#xff0c;实现自动拉取文件&#xff0c;从而保证客户端应用程序自动更新。 此json文件放在待升级的exe同级目录下…

以太网供电新标准POE+,IEEE802.3at解析

以太网供电新标准POE&#xff0c;IEEE802.3at解析 以太网供电新标准POE&#xff0c;IEEE802.3at一、IEEE 802.3at标准出现的背景为了遵循IEEE 802.3af规范&#xff0c;受电设备(PD)上的PoE功耗被限制为12.95W&#xff0c;这对于传统的IP电话以及网络摄像头而言足以满足需求&am…

C# 6.0 (C# vNext) 的新功能:Expression Bodied Functions and Properties

Expression Bodied Function 它可以用在&#xff1a;methodsuser-defined operatorstype conversionsread-only properties indexers 看下面的样例&#xff1a;public class RgbColor(int r, int g, int b) {public int Red { get; } r;public int Green { get; } g;public i…

[react] 在React中如何避免不必要的render?

[react] 在React中如何避免不必要的render&#xff1f; shouldComponentUpdate、memoization、PureComponent 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

C++的JSON库及使用方法

From: http://blog.csdn.net/moruite/article/details/7310976 VC没有自带的JSON库&#xff0c;所以分享一下如何使用该库http://download.csdn.net/detail/moruite/4104704 1. json.h头文件包含了如下API [cpp] view plaincopy #ifndef CPPTL_JSON_H_INCLUDED # define CP…

流程制造项目中关于销售订单数量与实际产生数量不同时的解决方案

流程制造项目中关于销售订单数量与实际产生数量不同时的解决方案 在流程制造项目中&#xff0c;例如涂料领域&#xff0c;往往实际生产出来的数量与销售订单的数量会产生差异&#xff0c;这种差异是小额值的。 例如客户A下了100KG的涂料&#xff0c;但车间实际生产出来的数量会…

KEIL ARM 6.12 compiler 编译__ASM 错误的解决方法

1、问题 KEIL compiler 设置为 “use default compiler version 5” 可以正确编译以下汇编和C混合代码&#xff0c;更改编译器为V6.12后不识别__ASM关键字&#xff0c;并对汇编语法报错。 替换为 __ASM void MSR_MSP(uint32_t addr) {MSR MSP, r0 BX r14 } 2、解决办法 6.12…

GCD牛逼的中枢调度器

GCD的基本使用: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {// dispatch_sync : 同步&#xff0c;不具备开启线程的能力// dispatch_async : 异步&#xff0c;具备开启线程的能力// 并发队列 &#xff1a;多个任务可以同时执行// 串行队列 &#xff1…

[react] 在React中组件的props改变时更新组件的有哪些方法?

[react] 在React中组件的props改变时更新组件的有哪些方法&#xff1f; 新版用 getDerivedstatefromProps(nextProps){ 业务逻辑} 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起…

平庸错了吗?

平庸&#xff0c;百度百科里的释义是&#xff1a;平凡、普通、寻常而不突出&#xff0c;没有作为。就像我&#xff0c;一直认为自已是个很平庸的人&#xff0c;平凡&#xff0c;很普通。没有优秀杰出的才能&#xff0c;没有高深莫测的思想&#xff0c;甚至没有多少可以用来奢侈…