2011-07-25 11 views
12

私はサーブレットに関する本を読んでいました。その本ではサーブレットクラスとHttpServletクラスについて簡単に説明しました。service()またはdoPost()をオーバーライドする必要がありますか?

フォームに入力するための1つの例があります。サーブレットのdoPost()メソッドは、そのクラスによってオーバーライドされています。しかし、ログインフォームの別の例では、service()メソッドが代わりにオーバーライドされます。

2つの異なるアプローチ - なぜ私たちはカスタムコードを通常doPost()(またはdoGet())に置き、service()をそのまま残しておくと思ったのですか? 2つのアプローチのいずれかを使用する理由がありますか、あるいはどちらの状況でも両方のアプローチを使用できますか?

+2

からトマシュNurkiewiczで与え

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

実装コード「あなたはこれを行うべきであるか、そうしなければならない」と反対に、サーブレットを使用するさまざまな方法の例を表示しようとしているだけであれば驚いた。なぜなら、本当にあなたが深刻なアプリケーションを開発しているのであれば、サーブレットレベルで実装するのではなく、MVCフレームワーク(Struts、Spring、Wicketなど)を勉強して実装することになります。 (将来の読書のためのちょっとした提案です。) – Marvo

答えて

13

service()メソッドを上書きしないでください。好ましい手法は、ポストにはdoPost()、getにはdoGet()を使用しています。ここでは、それぞれが何をするかについての優れた記事があります。 http://www.jguru.com/faq/view.jsp?EID=47730

あなたは HTTPプロトコルを使用していないクライアントによって行われた要求に応答しなければならない場合は、()サービスを使用する必要があります。

1

XXXは、GET、POSTなどのHTTPメソッドを表すdoXXX()メソッドをオーバーライドする可能性が最も高いでしょう。コンテナによって呼び出されるメソッドservice()は、呼び出されるdoXXX()のどれを決定します。

4

あなた自身で決定するためには、フローを理解する必要があると思います。 HttpServletのデフォルトの実装service()は、リクエストメソッド(GET、POST、何でも)に対して適切なハンドラを呼び出します。

同じメソッドですべての着信メソッドを処理する場合は、GET、PUT、POSTのいずれのリクエストであっても同じ方法で応答する必要がある場合は、service()をオーバーライドする必要があります。別々に各メソッドを扱うことに満足している場合は、デフォルトのservice()実装に行き、特定のハンドラーをオーバーライドします。

0

HTTPプロトコルクライアント(通常はブラウザ)からのGET要求またはPOST要求に応答する必要がある場合は、HttpServletを拡張して便利なメソッドを使用することをためらってください。 あなたはHTTPプロトコルを使用していないクライアントによって行われた要求に応答しなければならない場合は、サービスを(使用する必要があります)

1

サービス()メソッドは、GenericServletからに属しており、そのようなプロトコルのいずれかのタイプをサポートするためにオーバーロードすることができますHttp、Ftpなど。HttpServletと呼んでいます。次に、HttpProtocolを処理するための特殊なサーブレットがあります。HttpServlet HttpServletは、service()およびdoGet()およびdoPost()メソッドのデフォルトの実装も提供します。

なぜservice()メソッドをオーバーライドしないでください。

サービスメソッドをオーバーライドするのは良い方法ではありません。 doxxxメソッドのいずれかを呼び出すと、内部的にHttpServletのサービスメソッドが呼び出されます。したがって、明示的に呼び出す必要はありません。サービスの実行()の

注文:

サービス(のServletRequest、ServletResponseを) - >

- >呼び出す

- >サービス(HttpServletRequestのREQ、HttpServletResponseの解像度)

- >呼び出す

- >のdoGet/doPostメソッド(HttpServletRequestのREQ、HttpServletRespo NSE RES)

これは、あなたがしたい場合には、サービスを無効にする方法である:私はではないでしょうSOコミュニティのみ Overriding Service Method

関連する問題