Jak uniknąć kodu Javy w plikach JSP?

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. Czy ktoś może mi powiedzieć alternatywne linie JSP 2 i jak nazywa się ta technika?

Author: Francesco Menzani, 2010-07-05

29 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 deemphasizes stosowanie skryptów).

...

W duchu przyjęcia wzorca projektowego model-widok-kontroler (MVC) w celu zmniejszenia sprzężenia między warstwą prezentacji z logika biznesowa, 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. Częściej niż często kod ten należy umieścić 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 kawałka kodu na wszystkich stronach 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 daleko przed JSP jest / align = "left" / 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ący) znacznik flow control 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 musi być brany pod uwagę w każdej tworzonej 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ż:

 1864
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-06-08 08:34:53

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

 103
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

Nie jestem pewien, czy dobrze zrozumiałem.

Powinieneś przeczytać coś o MVC. Spring MVC & Rozpórki 2 są dwoma najczęstszymi rozwiązaniami.

 56
Author: tzim,
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 07:59:55

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>
 49
Author: Behrang,
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.

 32
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
2011-03-22 18:24:53

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, prędkość z JSP jako "silnik szablonu". 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 interesującą technikę eksponowania właściwości fasoli dla JSP ".

 29
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
2016-10-06 18:13:19

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

 25
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

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.

 23
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
2011-05-20 20:42:34

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 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>
 23
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
2015-12-07 10:40:28

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

Zauważ, że EL jest złym (wyjątki, refaktoryzacja)
Wicket może być również zły (wydajność, uciążliwy dla małych aplikacji lub prosty poziom 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.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>
 23
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
2016-03-08 10:44:33

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ść.

 22
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

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 zapisać wszystkie struktury programistyczne w postaci znaczników

 20
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
2011-02-23 06:14:50

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

Użycie JSTL Tag libraries w JSP, to będzie działać idealnie.

 18
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
2011-06-05 04:23:50

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

 17
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ęcej językach niż jednym , proponuję GWT, teoretycznie można uniknąć wszystkich elementów JS i HTML, ponieważ Google Toolkit przekształca cały klient i współdzielony kod do JS, nie będziesz miał z nimi problemu, więc masz webservice bez kodowania w innych językach. Nawet ty możesz użyć jakiegoś domyślnego CSS z jakiegoś miejsca, jak to jest podane przez rozszerzenia (smartGWT lub Vaadin). Nie musisz uczyć się dziesiątek adnotacji.

Oczywiście jeśli chcesz, możesz włamać się w głąb kodu i wstrzyknąć JS 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. Powiem worths spróbuj, 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 ją minimalizować.

 16
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
2013-03-19 13:00:10

Zgrabnym pomysłem ze świata Pythona są języki atrybutów szablonów ; TAL został wprowadzony przez Zope (dlatego aka "Szablony Stron Zope", 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 powyższy przykład 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ądarka i bezpiecznie być dostosowana przez projektanta. Istnieje wsparcie dla makr i dla 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>

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

Niewiele wiem jednak o implementacji Javy .

 15
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
2012-06-13 08:42:53

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

 12
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 i logiki projektowej, zgodnie ze wzorem MVC. Więc JSP są technicznie wszystkie kody java podczas wykonywania. Aby jednak odpowiedzieć na to pytanie, biblioteki znaczników są zwykle używane do stosowania logiki (usuwania kodów 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
2013-06-14 09:31:31

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

  1. Użyj architektury MVC dla aplikacji webowych

  2. Użyj znaczników JSP

    A. Standardowe Znaczniki

    B. Niestandardowe Znaczniki

  3. 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
2012-06-08 03:10:48

Jak uniknąć kodu Javy w plikach JSP?

Oprócz języka wyrażeń (EL) Można używać znaczników biblioteki tabulatorów, 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

 5
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
2015-12-24 11:47:27

Używanie skryptów jest bardzo starym sposobem i nie zaleca się. Jeśli chcesz bezpośrednio wypisać coś na swoich stronach JSP, użyj Języka wyrażeń (EL) wraz z JSTL.

Istnieją również inne opcje, takie jak użycie silnika szablonów, takich 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 zrobić logika biznesowa w warstwie widoku, logikę biznesową należy wykonać w warstwie usługowej, i przekazać wynik wyjściowy do swoich widoków za pomocą kontrolera.

 2
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
2017-11-30 15:59:33

Nic z tego nie jest już używane mój przyjacielu, moja rada jest oddzielenie widoku (css, html, javascript, itp) od serwera.

W moim przypadku robię swoje systemy obsługujące 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

 2
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
2017-12-12 19:45:33

Użyj szkieletu, kątowego 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.

 2
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
2018-06-20 13:49:13

JSP 2.0 posiada funkcję o nazwie "Pliki znaczników" , można pisać znaczniki bez zewnętrznego kodu java 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ż odczytać ciało tagu easly

/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żywaj innych tagów (np: JSTL który ma znaczniki sterujące jak if/forEcah/chosen manipulacja tekstem jak format/contains/uppercase lub nawet znaczniki SQL select/update), przekazuj 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 mając własne tagi mogą znacznie zmniejszyć 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ć kody HTML i budować tagi dużo, jak tylko zobacz duplikaty kodu zaczynają się na moich stronach.

W tym celu należy użyć kodu java w kodzie jsp, który, mam nadzieję, nie, można zamknąć w znaczniku.]}
 1
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
2016-04-12 14:55:51

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

 0
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
2017-07-07 20:24:49

Używając znaczników JSTL wraz z wyrażeniem EL można 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" %>
 -1
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
2016-09-13 08:43:25