webentwicklung-frage-antwort-db.com.de

Wie vermeide ich Java Code in JSP-Dateien?

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 jemand bitte die alternativen JSP 2-Zeilen sagen und wie diese Technik heißt?

1629
chmoelders

Die Verwendung von scriptlets (diesen <% %> - Dingen) in [~ # ~] jsp [~ # ~] ist in der Tat hoch entmutigt seit der Geburt von taglibs (wie [~ # ~] jstl [~ # ~] ) und [ ~ # ~] el [~ # ~] ( Expression Language , diese ${} Dinge) aus dem Jahr 2001.

Die Hauptnachteile von scriptlets sind:

  1. Wiederverwendbarkeit: Sie können Scriptlets nicht wiederverwenden.
  2. Ersetzbarkeit: Sie können keine abstrakten Scriptlets erstellen.
  3. OO-Fähigkeit: Sie können Vererbung/Komposition nicht nutzen.
  4. Debuggability: Wenn das Scriptlet eine Ausnahme zur Hälfte auslöst, erhalten Sie nur eine leere Seite.
  5. Testbarkeit: Scriptlets können nicht auf Einheiten getestet werden.
  6. Wartbarkeit: pro saldo wird mehr Zeit benötigt, um die vermischte/überfüllte/duplizierte Codelogik aufrechtzuerhalten.

Sonne Oracle selbst empfiehlt in den JSP-Codierungskonventionen , die Verwendung von Scriptlets zu vermeiden, wenn (Tag-) Klassen dieselbe Funktionalität bieten. Hier einige relevante Zitate:

Ab der JSP 1.2-Spezifikation wird dringend empfohlen, die JSP-Standard-Tag-Bibliothek (JSTL) in Ihrer Webanwendung zu verwenden, um die Notwendigkeit von JSP-Scriptlets reduzieren auf Ihren Seiten zu helfen. Seiten, die JSTL verwenden, sind im Allgemeinen leichter zu lesen und zu warten.

...

Wenn möglich, JSP-Scriptlets vermeiden, wenn Tag-Bibliotheken entsprechende Funktionen bereitstellen. Dies erleichtert das Lesen und Verwalten von Seiten, hilft bei der Trennung der Geschäftslogik von der Präsentationslogik und erleichtert die Entwicklung Ihrer Seiten zu Seiten im JSP 2.0-Stil (die JSP 2.0-Spezifikation unterstützt die Verwendung von Scriptlets, hebt diese jedoch hervor).

...

Im Sinne der Übernahme des MVC-Entwurfsmusters (Model View Controller), um die Kopplung zwischen der Präsentationsebene und der Geschäftslogik zu verringern, sollte JSP-Scriptlets sollten nicht verwendet werden zum Schreiben von Geschäftslogik. Stattdessen werden JSP-Scriptlets bei Bedarf verwendet, um Daten (auch als "Wertobjekte" bezeichnet), die von der Verarbeitung der Clientanforderungen zurückgegeben wurden, in ein ordnungsgemäßes clientfähiges Format zu transformieren. Selbst dann wäre dies besser mit einem Front-Controller-Servlet oder einem benutzerdefinierten Tag möglich.


Wie man scriptlets ersetzt hängt vollständig vom alleinigen Zweck des Codes/der Logik ab. Mehr als oft soll dieser Code in eine vollwertige Klasse gestellt werden Java class:

  • Wenn Sie die Anforderung same Java code on every aufrufen möchten, unabhängig von der angeforderten Seite, z. überprüfe, ob ein Benutzer angemeldet ist, implementiere einen Filter und schreibe den Code entsprechend in die doFilter() Methode. Z.B.:

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
            ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
        } else {
            chain.doFilter(request, response); // Logged in, just continue request.
        }
    }
    

    Wenn Sie auf ein geeignetes <url-pattern> Abgebildet sind, das die JSP-Seiten von Interesse abdeckt, müssen Sie nicht dasselbe Stück Code für alle JSP-Seiten kopieren.


  • Wenn Sie einen Code Java zu preprocess einer Anforderung aufrufen möchten, z. B. eine Liste aus einer Datenbank vorab laden, um sie in einer Tabelle anzuzeigen, falls erforderlich, basierend auf einigen Abfrageparametern, Implementieren Sie dann ein Servlet und schreiben Sie den Code entsprechend in die doGet() -Methode.

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            List<Product> products = productService.list(); // Obtain all products.
            request.setAttribute("products", products); // Store products in request scope.
            request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
        } catch (SQLException e) {
            throw new ServletException("Retrieving products failed!", e);
        }
    }
    

    Auf diese Weise ist der Umgang mit Ausnahmen einfacher. Auf die Datenbank wird nicht während des JSP-Renderns zugegriffen, sondern weit bevor die JSP angezeigt wird. Sie haben weiterhin die Möglichkeit, die Antwort zu ändern, wenn der Datenbankzugriff eine Ausnahme auslöst. Im obigen Beispiel wird die Seite mit dem Standardfehler 500 angezeigt, die Sie ohnehin mit einem <error-page> In web.xml Anpassen können.


  • Wenn Sie einen Java Code für Nachbearbeitung eine Anfrage aufrufen möchten, z. B. die Verarbeitung eines Formulars, dann implementieren Sie ein Servlet und schreiben Sie den Code entsprechend in doPost() .

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);
    
        if (user != null) {
            request.getSession().setAttribute("user", user); // Login user.
            response.sendRedirect("home"); // Redirect to home page.
        } else {
            request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope.
            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error.
        }
    }
    

    Auf diese Weise können Sie leichter mit verschiedenen Zielen auf der Ergebnisseite umgehen: Zeigen Sie das Formular mit Überprüfungsfehlern im Fehlerfall erneut an (in diesem Beispiel können Sie es mit ${message} In [~ # ~ erneut anzeigen ] el [~ # ~] ) oder bei Erfolg einfach zur gewünschten Zielseite.


  • Wenn Sie einen Java Code aufrufen möchten, um control den Ausführungsplan und/oder das Ziel der Anforderung und der Antwort zu steuern, implementieren Sie ein Servlet nach dem MVC Front Controller Pattern zB:

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Action action = ActionFactory.getAction(request);
            String view = action.execute(request, response);
    
            if (view.equals(request.getPathInfo().substring(1)) {
                request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
            } else {
                response.sendRedirect(view);
            }
        } catch (Exception e) {
            throw new ServletException("Executing action failed.", e);
        }
    }
    

    Oder übernehmen 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 einen Java Code zum Steuern des Flusses innerhalb einer JSP-Seite aufrufen möchten, müssen Sie eine (vorhandene) Flusssteuerungs-Taglib wie JSTL-Kern , zB Anzeige von List<Product> In einer Tabelle:

    <%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
    ...
    <table>
        <c:forEach items="${products}" var="product">
            <tr>
                <td>${product.name}</td>
                <td>${product.description}</td>
                <td>${product.price}</td>
            </tr>
        </c:forEach>
    </table>
    

    Mit XML-ähnlichen Tags, die gut in all das HTML passen, ist der Code besser lesbar (und damit besser wartbar) als eine Reihe von Scriptlets mit verschiedenen öffnenden und schließenden Klammern ( "Wo zum Teufel gehört diese schließende Klammer dazu? ? "). Eine einfache Hilfe besteht darin, Ihre Webanwendung so zu konfigurieren, dass sie immer dann eine Ausnahme auslöst, wenn scriptlets noch verwendet werden, indem Sie das folgende Teil zu web.xml Hinzufügen:

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <scripting-invalid>true</scripting-invalid>
        </jsp-property-group>
    </jsp-config>
    

    In Facelets stellte der Nachfolger von JSP, der Teil des Java EE ist, das MVC-Framework [~ # ~ bereit ] jsf [~ # ~] , es ist bereits nicht ​​möglich scriptlets zu verwenden. Auf diese Weise werden Sie automatisch gezwungen, die Dinge "richtig" zu machen.


  • Wenn Sie einen Java Code für Zugriff und Anzeige "Backend" -Daten innerhalb einer JSP-Seite aufrufen möchten, müssen Sie EL (Expression Language) verwenden, diese ${} Dinge, zB die erneute Anzeige der übergebenen Eingabewerte:

    <input type="text" name="foo" value="${param.foo}" />
    

    Das ${param.foo} Zeigt das Ergebnis von request.getParameter("foo") an.


  • Wenn Sie einen Dienstprogramm Java Code direkt auf der JSP-Seite aufrufen möchten (normalerweise public static - Methoden), müssen Sie diese als EL-Funktionen definieren Es gibt eine Standardfunktion taglib in JSTL, aber Sie können Funktionen auch einfach selbst erstellen . Hier ein Beispiel, wie JSTL fn:escapeXml Ist nützlich, um [~ # ~] xss [~ # ~]Angriffe zu verhindern.

    <%@ taglib uri="http://Java.Sun.com/jsp/jstl/functions" prefix="fn" %>
    ...
    <input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
    

    Beachten Sie, dass die XSS-Empfindlichkeit in keiner Weise speziell mit Java/JSP/JSTL/EL/in Verbindung steht. Dieses Problem muss in every der von Ihnen entwickelten Webanwendung berücksichtigt werden. Das Problem von scriptlets ist, dass es keine Möglichkeit für integrierte Vorbeugungen gibt, zumindest nicht unter Verwendung der standardmäßigen Java API. JSPs Nachfolger-Facelets haben bereits implizites HTML-Escape-Verhalten. Sie müssen sich also keine Gedanken über XSS-Löcher in Facelets machen.

Siehe auch:

1936
BalusC

Zum Schutz: Deaktivieren Sie Scriptlets endgültig

Während eine andere Frage diskutiert, können und sollten Sie Scriptlets in Ihrem web.xml Webanwendungsdeskriptor immer 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 Einstellungen für web.xml sehen folgendermaßen aus:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
222

JSTL bietet Tags für Bedingungen, Schleifen, Mengen, Abrufe usw. an. Zum Beispiel:

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

JSTL arbeitet mit Anforderungsattributen - diese werden am häufigsten in der Anforderung von einem Servlet festgelegt, das an die JSP weiterleitet .

107
Bozho

Ich bin mir nicht sicher, ob ich das richtig verstehe.

Sie sollten etwas über MVC lesen. Spring MVC & Struts 2 sind die beiden gebräuchlichsten Lösungen.

60
tzim

Sie können JSTL-Tags zusammen mit EL-Ausdrücken verwenden, um eine Vermischung von Java und HTML-Code zu vermeiden:

<%@ page contentType="text/html;charset=UTF-8" language="Java" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
    <head>
    </head>
    <body>

        <c:out value="${x + 1}" />
        <c:out value="${param.name}" />
        // and so on

    </body>
</html>
53
Behrang

Es gibt auch komponentenbasierte Frameworks wie Wicket, die viel HTML für Sie generieren. Die Tags, die im HTML-Code landen, sind extrem einfach und es gibt praktisch keine Logik, die sich einmischt. Das Ergebnis sind fast leere HTML-Seiten mit typischen HTML-Elementen. Der Nachteil ist, dass die Wicket API viele Komponenten enthält, die gelernt werden müssen, und unter diesen Bedingungen kann es schwierig sein, einige Dinge zu erreichen.

34
tsand

Im MVC Architectural-Muster stellen JSPs die Ansichtsebene dar. Das Einbetten von Java Code in JSPs wird als schlechte Vorgehensweise angesehen. Sie können JSTL , freeMarker , velocity mit JSP als "Template Engine" verwenden. Der Datenprovider für diese Tags hängt von den Frameworks ab, mit denen Sie arbeiten. Struts 2 und webwork als Implementierung für MVC Pattern verwenden OGNL "sehr interessante Technik, um Beans-Eigenschaften für JSP verfügbar zu machen".

32
Sami Jmii

Die Erfahrung hat gezeigt, dass JSPs einige Mängel aufweisen, von denen eine schwer zu vermeiden ist, dass Markups mit tatsächlichem Code verwechselt werden.

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 nützliche Funktionen bietet, darunter das Zusammenkleben von Java Beans mit JSF-Seiten über den Ansatz #{bean.method(argument)}.

wenn Sie einfach die Nachteile der Java-Codierung in JSP vermeiden möchten, können Sie dies auch mit Scriplets tun. Folgen Sie einfach einer gewissen Disziplin, um in JSP ein Minimum an Java und auf der JSP-Seite fast keine Berechnung und Logik zu haben.

<%@ page contentType="text/html;charset=UTF-8" language="Java" %>
<%//instantiate a JSP controller
MyController clr = new MyController(request, response);

//process action if any
clr.process(request);

//process page forwaring if necessary

//do all variable assignment here
String showMe = clr.getShowMe();%>

<html>
    <head>
    </head>
    <body>
        <form name="frm1">
            <p><%= showMe %>
            <p><% for(String str : clr.listOfStrings()) { %>
            <p><%= str %><% } %>

            // and so on   
        </form>
    </body>
</html>
26
dipu

Lernen Sie, Ihre eigenen Tags mit JSTL anzupassen und zu schreiben

Beachten Sie, dass EL EviL (Laufzeitausnahmen, Refactoring) ist.
Wicket kann auch böse sein (Leistung, mühsam für kleine Apps oder einfache Ansichtsebene)

Beispiel aus Java2s ,

Dies muss der Datei web.xml der Webanwendung hinzugefügt werden

<taglib>
    <taglib-uri>/Java2s</taglib-uri>
    <taglib-location>/WEB-INF/Java2s.tld</taglib-location>
</taglib>

datei erstellen: Java2s.tld im Verzeichnis/WEB-INF /

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://Java.Sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- a tab library descriptor -->
<taglib xmlns="http://Java.Sun.com/JSP/TagLibraryDescriptor">
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Java2s Simple Tags</short-name>

    <!-- this tag manipulates its body content by converting it to upper case
    -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.Java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

kompilieren Sie den folgenden Code in WEB-INF\classes\com\Java2s

package com.Java2s;

import Java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyContentTag extends BodyTagSupport{
    private int iterations, howMany;

    public void setHowMany(int i){
        this.howMany = i;
    }

    public void setBodyContent(BodyContent bc){
        super.setBodyContent(bc);
        System.out.println("BodyContent = '" + bc.getString() + "'");
    }

    public int doAfterBody(){
        try{    
            BodyContent bodyContent = super.getBodyContent();
            String bodyString  = bodyContent.getString();
            JspWriter out = bodyContent.getEnclosingWriter();

            if ( iterations % 2 == 0 ) 
                out.print(bodyString.toLowerCase());
            else
                out.print(bodyString.toUpperCase());

            iterations++;
            bodyContent.clear(); // empty buffer for next evaluation
        }
        catch (IOException e) {
            System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
            e.printStackTrace();
        } // end of catch

        int retValue = SKIP_BODY;

        if ( iterations < howMany ) 
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

Starten Sie den Server und laden Sie die Datei bodyContent.jsp im Browser

<%@ taglib uri="/Java2s" prefix="Java2s" %>
<html>
    <head>
        <title>A custom tag: body content</title>
    </head>
    <body>
        This page uses a custom tag manipulates its body content.Here is its output:
        <ol>
            <Java2s:bodyContentTag howMany="3">
            <li>Java2s.com</li>
            </Java2s:bodyContentTag>
        </ol>
    </body>
</html>
26
tomasb

Wicket ist auch eine Alternative, die Java vollständig von HTML trennt, sodass ein Designer und ein Programmierer zusammen und an verschiedenen Codesätzen arbeiten können, ohne dass sie sich verstehen.

Schau dir Wicket an.

25
msj121

Sie haben eine gute Frage aufgeworfen, und obwohl Sie gute Antworten erhalten haben, würde ich vorschlagen, dass Sie JSP loswerden. Es ist eine 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 Bearbeitungssoftware für Webpräsentationen generieren können, wobei in den meisten Fällen WYSIWYG zum Einsatz kommt.

Halten Sie sich von Filtern und Vor- und Nachbearbeitungen fern, da Sie sonst möglicherweise Probleme beim Support/Debuggen haben, da Sie immer nicht wissen, woher die Variable den Wert bezieht.

23
Dmitriy R

um zu vermeiden, dass Java Code in JSP-Dateien Java jetzt Tag-Bibliotheken wie JSTL enthält, wurde auch Java mit JSF entwickelt, in das Sie alle Programmierstrukturen schreiben können die Form von Tags

21
mahesh

Egal, wie viel Sie vermeiden möchten, wenn Sie mit anderen Entwicklern arbeiten, bevorzugen einige von ihnen immer noch Scriptlet und fügen dann den bösen Code in das Projekt ein. Daher ist es sehr wichtig, das Projekt beim ersten Mal einzurichten, wenn Sie den Scriptlet-Code wirklich reduzieren möchten. Es gibt verschiedene Techniken, um dies zu überwinden (einschließlich verschiedener Frameworks, die von anderen erwähnt wurden). 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, sodass die anderen Seiten die Masterseiten erben können

Erstellen Sie eine Masterseite namens base.tag unter Ihren WEB-INF/tags mit folgendem Inhalt

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>

<%@attribute name="title" fragment="true" %>

<html>
  <head>
    <title>  
       <jsp:invoke fragment="title"></jsp:invoke>
    </title>

  </head>
  <body>
    <div id="page-header">
       ....
    </div>
    <div id="page-body">
      <jsp:doBody/>
    </div>
    <div id="page-footer">
      .....
    </div>
  </body>
</html>

Auf dieser Seite habe ich ein Fragment mit dem Namen "title" erstellt, damit ich auf der untergeordneten Seite mehr Codes an dieser Stelle der Masterseite einfügen kann. Außerdem wird das Tag <jsp:doBody/> durch den Inhalt der untergeordneten Seite ersetzt

ntergeordnete Seite (child.jsp) in Ihrem WebContent-Ordner erstellen:

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:base>
    <jsp:attribute name="title"> 
        <bean:message key="hello.world" />
    </jsp:attribute>

    <jsp:body>
    [Put your content of the child here]
    </jsp:body>   
</t:base>

<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 ein beliebiges Tag lib enthalten und Sie können es normal wie das andere erwähnte verwenden. Wenn Sie jedoch einen Scriptlet-Code hier verwenden (<%= request.getParameter("name") %> ...) und versuchen, diese Seite auszuführen, erhalten Sie eine JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here. Daher können andere Personen den bösen Code auf keinen Fall in die JSP-Datei aufnehmen

Aufruf dieser Seite von Ihrem Controller:

Sie können die Datei child.jsp einfach von Ihrem Controller aus aufrufen. Dies funktioniert auch gut mit dem Strebengerüst

21
Thai Tran

Verwenden Sie JSTL Tag libraries in JSP, das wird perfekt funktionieren.

19
Chandra Sekhar

Verwenden Sie einfach das JSTL-Tag und den EL-Ausdruck.

18
tanglei

Wenn jemand wirklich dagegen ist, in mehr als einer Sprache zu programmieren, schlage ich vor, dass Sie theoretisch alle JS- und HTML-Elemente vermeiden können, da Google Toolkit den gesamten Client- und gemeinsam genutzten Code in JS umwandelt. Sie haben gewonnen. ' Sie haben kein Problem damit, also haben Sie einen Webservice ohne Kodierung in einer anderen Sprache. Sogar Sie können von irgendwoher Standard-CSS verwenden, wie es durch Erweiterungen (smartGWT oder Vaadin) vorgegeben ist. Sie müssen nicht Dutzende von Anmerkungen lernen.

Wenn Sie möchten, können Sie sich natürlich in die Tiefe des Codes hacken und JS einbinden und Ihre HTML-Seite anreichern, aber Sie können es wirklich vermeiden, wenn Sie möchten, und das Ergebnis wird so gut sein, wie es in anderen Frameworks geschrieben wurde. Ich sage, einen Versuch wert, und das grundlegende GWT ist gut dokumentiert.

Und natürlich haben viele Programmierkollegen hiermit verschiedene andere Lösungen beschrieben oder empfohlen. GWT ist für Leute, die sich wirklich nicht mit dem Webpart auseinandersetzen oder es minimieren wollen.

17
CsBalazsHungary

Eine nette Idee aus der Python Welt sind Template-Attributsprachen ; TAL wurde von Zope (daher auch "Zope Page Templates", ZPT) eingeführt und ist ein Standard mit Implementierungen in PHP, XSLT und Java (ich habe Python/Zope und PHP Inkarnationen). In dieser Klasse von Vorlagensprachen könnte ein Beispiel wie folgt aussehen:

<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name">Example product</td>
        <td tal:content="product/description">A Nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

Der Code sieht aus wie gewöhnliches 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:

<h1 i18n:translate="">Our special offers</h1>
<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name"
            i18n:translate="">Example product</td>
        <td tal:content="product/description"
            i18n:translate="">A Nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

Wenn Übersetzungen des Inhalts verfügbar sind, werden sie verwendet.

Ich weiß allerdings nicht viel über die Java-Implementierung .

16
Tobias

Die Verwendung von Scriptlets in JSPs ist keine gute Vorgehensweise.

Stattdessen können Sie Folgendes verwenden:

  1. JSTL-Tags
  2. EL Ausdrücke
  3. Benutzerdefinierte Tags - Sie können Ihre eigenen Tags zur Verwendung definieren.

Bitte beziehen Sie sich auf:

  1. http://docs.Oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL
15
kapil das

Ersetzen Sie <%! counter++; %> durch eine Ereignis-Produzent-Konsument-Architektur, bei der die Business-Schicht über die Notwendigkeit informiert wird, den Zähler zu erhöhen. Sie reagiert entsprechend und benachrichtigt die Präsentatoren, damit sie die Ansichten aktualisieren. Es handelt sich um eine Reihe von Datenbanktransaktionen, da wir in Zukunft den neuen und den alten Wert des Zählers kennen müssen, wer ihn inkrementiert 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 inkrementieren. 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, 250 Inkremente pro Sekunde auf Ihrem neuen glänzenden E7-Server mit 64 GB RAM zu erreichen.

Ich habe mehr als 20 Jahre in der Programmierung, die meisten Projekte scheitern vor dem Sextett: Wiederverwendbarkeit Ersetzbarkeit OO-Fähigkeit Debuggbarkeit Testbarkeit Wartbarkeit wird sogar benötigt. Andere Projekte, die von Leuten geleitet wurden, denen nur die Funktionalität am Herzen lag, waren äußerst erfolgreich. Außerdem führt eine zu früh im Projekt implementierte starre Objektstruktur dazu, dass der Code nicht an die drastischen Änderungen in den Spezifikationen (auch bekannt als agil) angepasst werden kann.

Als Aufschub betrachte ich daher das Definieren von "Layern" oder redundanten Datenstrukturen, entweder zu Beginn des Projekts oder wenn dies nicht ausdrücklich erforderlich ist.

14
Razvan

Technisch gesehen werden alle JSPs zur Laufzeit in Servlets konvertiert. JSP wurde ursprünglich erstellt, um die Geschäftslogik und die Entwurfslogik nach dem MVC-Muster zu entkoppeln. JSP sind also technisch gesehen 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.

11
mel3kings

Wenn wir die folgenden Dinge in einer Java Webanwendung verwenden, kann Java Code aus dem Vordergrund der JSP entfernt werden.

  1. Verwenden Sie die MVC-Architektur für Webanwendungen

  2. Verwenden Sie JSP-Tags

    ein. Standard-Tags

    b. Benutzerdefinierte Tags

  3. Ausdruckssprache

9
Ajay Takur

Wie vermeide ich Java Code in JSP-Dateien?

Sie können Registerkartenbibliotheks-Tags wie JSTL zusätzlich zu Expression Language (EL) 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, die für JSF (Java Server Faces) entwickelt wurde und 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.

enter image description here

Quelle

6
Yster

Die Verwendung von Scriptlets ist sehr alt 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 Templating-Engine wie Velocity, Freemarker, Thymeleaf usw. Die Verwendung von einfachem JSP mit EL und JSTL erfüllt jedoch die meiste Zeit meinen Zweck und scheint auch für Anfänger am einfachsten zu sein.

Beachten Sie außerdem, dass es keine bewährte Methode ist, Geschäftslogik in der Ansichtsebene auszuführen. Sie sollten Ihre Geschäftslogiken in der Serviceebene ausführen und das Ausgabeergebnis über einen Controller an Ihre Ansichten übergeben.

4
adn.911

Nichts davon wird mehr verwendet, mein Freund. Mein Rat ist, die Ansicht (CSS, HTML, Javascript usw.) vom Server zu entkoppeln.

In meinem Fall bearbeite ich meine Systeme mit Angular und benötigte Daten werden mithilfe von Rest-Services vom Server abgerufen.

Glauben Sie mir, das wird Ihr Design verändern

3
Eduardo

Verwenden Sie das Backbone, angular wie das JavaScript-Framework für das UI-Design und rufen Sie die Daten mit der Rest-API ab. Dadurch wird die Abhängigkeit von Java von der Benutzeroberfläche vollständig entfernt.

3
Sumesh TG

JSP 2.0 hat eine Funktion namens "Tag Files". Sie können Tags ohne externen Java Code und tld schreiben. Sie müssen eine .tag -Datei erstellen und in WEB-INF\tags ablegen. Sie können sogar eine Verzeichnisstruktur erstellen, um Ihre Tags zu verpacken.

Zum Beispiel:

/WEB-INF/tags/html/label.tag

<%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%>
<%@attribute name="name" required="true" description="The label"%>

<label class="control-label control-default"  id="${name}Label">${name}</label>

Benutze es wie

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%>
<h:label  name="customer name" />

Außerdem können Sie den Tag-Text leicht lesen

/WEB-INF/tags/html/bold.tag
<%@tag description="Bold tag" pageEncoding="UTF-8"%>
<b>
  <jsp:doBody/>
</b>

Benutze es

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%>
<h:bold>Make me bold</h:bold>

Die Beispiele sind sehr einfach, aber Sie können hier viele komplizierte Aufgaben ausführen. Bitte beachten Sie, dass Sie auch andere Tags verwenden können (z. B .: JSTL mit steuernden Tags wie if/forEcah/chosen Textmanipulation wie format/contains/uppercase oder sogar SQL-Tags select/update), und alle Arten von Parametern übergeben können, z Beispiel Hashmap, Zugriff auf session, request, ... auch in Ihrer Tag-Datei.

Tag File sind so einfach zu entwickeln, dass Sie den Server beim Ändern nicht neu starten mussten, wie bei JSP-Dateien. Dies macht sie einfach für die Entwicklung.

Selbst wenn Sie ein Framework wie Struts 2 verwenden, das viele gute Tags enthält, können Sie feststellen, dass die Verwendung eigener Tags Ihren Code erheblich reduzieren kann. Sie können Ihre Tag-Parameter an Streben übergeben und auf diese Weise Ihr Framework-Tag anpassen.

Sie können tag nicht nur verwenden, um Java zu vermeiden, sondern auch um Ihre HTML-Codes zu minimieren. Ich selbst versuche, HTML-Codes zu überprüfen und häufig Tags zu erstellen, sobald sich auf meinen Seiten Code-Duplikate befinden.

(Auch wenn Sie das Java in Ihrem JSP-Code verwenden, was ich nicht hoffe, können Sie diesen Code in ein Tag einkapseln.)

2
Alireza Fattahi
  1. Machen Sie Ihre Werte und Parameter in Ihren Servlet-Klassen
  2. Rufen Sie diese Werte und Parameter in Ihrer JSP mit JSTL/Taglib ab

Das Gute an diesem Ansatz ist, dass Ihr Code auch HTML-Code ist!

1
Mehdi

Wie in vielen Antworten angegeben, verwenden Sie JSTL oder erstellen Sie Ihre eigenen benutzerdefinierten Tags. Hier ist eine gute Erklärung zum Erstellen benutzerdefinierter Tags

1
Code_Mode

Indem Sie JSTL-Tags zusammen mit EL-Ausdrücken verwenden, können Sie dies vermeiden. Fügen Sie die folgenden Dinge in Ihre JSP-Seite ein:

<%@ page contentType="text/html;charset=UTF-8" language="Java" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/fmt" prefix="fmt" %>
0
bhanwar rathore