一个简单的Servlet .

2.1.4 一个简单的Servlet(1)

这一节我们编写一个最简单的Servlet,其功能就是向客户端输出一个字符串“Hello World”。实例的开发主要有下列步骤。

Step1:编写HelloWorldServlet类

编写一个Servlet,实际上就是编写一个实现了javax.servlet.Servlet接口的类。我们首先在%CATALINA_HOME%/webapps目录下新建一个子目录ch02,然后用记事本或者UltraEdit等文本编辑工具编写HelloWorldServlet.java源文件,将编写好的HelloWorldServlet. java源文件放到%CATALINA_HOME%/webapps/ch02/src目录下(读者也可以自行选择存放源代码的目录)。完整的源代码如例2-1所示。

例2-1 HelloWorldServlet.java

package org.sunxin.ch02.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloWorldServlet implements Servlet
{
private ServletConfig config;
public void destroy(){}
 public ServletConfig getServletConfig()
{
return config;
}

/**
* 该方法很少使用,因此返回null即可
*/
public String getServletInfo()
{  
return null;
}
 /**
* ServletConfig对象由容器构造。容器在调用init()方法时,将其作为参数传给Servlet 
*/
public void init(ServletConfig config) throws ServletException
{
this.config = config;
}
 public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
//得到PrintWriter对象。Servlet使用输出流来产生响应
PrintWriter out=res.getWriter();
//向客户端发送字符数据
out.println("Hello World");
//关闭输出流
out.close();
}
}

在Servlet中,主要的方法是service(),当客户端请求到来时,Servlet容器将调用Servlet实例的service()方法对请求进行处理。我们在service()方法中,首先通过ServletResponse类中的getWriter()方法调用得到一个PrintWriter类型的输出流对象out,然后调用out对象的println()方法向客户端发送字符串“Hello World”,最后关闭out对象。

Servlet容器调用Servlet实例对请求的处理过程如图2-2所示。

 

  
图2-2 Servlet容器调用Servlet实例对请求进行处理的全过程

Step2:编译HelloWorldServlet.java

打开命令提示符,转到HelloWorldServlet.java所在的目录%CATALINA_HOME%/ webapps/ch02/src下,然后执行:

javac -d . HelloWorldServlet.java
大多数情况下,你会看到如图2-3所示的画面。
(点击查看大图)图2-3 编译HelloWorldServlet.java的出错信息

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文件中可以包含ServletBean和其他有用的类文件

/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目录下,对于客户端是无法通过下面的方式访问到这个文件的:

http://localhost:8080/ch02/WEB-INF/index.html

不过,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

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
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_2_5.xsd">

 <servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>
org.sunxin.ch02.servlet.HelloWorldServlet</servlet-class>
</servlet>
     <servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
</web-app>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值