19 Stimmen

JSP direkt von Java aus ausführen

Ich muss ein JSP ausführen. Aber ich muss es direkt von Java aus tun, ohne Tomcat oder einen anderen Servlet-Container zu verwenden. Das Kompilieren von JSPs wäre auch gut, ist aber nicht notwendig. Ich denke, vielleicht org.apache.jasper Paket ist gut für dies zu tun, aber ich kann kein gutes Beispiel oder Tutorial online finden.

Ich brauche etwas wie:

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

html --> "Hello World, John!"

Gracias.

19voto

ChssPly76 Punkte 97241

Wenn Sie die JSP-Ausgabe als Zeichenkette erfassen müssen, ist das relativ einfach (wenn auch vom Standpunkt des Designs aus alles andere als ideal) von innerhalb Servlet-Container:
1. Erweitern Sie javax.servlet.HttpServletResponseWrapper und überschreiben Sie die Methoden getWriter() / getOutputStream(), um Ihre eigenen gepufferten Versionen bereitzustellen (z. B. StringWriter)
2. Rufen Sie die Methode "include()" von RequestDisparcher auf und verpacken Sie die ursprüngliche Antwort in Ihre eigene.
3. Greifen Sie den Inhalt des Puffers.

Wenn Sie nun dasselbe tun müssen außerhalb Servlet-Container zu verwenden, müssen Sie sich wirklich fragen, "warum?". Vielleicht sollten Sie eine Template-Engine (FreeMarker / Velocity / StringTemplate / etc...) anstelle von JSPs verwenden? Wenn Ihre JSPs wohlgeformte XML-Dateien sind und keine Java-Code-Einschübe verwenden, kann es relativ trivial sein, sie in FreeMarker-Templates zu konvertieren (FreeMarker unterstützt benutzerdefinierte JSP-Tag-Bibliotheken). sehr Ihre Aufgabe zu vereinfachen.

Wenn es sich jedoch um eine absolut harte Anforderung handelt, sind die einfachsten Optionen:
1. Starten Sie einen externen Servlet-Container und überlassen Sie ihm die JSP-Interpretation. Ihr Programm würde HTTP-Anfragen an ihn senden und die Ausgabe erfassen.
2. Wie oben, aber Sie können eingebettete Servlet Container (z.B. Jetty) verwenden.

Wenn Ihre JSPs zur Build-Zeit verfügbar sind, können Sie sie über Jasper vorkompilieren, wie in anderen Antworten vorgeschlagen.

Ich würde stark Ich rate Ihnen davon ab, einen eigenen Servlet-Container zu implementieren - Sie werden sich in eine Welt des Schmerzes begeben.

4voto

Brian Punkte 13229

Sie benötigen einen Behälter. Ein JSP ist eine Abstraktion von einem Servlet. Servlets sind von einem Lebenszyklus abhängig, der von einem Container bereitgestellt wird. Sie benötigen einen Container, um den Lebenszyklus bereitzustellen.

0voto

Pablojim Punkte 8312

Dies ist ohne einen Servlet-Container möglich. Es gibt zwei Schritte dazu.

Die erste besteht darin, den Quellcode zu generieren. Wenn Sie sich den Quellcode der jspc-Ant-Aufgabe ansehen, ist es möglich, dies direkt im Code zu tun. Oder Sie könnten einfach den Ant-Task aufrufen.

Der generierte Code ist lediglich ein Servlet und es ist möglich, die Methoden eines Servlets außerhalb eines Containers aufzurufen:

Einfach instanziieren und dann doGet(request, response) aufrufen. Ich bin mir nicht sicher, wofür genau Sie das brauchen, aber Ihr Leben wird durch die Verwendung von Spring Mock-Objekten für die HTTP-Anfrage und -Antwort einfacher gemacht.

Dies füllt das Response-Objekt auf. Sie können dann die Ausgabe mit abrufen:

res.getContentAsString();

Sehen Sie hier ein Beispiel:

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

0voto

Aaron Digulla Punkte 308693

Versuchen Sie MockRunner um sie auszuführen. Allerdings müssen Sie die JSP zuerst kompilieren. Ich verwende dafür Maven 2 (und die JSP-Compiler-Plugin )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X