8

Restletアプリケーションを開発しました。Restletを介してURLリクエストでJSPファイルを返したいのですが。リダイレクトを使用せずにこれを達成するにはどうすればよいですか?

つまり、mydomain.comに「contact.jsp」というファイルがあり、http://mydomain.com/contactでcontact.jspにアクセスできるようにしたいとします

したがって、Restletでは、次のようになります。

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

しかし、どうすれば「contact.jsp」ページを返すことができますか?リダイレクトが機能することはわかっていますが、ユーザーに「 http://mydomain.com/contact.jsp 」の「.jsp」を表示させたくありません...または、使用しなくても機能する別の戦略がありますレストレット?たぶん私のweb.xmlファイルのいくつかの変更?

編集(2009-08-14):

以下に投稿された私の回答は、App-EngineとRestletでは機能しません。ただし、Restletを含めない場合、またはRestletに「/*」のURLパターンを許可する場合は機能します。

理想的なのは、これを実行できるルーターのサブクラスを用意することです。

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

ありがとう!

編集(2009-08-17):

賞金を投じてから何の返答もなかったのには驚きました。私の質問/問題が明確でない場合、誰かがコメントして私に知らせてくれますか?

編集(2009-08-17):

興味深い観察。以下の「リッチセラー」で説明されている方法を使用する場合、ローカルではなくGoogleApp-Engineにデプロイすると機能します。さらに、Google App-Engineでhttp://mydomain.com/contact.jspを呼び出すと、Restletをバイパスして、JSPに直接アクセスします。しかし、ローカルでは、Restletが引き継ぎます。つまり、http:// localhost:8080 / contact.jspはJSPに移動せず、Restletに移動します。デプロイされたアプリエンジンアプリケーションは、ローカルの対応するURLとは異なる応答をしますか?

4

3 に答える 3

2

Restletは現在JSPを直接サポートしていません。サーブレットコンテナの外部で処理するのは困難です。

Nabbleについて、この問題についての議論があります。現時点では、web.xmlで通常どおりにマップされたJSPにリダイレクトを返すか、ハッキングしてJSPを処理してストリームを返す必要があるようです。表現として。

スレッドの「2009年4月23日;03:02pm」という日付の応答は、ハッキングを行う方法を説明しています。

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のソースは、数エントリ後に投稿されます。

于 2009-08-14T07:57:22.193 に答える
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>

これは、App-EngineでRestletなしで機能します。ただし、Restletを含めると、Resletのurl-patternを「/*」に設定しても機能しません。

于 2009-08-14T03:55:23.460 に答える
1

「Restletを介してURLリクエストでJSPファイルを返したい」-私の理解では、JSPはサーブレットに変換されます。サーブレットはRestletに対してオルソゴノールであるため、Restletを介してJSPファイルを返す方法がわかりません。

Restletに加えてJSPを使用する方法を求めていると仮定すると、これは、Restletを/*ではなく/restなどのルートパスにマッピングし、通常どおり.jspを使用することで最もよく達成されます。

于 2010-09-17T00:36:42.460 に答える