2009-08-14 8 views
8

Ho sviluppato un'applicazione Restlet. Vorrei restituire un file JSP su una richiesta URL tramite Restlet. Come posso ottenere questo risultato senza utilizzare un reindirizzamento?Configura Restlet per restituire JSP su Google App Engine?

cioè Diciamo che ho il file "contact.jsp" su mydomain.com e voglio che le persone a essere in grado di accedere a contact.jsp http://mydomain.com/contact

Così, in Restlet, avrei:

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

Ma come posso restituire la pagina "contact.jsp"? So che un reindirizzamento funzionerebbe, ma non voglio che gli utenti vedano il ".jsp" in "http://mydomain.com/contact.jsp" ... o c'è un'altra strategia che funzionerebbe senza nemmeno usare il restlet? Forse qualche modifica del mio file web.xml?

Edit (2009-08-14):

La mia risposta pubblicato qui di seguito non funziona su App-Engine e Restlet. Funziona comunque, se non includo Restlet, o consenti a Restlet di avere un modello URL di "/ *"

Ciò che sarebbe l'ideale è avere una sottoclasse del Router che mi permetta di fare questo:

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

Grazie!

Edit (2009-08-17):

Sono sorpreso che non ho avuto alcuna risposta da quando ho postato una taglia. Qualcuno potrebbe commentare e farmi sapere se la mia domanda/problema non è chiara?

Edit (2009-08-17):

Interessante osservazione. Quando si utilizza il metodo descritto da "Rich Seller" di seguito, funziona quando è distribuito su Google App-Engine e non localmente. Inoltre, se chiamo http://mydomain.com/contact.jsp su Google App-Engine ignora il Restlet e passa direttamente al JSP. Ma, localmente, la Restlet prende il sopravvento. Cioè, http://localhost:8080/contact.jsp non va al JSP e va a Restlet. Le applicazioni di app-engine distribuite rispondono in modo diverso agli URL come controparte locale?

risposta

1

"Mi piacerebbe restituire un file JSP su una richiesta URL tramite Restlet" - La mia comprensione è JSP sono convertiti in servlet. Poiché i servlet sono ortogonali ai restlets, non si è sicuri su come sia possibile restituire il file JSP tramite Restlet.

Supponendo che si stia chiedendo un modo per utilizzare JSP in aggiunta a Restlet, è meglio farlo mappando i propri restlets su un rootpath come/resto anziché/* e usando il .jsp come al solito.

+0

Ciao Gmu! Anche io sto affrontando lo stesso problema, puoi spiegare "Questo è il modo migliore per farlo mappando i tuoi restlets su un rootpath" un po 'di più? – mabicha

1

Sembra una semplice configurazione 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> 

Questo funziona senza Restlet in App-Engine. Ma una volta incluso Restlet, non funziona se imposto il mio modello di URL Reslet su "/ *"

+0

funziona se si gioca con l'ordine delle mappature servlet – koma

2

Attualmente, il supporto non supporta direttamente JSP. Sono difficili da gestire al di fuori del contenitore della servlet.

C'è un discussion on Nabble su questo problema che potresti trovare utile, al momento sembra che sia necessario restituire un reindirizzamento al JSP mappato normalmente nel web.xml, o modificarlo per elaborare il JSP e restituirlo il flusso come rappresentazione.

La risposta datata "Apr 23, 2009; 15:02" nel thread descrive come si potrebbe fare l'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.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 fonte per la BufferedServletResponseWrapper è pubblicato un paio di voci più tardi.

+0

Non riesco a farlo funzionare, continuo a ricevere un'eccezione. –

+0

quale eccezione stai ricevendo? –

+0

Sembra essersi impigliato in "dispatcher.include" ... e poi si ripete .. –