编写及部署Servlet(二)

编写Servlet源代码

    Servlet规范中规定了所有的Servlet类必须实现javax.servlet.Servlet接口。为了便于开发,Servlet规范中提供了该接口的两个通用实现类:javax.servlet.GenericServlet和javax.servlet.http.HttpServlet。这样开发者编写的Servlet既可以直接实现Servlet接口也可以继承于GenericServlet或HttpServlet。由于目前Servlet容器都是基于HTTP协议的,所以继承于HttpServlet是最方便、最快捷的开发方式。 

下面分别以上述三种方式开发一个Servlet,用来通知访问者服务器的当前时间。

方式一:直接实现Servlet接口,代码如下: 

package com.allanlxf.servlet.basic; 

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; 

/**
 * 直接实现javax.servlet.Servlet接口编写Servlet,用来通知访问者服务器的当前时间。
 * 
 * @author Allanlxf(刘新福)
 */

public class TimeServlet implements Servlet
{
    private ServletConfig config; 

    /**
     * Servlet的初始化方法,由Servlet容器调用。
     * 该方法在Servlet实例被创建后,service方法执行前调用。
     * 
     * @param config ServletConfig类型的对象,包含了当前Servlet的配置及初始化参数。
     *               该对象由服务器创建,传给Servlet实例。
     *@throws ServletException Servlet初始化失败时。
     */

    public void init(ServletConfig config) throws ServletException
    {
        this.config = config;
    }

    /**
     * Servlet的服务方法,由Servlet容器调用。
     * 当Servlet容器接收到一个来自客户端的请求时,调用该方法。
     * 本类中,该方法输出服务器的当前时间到客户端。
     *
     * @param request  包含了客户端请求信息的ServletRequest类型的对象。
     * @param response 代表服务器到客户端响应信息的ServletResponse类型的对象。
     * 
     * @throws ServletException 当Servlet无法提供服务时。
     * @throws IOException 输入输出错误发生时。
     */
    public void service(ServletRequest request, ServletResponse response) 
                             throws ServletException, IOException
    {
        response.setContentType("text/html;charset=gbk");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("  <title>current time of web server</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h3 align=\"center\">Current Time Of The Web Server</h3>");
        out.println("<hr size=\"10\" color=\"#FF0000\">");
        out.println("<center>" + new java.util.Date() + "</center>");
        out.println("</body>");
        out.println("</html>");
    }

    /**
     * Servlet销毁方法,由Servlet容器调用。
     * 该方法在Servlet实例从Servlet容器中卸载之前调用。
     */
    public void destroy()
    {
    } 

    /**
     * 返回包含了当前Servlet的配置及初始化参数的ServletConfig对象。
     * 该对象应该为init方法传入的ervletConfig对象。
     */
    public ServletConfig getServletConfig()
    {
        return config;
    } 

    /**
     * 返回一个代表该Servlet信息的字符串,比如作者,版本等。
     */
    public String getServletInfo()
    {
        return "TimeServlet By Allanlxf, version1.0";
    }

方式二:继承于GenericServlet抽象类,代码如下: 

package com.allanlxf.servlet.basic; 

import java.io.IOException;
import java.io.PrintWriter; 

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; 

/**
 * 继承于javax.servlet.GenericServlet抽象类编写Servlet,用来通知访问者服务器的当前时间。
 * 
 * @author Allanlxf(刘新福)
 */
@SuppressWarnings("serial")
public class TimeGenericServlet extends GenericServlet
{
    /**
     * Servlet的服务方法,由Servlet容器调用。
     * 当Servlet容器接收到一个来自客户端的请求时,调用该方法。
     * 本类中,该方法输出服务器的当前时间到客户端。
     * 
     * @param request  包含了客户端请求信息的ServletRequest类型的对象。
     * @param response 代表服务器到客户端响应信息的ServletResponse类型的对象。
     * 
     * @throws ServletException 当Servlet无法提供服务时。
     * @throws IOException 输入输出错误发生时。
     */
    @Override
    public void service(ServletRequest request, ServletResponse response) 
                       throws ServletException, IOException
    {
        response.setContentType("text/html;charset=gbk");
        PrintWriter out = response.getWriter(); 
        out.println("<html>");
        out.println("<head>");
        out.println("  <title>current time of web server</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h3 align=\"center\">Current Time Of The Web Server</h3>");
        out.println("<hr size=\"10\" color=\"#FF0000\">");
        out.println("<center>" + new java.util.Date() + "</center>");
        out.println("</body>");
        out.println("</html>");
    }

方式三:继承于HttpServlet抽象类,代码如下: 

package com.allanlxf.servlet.basic; 

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; 

/**
 * 继承于javax.servlet.http.HttpServlet抽象类编写Servlet,
 * 用来通知访问者服务器的当前时间。
 * 
 * @author Allanlxf(刘新福)
 */
@SuppressWarnings("serial")
public class TimeHttpServlet extends HttpServlet
{
    /**
     * Servlet的服务方法,用来处理客户端的get请求,由Servlet容器调用。
     * 当Servlet容器接收到一个来自客户端的get请求时,调用该方法。
     * 本类中,该方法输出服务器的当前时间到客户端。
     * 
     * @param request  包含了客户端请求信息的HttpServletRequest类型的对象。
     * @param response 代表服务器到客户端响应信息的HttpServletResponse类型的对象。
     * 
     * @throws ServletException 当Servlet无法提供服务时。
     * @throws IOException 输入输出错误发生时。
     */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
                           throws
 ServletException, IOException
    {
        response.setContentType("text/html;charset=gbk");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("  <title>current time of web server</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h3 align=\"center\">Current Time Of The Web Server</h3>");
        out.println("<hr size=\"10\" color=\"#FF0000\">");
        out.println("<center>" + new java.util.Date() + "</center>");
        out.println("</body>");
        out.println("</html>");
    }

    /**
     * Servlet的服务方法,用来处理客户端的post请求,由Servlet容器调用。
     * 当Servlet容器接收到一个来自客户端的post请求时,调用该方法。
     * 本类中,该方法通过调用doGet来输出服务器的当前时间到客户端。
     * 
     * @param request  包含了客户端请求信息的HttpServletRequest类型的对象。
     * @param response 代表服务器到客户端响应信息的HttpServletResponse类型的对象。
     * 
     * @throws ServletException 当Servlet无法提供服务时。
     * @throws IOException 输入输出错误发生时。
     */
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
                         throws ServletException, IOException
    {
        doGet(request, response);
    }
}

编译Servlet

   由于Servlet规范属于Java企业版,Servlet的类文件并不包含在Java SDK中,因此首先要确保Java编译器能够识别Servlet规范中的类。解决办法是正确设置编译环境。Servlet的类文件包含在tomcat服务器下的common/lib/servlet-api.jar文件中,如果在命令行下编译,需要将servlet-api.jar包含到环境变量CLASSPATH中;如果使用了集成开发工具,比如eclipse、netbeans或jbuilder等,需要将servlet-api.jar导入到工具中。

   下面以命令行为例,编译步骤如下:

   javac TimeServlet.java –d .

部署Servlet到Web应用

(1)将TimeServlet、TimeGenericServlet和TimeHttpServlet类的字节码文件放到web应用的WEB-INF/classes目录下。
(2)编辑web应用的WEB-INF/web.xml文件,加入如下Servlet配置标签,部署上述三个Servlet。 

<?xml version="1.0" encoding="gbk"?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"  version="2.4">   

    <servlet>
      <servlet-name>TimeServlet</servlet-name>
      <servlet-class>com.allanlxf.servlet.basic.TimeServlet</servlet-class>
    </servlet>

    <servlet>
      <servlet-name>TimeGenericServlet</servlet-name>
      <servlet-class>com.allanlxf.servlet.basic.TimeGenericServlet</servlet-class>
    </servlet>

    <servlet>
      <servlet-name>TimeHttpServlet</servlet-name>
      <servlet-class>com.allanlxf.servlet.basic.TimeHttpServlet</servlet-class>    
    </servlet>   

    <servlet-mapping>
      <servlet-name>TimeServlet</servlet-name>
      <url-pattern>/basic/time</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
      <servlet-name>TimeGenericServlet</servlet-name>
      <url-pattern>/basic/time/generic</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
      <servlet-name>TimeHttpServlet</servlet-name>
      <url-pattern>/basic/time/http</url-pattern>
    </servlet-mapping>

</web-app> 

测试Servlet

(1)启动tomcat服务器。
(2)打开Web浏览器,在地址栏输入http://localhost:8080/serv-app/basic/time,测试TimeServlet。
(3)打开Web浏览器,在地址栏输入http://localhost:8080/serv-app/basic/time/generic,测试TimeGenericServlet。
(4)打开Web浏览器,在地址栏输入http://localhost:8080/serv-app/basic/time/http,测试TimeHttpServlet。 

运行结果如下图所示:


posted @ 2010-03-24 16:13  退而结网  阅读(648)  评论(0)    收藏  举报