Servlet的概念、配置与运行
Java Servlet的概念
Java Servlet是一个专门用于编写网络服务器应用程序的Java组件。所有基于Java的服务器端编程都是构建在Servlet之上的。
在J2EE中Servlet已经是一个标准的组件。了解Servlet在Java的软件包中是怎样的一个结构,这会有助于我们理解Servlet的概念。
在J2EE中跟Servlet相关的一个包是javax.servlet,其中最基本的Servlet被声明为一个接口javax.servlet: Interface Servlet,这是Servlet最高层次的一个抽象,它是和网络协议无关的。同样在javax.servlet中,实现了一个类javax.servlet: class GenericServlet,这个类实现了Servlet接口,也是和协议无关的。而这个类是构建其他和协议相关的Servlet子类型的通用的父类(至少HttpServlet是从它继承而来的,从它的名字也能看出这一点)。
也就是说Servlet所适用的网络协议可以是多种多样的,比如HTTP,FTP,SMTP,TELNET等,但是就目前而言,只有HTTP服务已经形成了标准的Java组件。对应的软件包有两个javax.servlet.http和javax.servlet.jsp,分别对应我们要讲解的Servlet和JSP编程。我们通常所说的Servlet编程主要就是指针
对HTTP的Servlet编程,用到的就是javax.servlet.http包中的类(典型的就是HttpServlet类),实际上Java Servlet编程的概念要更广一些,在这里我们也就约定俗成的使用Servlet来指代HTTP Servlet的编程,这点你是需要了解的。由于JSP最终都是要经过JSP引擎转换成Servlet代码的,而且Servlet编程和一般的Java编程是没有大的区别的,只需要了解一定的规范即可,所以我们在这里先讲解Servlet的编程,这样对以后理解JSP是很大的有好处的,尽管在使用的时候可能JSP更为简单一些。
目前,Servlet引擎一般是第三方的插件,它通过一定的方法连接到Web服务器,Servlet 引擎把它识别为Servlet请求的那些HTTP请求截获下来处理,而其他的HTTP请求由Web 服务器按照通常的方式来处理,Servlet引擎会装载合适的Servlet到内存中,如果Servlet还没有运行的话,会分配一个可以使用的线程来处理请求,再把Servlet的输出返回到发出请求的Web客户机。
Java Servlet和Java Applet正好是相对应的两种程序类型,Applet运行在客户端,在浏览器内执行,而Servlet在服务器内部运行,通过客户端提交的请求启动运行,你在学习过程可以作简单的比较。servlet和tomcat的关系
使用过CGI的话一定知道CGI程序的作用,Servlet要实现的功能和CGI是一样的,只是实现的时候更为方便,效率更高。
Servlet的优点和应用范围
由于Servlet是用Java编写的,所以它与生俱来就有跨平台的特性,因此Servlet程序的设计完全和平台是无关的,同样的Servlet完全可以在Apache,IIS等不同Web服务器上执行,不管底层的操作系统是Windows,Solaris,Mac,Linux还是其他的能支持Java的操作系统。
Servlet是跟普通的Java程序一样,是被编译成字节码后由JVM执行的。相比传统的CGI,尽管CGI是用本地代码直接执行的,但是由于每次客户端发出请求,服务器必须启动一个新的程序来处理请求,这就把高负载强加给了服务器资源,尤其如果CGI使用脚本语言编写时,如perl,服务器还必须启动语言解释程序,程序越多,占用的内存就越多,消耗CPU也越多,严重影响系统性能。
Servlet运行于Servlet引擎管理的Java虚拟机中,被来自客户机的请求所唤醒,与CGI 不同的是,在虚拟机中只要装载一个Servlet就能够处理新的请求,每个新请求使用内存中那个Servlet的相同副本,所以效率比CGI来得高。如果采用服务器端脚本,如ASP,PHP,语言解释程序是内置程序,因此可以加快服务器的运行,但是效率还是比不上准编译的Servlet。实际的使用也已经证明,Servlet是效率很高的服务器端程序,很适合用来开发Web 服务器应用程序。
Java Servlet有着十分广泛的应用。不光能简单的处理客户端的请求,借助Java的强大的功能,使用Servlet还可以实现大量的服务器端的管理维护功能,以及各种特殊的任务,比如,并发处理多个请求,转送请求,代理等。
Servlet的运行环境
为了运行Servlet,首先当然需要一个JVM来提供对Java的基本支持,一般需要安装JRE(Java Runtime Environment)或JDK(Java Develop Kit,JRE是其一个子集)。
其次我们需要Servlet API的支持,一般的Servlet引擎都自带Servlet API,只要我们安装Servlet引擎,或直接支持Servlet的Web服务器之后便会自动安装上Servlet相关的程序包。
典型的Servlet运行环境有JSWDK,Tomcat,Resin等,这几个都是免费的软件,适合用来学习Servlet和JSP。它们都自带一个简单的HTTP Server,只需简单配置即可投入使用,你也可以把它们绑定到常用的Web服务器上,如Apache,IIS等,提供小规模的Web服务。还有一些商业的大中型的支持Servlet和JSP的Web服务器,如JRun,Web Sphere,Web Logic 等等,配置比较复杂,但是功能较为强大,有条件的可以一试。后面会讲解如何配置一简单的支持Servlet和JSP的Web服务器。
Servlet与CGI环境变量
在使用CGI时,最重要的内容是CGI接口的环境变量。CGI规范列出了19个环境变量。尽管其他的环境变量,如HTTP_COOKIE(用于查询站点信息的)不是该规范的组成部分,但也是经常使用。
由于Java运行于JVM,不直接在服务器上运行,所以不能直接访问环境变量。由于CGI 环境变量是We
b服务器建立的,而且用户能够用其他的方法查询变量值,所以Java不访问环境变量没有什么大问题。Java Servlet API定义几种查询在CGI环境变量中发现大多数信息的方法。
有些信息是HTTP标题的组成部分,而且采用HttpServletRequest类中的getHeader()方
法能够很容易的获取。采用特殊的方法可以查询其他的信息。Java唯一不可用的CGI环境变量是GA TEWAY_INTERFACE。当在CGI程序中使用时,该变量包含CGI版本。在Java Servlet中这种变量信息是无关紧要的。
以上的内容是针对有CGI编程经验的你的,通过对比能帮助更快的理解Servlet。
Servlet的安全性
Java Servlet能够使用包括SSL在内的安全协议。Servlet与Java内在的安全措施紧密相连,如不能直接访问内存等。采用安全管理器,用户能够限定对其他资源的访问,如文件、目录和局域网。Java Servlet支持代码符号,从而能够更好的控制委托每个Servlet要执行的程序。
Java的安全机制本身是比较复杂的,在这里我们只能作简单讲解,具体的分析参看有关Java安全性的技术资料。
Servlet的管理
对于大多数用户来说,Servlet比CGI程序和服务器脚本更容易管理。Servlet是以Java类的形式编译的。Java采用能够保存在Java Archive(.JAR)文件中的编制目录树内的组件,提供一种管理类的方法,如Sun公司的Java Web服务器的Servlet管理平台。有些服务器和第三方产品为管理Servlet提供图形用户界面。
具体的Servlet的管理是比较复杂的一件事情,尤其是对于一个大系统而言。对于初学者只要能掌握基本的配置一个Servlet,使其能正常运行的技能就可以了。更高级的技巧要在更多的实践中才能真正掌握。
Servlet的编译
Servlet的编译和一般的Java程序是完全一样的,在使用javac编译的时候不需要任何特殊的参数。只要Servlet的编写是正确的,编译完后生成的Class文件就可以做为Servlet来运行了。
用Servlet Runner运行Servlet
在真正开始编写Servlet之前,我们先介绍一个简单的Servlet引擎--Resin。目前支持Servlet的Web服务器不下数十种,Resin是一个简单易用的Servlet运行器(Servlet Runner),很适合初学者。由于各个厂家的Servlet引擎各不相同,配置方法也是千差万别,在这里不可能一概而论,但是Servlet的编写方
法却是一样的,所以你不必太在意服务器的配置方法,只要知道如何让自己的Servlet正常运行就可以了,把更多的注意力放在Servlet的编写上。
Resin自带一个Servlet Runner和HTTP Server,因此要构建一个简单的Web环境,光有Resin已经足够了,不需要额外的支持软件。Resin不需要安装,解压之后即可使用。
Resin目录下有几个子目录,bin目录存放的是可执行文件,要启动HTTP Server和Servlet Runner 只需要分别点击其中的和即可,启动后会出现四个窗口,分别对应HTTP Server的标准输出,启/停控制和Servlet Runner的标准输出,启/停控制。conf目录下存放的是Resin Servlet Runner
的配置文件,这是配置整个Web环境的关键,包括Servlet的配置和后面要用到的JSP的配置。doc目录是默认的发布目录,即Resin自带的HTTP Server是以这个目录为根目录的。
下面我们以一个最简单的HelloWorld的例子,来讲解如何配置Resin,使其能运行Servlet程序,同时也做为Servlet编写的入门。程序如下:
//HelloServlet.java
import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import javax.servlet.*;
//导入必要的包
public class HelloServlet extends HttpServlet {
//所有Servlet必须从HttpServlet派生
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
//doGet()是这个Servlet的核心,真正处理请求的地方
{
res.setContentType("text/html");
//设置相应的类型为text/html
PrintWriter pw = Writer();
//从HttpServletResponse得到输出流
pw.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
pw.println("<head>");
pw.println("<meta http-equiv=\"Content-Type\" content=\"text/html;
charset=ISO-8859-1\">");
pw.println("<!-- The Servlet expression tags interpolate script variables into the HTML -->");
pw.println("<title>Hello, world!</title>");
pw.println("</head>");
pw.println("<body bgcolor=#cc99dd>");
pw.println("<h1>Hello, world!</h1>");
pw.println("</body>");
//上面的语句都是向客户端打印HTML文本
pw.close();
//关闭HttpServletResponse,使Web服务器知道相应结束
}
public HelloServlet() {} //构造函数,可以不要
}
这是最简单的一个Servlet程序,整个类从HttpServlet派生,就跟Applet一样,这个派生关系是必须的。这个Servlet必须实现doGet()方法(因为它是作为静态页面通过地址访问的,这种方式在HTTP中称为GET请求,在后面还会有更具体的讲解),这是这个Servlet真正处理请求的地方,是整个Servlet 的主体,就跟线程体的run()方法一样。doGet()有两个参数HttpServletRequest req和
HttpServletResponse res。HttpServletRequest包含了客户请求的各种信息,HttpServletResponse则
包装了服务器响应,主要处理对客户机的输出。这个程序是很简单的,如果对网络编程和HTML有一些概念的话,很容易就应该能理解。
通过javac对以上程序进行编译,我们可以得到HelloServlet.class,下面我们就通过配置Resin来运行这个Servlet。前面说过如果你没有修改过Resin的配置文件的话,doc是Resin默认的发布目录。发布目录下的WEB_INF/classes是Resin默认的Classpath,你只要把自己的Servlet拷贝到该目录下,Resin 就能识别,当然只要拷贝的有效的系统的或用户的Classpath下,Resin都是能够到的。我们把HelloServlet.class拷贝到WEB_INF/classes目录下。接下来就需要修改conf目录下的f文件,来配置我们的Servlet。你可以使用任何一种自己所熟悉的文本编辑器来打开该配置文件。到<web-app id='/'>,在它和 </web-app>之间任何地方添加以下的配置语句(可以参考已有的语句)<servlet-mapping url-pattern='Hello' servlet-name='Hello' />
<servlet servlet-name='Hello'
servlet-class='HelloServlet' >
</servlet>
这样当客户端产生/Hello请求的时候,Resin就能把这个请求定向到HelloServlet上,该Servlet就能正常运行了,我们也可以采用以下的配置语句
<servlet-mapping url-pattern='Hello' servlet-name='HelloServlet' />
这种情况下,没有对Servlet的名字进行映射,系统会默认的使用servlet-name作为servlet-class 进行类的查,所以servlet-name必须填写正确的类名,而不能是随意的名字。关于Resin更多的配置信息,有兴趣的你可以参考Resin的帮助文档,这里就不再赘述了。
下面我们启动Http Server和Servlet Runner(通过双击bin下的和)。这样我们就可以通过浏览器访问这个Servlet了。打开浏览器,比如IE,在地址栏键入
localhost:8080/Hello,我们可以打开如下的一个网页:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。