Configurer Restlet pour renvoyer des fichiers JSP sur Google App Engine?

J’ai développé une application Restlet. Je souhaite renvoyer un fichier JSP sur une demande d’URL via Restlet. Comment puis-je y parvenir sans utiliser une redirection?

Par exemple, disons que j’ai le fichier “contact.jsp” sur mydomain.com et que les gens puissent accéder à contact.jsp à l’ adresse http://mydomain.com/contact

Ainsi, dans Restlet, j’aurais:

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

Mais comment puis-je retourner 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 ci-dessous ne fonctionne pas sur App-Engine et Restlet. Cela fonctionne cependant, si je n’inclus pas Restlet, ou si j’autorise Restlet à avoir un motif d’URL de “/ *”

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

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

Merci!

Edit (2009-08-17):

Je suis surpris de ne pas avoir de réponses depuis que j’ai posté une prime. Est-ce que quelqu’un peut commenter et me faire savoir si ma question / problème n’est pas clair?

Edit (2009-08-17):

Observation intéressante. Lorsque vous utilisez la méthode décrite par “Rich Seller” ci-dessous, cela fonctionne lorsqu’il est déployé sur Google App-Engine et non localement. De plus, si j’appelle http://mydomain.com/contact.jsp sur Google App-Engine, cela contourne Restlet et passe directement au JSP. Mais localement, Restlet prend le relais. Autrement dit, http: // localhost: 8080 / contact.jsp ne va pas vers le JSP et va vers Restlet. Les applications de moteur d’application déployées répondent-elles différemment aux URL en tant que contrepartie locale?

“Je souhaite renvoyer un fichier JSP sur une requête d’URL via Restlet” – Je comprends que les fichiers JSP sont convertis en servlets. Comme les servlets sont orthogonol à Restlets, vous ne savez pas comment vous pouvez renvoyer un fichier JSP via Restlet.

En supposant que vous demandiez un moyen d’utiliser JSP en plus de Restlet, la meilleure solution consiste à mapper vos restlets sur un chemin racine tel que / rest au lieu de / * et à utiliser le fichier .jsp comme d’habitude.

Restlet ne prend actuellement pas directement en charge les JSP. Ils sont difficiles à manipuler en dehors du conteneur de servlets.

Vous trouverez peut-être une discussion utile sur ce problème au sujet de Nabble. Pour le moment, il semble nécessaire de renvoyer une redirection vers le fichier JSP mappé normalement dans le fichier web.xml ou de le pirater pour traiter le fichier JSP et renvoyer le stream. comme la représentation.

La réponse datée du “23 avril 2009; 15h02” dans le fil de discussion décrit comment vous pouvez faire le hack:

 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.setAtsortingbute("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 de BufferedServletResponseWrapper est postée quelques entrées plus tard.

Ressemble à une simple configuration web.xml.

  contactServlet /contact.jsp   contactServlet /contact  

Cela fonctionne sans Restlet dans App-Engine. Mais une fois que j’inclus Restlet, cela ne fonctionne pas si je règle mon motif d’URL Reslet sur “/ *”