Java Servlet——改进的CGI
一、关于Servlet
在上一篇随笔中,我们看到了CGI存在的不足,其每次请求都需加载和运行一个CGI程序。若使用Java编写CGI程序,需要为每个请求都启动一个系统进程以及JVM,其执行效率大大降低。如果有办法取消这些开销,即只需要启动一个系统进程以及一个JVM映像,基于Java的CGI就能得到很好的改善。
Servlet就基于这种想法产生了,利用Java运行时可动态加载来处理新的请求,只需要启动一次服务器进程,只加载一次JVM,之后这个JVM再动态加载另外的类。其执行效率比传统CGI快得多了。Servlet的优点如下:
1、只需要启动一个系统进程以及加载一个JVM,大大降低系统开销。
2、如果多个请求需要做同样处理的时候,只需要加载一个类,这也大大降低开销。
3、所有动态加载的类可以实现对网络协议以及请求解码的代码共享,大大降低工作量。
4、Servlet能够直接和Web服务器交互,而普通的CGI不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。
5、Servlet是与平台无关的,因为它们是用Java编写的。
那究竟什么是Servlet呢? 简单地说:Servlet就是JAVA 类,是一个继承HttpServlet类的类,在服务器端运行,用以处理客户端的请求。现在的Web服务器(例如Tomcat)已经集成了Servlet容器,Servlet容器负责管理加载、卸载、重新加载和执行Servlet代码等操作。
具体来讲,Servlet是一种实现了javax.servlet.Servlet接口的类。Servlet接口规定了特定的方法来处理特定的请求。开发者只需要实现Servlet的相关方法,用户访问web程序时,Tomcat会调用这些方法来完成业务处理。Servlet扩展类javax.servlet.http.HttpServlet,实现Servlet接口和抽象类,它是专门设计用来处理HTTP请求。编写Servlet时直接继承HttpServlet,并覆盖需要的方法即可,一般只覆盖doGet()和doPost()方法。
二、Servlet工作流程
当用户访问服务器时,发送Request请求,由服务器(Tomcat)接收并解析,封装成HttpServletRequest类型的request对象,同时将输出流封装成HttpServletResponse类型的response对象,然后服务器(Tomcat)把request、response作为参数,调用Servlet的相应方法进行处理,例如doPost(request,response),doGet(request,response)等。
这里需简单了解HTTP规范,HTTP1.1规范支持OPTIONS、GET、POST、HEAD、PUT、DELETE以及TRACE等7中web访问方式。我们常用的有GET和POST。其中
·GET:表示查询信息,URL中可以附带少量的参数信息,并且参数会显示在浏览器地址栏。
·POST:表示提交信息,一般用于提交大量数据信息或者文件,提交的内容不受长度限制,并且不会显示在浏览器地址栏。
Java-Web请求响应过程如下图:
来看一个典型的Java Servlet代码
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html"); //设置向客户端发送的内容格式
PrintWriter out = response.getWriter(); //利用PrintWriter对象的方法将数据发送给客户端
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println(" Hello Servlet!");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response); //这条语句的作用是,当客户端发送POST请求时,调用doGet()方法进行处理
}
}
当用户请求该页面时,Servlet重复使用PrintWriter.println()方法来输出相应的HTML页面,以达到动态生成HTML页面的效果。
Servlet的配置文件为web.xml。这里涉及web程序在Tomcat上的部署,不详细展开,有关Java web环境的搭建(Myeclipse+Tomcat+MySQL)在下一篇随笔中详述。这里只展示一下配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>firstWeb.HelloServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping> </web-app>
虽然Servlet改变传统CGI程序的缺点,但是它也有不足之处:Servlet生成网页的方法是在java类中嵌入HTML标签和表达式,也就是说对HTML做一个小小的改动时,需要修改和重新编译Servlet源文件,然后重新部署到Servlet容器中,这使得修改Servlet变得非常麻烦。
有兴趣的朋友可通过以下链接进一步学习:
1、易百Servlets教程:http://www.yiibai.com/servlets
Java Servlet——改进的CGI的更多相关文章
- Java Servlet与Applet、CGI、JSP的比较
Java Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面. Java Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启 ...
- Servlet Servlet是Java平台上的CGI技术
Servlet Servlet是Java平台上的CGI技术.Servlet在服务器端运行,动态地生成Web页面.与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更 ...
- Java Servlet与Web容器之间的关系
自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- 【Java】Java Servlet 技术简介
Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创 ...
- Java Servlet API中文说明文档
Java Servlet API中文说明文档 目 录 1.... Servet资料 1.1 绪言 1.2 谁需要读这份文档 1.3 Java Servlet API的组成 ...
- Java Servlet 笔记1
1. 什么是Servlet. Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序 ...
- 初识Java Servlet
Java Servlet是什么? Servlet的本质就是一个Java接口,之所以能生成动态的Web内容,是因为对客户的一个HTTP请求,Servlet通过接口这个规范重写了其中的方法,然后Web服务 ...
- Java --Servlet 32个经典问题
Servlet方面 1.说一说Servlet的生命周期? Servlet有良好的生存期的定义,包括加载和实例化.初始化.处理请求以及服务结束.这个生存期由javax.servlet.Servlet接口 ...
随机推荐
- bzoj 1951: [Sdoi2010]古代猪文
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #defin ...
- VS2010静态编译生成.exe可执行文件
VS2010静态编译生成的.exe可执行文件,可以在其他未安装VS2010的电脑直接运行. 静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到 ...
- pthread_create如何传递两个参数以上的参数
涉及多参数传递给线程的,都需要使用结构体将参数封装后,将结构体指针传给线程 定义一个结构体 struct mypara { var para1;//参数1 var para2;//参数2 } 将这个结 ...
- 青蛙的烦恼(dp好题)
有n片荷叶正好在一凸多边形顶点上 有一只小青蛙恰好站在1号荷叶的点 小青蛙可以从一片荷叶上跳到另外任意一片荷叶上 给出N个点的坐标N<800 求小青蛙想通过最短的路程遍历所有的荷叶一次且仅一次的 ...
- svnadmin:error while loading shared libraries: libaprutil-1.so.0:cannot open shared object file: No such file or directory
wdcp下安装svn后一直提示 svnadmin:error while loading shared libraries: libaprutil-1.so.0:cannot open shared ...
- Hello Hibernate
Hibernate 一个框架; 一个 Java 领域的持久化框架; 一个 ORM 框架 ORM(Object/Relation Mapping): 对象/关系映射 –ORM的思想:将关系数据库中表中的 ...
- POJ 3237
题目大意:指定一颗树上有3个操作:询问操作,询问a点和b点之间的路径上最长的那条边的长度:取反操作,将a点和b点之间的路径权值都取相反数:变化操作,把某条边的权值变成指定的值. #include &l ...
- 在MongoDB中实现聚合函数 (转)
随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...
- 如何搭建MVC + EF 框架
1.搭建MVC框架 1.1 VS2010:需要安装WPI 安装 ASP.NET MVC 4 和Visual Studio 2010 系统必备组件 如果上述链接无法打开,请访问:http://www.a ...
- <转>thinkphp的各种内部函数 D()、F()、S()、C()、L()、A()、I()详解
D.F.S.C.L.A.I 他们都在functions.php这个文件家下面我分别说明一下他们的功能 D() 加载Model类M() 加载Model类 A() 加载Action类L() 获取语言定义C ...