4.2.2 Servlet的编写过程
最简单的Servlet类就是继承HttpServlet类的空类,如下面代码如示:
public class EmptyServlet extends HttpServlet
{
}
在访问EmptyServlet时会显示如图4.3所示的异常信息。
图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节中的内容。