2.1.4 一个简单的Servlet(2)
产生这些错误的原因是Java编译器没有找到javax.servlet包中的类。要解决这个问题,我们需要让Java编译器知道Servlet API库所在的位置。Tomcat在其发行版中已经包含了Servlet API库,是以JAR文件的形式提供的,这个JAR文件的完整路径名是:
%CATALINA_HOME%/lib/servlet-api.jar |
我们只需要在系统的CLASSPATH环境变量下添加这个JAR文件的路径名就可以了。
设置CLASSPATH环境变量的方法和第1章设置JAVA_HOME环境变量的方法是一样的,在笔者的机器上CLASSPATH环境变量的配置如下:
CLASSPATH=.;D:/OpenSource/apache-tomcat-6.0.16/lib/servlet-api.jar |
关闭刚才打开的命令提示符窗口,重新打开一个新的命令提示符窗口,进入HelloWorldServlet.java所在的目录,再次执行:
javac -d . HelloWorldServlet.java |
生成org/sunxin/ch02/servlet目录结构,以及在servlet子目录中的HelloWorldServlet.class文件。
如果你已经安装了J2EE SDK,那么在安装目录的lib子目录下有一个javaee.jar文件(J2EE 1.4以及之前的版本是j2ee.jar文件),其中包含了Servlet API库。你可以在CLASSPATH环境变量下添加javaee.jar所在的路径名,就不需要再配置Tomcat中的servlet-api.jar了。配置了javaee.jar后,你还可以开发其他的J2EE应用。
Step3:部署HelloWorldServlet
Servlet是Web应用程序中的一个组件。一个Web应用程序是由一组Servlet、HTML页面、类,以及其他的资源组成的运行在Web服务器上的完整的应用程序,以一种结构化的有层次的目录形式存在。组成Web应用程序的这些资源文件要部署在相应的目录层次中,根目录代表了整个Web应用程序的根。我们通常是将Web应用程序的目录放到%CATALINA_HOME%/webapps目录下,在webapps目录下的每一个子目录都是一个独立的Web应用程序,子目录的名字就是Web应用程序的名字,也称为Web应用程序的上下文根。用户通过Web应用程序的上下文根来访问Web应用程序中的资源,如图2-4所示。
如果你要新建一个Web应用程序,可以在webapps目录下先建一个目录,在这个例子中,我们所建的目录是ch02,作为第一个Web应用程序的上下文根。Java开发的Web应用程序需要遵照一定的目录层次结构,在Servlet规范中定义了Web应用程序的目录层次结构,如图2-5所示。
|
图2-4 多个Web应用程序和上下文根 |
|
图2-5 Web应用程序的目录层次结构 |
Web应用程序的目录层次结构如表2-1所示。
表2-1 Web应用程序的目录层次结构
目 录 | 描 述 |
/ch02 | Web应用程序的根目录,属于此Web应用程序的所有文件都存放在这个目录下 |
/ch02/WEB-INF | 存放Web应用程序的部署描述符文件web.xml |
/ch02/WEB-INF/classes | 存放Servlet和其他有用的类文件 |
/ch02/WEB-INF/lib | 存放Web应用程序需要用到的JAR文件,这些JAR文件中可以包含Servlet、Bean和其他有用的类文件 |
/ch02/WEB-INF/web.xml | web.xml文件包含Web应用程序的配置和部署信息 |
从表2-1中可以看到,WEB-INF目录下的classes和lib目录都可以存放Java的类文件,在Servlet容器运行时,Web应用程序的类加载器将首先加载classes目录下的,其次才是lib目录下的类。如果这两个目录下存在同名的类,起作用的将是classes目录下的类。
在表2-1中,我们还可以看到一个特殊的目录WEB-INF,注意在书写时不要写错,所有字母都要大写。说这个目录特殊,是因为这个目录并不属于Web应用程序可以访问的上下文路径的一部分,对客户端来说,这个目录是不可见的。如果你将index.html文件放到WEB-INF目录下,对于客户端是无法通过下面的方式访问到这个文件的:
不过,WEB-INF目录下的内容对于Servlet代码是可见的,在Servlet代码中可以通过调用ServletContext对象中的getResource()或者getResourceAsStream()方法来访问WEB-INF目录下的资源,也可以使用RequestDispatcher调用(参见第2.6节)将WEB-INF目录下的内容呈现给客户端。
如果我们想要在Servlet代码中访问保存在文件中的配置信息,而又不希望这些配置信息被客户端访问到,就可以把这个文件放到WEB-INF目录下。
在%CATALINA_HOME%/webapps/ch02目录下新建一个目录WEB-INF,进入WEB-INF目录,新建一个classes目录,整个目录结构是:
%CATALINA_HOME%/webapps/ch02/WEB-INF/classes |
将编译生成的HelloWorldServlet.class文件连同所在的包一起放到WEB-INF/classes目录下。
接下来,我们需要部署这个Servlet,Web应用程序的配置和部署是通过web.xml文件来完成的。web.xml文件被称为Web应用程序的部署描述符,
它可以包含如下的配置和部署信息:
ServletContext的初始化参数
Session的配置
Servlet/JSP的定义和映射
应用程序生命周期监听器类
过滤器定义和过滤器映射
MIME类型映射
欢迎文件列表
错误页面
语言环境和编码映射
声明式安全配置
JSP配置
我们所编写的web.xml文件必须是格式良好的XML。用记事本或者UltraEdit等文本编辑工具编写web.xml文件,内容如例2-2所示。
例2-2 web.xml