JSP programmgesteuert Rendern
Brauche ich, um programmgesteuert Rendern JSP-Seite. Soweit ich das verstanden habe, JSP sollten einige compiler. Die Frage ist kann ich mit diesem compiler dirrectly ohne JspServlet und andere? Alles, was ich brauche, ist eine Dokumentation wie zu verwenden JSP compiler (Jasper, zum Beispiel).
Einige zusätzliche Informationen würde die situation klären, denke ich. Ich kann nicht mit standard-JspServlet. Ich möchte zum ändern der Quelle JSP vor der Kompilierung in irgendeiner Weise (Zusammenführen von zwei JSP zusammen, um genau zu sein), so muss ich einen Weg zum kompilieren von JSP-Ergebnis von InputStream (oder Reader) mit Hilfe des JSP-Compilers direkt.
Zusammenführen von zwei JSP-layout ist Voraussetzung. Sie können Fragen: "Aber warum ist dieser Kerl einfach nicht verwenden SiteMesh oder so etwas?". Einer der JSP-Seiten ist nicht statisch. Es ist vom Benutzer vorgesehen und in der Datenbank gespeichert. Wir sanitify und überprüft diese JSP-layout (Benutzer verwenden nur Teilmenge der tags, und alle von Ihnen sind nicht standart, sondern speziell für Sie geschaffene), cache und so weiter. Aber jetzt müssen wir einen Weg zur Verwendung dieser JSP-Seiten (die im Arbeitsspeicher gespeichert werden) als layouts für alle JSP-Seiten, die Benutzer-Anforderung.
InformationsquelleAutor Denis Bazhenov | 2009-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist die funktionale Anforderung nach? Sie sind offensichtlich auf der Suche für eine Lösung in die falsche Richtung. Was ist es, das problem/die Anforderung aus, für die Sie denken, dass dies die Lösung? Wir kommen vielleicht bessere Vorschläge.
Tun Sie zum Beispiel brauchen nur die Ausgabe? Wenn dem so ist, dann
java.net.URLConnection
ausreichen kann.Bearbeiten: Sie bearbeitet Ihre Frage:
OK, das ist ein bit mehr klar. Aber wozu brauchen Sie diese? Was bedeutet diese JSPs eigentlich vertreten? Was ist das endgültige Ergebnis soll verwendet werden?
Tun Sie zum Beispiel nur die eine JSP in der anderen? E. g. darunter ein
head.jsp
immain.jsp
? Wenn dem so ist, dann<jsp:include>
ausreichen kann. Oder ist es eher noch schlimmer werden, enthalten Sie roh Java-code mit einem spezifischen code, den Sie wollte wiederverwenden? Wenn dem so ist, dann sollten Sie reinen Java-Klassen und-wenn notwendig-taglibs.Edit 2: als Sie kommentierte:
Nur speichern Sie die JSP-Dateien auf der Festplatte die Datei-system innerhalb des webapp - webcontent (die
ServletContext#getRealPath()
in der Rettung hier) und leiten die Anfrage an Ihre eigenen Haupt-JSP-Datei, die die zwei JSP-Dateien unter Verwendung zum Beispiel:Edit 3: ich habe eine SSCCE beweisen, dass Sie arbeiten.
Ausführen auf http://localhost:8080/playground/test (oder wie host/contextname, die Sie verwenden) und Sie werden sehen,
Effizienter zu machen, würde ich jeder cache-Ressource und nutzen Sie
File#exists()
um zu überprüfen, ob die Seite bereits auf der Festplatte gespeichert.Ok, es wird funktionieren. Aber ich möchte, dass meine JSP zu sehen ein bisschen mehr rein. Wie <m:page-title="Titel der Seite">...</m:page> und childs von page-Tags beschreiben die Seite. Seite tag durch sich selbst ersetzt mit layout auf compilation-Zeit. Ist das möglich?
Nur sind taglibs an der Spitze der JSP-Inhalt. Nur JSP-code der üblichen Weise. Alles, was Sie tun müssen, ist, um es zu speichern in der webapp ist webcontent. Finden Sie die SSCCE, die ich Hinzugefügt habe, letzten.
Würde der Beispiel code funktioniert, wenn entweder Seite1.jsp oder page2.jsp wurde geändert, nachdem der Anwendungsserver gestartet wird? In den meisten Produktionsumgebungen, die Anwendungsserver verwenden nicht diese Dateien erneut kompilieren.
Das erfordert dann einen anderen Ansatz. Geben Sie einen anderen Dateinamen und so weiter. Ich allerdings glaube nicht, dass dies für die auf seinen konkreten Fall.
InformationsquelleAutor BalusC
Ich bin mir nicht ganz sicher, ob dies ist, was Sie suchen, aber die DWR-framework enthält eine Methode namens
WebContext.forwardToString
, leitet die aktuelle Anfrage plus eine gefälschte Antwort-Objekt an einen URL und liest dann den Inhalt des Puffers in den Speicher. Hier ist ein Beispiel für den code:Benutzen Sie diese, um die Ergebnisse der jsp-rednering und speichern Sie Sie im Speicher. Sie können laden Sie sich den Quelltext aus dem link oben, um zu sehen, wie SwallowingHttpServletResponse funktioniert.
InformationsquelleAutor Jason Gritman
Vielleicht könnten Sie Tomcat JspC ant-task?
InformationsquelleAutor Jonathan Feinberg
JSTL ist nur eine Bibliothek von tags in JSP-Dateien. Also es ist wirklich egal in diesem Zusammenhang.
Da eine JSP-compiler wandelt die JSP-Dateien in Java-Servlets, bezweifle ich, Sie können es direkt ausführen(ein compiler muss eigentlich gar nichts mehr laufen!) zu machen oder für diese Angelegenheit eine JSP-Datei.
Es ist wirklich ziemlich schwer zu verstehen, Ihre Frage, was Sie wirklich suchen.
Edit: ich würde empfehlen, jsp:include, die für den job
Ist es nicht genug, um einen der JSP-Dateien in der anderen? Siehe jsp:include <%@include%>
Leider Nein. Die Regeln für die JSP-Zusammenführung sind nicht trivial. Natürlich ist dieses problem, indem es sich von selbst, aber...
InformationsquelleAutor Marius Burz
Welchen Grund haben Sie zu tun?
Wenn Sie brauchen, merge 2 jsp-Datei zu verarbeiten, vielleicht mit gehören
Oder brauchen Sie andere Ideen? Können Sie geben Beispiel, über Ihre Anfrage?
InformationsquelleAutor misamap
Wenn der JSP bereits vorkompiliert von der Anwendungsserver-dann kann man sich das generiert .Klasse Datei . In Tomcat-dies sollte unter der $CONTEXT_ROOT/org/apache/jsp/Verzeichnis. Sie könnten in der Lage sein, die zum ausführen dieser Klasse irgendwie, und generieren Sie die Ausgabe.
EDIT: Verpasst Ihr Bearbeiten zum ändern der JSP-Quelle.
Werfen Sie einen Blick auf org.apache.jasper.compiler.AntCompiler (enthalten in jasper.jar in Tomcat). Es ist eine geschützte Methode, genannt generateClass, die Sie möglicherweise in der Lage, zu überschreiben und zu Durcheinander herum mit 🙂
InformationsquelleAutor Thimmayya