覆盖 HttpServlet 服务方法



我有一个servlet,看起来像:

public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws IOException, ServletException {
    doTheJob(request, response);
}//method doGet
public void doPost(HttpServletRequest request, HttpServletResponse response)
              throws IOException, ServletException {
    doTheJob(request, response);
}//method doPost
private void doTheJob(.....) {
    ...........................
}
}

由于我的应用程序的工作方式,我只需要从doGet()doPost()调用doTheJob()。所以我认为,我最好覆盖 HttpServlet 的方法 service()。

但我想知道这是否会阻止任何事情或会导致任何问题。

这是service()通常的实现方式(非常简化):

protected void service(HttpServletRequest req, HttpServletResponse resp) {
    String method = req.getMethod();
    if (method.equals(METHOD_GET)) {
            doGet(req, resp);
    } else if (method.equals(METHOD_HEAD)) {
        doHead(req, resp);
    } else if (method.equals(METHOD_POST)) {
        doPost(req, resp);
    } else if (method.equals(METHOD_PUT)) {
        doPut(req, resp);   
    } else if (method.equals(METHOD_DELETE)) {
        doDelete(req, resp);
    } else if (method.equals(METHOD_OPTIONS)) {
        doOptions(req,resp);
    } else if (method.equals(METHOD_TRACE)) {
        doTrace(req,resp);
    } else {
        resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    }
}

如您所见,它几乎没有委托给doGet()doPost(),具体取决于HTTP方法。因此,一方面用service()代替doGet()doPost()就可以了。另一方面,你的 servlet 也会处理PUTDELETEHEAD和其他方法,同时使用单独的doGet()doPost()它将返回 405 方法不允许

这就是为什么我实际上建议将doGet()doPost()委托给您的代码并让 servlet 处理其他方法的原因。如果这是代码中反复出现的模式,请考虑以下帮助程序 servlet:

public class AbstractServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                 throws IOException, ServletException {
        doGetOrPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                  throws IOException, ServletException {
        doGetOrPost(request, response);
    }
    abstract protected void doGetOrPost(.....);
}

你最好保持原样。覆盖 service() 方法也使此方法回答 PUT、HEAD、DELETE 等。它绕过了默认 service() 方法对上次修改的标头所做的工作。

最新更新