4.2.2 Servlet的编写过程

优质
小牛编辑
131浏览
2023-12-01

最简单的Servlet类就是继承HttpServlet类的空类,如下面代码如示:

public class EmptyServlet extends HttpServlet

{

}

在访问EmptyServlet时会显示如图4.3所示的异常信息。

 03

图4.3 访问EmptyServlet抛出的异常

从错误信息可以看出,抛出异常的原因是由于EmptyServlet不支持GET方法所导致。实际上,在HttpServlet类中已经默认实现了doGet、doPost等方法,在默认实现代码中,都会抛出一个不支持该方法的异常(从4.2.1节给出的doGet方法的实现代码就可以看出这一点)。如果Servlet程序不覆盖HttpServlet类中相应的doXxx方法,那么就无法使用相应的HTTP方法来访问Servlet。

要想让Servlet支持某一个HTTP方法,就必须覆盖相应的HttpServlet类的doXxx方法。如在客户端要使用GET方法访问Servlet,就要在Servlet中覆盖doGet方法,如下面代码如示:

public class DoGetServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response
throws ServletException, IOException
{
        // 处理GET请求的代码
}
}

如果要处理POST或其他的请求,方法和处理GET请求类似,都需要覆盖相应的doXxx方法。

要让Servlet支持所有的HTTP方法(处理不同HTTP方法的代码相同)一般有如下两种方法:

1. 将处理HTTP方法的代码写在一个方法中,或是写在其中一个doXxx方法中,然后在其他的doXxx方法中调用这个方法,如下面的代码所示:

public class MyServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response
throws ServletException, IOException
{
        // 处理GET请求的代码
}
public void doPost(HttpServletRequest request, HttpServletResponse response
throws ServletException, IOException
{
        doGet(request, response);           //  调用doGet方法
}   
... ...
}

2. 直接覆盖HttpServlet类中的service方法。如下面的代码所示:

public class MyServlet extends HttpServlet
{
public void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
    {
// 处理所有HTTP请求的代码
    }
}

从上面两种方法可以看出,第二种方法更方便。如果在Servlet中要支持所有的HTTP请求,建议使用第二种方法处理。

除了doXxx外,GenericServlet类中还有两个方法需要注意一下:

1. init方法

这个方法的完整定义如下:

public void init(ServletConfig config) throws ServletException

这个方法在建立Servlet对象时调用,用于为Servlet做一些初始化的工作。其中config参数可以读取Servlet的配置信息(就是web.xml中的信息)。

2. destroy方法

这个方法的完整定义如下:

public void destroy()

当Servlet对象被销毁时destroy方法被调用。这个方法主要用来释放一些被Servlet占用的资源。

在编写完Servlet后,需要使用<Web工程>\WEB-INF\web.xml文件对Servlet进行配置才能运行。主要是将Servlet类和Web访问路径相对应。详细的配置过程请参阅4.2.1节中的内容。