Ich bin neu in Java EE und ich weiß, dass so etwas wie die folgenden drei Zeilen
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
ist eine alte Art der Codierung und in JSP Version 2 gibt es eine Methode, um Java-Code in JSP-Dateien zu vermeiden. Kann mir bitte jemand die alternativen JSP 2-Zeilen sagen und wie diese Technik heißt?
Antworten:
Die Verwendung von Scriptlets (diese
<% %>
Dinge) in JSP wird seit der Geburt von Taglibs (wie JSTL ) und EL ( Expression Language , diese${}
Dinge) im Jahr 2001 in der Tat dringend empfohlen .Die Hauptnachteile von Scriptlets sind:
SunOracle selbst empfiehlt in den JSP-Codierungskonventionen auch , die Verwendung von Scriptlets zu vermeiden, wenn (Tag-) Klassen dieselbe Funktionalität ermöglichen. Hier sind einige relevante Zitate:Wie Scriptlets vollständig ersetzt werden, hängt vom alleinigen Zweck des Codes / der Logik ab. Mehr als oft soll dieser Code in eine vollwertige Java-Klasse eingefügt werden:
Wenn Sie bei jeder Anforderung denselben Java-Code aufrufen möchten, unabhängig von der angeforderten Seite, weniger oder mehr, z. B. prüfen, ob ein Benutzer angemeldet ist, implementieren Sie einen Filter und schreiben Sie den Code entsprechend in die Methode. Z.B:
doFilter()
Wenn Sie einem geeigneten Titel zugeordnet sind
<url-pattern>
, der die interessierenden JSP-Seiten abdeckt, müssen Sie nicht denselben Code für die gesamten JSP-Seiten kopieren.Wenn Sie einige Java - Code aufrufen möchten vorverarbeiten eine Anfrage, zB Vorbelastung einige Liste aus einer Datenbank in irgendeiner Tabelle anzuzeigen, falls erforderlich auf einigen Abfrageparameter basiert, implementieren dann ein Servlet und Schreibcode entsprechend in
doGet()
Verfahren. Z.B:Auf diese Weise ist der Umgang mit Ausnahmen einfacher. Auf die Datenbank wird nicht während des JSP-Renderings zugegriffen, sondern lange bevor die JSP angezeigt wird. Sie haben weiterhin die Möglichkeit, die Antwort zu ändern, wenn der DB-Zugriff eine Ausnahme auslöst. Im obigen Beispiel wird die Seite mit dem Standardfehler 500 angezeigt, die Sie ohnehin durch ein
<error-page>
In anpassen könnenweb.xml
.Wenn Sie Java-Code aufrufen möchten, um eine Anforderung nachzubearbeiten , z. B. die Verarbeitung eines Formulars, dann implementieren Sie ein Servlet und schreiben Sie den entsprechenden Code in die
doPost()
Methode. Z.B:Auf diese Weise ist der Umgang mit verschiedenen Zielseitenzielen einfacher: erneutes Anzeigen des Formulars mit Validierungsfehlern im Fehlerfall (in diesem Beispiel können Sie es
${message}
in EL erneut anzeigen ) oder bei Erfolg einfach zur gewünschten Zielseite wechseln.Wenn Sie Java-Code aufrufen möchten, um den Ausführungsplan und / oder das Ziel der Anforderung und der Antwort zu steuern , implementieren Sie ein Servlet gemäß dem Front Controller-Muster der MVC . Z.B:
Oder verwenden Sie einfach ein MVC-Framework wie JSF , Spring MVC , Wicket usw., sodass Sie nur eine JSP / Facelets-Seite und eine JavaBean-Klasse erhalten, ohne dass ein benutzerdefiniertes Servlet erforderlich ist.
Wenn Sie Java-Code aufrufen möchten, um den Fluss innerhalb einer JSP-Seite zu steuern , müssen Sie eine (vorhandene) Taglib zur Flusssteuerung wie den JSTL-Kern abrufen . ZB Anzeige
List<Product>
in einer Tabelle:Mit XML-Tags, die gut zu all dem HTML passen, ist der Code besser lesbar (und damit besser zu warten) als eine Reihe von Scriptlets mit verschiedenen öffnenden und schließenden Klammern ( "Wo zum Teufel gehört diese schließende Klammer hin?" ). Eine einfache Hilfe besteht darin, Ihre Webanwendung so zu konfigurieren, dass eine Ausnahme ausgelöst wird, wenn noch Scriptlets verwendet werden, indem Sie Folgendes hinzufügen
web.xml
:In Facelets , dem Nachfolger von JSP, das Teil des von Java EE bereitgestellten MVC-Frameworks JSF ist , können Scriptlets bereits nicht verwendet werden . Auf diese Weise werden Sie automatisch gezwungen, die Dinge "richtig" zu machen.
Wenn Sie Java-Code aufrufen möchten, um auf "Backend" -Daten innerhalb einer JSP-Seite zuzugreifen und diese anzuzeigen , müssen Sie EL (Expression Language) verwenden
${}
. ZB erneutes Anzeigen der übermittelten Eingabewerte:Das
${param.foo}
zeigt das Ergebnis vonrequest.getParameter("foo")
.Wenn Sie Java-Code für Dienstprogramme direkt auf der JSP-Seite aufrufen möchten (normalerweise
public static
Methoden), müssen Sie diese als EL-Funktionen definieren. In JSTL gibt es eine Taglib für Standardfunktionen , aber Sie können Funktionen auch einfach selbst erstellen . Hier ist ein Beispiel, wie JSTLfn:escapeXml
nützlich ist, um XSS- Angriffe zu verhindern .Beachten Sie, dass die XSS-Empfindlichkeit in keiner Weise speziell mit Java / JSP / JSTL / EL / was auch immer zusammenhängt. Dieses Problem muss in jeder von Ihnen entwickelten Webanwendung berücksichtigt werden . Das Problem von Scriptlets ist, dass sie keine Möglichkeit zur integrierten Verhinderung bieten, zumindest nicht unter Verwendung der Standard-Java-API. Der Nachfolger von JSP, Facelets, hat bereits implizites HTML-Escape-Verfahren, sodass Sie sich keine Gedanken über XSS-Lücken in Facelets machen müssen.
Siehe auch:
quelle
<% response.getWriter().flush(); %>
zwischen</head>
und<body>
, um die Parsing-Leistung von Webseiten im Webbrowser zu verbessern. Diese Verwendung ist jedoch wiederum völlig vernachlässigbar, wenn die Größe des Ausgabepuffers auf der Serverseite niedrig ist (1 ~ 2 KB). Siehe auch diesen Artikel .Zum Schutz: Deaktivieren Sie Scriptlets endgültig
Während eine andere Frage diskutiert wird, können und sollten Sie Scriptlets in Ihrem
web.xml
Webanwendungsdeskriptor deaktivieren .Ich würde das immer tun, um zu verhindern, dass Entwickler Scriptlets hinzufügen, insbesondere in größeren Unternehmen, in denen Sie früher oder später den Überblick verlieren. Die
web.xml
Einstellungen sehen folgendermaßen aus:quelle
<%-- comment that i don't want in the final HTML --%>
. Ich finde es nützlich, diese anstelle von HTML-Kommentaren zu verwenden.<% %>
, scriptlet Ausdrücke<%! %>
und scriptlet Erklärungen<%= %>
. Das bedeutet, dass Anweisungen<%@ %>
und Kommentare<%-- --%>
aktiviert und verwendbar bleiben, sodass Sie weiterhin Kommentare und Einschlüsse vornehmen können.JSTL bietet Tags für Bedingungen, Schleifen, Mengen, Abrufe usw. an. Zum Beispiel:
JSTL arbeitet mit Anfrage Eigenschaften - sie sind am häufigsten festgelegt in der Anfrage von einem Servlet, die nach vorne an die JSP.
quelle
Ich bin mir nicht sicher, ob ich das richtig verstehe.
Sie sollten etwas über MVC lesen. Spring MVC & Struts 2 sind die beiden gängigsten Lösungen.
quelle
Sie können JSTL-Tags zusammen mit EL-Ausdrücken verwenden, um eine Vermischung von Java- und HTML-Code zu vermeiden:
quelle
Es gibt auch komponentenbasierte Frameworks wie Wicket , die einen Großteil des HTML-Codes für Sie generieren. Die Tags, die im HTML-Code landen, sind äußerst einfach und es gibt praktisch keine Logik, die eingemischt wird. Das Ergebnis sind fast leere HTML-Seiten mit typischen HTML-Elementen. Der Nachteil ist, dass die Wicket- API viele Komponenten zu lernen hat und einige Dinge unter diesen Bedingungen schwierig zu erreichen sein können.
quelle
Im MVC-Architekturmuster repräsentieren JSPs die Ansichtsebene. Das Einbetten von Java-Code in JSPs wird als schlechte Praxis angesehen. Sie können JSTL , freeMarker , Geschwindigkeit mit JSP als "Template Engine" verwenden. Der Datenprovider für diese Tags hängt von den Frameworks ab , mit denen Sie sich befassen.
Struts 2
undwebwork
als Implementierung für MVC verwendet Pattern OGNL "sehr interessante Technik, um Beans-Eigenschaften für JSP verfügbar zu machen".quelle
Die Erfahrung hat gezeigt, dass JSPs einige Mängel aufweisen, von denen eine schwer zu vermeiden ist, Markups mit tatsächlichem Code zu mischen.
Wenn Sie können, sollten Sie eine spezielle Technologie für Ihre Aufgaben in Betracht ziehen. In Java EE 6 gibt es JSF 2.0, das viele nette Funktionen bietet, einschließlich des Zusammenklebens von Java-Beans mit JSF-Seiten durch den
#{bean.method(argument)}
Ansatz.quelle
Wenn Sie einfach die Nachteile der Java-Codierung in JSP vermeiden möchten, können Sie dies auch mit Scriplets tun. Befolgen Sie einfach eine gewisse Disziplin, um ein minimales Java in JSP und fast keine Berechnung und Logik auf der JSP-Seite zu haben.
quelle
Erfahren Sie, wie Sie Ihre eigenen Tags mit JSTL anpassen und schreiben
Beachten Sie, dass EL EviL ist (Laufzeitausnahmen, Refactoring).
Wicket kann auch böse sein (Leistung, mühsam für kleine Apps oder einfache Ansichtsebene).
Beispiel aus Java2s ,
Dies muss zur web.xml der Webanwendung hinzugefügt werden
Datei erstellen: java2s.tld im / WEB-INF /
Kompilieren Sie den folgenden Code in WEB-INF \ classes \ com \ java2s
Starten Sie den Server und laden Sie die Datei bodyContent.jsp in den Browser
quelle
Wicket ist auch eine Alternative, die Java vollständig von HTML trennt, sodass Designer und Programmierer zusammenarbeiten und an verschiedenen Codesätzen arbeiten können, ohne sich gegenseitig zu verstehen.
Schau dir Wicket an.
quelle
Sie haben eine gute Frage gestellt, und obwohl Sie gute Antworten erhalten haben, würde ich vorschlagen, dass Sie JSP loswerden. Es ist veraltete Technologie, die irgendwann sterben wird. Verwenden Sie einen modernen Ansatz wie Template-Engines. Sie haben eine sehr klare Trennung zwischen Geschäfts- und Präsentationsebenen und sicherlich keinen Java-Code in Vorlagen, sodass Sie Vorlagen direkt aus der Software zur Bearbeitung von Webpräsentationen generieren können, wobei Sie in den meisten Fällen WYSIWYG nutzen.
Halten Sie sich auf jeden Fall von Filtern und Vor- und Nachbearbeitung fern, da Sie sonst möglicherweise Probleme mit Support / Debugging haben, da Sie immer nicht wissen, woher die Variable den Wert bezieht.
quelle
Um Java-Code in JSP-Dateien zu vermeiden, stellt Java jetzt Tag-Bibliotheken wie JSTL zur Verfügung. Java hat JSF entwickelt, in das Sie alle Programmierstrukturen in Form von Tags schreiben können
quelle
Egal wie viel Sie vermeiden möchten, wenn Sie mit anderen Entwicklern zusammenarbeiten, bevorzugen einige von ihnen immer noch das Scriptlet und fügen dann den bösen Code in das Projekt ein. Daher ist das Einrichten des Projekts beim ersten Zeichen sehr wichtig, wenn Sie den Scriptlet-Code wirklich reduzieren möchten. Es gibt verschiedene Techniken, um dies zu überwinden (einschließlich mehrerer Frameworks, die andere erwähnt haben). Wenn Sie jedoch die reine JSP-Methode bevorzugen, verwenden Sie die JSTL-Tag-Datei. Das Schöne daran ist, dass Sie auch Masterseiten für Ihr Projekt einrichten können, damit die anderen Seiten die Masterseiten erben können
Erstellen Sie unter Ihren WEB-INF / -Tags eine Masterseite mit dem Namen base.tag mit dem folgenden Inhalt
Auf dieser Mater-Seite habe ich ein Fragment namens "title" erstellt, damit ich auf der untergeordneten Seite weitere Codes an dieser Stelle der Masterseite einfügen kann. Außerdem wird das Tag
<jsp:doBody/>
durch den Inhalt der untergeordneten Seite ersetztErstellen Sie eine untergeordnete Seite (child.jsp) in Ihrem WebContent-Ordner:
<t:base>
wird verwendet, um die Masterseite anzugeben, die Sie verwenden möchten (derzeit base.tag). Der gesamte Inhalt des Tags<jsp:body>
hier ersetzt den<jsp:doBody/>
auf Ihrer Masterseite. Ihre untergeordnete Seite kann auch eine beliebige Tag-Bibliothek enthalten und Sie können sie normalerweise wie die andere erwähnte verwenden. Wenn Sie hier jedoch einen Scriptlet-Code verwenden (<%= request.getParameter("name") %>
...) und versuchen, diese Seite auszuführen, erhalten Sie eineJasperException because Scripting elements ( <%!, <jsp:declaration, <%=, <jsp:expression, <%, <jsp:scriptlet ) are disallowed here
. Daher können andere Personen den bösen Code auf keinen Fall in die JSP-Datei aufnehmenAufrufen dieser Seite von Ihrem Controller aus:
Sie können die Datei child.jsp einfach von Ihrem Controller aus aufrufen. Dies funktioniert auch gut mit dem Strebenrahmen
quelle
Verwendung
JSTL Tag libraries
in JSP, das wird perfekt funktionieren.quelle
Verwenden Sie einfach das JSTL-Tag und den EL-Ausdruck.
quelle
Wenn jemand wirklich gegen das Programmieren in mehr als einer Sprache ist , schlage ich GWT vor. Theoretisch können Sie alle JS- und HTML-Elemente vermeiden, da Google Toolkit den gesamten Client und den gemeinsam genutzten Code in JS umwandelt und Sie keine Probleme damit haben Sie haben einen Webservice ohne Codierung in einer anderen Sprache. Sogar Sie können Standard-CSS von irgendwoher verwenden, wie es durch Erweiterungen (smartGWT oder Vaadin) gegeben ist. Sie müssen nicht Dutzende von Anmerkungen lernen.
Wenn Sie möchten, können Sie sich natürlich in die Tiefen des Codes hacken und JS einfügen und Ihre HTML-Seite anreichern, aber Sie können es wirklich vermeiden, wenn Sie möchten, und das Ergebnis wird gut sein, wie es in anderen Frameworks geschrieben wurde. Ich sage, es ist einen Versuch wert, und die grundlegende GWT ist gut dokumentiert.
Und natürlich haben viele Programmierkollegen hiermit mehrere andere Lösungen beschrieben oder empfohlen. GWT ist für Leute gedacht, die sich wirklich nicht mit dem Webpart befassen oder es minimieren möchten.
quelle
Eine nette Idee aus der Python-Welt sind Vorlagenattributsprachen . TAL wurde von Zope (daher auch als "Zope Page Templates", ZPT bezeichnet) eingeführt und ist ein Standard mit Implementierungen in PHP, XSLT und Java (ich habe die Inkarnationen Python / Zope und PHP verwendet). In dieser Klasse von Vorlagensprachen könnte ein Beispiel wie folgt aussehen:
Der Code sieht aus wie normales HTML (oder XHTML) plus einige spezielle Attribute in einem XML-Namespace. Es kann mit einem Browser angezeigt und von einem Designer sicher optimiert werden. Es gibt Unterstützung für Makros und auch für i18n:
Wenn Übersetzungen des Inhalts verfügbar sind, werden sie verwendet.
Ich weiß jedoch nicht viel über die Java-Implementierung .
quelle
ui:xxx
Tags in Facelts VDL .tal:replace="structure (expression)"
ständig Attribute verwenden.Die Verwendung von Scriptlets in JSPs ist keine gute Vorgehensweise.
Stattdessen können Sie Folgendes verwenden:
Bitte beziehen Sie sich auf:
quelle
Sicher,
<%! counter++; %>
durch eine Ereignisproduzenten-Konsumenten-Architektur ersetzen , bei der die Geschäftsschicht über die Notwendigkeit des Inkrementierens des Zählers informiert wird, entsprechend reagiert und die Präsentatoren benachrichtigt, damit sie die Ansichten aktualisieren. Es handelt sich um eine Reihe von Datenbanktransaktionen, da wir in Zukunft den neuen und alten Wert des Zählers kennen müssen, wer ihn erhöht hat und zu welchem Zweck. Offensichtlich handelt es sich um eine Serialisierung, da die Schichten vollständig entkoppelt sind. Sie können Ihren Zähler über RMI, IIOP, SOAP erhöhen. Es wird jedoch nur HTML benötigt, das Sie nicht implementieren, da es sich um einen so banalen Fall handelt. Ihr neues Ziel ist es, auf Ihrem neuen glänzenden E7-Server mit 64 GB RAM 250 Schritte pro Sekunde zu erreichen.Ich habe mehr als 20 Jahre Erfahrung in der Programmierung, die meisten Projekte scheitern vor dem Sextett: Wiederverwendbarkeit Austauschbarkeit OO-Fähigkeit Debuggbarkeit Testbarkeit Wartbarkeit ist sogar erforderlich. Andere Projekte, die von Leuten durchgeführt wurden, die sich nur um Funktionalität kümmerten, waren äußerst erfolgreich. Aufgrund der steifen Objektstruktur, die zu früh im Projekt implementiert wurde, kann der Code nicht an die drastischen Änderungen der Spezifikationen angepasst werden (auch bekannt als agil).
Daher betrachte ich die Aktivität des Definierens von "Schichten" oder redundanten Datenstrukturen entweder zu Beginn des Projekts oder wenn dies nicht speziell erforderlich ist, als Aufschub.
quelle
Technisch gesehen werden JSP zur Laufzeit alle in Servlets konvertiert . JSP wurde ursprünglich zum Zweck der Entkopplung der Geschäftslogik und der Entwurfslogik nach dem MVC-Muster erstellt. JSP sind also technisch alle Java-Codes zur Laufzeit. Um die Frage zu beantworten, werden Tag-Bibliotheken normalerweise zum Anwenden von Logik (Entfernen von Java-Codes) auf JSP-Seiten verwendet.
quelle
Wenn wir in einer Java-Webanwendung die folgenden Dinge verwenden, kann Java-Code aus dem Vordergrund der JSP entfernt werden.
Verwenden Sie die MVC-Architektur für Webanwendungen
Verwenden Sie JSP-Tags
ein. Standard-Tags
b. Benutzerdefinierte Tags
Ausdruckssprache
quelle
Wie vermeide ich Java-Code in JSP-Dateien?
Sie können neben Expression Language ( EL ) auch Tab-Bibliotheks-Tags wie JSTL verwenden . Aber EL funktioniert nicht gut mit JSP. Daher ist es wahrscheinlich besser, JSP vollständig zu löschen und Facelets zu verwenden .
Facelets ist die erste Nicht-JSP-Seitendeklarationssprache für JSF (Java Server Faces), die JSF-Entwicklern im Vergleich zu JSP ein einfacheres und leistungsfähigeres Programmiermodell bietet. Es behebt verschiedene Probleme, die in JSP für die Entwicklung von Webanwendungen auftreten.
Quelle
quelle
Die Verwendung von Scriptlets ist ein sehr alter Weg und wird nicht empfohlen. Wenn Sie etwas direkt auf Ihren JSP-Seiten ausgeben möchten, verwenden Sie einfach Expression Language (EL) zusammen mit JSTL .
Es gibt auch andere Optionen wie die Verwendung einer Template-Engine wie Velocity, Freemarker, Thymeleaf usw. Die Verwendung von einfachem JSP mit EL und JSTL erfüllt jedoch meistens meinen Zweck und scheint für Anfänger auch die einfachste zu sein.
Beachten Sie außerdem, dass es keine bewährte Methode ist, Geschäftslogik in der Ansichtsebene auszuführen. Sie sollten Ihre Geschäftslogik in der Serviceebene ausführen und das Ausgabeergebnis über einen Controller an Ihre Ansichten übergeben.
quelle
Nichts davon wird mehr verwendet, mein Freund. Mein Rat ist, die Ansicht (CSS, HTML, Javascript usw.) vom Server zu entkoppeln.
In meinem Fall mache ich meine Systeme, die die Ansicht mit Angular verarbeiten, und alle benötigten Daten werden mithilfe von Restdiensten vom Server übertragen.
Glauben Sie mir, dies wird Ihre Gestaltung verändern
quelle
Verwenden Sie ein eckiges Backbone-ähnliches Javascript-Framework für das UI-Design und rufen Sie die Daten mit der Rest-API ab. Dadurch wird die Java-Abhängigkeit vollständig von der Benutzeroberfläche entfernt.
quelle
JSP 2.0 hat eine Funktion namens "Tag Files" , Sie können Tags ohne externen
java
Code schreiben undtld
. Sie müssen eine.tag
Datei erstellen und einfügen.WEB-INF\tags
Sie können sogar eine Verzeichnisstruktur erstellen, um Ihre Tags zu verpacken.Zum Beispiel:
Verwenden Sie es wie
Sie können den Tag-Body auch leicht lesen
Benutze es
Die Beispiele sind sehr einfach, aber Sie können hier viele komplizierte Aufgaben erledigen. Bitte beachten Sie andere Tags verwenden: (zB
JSTL
die Tags wie hat Steuernif/forEcah/chosen
Textmanipulation wieformat/contains/uppercase
oder sogar SQL - Tagsselect/update
, übergeben Sie alle Art Parameter, zum Beispiel)Hashmap
, Zugangsession
,request
... in der Tag - Datei zu.Tag- Dateien sind so einfach zu entwickeln, dass Sie den Server beim Ändern nicht neu starten mussten, wie z. B. JSP-Dateien. Dies erleichtert die Entwicklung.
Selbst wenn Sie ein Framework wie Struts 2 verwenden, das viele gute Tags enthält, können Sie feststellen, dass Ihre eigenen Tags Ihren Code erheblich reduzieren können. Sie können Ihre Tag-Parameter an Struts übergeben und auf diese Weise Ihr Framework-Tag anpassen.
Sie können Tag nicht nur verwenden, um Java zu vermeiden, sondern auch Ihre HTML-Codes zu minimieren. Ich selbst versuche, HTML-Codes zu überprüfen und Tags zu erstellen, sobald auf meinen Seiten Code-Duplikate beginnen.
(Selbst wenn Sie am Ende Java in Ihrem JSP-Code verwenden, was ich nicht hoffe, können Sie diesen Code in ein Tag einkapseln.)
quelle
Wie in vielen Antworten angegeben, verwenden Sie JSTL oder erstellen Sie Ihre eigenen benutzerdefinierten Tags. Hier finden Sie eine gute Erklärung zum Erstellen benutzerdefinierter Tags
quelle
quelle
Durch die Verwendung von JSTL-Tags zusammen mit dem EL-Ausdruck können Sie dies vermeiden. Fügen Sie die folgenden Dinge in Ihre JSP-Seite ein:
quelle