一、关于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的更多相关文章

  1. Java Servlet与Applet、CGI、JSP的比较

    Java Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面. Java Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启 ...

  2. Servlet Servlet是Java平台上的CGI技术

    Servlet Servlet是Java平台上的CGI技术.Servlet在服务器端运行,动态地生成Web页面.与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更 ...

  3. Java Servlet与Web容器之间的关系

    自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...

  4. Java Servlet 技术简介

    Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...

  5. 【Java】Java Servlet 技术简介

    Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创 ...

  6. Java Servlet API中文说明文档

    Java Servlet API中文说明文档 目 录 1.... Servet资料 1.1      绪言 1.2      谁需要读这份文档 1.3      Java Servlet API的组成 ...

  7. Java Servlet 笔记1

    1. 什么是Servlet. Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序 ...

  8. 初识Java Servlet

    Java Servlet是什么? Servlet的本质就是一个Java接口,之所以能生成动态的Web内容,是因为对客户的一个HTTP请求,Servlet通过接口这个规范重写了其中的方法,然后Web服务 ...

  9. Java --Servlet 32个经典问题

    Servlet方面 1.说一说Servlet的生命周期? Servlet有良好的生存期的定义,包括加载和实例化.初始化.处理请求以及服务结束.这个生存期由javax.servlet.Servlet接口 ...

随机推荐

  1. (转)onTouchEvent方法的使用

      (转)onTouchEvent方法的使用 手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触 ...

  2. 类成员函数作为pthread_create函数参数

    from:http://www.cnblogs.com/shijingxiang/articles/5389294.html 近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数 ...

  3. comboBox绑定数据库、模糊查询

    实现: 一.绑定数据库 点击查询按钮,comboBox显示从数据库查到的某字段的一列数据 方法:在按钮的点击事件绑定数据库 private void button1_Click(object send ...

  4. Ibatis.Net 数据库操作(四)

    一.查询select 还记得第一篇示例中的是如何读出数据库里的3条数据吗? 就是调用了一个QueryForList方法,从方法名就知道,查询返回列表. 1.QueryForList 返回List< ...

  5. [转载]查看基于Android 系统单个进程内存、CPU使用情况的几种方法

    转载自: http://www.linuxidc.com/Linux/2011-11/47587.htm 一.利用Android API函数查看1.1 ActivityManager查看可用内存. A ...

  6. JAVA之关于super的用法

    JAVA之关于super的用法   路漫漫其修远兮,吾将上下而求索.——屈原<离骚> 昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为 ...

  7. Android 自定义属性

    values新建一个attrs.xml<resource>    <declare-styleable name = "MyTextView">    &l ...

  8. Add project to working sets

    最近换了个电脑,重新搭建了开发环境,但是在新建项目的过程中发现有Add project to working sets这一个选项,一开始也不明白是什么意思,百度了一下,不少网友说是把项目存到物理空间, ...

  9. c++高质量编程手册

    怡化主管强烈要求我读这本书.... 笔记尚未完成,持续更新呗.. 第1章 高质量软件开发之道 1.1 软件质量基本概念 1.1.1 如何理解软件的质量:功能性和非公能性 1.1.2 提高软件质量的基本 ...

  10. copy和assign的使用和区别

    1.使用copy和assign都可以进行修饰属性或者变量. 2.区别: (1)copy的使用:使用这个进行修饰的属性,当已经进行初始化之后,就无法再改变属性的数据. 如: @property (cop ...