Jak mogę uniknąć kodu Java w plikach JSP, używając JSP 2?

Jestem nowy w Java EE i Wiem, że coś takiego jak następujące trzy linie

<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>

Jest staromodnym sposobem kodowania, a w JSP w wersji 2 istnieje metoda unikania kodu Javy w plikach JSP. Jakie są alternatywne linie JSP 2 i jak nazywa się ta technika?

Author: Peter Mortensen, 2010-07-05

30 answers

Stosowanieskryptów (tych <% %> rzeczy) w JSP jest rzeczywiście wysoce odradzane od narodzin taglib (Jak JSTL) i EL (Expression Language , those ${} things) w 2001 roku.

Główne wady skryptów to:

  1. Reusability: nie można ponownie używać skryptów.
  2. nie można tworzyć skryptów abstrakcja.
  3. oo-zdolność: nie możesz używać dziedziczenia/kompozycji.
  4. Debuggability: jeśli scriptlet wyrzuci wyjątek w połowie, otrzymasz tylko pustą stronę.
  5. Testowalność: skrypty nie są testowalne jednostkowo.
  6. Maintainability: per saldo potrzeba więcej czasu, aby zachować mieszaną/zaśmieconą / zduplikowaną logikę kodu.

Sun sama Oracle poleca również w kodowanie JSP konwencje {[28] } aby uniknąć użycia skryptów , gdy ta sama funkcjonalność jest możliwa przez klasy (tag). Oto kilka ważnych cytatów:

Ze specyfikacji JSP 1.2, jest wysoce zalecane, aby JSP Standard Tag Library (JSTL) być używane w aplikacji internetowej, aby pomóc zmniejszyć potrzebę skryptów JSP na stronach. Strony korzystające z JSTL są ogólnie łatwiejsze do odczytania i utrzymania.

...

Gdzie to możliwe, unikaj skryptów JSP, gdy biblioteki znaczników zapewniają równoważną funkcjonalność. To sprawia, że strony są łatwiejsze do odczytania i utrzymania, pomaga oddzielić logikę biznesową od logiki prezentacji i sprawi, że strony będą łatwiejsze do przekształcenia w strony w stylu JSP 2.0 (Specyfikacja JSP 2.0 obsługuje, ale de-podkreśla użycie skryptów).

...

W duchu przyjęcia wzorca projektowego model-widok-kontroler (MVC) w celu zmniejszenia sprzężenia między warstwą prezentacji z logiki biznesowej Skrypty JSP nie powinny być używane do pisania logiki biznesowej. Zamiast tego, Skrypty JSP są używane w razie potrzeby do przekształcania danych (zwanych również "obiektami wartości") zwróconych podczas przetwarzania żądań klienta do odpowiedniego formatu gotowego do klienta. Nawet wtedy lepiej byłoby to zrobić z serwletem kontrolera przedniego lub niestandardowym znacznikiem.


Jak zastąpić Skrypty zależy wyłącznie od celu kodu / logiki. Więcej niż często ten kod musi być umieszczony w pełnej klasie Javy:

  • Jeśli chcesz wywołać ten sam Kod Javy na każdym żądaniu , mniej-lub-więcej niezależnie od żądanej strony, np. sprawdzając, czy użytkownik jest zalogowany, zaimplementuj filtr i wpisz odpowiednio kod w doFilter() metoda. Np.:

    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.
        }
    }
    

    Po zmapowaniu na odpowiedniej <url-pattern> obejmującej interesujące strony JSP, nie musisz kopiować tego samego fragment kodu ogólnie strony JSP.


  • Jeśli chcesz wywołać jakiś kod Javy do preprocess żądania, np. wstępnie załadować listę z bazy danych do wyświetlenia w jakiejś tabeli, jeśli to konieczne na podstawie niektórych parametrów zapytania, zaimplementuj servlet i napisz odpowiednio kod w doGet() metoda. Np.:

    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);
        }
    }
    

    W ten sposób radzenie sobie z wyjątkami jest łatwiejsze. DB nie jest dostępny w trakcie renderowania JSP, ale znacznie przed JSP został wyświetlony. Nadal masz możliwość zmiany odpowiedzi za każdym razem, gdy dostęp DB wyrzuci wyjątek. W powyższym przykładzie zostanie wyświetlona Domyślna strona błędu 500, którą możesz dostosować za pomocą <error-page> w web.xml.


  • Jeśli chcesz wywołać jakiś kod Javy do postprocess żądania, np. przetwarzając formularz submit, to zaimplementuj servlet i napisz odpowiednio kod w doPost() metoda. Np.:

    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.
        }
    }
    

    W ten sposób radzenie sobie z różnymi docelowymi stronami wyników jest łatwiejsze: ponowne wyświetlenie formularza z błędami walidacji w przypadku błędu (w tym konkretnym przykładzie możesz ponownie wyświetlić go za pomocą ${message} w EL ), lub po prostu przejście do żądanej strony docelowej w przypadku sukcesu.


  • Jeśli chcesz wywołać kod Javy, aby kontrolować plan wykonania i / lub miejsce docelowe żądania i odpowiedź, zaimplementuj servlet zgodnie z wzorcem kontrolera przedniego MVC. Np.:

    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);
        }
    }
    

    Lub po prostu przyjąć Framework MVC jak JSF, Spring MVC, Wicket , itp., aby skończyć z tylko stroną JSP/Facelets i klasą JavaBean bez potrzeby tworzenia niestandardowego servletu.


  • Jeśli chcesz wywołać kod Javy, aby kontrolować przepływ wewnątrz strony JSP, musisz pobrać (istniejącą) kontrolę przepływu taglib jak JSTL core . Np. wyświetlanie List<Product> w tabeli:

    <%@ 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>
    

    Ze znacznikami w stylu XML, które ładnie pasują do całego HTML ' a, kod jest lepiej czytelny (a tym samym lepiej utrzymywalny) niż kilka skryptów z różnymi nawiasami otwierającymi i zamykającymi ("gdzie do cholery należy ten nawias zamykający?"). Łatwą pomocą jest skonfigurowanie aplikacji internetowej tak, aby rzucała wyjątek, gdy Skrypty są nadal używane, dodając następujący fragment do web.xml:

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

    W Facelets, następcy JSP, który jest częścią Java EE pod warunkiem MVC framework JSF , jest już niemożliwe użycie skryptów. W ten sposób jesteś automatycznie zmuszony do robienia rzeczy "we właściwy sposób".


  • Jeśli chcesz wywołać kod Javy, aby uzyskać dostęp i wyświetlić "backend" danych wewnątrz strony JSP, musisz użyć EL (Expression Language), tych ${} rzeczy. Np. redisplaying submitted input values:

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

    ${param.foo} wyświetla wynik request.getParameter("foo").


  • Jeśli chcesz wywołać jakiś utility Kod Javy bezpośrednio na stronie JSP (zazwyczaj metody public static), musisz zdefiniować je jako funkcje EL. W JSTL jest standard functions taglib , ale możesz również łatwo tworzyć funkcje samodzielnie. Oto przykład, jak JSTL fn:escapeXml jest przydatny do zapobiegania XSS ataki .

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

    Zauważ, że czułość XSS nie jest w żaden sposób związana z Java / JSP/JSTL / el / cokolwiek, ten problem należy wziąć pod uwagę w każdej stworzonej aplikacji internetowej. Problem skryptów polega na tym, że nie zapewnia on możliwości wbudowania prewencji, przynajmniej nie używając standardowego API Javy. Następca JSP ma już ukryty kod HTML, więc nie musisz się martwić dziurami XSS w Facelets.

Zobacz też:

 1991
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-07 13:07:15

Jako zabezpieczenie: Wyłącz Skrypty na dobre

Ponieważ omawiane jest kolejne pytanie , Możesz i zawsze powinieneś wyłączyć skrypty w swoim deskryptorze aplikacji internetowej web.xml.

Zawsze robiłbym to, aby zapobiec dodawaniu skryptów przez programistów, szczególnie w większych firmach, gdzie prędzej czy później stracisz przegląd. Ustawienia web.xml wyglądają tak:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
 228
Author: Stefan Schubert-Peters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

JSTL oferuje znaczniki dla warunkow, pętli, zestawów, getów itp. Na przykład:

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

JSTL działa z atrybutami żądania - są one najczęściej ustawiane w żądaniu przez Servlet, który przekazuje do JSP.

 109
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 12:17:16

Możesz używać znaczników JSTL razem z wyrażeniami EL, aby uniknąć mieszania się kodu Java i HTML:

<%@ 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>
 54
Author: βξhrαng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-08 15:36:41

Istnieją również frameworki oparte na komponentach, takie jak Wicket, które generują dużo HTML dla Ciebie.

Znaczniki, które kończą się w HTML są niezwykle podstawowe i praktycznie nie ma logiki, która się miesza. Rezultatem są prawie puste strony HTML z typowymi elementami HTML. Minusem jest to, że istnieje wiele komponentów w API Wicket do nauczenia się i niektóre rzeczy mogą być trudne do osiągnięcia w tych ograniczeniach.

 34
Author: tsand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 21:06:44

We wzorze architektonicznym MVC, JSP reprezentują warstwę widoku. Osadzanie kodu Javy w JSP jest uważane za złą praktykę.

Możesz użyć JSTL, freeMarker i velocity z JSP jako "silnikiem szablonów".

Dostawca danych do tych tagów zależy od frameworków , z którymi masz do czynienia. Struts 2 i WebWork jako implementacja wzorca MVC wykorzystuje OGNL " bardzo ciekawą technikę eksponowania fasoli nieruchomości do JSP"

 33
Author: Sami Jmii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-13 10:28:11

Doświadczenie pokazało, że JSP ma pewne niedociągnięcia, jednym z nich jest trudno uniknąć mieszania znaczników z rzeczywistym kodem.

Jeśli możesz, rozważ użycie specjalistycznej technologii do tego, co musisz zrobić. W Javie EE 6 jest JSF 2.0, który zapewnia wiele fajnych funkcji, w tym klejenie fasoli Javy wraz ze stronami JSF poprzez podejście #{bean.method(argument)}.

 27
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-05 08:30:06

Jeśli po prostu chcesz uniknąć wad kodowania Javy w JSP, możesz to zrobić nawet za pomocą skryptów. Po prostu postępuj zgodnie z pewną dyscypliną, aby mieć minimalną Javę w JSP i prawie bez obliczeń i logiki na stronie JSP.

<%@ 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 forwarding, 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
Author: dipu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:57:37

Naucz się dostosowywać i pisać własne tagi za pomocą JSTL

Zauważ, że EL jest złym (wyjątki i refaktoryzacja).

Wicket może być również zły (wydajność i uciążliwość dla małych aplikacji lub prostej warstwy widoku).

Przykład z java2s

To musi być dodane do web aplikacji.xml

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

Utwórz plik java2s. TLD w / 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>

Skompiluj poniższy kod do 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;
    }
}

Uruchom serwer i załaduj bodyContent.plik jsp w przeglądarce:

<%@ 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
Author: tomasb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 21:02:10

Wicket jest również alternatywą, która całkowicie oddziela Javę od HTML, więc projektant i programista mogą pracować razem i na różnych zestawach kodu z niewielkim zrozumieniem siebie nawzajem.

Spójrz na Wicket.

 25
Author: msj121,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 21:05:40

Postawiłeś dobre pytanie i chociaż masz dobre odpowiedzi, sugerowałbym, żebyś pozbył się JSP. To przestarzała technologia, która w końcu umrze. Użyj nowoczesnego podejścia, takiego jak silniki szablonów. Będziesz miał bardzo wyraźne oddzielenie warstw biznesowych i prezentacji, a na pewno nie ma kodu Java w szablonach, dzięki czemu można generować szablony bezpośrednio z oprogramowania do edycji prezentacji internetowych, w większości przypadków przy użyciu WYSIWYG.

I na pewno trzymaj się z dala od filtrów i pre i post przetwarzanie, w przeciwnym razie możesz poradzić sobie z problemami wsparcia / debugowania, ponieważ zawsze nie wiesz, gdzie zmienna otrzymuje wartość.

 23
Author: Dmitriy R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-20 00:02:46

Bez względu na to, jak bardzo starasz się unikać, podczas pracy z innymi programistami, niektórzy z nich nadal będą preferować skryptlet, a następnie wstawić zły kod do projektu. Dlatego ustawienie projektu przy pierwszym znaku jest bardzo ważne, jeśli naprawdę chcesz zmniejszyć kod skryptu. Istnieje kilka technik, aby przejść przez to (w tym kilka frameworków, o których inne wspomniały). Jeśli jednak wolisz czysty sposób JSP, użyj pliku znacznika JSTL. Fajną rzeczą w tym jest to, że możesz również skonfiguruj strony wzorcowe dla swojego projektu, aby pozostałe strony mogły dziedziczyć strony wzorcowe

Utwórz stronę wzorcową o nazwie base.tag under your WEB-INF / tags with the following content

<%@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>

Na tej stronie głównej utworzyłem fragment o nazwie "title", aby na stronie potomnej móc wstawić więcej kodów w to miejsce strony wzorcowej. Ponadto znacznik <jsp:doBody/> zostanie zastąpiony zawartością strony potomnej

Create child page (child.jsp) w Twój katalog WebContent:

<%@ 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> służy do określenia strony wzorcowej, której chcesz użyć (która jest bazą.tag w tej chwili). Cała zawartość wewnątrz tagu <jsp:body> tutaj zastąpi <jsp:doBody/> na stronie wzorcowej. Strona potomna może również zawierać dowolny znacznik lib i można go używać normalnie, jak inne wymienione. Jeśli jednak użyjesz tu jakiegoś kodu skryptowego (<%= request.getParameter("name") %>...) i spróbuj uruchomić tę stronę, otrzymasz JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here. Dlatego nie ma sposobu, aby inni ludzie mogli Dołącz zły kod do pliku jsp

Wywołanie tej strony z kontrolera:

Możesz łatwo zadzwonić do dziecka.plik jsp z kontrolera. Działa to również dobrze z frameworkiem struts
 21
Author: Thai Tran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-26 18:07:56

Aby uniknąć kodu Javy w plikach JSP, Java udostępnia teraz biblioteki znaczników, takie jak JSTL.

Również Java stworzyła JSF , do którego można zapisywać wszystkie struktury programistyczne w postaci znaczników.

 21
Author: mahesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 21:08:05

Użyj bibliotek znaczników JSTL w JSP. To zadziała idealnie.

 19
Author: Chandra Sekhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 21:04:07

Wystarczy użyć tagu JSTL i wyrażenia EL.

 18
Author: tanglei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-11 06:59:59

Jeśli ktoś jest naprawdę przeciwny programowaniu w większej liczbie języków niż jeden , proponuję GWT. Teoretycznie można uniknąć wszystkich elementów JavaScript i HTML, ponieważ Google Toolkit przekształca cały klient i udostępniony kod do JavaScript. Nie będziesz miał z nimi problemu, więc masz webservice bez kodowania w innych językach. Możesz nawet użyć domyślnego CSS, ponieważ jest on podawany przez rozszerzenia (smartGWT lub Vaadin ). Nie musisz uczyć się dziesiątek Przypisy

Oczywiście, jeśli chcesz, możesz włamać się do głębi kodu i wstrzyknąć JavaScript i wzbogacić swoją stronę HTML, ale naprawdę możesz tego uniknąć, jeśli chcesz, a wynik będzie dobry, jak to zostało napisane w innych frameworkach. Warto spróbować, a podstawowy GWT jest dobrze udokumentowany.

I oczywiście wielu innych programistów opisało lub poleciło kilka innych rozwiązań. GWT jest dla ludzi, którzy naprawdę nie chcą zajmować się Stroną Internetową lub zminimalizuj to.

 17
Author: CsBalazsHungary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:54:08

Zgrabnym pomysłem ze świata Pythona jest języki atrybutów szablonów ; TAL został wprowadzony przez Zope (dlatego znany jako "Zope Page Templates", ZPT) i jest standardem, z implementacjami w PHP, XSLT i Javie, jak również (użyłem wcielenia Python/Zope i PHP). W tej klasie języków szablonowych jeden z powyższych przykładów może wyglądać tak:

<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>

Kod wygląda jak zwykły HTML (lub XHTML) plus pewne specjalne atrybuty w przestrzeni nazw XML; można go przeglądać za pomocą przeglądarkę i bezpiecznie zostać poprawionym przez projektanta.

Istnieje również wsparcie dla makr oraz dla internacjonalizacji i lokalizacji :

<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>

Jeśli tłumaczenia treści są dostępne, są one używane.

Niewiele wiem jednak o implementacji Javy .

 16
Author: Tobias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:55:59

Używanie skryptów w JSPs nie jest dobrą praktyką.

Zamiast tego możesz użyć:

  1. tagi JSTL
  2. El
  3. własne tagi - możesz zdefiniować własne tagi do użycia.

Zobacz:

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL
 15
Author: kapil das,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 16:02:02

Jasne, zastąp <%! counter++; %> architekturą producent-konsument, gdzie warstwa biznesowa jest powiadamiana o konieczności zwiększenia licznika, reaguje odpowiednio i powiadamia prezenterów, aby zaktualizowali widoki. W grę wchodzi szereg transakcji bazodanowych, ponieważ w przyszłości będziemy musieli znać nową i starą wartość licznika, kto ją zwiększył i w jakim celu. Oczywiście serializacja jest zaangażowana, ponieważ warstwy są całkowicie odsprzęgnięte. Będziesz możliwość zwiększenia licznika o RMI, IIOP, SOAP. Ale wymagany jest tylko HTML, którego nie implementujesz, ponieważ jest to tak przyziemny przypadek. Twoim nowym celem jest osiągnięcie 250 przyrostów na sekundę na nowym błyszczącym serwerze E7, 64GB RAM.

Mam ponad 20 lat w programowaniu, większość projektów zawodzi przed sekstetem: reusability Replaciability oo-ability Debuggability testability Maintaiability jest nawet potrzebna. Inne projekty, prowadzone przez ludzi, którym zależało tylko na funkcjonalności, były bardzo udany. Ponadto sztywna struktura obiektu, zaimplementowana zbyt wcześnie w projekcie, sprawia, że kod nie może być dostosowany do drastycznych zmian w specyfikacji (aka agile).

Uważam więc za zwlekanie z definiowaniem "warstw" lub nadmiarowych struktur danych na początku projektu lub gdy nie jest to specjalnie wymagane.  

 14
Author: Razvan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 12:22:43

Technicznie, JSP są konwertowane do Servletów podczas wykonywania .

JSP został początkowo stworzony w celu oddzielenia logiki biznesowej od logiki projektowej, zgodnie ze wzorem MVC. Więc JSP jest technicznie cały kod Java podczas wykonywania.

Ale aby odpowiedzieć na pytanie, biblioteki znaczników są zwykle używane do stosowania logiki (usuwania kodu Javy) na stronach JSP.

 11
Author: mel3kings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:39:29

Jeśli użyjemy następujących rzeczy w aplikacji Java web, kod Java może zostać wyeliminowany z pierwszego planu pliku JSP.

  1. Użyj architektury MVC dla aplikacji webowej

  2. Użyj znaczników JSP

A. Standardowe Znaczniki

B. Niestandardowe Znaczniki

  1. Język Wyrażeń
 9
Author: Ajay Takur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:59:19

Jak mogę uniknąć kodu Java w plikach JSP?

Oprócz języka wyrażeń (EL) Można używać znaczników tab library, takich jakJSTL. Ale EL nie działa dobrze z JSP. Więc chyba lepiej całkowicie porzucić JSP i użyć .

Facelets jest pierwszym językiem deklaracji stron nie JSP zaprojektowanym dla JSF (Java Server Faces), który dostarczył prostszy i bardziej wydajny model programowania dla programistów JSF jako porównaj z JSP. Rozwiązuje różne problemy występujące w JSP dla tworzenia aplikacji internetowych.

Tutaj wpisz opis obrazka

Źródło

 8
Author: Yster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:22:21

Używanie skryptów jest bardzo starym sposobem i nie jest zalecane. Jeśli chcesz bezpośrednio wypisać coś na swoich stronach JSP, po prostu użyj Expression Language (EL) wraz z JSTL.

Istnieją również inne opcje, takie jak użycie silnika szablonów, takiego jak Velocity, Freemarker, Thymeleaf itp. Ale używanie zwykłego JSP z EL i JSTL służy mojemu celowi przez większość czasu i również wydaje się najprostsze dla początkującego.

Należy również pamiętać, że nie jest to najlepsza praktyka aby wykonać logikę biznesową w warstwie widoku. Powinieneś wykonać swoją logikę biznesową w warstwie service , i przekazać wynik wyjściowy do swoich widoków za pomocą kontrolera .

 4
Author: adn.911,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:16:34

Użyj kręgosłupa.js lub AngularJS-jak JavaScript framework do projektowania UI i pobrać dane za pomocą REST API. Spowoduje to całkowite usunięcie zależności Javy z interfejsu użytkownika.

 3
Author: Sumesh TG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:12:21

Nic z tego nie jest już używane, mój przyjacielu. Moja rada to oddzielenie widoku (CSS, HTML, JavaScript itp.) z serwera.

W moim przypadku moje systemy obsługują widok z Angular i wszelkie potrzebne dane są przywożone z serwera za pomocą usług REST.

Uwierz mi, to zmieni sposób, w jaki projektujesz.

 3
Author: Eduardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:14:33

JSP 2.0 posiada funkcję o nazwie "pliki znaczników" i można pisać znaczniki bez zewnętrznego kodu Javy i tld. Musisz utworzyć plik .tag i umieścić go w WEB-INF\tags. Możesz nawet utworzyć strukturę katalogów, aby spakować swoje tagi.

Na przykład:

/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>

Użyj go jak

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

Możesz również łatwo odczytać treść tagu:

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

Użyj go:

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

Próbki są bardzo proste, ale można tu wykonać wiele skomplikowanych zadań. Proszę wziąć pod uwagę, że możesz użyj innych tagów (na przykład: JSTL który ma kontrolujące tagi jak if/forEcah/chosen manipulacja tekstem jak format/contains/uppercase lub nawet tagi SQL select/update), przekazać wszystkie parametry rodzaju, na przykład Hashmap, dostęp session, request, ... w Twoim pliku tagów też.

Pliki znaczników są tak łatwe do opracowania, że nie trzeba było ponownie uruchamiać serwera podczas ich zmiany, jak pliki JSP. To ułatwia ich rozwój.

Nawet jeśli używasz frameworka takiego jak Struts 2, który ma wiele dobrych tagów, może się okazać, że posiadanie własnych znaczników może znacznie zredukować kod. Możesz przekazać parametry znacznika struts i w ten sposób dostosować znacznik framework.

Możesz używać tagów nie tylko w celu uniknięcia Javy, ale także zminimalizowania kodu HTML. Sam staram się przeglądać kod HTML i budować tagi dużo, jak tylko widzę duplikaty kodu zaczynają się na moich stronach.

(nawet jeśli skończysz używając Javy w swoim kodzie JSP, a mam nadzieję, że nie, możesz zamknąć ten kod w znaczniku.)

 3
Author: Alireza Fattahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:20:30
  1. twórz wartości i parametry wewnątrz klas serwletów
  2. pobieranie tych wartości i parametrów w JSP za pomocą JSTL / Taglib

Dobrą rzeczą w tym podejściu jest to, że Twój kod jest również HTML jak kod!

 1
Author: Mehdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-01 16:04:09

Jak mówi wiele odpowiedzi, użyj JSTL lub utwórz własne niestandardowe tagi. tutaj{[2] } jest dobre wyjaśnienie dotyczące tworzenia niestandardowych tagów.

 1
Author: Code_Mode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:17:01

Używając znaczników JSTL wraz z wyrażeniami EL, możesz tego uniknąć. Umieść następujące rzeczy na swojej stronie JSP:

<%@ 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
Author: bhanwar rathore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-25 20:17:36

Wiele odpowiedzi tutaj idzie" użyj frameworka " trasa. Nie ma w tym nic złego. Jednak nie sądzę, aby to naprawdę odpowiada na twoje pytanie, ponieważ frameworki mogą lub nie mogą używać JSP, ani nie są zaprojektowane w żaden sposób z usuwaniem wykorzystania Javy w JSP jako głównego celu.

Jedyną dobrą odpowiedzią na twoje pytanie "Jak uniknąć używania Javy w JSP" jest: nie możesz.

po to są JSP - używanie Javy do renderowania HTML z dynamicznymi danymi/logiką. Kolejnym pytaniem może być, ile Javy powinienem używać w moich JSP.
zanim odpowiemy na to pytanie, należy również zastanowić się: "czy muszę używać JSP do tworzenia treści internetowych za pomocą Javy?"Odpowiedź na to ostatnie brzmi: nie. Istnieje wiele alternatyw dla JSP do tworzenia aplikacji internetowych przy użyciu Javy. Struts na przykład nie zmusza cię do używania JSP-nie zrozum mnie źle, możesz z nich korzystać i wiele implementacji tak robi, ale absolutnie nie musisz. Struts nawet nie zmusza do używania żadnego HTML. JSP nie albo, ale bądźmy szczerzy, JSP produkujący bez HTML jest trochę dziwny. Serwlety, znane, pozwalają na serwowanie dowolnego rodzaju treści, które lubisz przez HTTP dynamicznie. Są one podstawową technologią stojącą za prawie wszystkim java web-JSP to tylko szablony HTML dla serwletów, tak naprawdę.
Więc odpowiedź na to, ile Javy powinieneś umieścić w JSP, brzmi: "jak najmniej". Oczywiście mam Javę w moich JSP, ale składa się wyłącznie z definicji biblioteki tagów, sesji i zmiennych klienta, i beans enkapsuluje obiekty po stronie serwera. Znaczniki w moim HTML są prawie wyłącznie wywołaniami Właściwości lub wyrażeniami zmiennymi. Rzadkie wyjątki obejmują ultra-specyficzne obliczenia odnoszące się do pojedynczej strony i mało prawdopodobne, aby kiedykolwiek zostały ponownie użyte; poprawki błędów wynikające z problemów specyficznych dla strony tylko dla jednej strony; koncatenacje last minute i arytmetyka wynikające z nietypowych wymagań ograniczonych do pojedynczej strony; i inne podobne przypadki. W zestawie kodów 1,5 miliona linii, 3000 JSPs i 5000 klas, jest może 100 instancji takich unikalnych fragmentów. Byłoby całkiem możliwe wprowadzenie tych zmian w definicjach klas lub bibliotek znaczników, ale byłoby to niezwykle skomplikowane ze względu na specyfikę każdego przypadku, dłuższe pisanie i debugowanie zajęło więcej czasu, a w rezultacie dotarcie do moich użytkowników. To decyzja sądu. Ale nie popełnij błędu, nie możesz pisać JSP o jakimkolwiek znaczeniu z "bez Javy", ani byś tego nie chciał. Możliwości są nie bez powodu.

 0
Author: Philippe Damerval,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-28 00:03:41