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接口 ...
随机推荐
- Servlet作业--实现注册和登录
1.注册页面 zhuce.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- 关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配。”的解决办法
关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配.”的解决办法 解决办法: $("selector").clone().html()
- ARC 类型转换:显式转换 id 和 void *
http://blog.csdn.net/chinahaerbin/article/details/9471419 /* * ARC有效时三种类型转换: */ 1.__bridge ...
- asp.net后台编写 loading效果
From :http://www.cnblogs.com/ganmk/articles/1207832.html 使用方法: protected void Page_Load(object sende ...
- 由于lightdm.conf 错误无法进入ubuntu 的办法
由于自己向默认登录GNOME桌面,所以修改了lightdm,由于参数错误,结果无法启动桌面? 这是需要进入shell界面: 1.选择cancel ,如果虚拟机下无法点击cancel按钮,可以使用快捷键 ...
- C++全局变量的声明和定义
(1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件: 第二步,将工程中所有 ...
- Hadoop 重启各个节点
对于datanode可以在master中配置,然后在maste启动的时候,一并去启动这些节点 .对于死掉的节点,也可以通过以下命令启动 .重启挂掉的节点进入到 挂掉的机器 bin/hadoop-dae ...
- SharePoint 跨域还原网站一则
博客地址:http://blog.csdn.net/foxdave 源端:执行PowerShell命令备份网站集 Backup-SPSite http://server_name/sites/site ...
- for循环进阶
[引例] 输出一行10个“*” #include<cstdio> int main(){ printf("**********\n"); ; } 思考: (1)输出一行 ...
- 《day14---多线程入门_进阶》
/* 多线程: 进程:正在执行中的程序,一个应用程序启动后在内存中运行的那片空间.进程具有动态性和并发性. 线程:进程中的一个执行单元.负责进程中的程序的运行的.一个进程中至少要有一个线程. 一个进程 ...