2009-07-02 23 views
18

Ho bisogno di eseguire un JSP. Ma ho bisogno di direttamente da Java, senza utilizzare Tomcat o qualsiasi altro contenitore di servlet. Compilare JSP sarebbe una buona cosa, ma non necessario. Penso che forse il pacchetto org.apache.jasper è buono per farlo, ma non riesco a trovare nessun buon esempio o tutorial online.Esegui JSP direttamente da Java

ho bisogno di qualcosa come:

Class compiledJSP = compileJSP(new File("helloWorld.jsp")); 
String html = executeJSP(compiledJSP, httpServletRequest, httpServletResponse, ...); 

html --> "Hello World, John!" 

Grazie!

+0

Ma perché vuoi farlo? Vuoi semplicemente generare HTML in modo programmatico? – Raedwald

+0

Questo è stato precedentemente contrassegnato come un duplicato per http://stackoverflow.com/questions/956112/programmatic-htmldocument-generation-using-java?lq=1 o http://stackoverflow.com/questions/8141813/execute-jsp -with-jetty-7-3-senza-javac? lq = 1. Non è. –

risposta

4

Avrete bisogno di un contenitore. Un JSP è un'astrazione su Servlet. I servlet hanno una dipendenza da un ciclo di vita fornito da un contenitore. È necessario un contenitore per fornire il ciclo di vita.

18

Se avete bisogno di catturare l'output di JSP come stringa è abbastanza semplice (anche se tutt'altro che ideale dal punto di vista del design) da entro Servlet Container:
1. Estendere javax.servlet.HttpServletResponseWrapper e sovrascrivere getWriter()/metodi getOutputStream() per fornire le proprie versioni bufferizzate (ad es. StringWriter)
2. Richiamare il metodo "include()" di RequestDisparcher, avvolgendo la risposta originale nel proprio.
3. Carica il contenuto del buffer.

Ora, se è necessario fare la stessa cosa all'esterno del contenitore di servlet, è davvero necessario chiedersi "perché?". Forse dovresti usare un motore di template (FreeMarker/Velocity/StringTemplate/etc ...) invece di JSP? Se i file JSP sono file XML ben formati e non si utilizzano inserimenti di codice java, può essere ragionevolmente banale convertirli in modelli di FreeMarker (FreeMarker supporta librerie di tag JSP personalizzate) che renderebbero notevolmente semplificando l'attività.

Tuttavia, se si tratta di un requisito difficile in assoluto le opzioni più semplici sono:
1. Eseguire un Servlet Container esterna e lasciarlo gestire l'interpretazione JSP. Il tuo programma invierà richieste HTTP ad esso e catturerà l'output.
2. Come sopra, ma è possibile eseguire il contenitore servlet incorporato (ad esempio Jetty).

Se i JSP sono disponibili in fase di build, è possibile precompilarli tramite Jasper come suggerito in altre risposte.

Vorrei fortemente consigli contro il tentativo di implementare il proprio contenitore di servlet - camminerai in un mondo di dolore.

+0

Grazie per il vostro consiglio. In realtà non voglio implementare il mio contenitore di servlet. Non voglio compilare ed elaborare JSP, ma non vedo alcuna alternativa per quello che cerco. Voglio creare le risposte del server come JSON come questo: {HTML1: "

1
", HTML2: ""} Ogni html deve essere fatta con JSP, ma il JSON non può essere lì . Ho usato FreeMarker e non vedo come può essere d'aiuto. Se conosci qualche modo per fare quello che sto cercando, ti sarei grato. Grazie. –

+0

Non sono abbastanza chiaro su cosa stai cercando di ottenere. Stai restituendo la risposta JSON da un'applicazione che esegue _outside_ un container servlet? Perché? Ho difficoltà a immaginare di usare JSON per le comunicazioni tra app. Se potresti chiarire cosa stai cercando di fare un po 'di più sarei felice di aiutarti. La differenza che FreeMarker farebbe è che puoi eseguirlo completamente dall'app senza dover simulare l'ambiente servlet. Per esempio. ogni frammento 'html' nella tua risposta sarebbe prodotto da un modello FTL separato e dovresti semplicemente chiamare Template.process (modello, scrittore) su ciascuno. – ChssPly76

+0

Nota che questo (al momento) non funzionerà su Jetty, a causa di http://jira.codehaus.org/browse/JETTY-1485. Funziona benissimo su Tomcat. C'è una descrizione più dettagliata di questo approccio qui: http://technologicaloddity.com/2011/10/04/render-and-capture-the-output-of-a-sp-as-a-string/ – Rich

0

Questo è possibile senza un contenitore servlet. Ci sono due passaggi.

Il primo è generare il codice sorgente. Se si guarda il codice sorgente del task jspc ant, è possibile farlo direttamente nel codice. O potresti semplicemente invocare l'attività ant.

Il codice generato è solo un servlet ed è possibile richiamare i metodi su un servlet esterna di un contenitore:

Basta istanziarla e quindi chiamare doGet (richiesta, risposta). Non sono sicuro esattamente di cosa hai bisogno, ma la tua vita sarà semplificata usando gli oggetti simulati di primavera per la richiesta e la risposta http.

Questo popolerà l'oggetto risposta.si può quindi ottenere l'uscita con:

res.getContentAsString(); 

vedere un esempio qui:

http://ytreyvus.blogspot.com/2007/03/private-void-cloneplaneffectrelationshi.html