2009-11-13 15 views
11

私は構築しているWebアプリケーションでJSPとサーブレットを混在させてきました。私のより複雑なJSPには、多くのコードが含まれていることがわかり始めました。これは、すべてのMVCレッスン私に打たれた。私はJSPに転送するだけでこれを行うことができますが、これは馬鹿げたハックのようです。サーブレットのテンプレートとしてJSPを使用できますか?

私がしたいのは、サーブレットを使用して処理した後、JSPに一連の値を送信してHTMLをレンダリングし、応答を返すことです。線に沿って何か:それはJSPモデル2アーキテクチャのように思えるhttp://java.sun.com/developer/technicalArticles/javaserverpages/servlets_jsp/ 私が実装したい正確に何ですが、私は例を見つけることができません。

public class MyServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException { 

     // ... Do some processing 

     resp.getWriter.print(renderJSP("mypage.jsp", values)); 

    } 

} 

私はSunのドキュメントチャンスをうかがってきたとは、これが見つかりましたどのようにそれを設定することができます。技術的な理由から、私はStrutsのような高度なテンプレートフレームワークを使用することはできません。

これは可能なのでしょうか?

+2

"技術的な理由から、Strutsのようなより高度なテンプレートフレームワークを使用することはできません。 - あなたは基本的にあなたのアプリのためだけにそれを再実装しようとしています... – Nate

+0

私はそれが素朴なステートメントだと知っていますが、これは本当に私がフレームワーク全体を再考しているような気がしません。私はちょうど2つの既存の技術を結びつける方法を模索しています。私の考えでは、これは非常に明白なユースケースです。 –

答えて

9

オブジェクトを要求に入れ、要求をjspページに転送してから、jspのオブジェクトを使用して応答をレンダリングします。サーブレットで

、あなたの結果JSPは、あなたがそれは前方にのみディレクティブを介してアクセスすることができるWEB-INFディレクトリの中にそれを隠す必要があるURLから直接アクセスしてはならない場合

MyObject obj = ... //build somehow 
request.setAttribute("myObject", obj); 
RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/jsp/my.jsp"); 
rd.forward(request, response); 

次に、あなたのJSPにあなたが持つことができ、オブジェクトを取得するに

<% MyObject obj = (MyObject) request.getAttribute("myObject"); %> 

し、必要に応じて使用。

他の人が示唆しているように、JSTLとおそらくSpring MVCのようなMVCフレームワークを使うことを学ぶのは良い考えです。チュートリアルはhereです。

+0

rd.forwardは302をクライアントに送り返すのですか、それともサーバー側ですべて処理しますか?私は自分の用語を混乱させているだけかもしれません。 –

+0

@Sean Lynch - フォワードディレクトリはサーバ側です。そのため、WEB-INFディレクトリ内のJSPページにアクセスすることができます。 –

4

JSPへの転送はハックとして記述しますが、実際はMVCフレームワークとまったく同じです(少なくともSpring MVCとStruts)。

「モデル」は、サーブレットが移入する要求属性です。 JSPは単にそれらを取得して表示します。 Spring MVCのように "ModelAndView"でラップすることはできますが、実際にはそれが本当です。

もちろん、要求パラメータ、セッション属性、またはサーブレットコンテキスト(「グローバル」)属性を解析することで、JSPでより洗練されたものにすることができます。私は、一般的には、フロントコントローラ/サーブレットがすべてのリクエスト属性をマーシャリングし、ページをそれらから取得させることがよりクリーンであることを発見しました。 JSTLを使用している場合は、要求とセッションの違いが曖昧になります。

+0

絶対に真です。私は春の4つのまともなサイズのWebアプリケーションを行っている、これは明らかにハックではない、サーブレット(または春、コントローラ)ビューのすべてのデータを設定し、JSPに提供されたデータを表示するための唯一のロジックが含まれていますそれはコントローラによって行われます。それは素晴らしい、と本当に維持するのは簡単です、あなたは間違いなく、このルート、そのハックではないとしたい。 – Zoidberg

5

Request/Response/SessionでJavaオブジェクトを入れて、あなたのサーブレットでjavax.servlet.RequestDispatcherを使用し、そのようなこと:

RequestDispatcher dispatcher = request.getRequestDispatcher("/test.jsp"); 
dispatcher.forward(request,response); 

前方はサーバー側で、ターゲット・サーブレット/ JSPは同じを受け取りますリクエスト/レスポンスオブジェクトを元のサーブレット/ JSPとして返します。したがって、request.setAttribute()を使用してそれらの間でデータを渡すことができます。

他のオプションは、クライアント側あるresponse.sendRedirect(String location)を使用する(この方法は、クライアントに、一時的なリダイレクトレスポンスを送信)されるように、ロケーションURLは、クライアントからの新しい要求を受信し、データを渡すための唯一の方法でありますセッションまたはWebパラメータ(url?name = value)を使用します。

これは基本的にMVCフレームワークの機能です(いいえ、ハックではありません)。

+0

dispatcher.forward()は実際に302をクライアントに送信しますか、それともすべてのサーバー側で処理しますか?私は自分のHTML用語が過負荷になっているかもしれないと思う。 –

+0

@Sean、すべてのサーバー側。 –

+0

私は両方のケース(サーバー側とクライアント側)をカバーするために私の答えを更新しました –