8 votes

Configurer Restlet pour renvoyer des JSP sur Google App Engine ?

J'ai développé une application Restlet. J'aimerais renvoyer un fichier JSP lors d'une requête URL via Restlet. Comment puis-je réaliser cela sans utiliser de redirection ?

Par exemple. Disons que j'ai le fichier "contact.jsp" sur mondomaine.com et que je veux que les gens puissent accéder à contact.jsp à l'adresse suivante http://mydomain.com/contact

Ainsi, dans Restlet, j'aurais :

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

Mais comment puis-je renvoyer la page "contact.jsp" ? Je sais qu'une redirection fonctionnerait, mais je ne veux pas que les utilisateurs voient le " .jsp " dans " http://mydomain.com/contact.jsp "... ou existe-t-il une autre stratégie qui fonctionnerait sans même utiliser restlet ? Peut-être une modification de mon fichier web.xml ?

Modifier (2009-08-14) :

Ma réponse postée ci-dessous ne fonctionne pas sur App-Engine et Restlet. Elle fonctionne cependant, si je n'inclus pas Restlet, ou si j'autorise Restlet à avoir un modèle d'url de "/*".

L'idéal serait d'avoir une sous-classe du routeur qui me permette de faire cela :

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

Gracias.

Modifier (2009-08-17) :

Je suis surpris de n'avoir eu aucune réponse depuis que j'ai posté une prime. Quelqu'un peut-il commenter et me faire savoir si ma question/problème n'est pas claire ?

Edit (2009-08-17) :

Observation intéressante. Lorsque j'utilise la méthode décrite par "Rich Seller" ci-dessous, elle fonctionne lorsqu'elle est déployée sur Google App-Engine et non localement. De plus, si j'appelle http://mydomain.com/contact.jsp sur Google App-Engine, il contourne Restlet et va directement à la JSP. Mais, localement, Restlet prend le relais. C'est à dire, http://localhost:8080/contact.jsp ne va pas à la JSP et va à Restlet. Les applications déployées du moteur d'application répondent-elles différemment aux URL que leur homologue local ?

2voto

Rich Seller Points 46052

Restlet ne supporte actuellement pas directement les JSPs. Ils sont difficiles à gérer en dehors du conteneur de servlets.

Il y a un discussion sur Nabble Pour l'instant, il semble que vous deviez soit renvoyer une redirection vers la JSP mappée normalement dans le web.xml, soit modifier le traitement de la JSP et renvoyer le flux comme représentation.

La réponse datée du "23 avril 2009 à 15 h 02" dans le fil de discussion décrit comment vous pouvez effectuer le piratage :

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

La source du BufferedServletResponseWrapper est affichée quelques entrées plus loin.

1voto

JP Richardson Points 11920

On dirait une simple configuration 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>

Cela fonctionne sans Restlet dans App-Engine. Mais une fois que j'ai inclus Restlet, cela ne fonctionne pas si je règle mon modèle d'url Reslet sur "/*".

1voto

Gmu Points 328

"J'aimerais renvoyer un fichier JSP lors d'une demande d'URL par le biais de Restlet" - Si j'ai bien compris, les JSP sont convertis en servlets. Puisque les servlets sont orthogonaux aux Restlets, je ne suis pas sûr que vous puissiez retourner un fichier JSP par Restlet.

En supposant que vous demandez un moyen d'utiliser JSP en plus de Restlet, le meilleur moyen d'y parvenir est de faire correspondre vos restlets à un chemin racine tel que /rest au lieu de /* et d'utiliser le .jsp comme d'habitude.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X