16

次のようなサーブレットがあります。

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()をオーバーライドしたほうがいいと思います。

しかし、それが何かを妨げるか、または問題を引き起こすかどうかを知りたい.

4

2 に答える 2

24

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);
    }
}

ご覧のとおり、HTTP メソッドにほとんど委譲しdoGet()doPost()依存していません。だから、片手から交換doGet()doPost()service()大丈夫です。一方、サーブレットは、、、およびその他のメソッドを個別に処理し、405 PUTMethod not allowedを返します。DELETEHEADdoGet()doPost()

doGet()そのため、コードを分離してdoPost()委任し、サーブレットに他のメソッドを処理させることを実際にアドバイスします。これがコード内で繰り返されるパターンである場合は、次のヘルパー サーブレットを検討してください。

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(.....);

}
于 2012-12-15T12:09:00.493 に答える
9

そのままにしておいたほうがいい。また、メソッドをオーバーライドするservice()と、このメソッドは PUT、HEAD、DELETE などに応答します。また、デフォルトのservice()メソッドが最後に変更されたヘッダーで行う作業をバイパスします。

于 2012-12-15T12:09:30.147 に答える