2009-08-14 7 views
8

私は、Restletアプリケーションを開発しました。私は、Restletを通じてURLリクエストでJSPファイルを返したいと思います。リダイレクトを使用せずにこれをどのように達成できますか?Google App EngineでJSPを返すようにRestletを設定しますか?

すなわち するのは、私がmydomain.com上のファイル「contact.jsp」を持っていると私は人々がのRestletに、このようにhttp://mydomain.com/contact

でcontact.jspにアクセスできるようにしたいとしましょう、私が持っているでしょう:

router.attach("/contact", MyResource.class); 

どうすれば "contact.jsp"ページを返すことができますか?私はリダイレクトが機能することを知っていますが、ユーザーに "http://mydomain.com/contact.jsp"の ".jsp"を見せたくないのですか?または、restletを使わなくても動作する別の戦略がありますか? Web.xmlファイルを変更したことがありますか?

編集(2009-08-14):

私の答えは以下の投稿は、App-EngineとのRestlet上では動作しません。しかし、もし私がRestletを含んでいない場合、またはRestletに "/ *"のurlパターンを持たせることができます。

理想的なのは、これを可能にするルータのサブクラスを持つことです。

router.attach("/contact", "/contact.jsp"); 

ありがとうございます!

編集(2009-08-17):私は恵みを掲載するので、私は任意の応答がなかった

私は驚いています。私の質問/問題が明確でない場合、誰かがコメントしてくれますか?

編集(2009-08-17):

興味深い観察。以下の「Rich Seller」で説明されているメソッドを使用する場合、Google App Engineにデプロイされていてローカルではなく動作します。さらに、私がhttp://mydomain.com/contact.jspをGoogle App-Engineに呼び出すと、RestletをバイパスしてそのままJSPに進みます。しかし、ローカルでは、Restletが引き継ぎます。つまり、http://localhost:8080/contact.jspはJSPには行かず、Restletに行きます。デプロイされたアプリケーションエンジンアプリケーションは、ローカルの相手とURLが異なる応答をしますか?

答えて

1

"Restletを使ってURLリクエストでJSPファイルを返すのですが、私はJSPがサーブレットに変換されていることを理解しています。サーブレットはRestletと直交しているため、Restletを使用してJSPファイルを返す方法が不明です。

Restletに加えてJSPを使用する方法を尋ねると仮定すると、これは/ restの代わりに/ restや通常通り.jspを使用してルートパスにリセットをマッピングすることによって最も効果的です。

+0

こんにちはGmu!私も同じ問題に直面しています。「これはあなたのレストレットをルートパスにマッピングすることで最高です」ともう少し説明してください。 – mabicha

1

単純なweb.xml設定のようです。

<servlet> 
    <servlet-name>contactServlet</servlet-name> 
    <jsp-file>/contact.jsp</jsp-file> 
</servlet> 

<servlet-mapping> 
    <servlet-name>contactServlet</servlet-name> 
    <url-pattern>/contact</url-pattern> 
</servlet-mapping> 

これは、RestletなしのApp Engineで動作します。しかし、Restletを組み込むと、Resletのurl-patternを "/ *"に設定すると動作しません。

+0

あなたのサーブレットマッピングの順序を練るとうまくいきます。 – koma

2

Restletは現在JSPを直接サポートしていません。彼らはサーブレットコンテナの外では扱いにくいです。

この問題については、web.xmlの通常の方法でマップされたJSPにリダイレクトするか、JSPを処理して戻す必要があるように見えることがあります。この問題については、discussion on Nabbleが役に立ちます。表現としてのストリーム。

「2009年4月23日、3:02 pmの」日付応答スレッドでは、あなたがハックを行うことができる方法を説明します。

if (request instanceof HttpRequest && 
    ((HttpRequest) request).getHttpCall() instanceof ServletCall) { 

    ServletCall httpCall = (ServletCall) ((HttpRequest) request).getHttpCall(); 

    // fetch the HTTP dispatcher 
    RequestDispatcher dispatcher = httpCall.getRequest().getRequestDispatcher("representation.jsp"); 

    HttpServletRequest proxyReq = new HttpServletRequestWrapper(httpCall.getRequest()); 

    // Overload the http response stream to grab the JSP output into a dedicated proxy buffer 
    // The BufferedServletResponseWrapper is a custom response wrapper that 'hijacks' the 
    // output of the JSP engine and stores it on the side instead of forwarding it to the original 
    // HTTP response. 
    // This is needed to avoid having the JSP engine mess with the actual HTTP stream of the 
    // current request, which must stay under the control of the restlet engine. 
    BufferedServletResponseWrapper proxyResp = new BufferedServletResponseWrapper(httpCall.getResponse()); 

    // Add any objects to be encoded in the http request scope 
    proxyReq.setAttribute("myobjects", someObjects); 

    // Actual JSP encoding 
    dispatcher.include(proxyReq, proxyResp); 

    // Return the content of the proxy buffer 
    Representation rep = new InputRepresentation(proxyResp.toInputStream(),someMediaType); 

BufferedServletResponseWrapperのソースはエントリのカップルの後に掲載されています。

+0

私はこれを動作させることができません。 –

+0

何の例外がありますか? –

+0

これは "dispatcher.include"に遭遇しているようです...そしてそれが繰り返されます。 –

関連する問題