Как избежать Java-кода в файлах JSP?

1649

Я новичок в Java EE, и я знаю, что что-то вроде следующих трех строк

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

- старый школьный способ кодирования, а в JSP версии 2 существует метод, позволяющий избежать Java-кода в JSP файлах. Может кто-нибудь, пожалуйста, скажите мне альтернативные строки JSP 2 и что называется эта техника?

  • 20
    @ Корай Тугай, если переменная counter объявлена где-то до ее использования, то она наверняка верна ...
  • 0
    @SheldonR. Это верно: <% = counter ++%> или это: <%! int counter = 0; int x = counter ++; %> но не: <%! int counter = 0; Счетчик ++; %>
Показать ещё 1 комментарий
Теги:
jsp
scriptlet

30 ответов

1889
Лучший ответ

Использование скриптлетов (эти <% %> %% <% %> вещи) в JSP действительно крайне не рекомендуется с момента рождения taglibs (например, JSTL) и EL (Expression Language, эти ${} вещи) еще в 2001 году.

Основными недостатками скриплетов являются:

  1. Возможность повторного использования : вы не можете повторно использовать скриптлеты.
  2. Заменимость: вы не можете сделать скриптлеты абстрактными.
  3. ОО-способность: вы не можете использовать наследование/композицию.
  4. Отладка: если скриптлет выбрасывает исключение на полпути, вы получаете только пустую страницу.
  5. Тестируемость: скриптлеты не тестируются юнитами.
  6. Ремонтопригодность: для сохранения логики смешанного/загроможденного/дублированного кода требуется больше времени.

Сам Sun Oracle также рекомендует в соглашениях по кодированию JSP избегать использования скриптлетов, когда те же функции возможны с помощью (тегов) классов. Вот несколько ссылок:

Из спецификации JSP 1.2 настоятельно рекомендуется использовать в вашем веб-приложении стандартную библиотеку тегов JSP (JSTL), чтобы уменьшить потребность в скриплетах JSP на ваших страницах. Страницы, использующие JSTL, в общем, легче читать и поддерживать.

...

По возможности избегайте JSP-скриптлетов, когда библиотеки тегов предоставляют эквивалентную функциональность. Это облегчает чтение и обслуживание страниц, помогает отделить бизнес-логику от логики представления и облегчает превращение ваших страниц в страницы в стиле JSP 2.0 (спецификация JSP 2.0 поддерживает, но не подчеркивает использование скриптлетов).

...

В духе принятия шаблона проектирования модель-представление-контроллер (MVC) для уменьшения связи между уровнем представления и бизнес-логикой сценарии JSP не должны использоваться для написания бизнес-логики. Вместо этого JSP-скриптлеты используются при необходимости для преобразования данных (также называемых "объектами значений"), возвращаемых при обработке клиентских запросов, в надлежащий формат, готовый для клиента. Даже тогда это лучше сделать с помощью сервлета фронт-контроллера или пользовательского тега.


То, как заменить скриптлеты, полностью зависит от единственной цели кода/логики. Чаще всего этот код помещается в полноценный класс Java:

  • Если вы хотите вызывать один и тот же код Java при каждом запросе, в меньшей или большей степени независимо от запрашиваемой страницы, например, проверяя, вошел ли пользователь в систему, тогда реализуйте фильтр и соответственно пишите код в doFilter(). Например:

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

    При отображении на соответствующий <url-pattern> охватывающий интересующие JSP-страницы, вам не нужно копировать и вставлять один и тот же фрагмент кода в общие JSP-страницы.


  • Если вы хотите вызвать некоторый Java-код для предварительной обработки запроса, например, предварительно загрузить некоторый список из базы данных для отображения в некоторой таблице, при необходимости, основываясь на некоторых параметрах запроса, то реализуйте сервлет и напишите код соответствующим образом в методе doGet(). Например:

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

    Таким образом, иметь дело с исключениями проще. К БД не обращаются во время рендеринга JSP, но задолго до того, как JSP был отображен. У вас все еще есть возможность изменить ответ всякий раз, когда доступ к БД вызывает исключение. В приведенном выше примере будет отображена страница ошибки 500 по умолчанию, которую вы в любом случае можете настроить с помощью <error-page> в web.xml.


  • Если вы хотите вызвать некоторый Java-код для постобработки запроса, например, обработки отправки формы, то реализуйте сервлет и напишите код соответствующим образом в методе 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.
        }
    }
    

    Это облегчает работу с различными адресами на странице результатов: повторное отображение формы с ошибками проверки в случае ошибки (в данном конкретном примере вы можете повторно отобразить ее, используя ${message} в EL), или просто переход на нужную целевую страницу в случае успеха.


  • Если вы хотите вызвать некоторый Java-код для управления планом выполнения и/или местом назначения запроса и ответа, то реализуйте сервлет в соответствии с шаблоном фронт-контроллера MVC. Например:

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

    Или просто используйте MVC-инфраструктуру, такую как JSF, Spring MVC, Wicket и т.д., Чтобы в итоге вы получили только страницу JSP/Facelets и класс JavaBean без необходимости использования собственного сервлета.


  • Если вы хотите вызвать некоторый Java-код для управления потоком внутри JSP-страницы, то вам нужно получить (существующий) taglib управления потоком, такой как ядро JSTL. Например, отображение List<Product> в таблице:

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

    С тегами в стиле XML, которые хорошо вписываются в этот HTML, код лучше читается (и, следовательно, лучше поддерживается), чем набор скриплетов с различными открывающими и закрывающими скобками ("Куда, черт возьми, относится эта закрывающая скобка?"). Легкая помощь состоит в том, чтобы настроить ваше веб-приложение на выдачу исключения, когда скриптлеты все еще используются, добавив следующий фрагмент в web.xml:

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

    В Facelets, преемник JSP, который является частью Java EE при условии рамочного MVC JSF, это уже не представляется возможным использовать скриптлет. Таким образом, вы автоматически будете вынуждены делать все "правильно".


  • Если вы хотите вызвать некоторый Java-код для доступа и отображения "внутренних данных" на странице JSP, то вам нужно использовать EL (Expression Language), эти ${} вещи. Например, повторное отображение введенных значений ввода:

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

    ${param.foo} отображает результат request.getParameter("foo").


  • Если вы хотите вызывать некоторый служебный Java-код непосредственно на странице JSP (обычно это public static методы), вам нужно определить их как функции EL. В JSTL есть стандартные функции taglib, но вы также можете легко создавать функции самостоятельно. Вот пример того, как JSTL fn:escapeXml полезен для предотвращения XSS- атак.

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

    Обратите внимание, что чувствительность XSS никоим образом не связана конкретно с Java/JSP/JSTL/EL/чем бы то ни было, эту проблему необходимо учитывать в каждом разрабатываемом веб-приложении. Проблема скриплетов в том, что они не предоставляют встроенных предупреждений, по крайней мере, не используя стандартный Java API. У преемника JSP Facelets уже есть неявное экранирование HTML, поэтому вам не нужно беспокоиться о дырах XSS в Facelets.

Смотрите также:

  • 114
    +1 Отличный ответ. Но не будьте догматичными, иногда использование скриптлетов - это нормально, но это должно быть исключением, которое подтверждает правило.
  • 26
    @svachon: Scriptlets полезны для быстрого прототипирования / тестирования. Насколько я знаю, есть только одно «законное» производственное использование скриплета, а именно: <% response.getWriter().flush(); %> между </head> и <body> чтобы улучшить производительность анализа веб-страницы в браузере. Но это использование, в свою очередь, совершенно незначительно, когда размер выходного буфера на стороне сервера низок (1 ~ 2 КБ). Смотрите также эту статью .
Показать ещё 13 комментариев
212

Как защитник: отключить скрипты для хорошего

Как обсуждается еще один вопрос, вы можете и всегда должны отключать скрипты в дескрипторе веб-приложения web.xml.

Я всегда делал это, чтобы любой разработчик не добавлял сценарии, особенно в более крупные компании, где вы рано или поздно потеряете обзор. Настройки web.xml выглядят следующим образом:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
  • 4
    Отключает ли это также комментарии скриптлета ?: <%-- comment that i don't want in the final HTML --%> . Я считаю полезным использовать эти, а не комментарии HTML.
  • 14
    @MrSpoon нашел ответ для вас. Согласно этому ответу + комментарию , это отключает скриптлеты <% %> %% <% %> , выражения скриптлетов <%! %> и объявления скриптлета <%= %> . Это означает, что директивы <%@ %> и комментарии <%-- --%> остаются включенными и пригодными для использования, так что вы все равно можете делать комментарии и включения.
Показать ещё 1 комментарий
108

JSTL предлагает теги для условных выражений, циклов, наборов, получения и т.д. Например:

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

JSTL работает с атрибутами запроса - они чаще всего задаются в запросе сервлетом, который пересылается в JSP.

  • 2
    Почему вы говорите, что JSTL работает с атрибутами запроса? Они могут работать с атрибутами в любой области, не так ли?
58

Я не уверен, правильно ли я это понял.

Вы должны прочитать что-то о MVC. Spring MVC и Struts 2 являются двумя наиболее распространенными решения.

  • 27
    MVC может быть реализован с сервлетами / jsp с использованием многих из вышеперечисленных методов без Spring или Struts.
  • 13
    Как это отвечает на вопрос?
49

Вы можете использовать теги JSTL вместе с выражениями EL, чтобы избежать смешения Java и 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>
33

Существуют также основанные на компонентах фреймворки, такие как Wicket, которые генерируют много HTML для вас. Теги, которые попадают в HTML, являются чрезвычайно базовыми, и в них практически нет логики, в результате чего возникают почти пустые страницы HTML с типичными элементами HTML. Недостатком является то, что в API Wicket есть много компонентов, и некоторые из них могут быть трудными для достижения этих ограничений.

30

В архитектурном шаблоне MVC JSP представляют собой слой "Вид". Встраивание java-кода в JSP считается плохой практикой. Вы можете использовать JSTL, freeMarker, velocity с JSP как "механизм шаблонов". Поставщик данных для этих тегов зависит от фреймворков, с которыми вы имеете дело. Struts 2 и webwork в качестве реализации шаблона MVC использует OGNL "очень интересный метод для раскрытия Beans Свойства для JSP".

24

Научитесь настраивать и писать свои собственные теги с помощью JSTL

Обратите внимание, что EL является EviL (исключения времени выполнения, рефакторинг)
Калитка также может быть злой (производительность, трудная для небольших приложений или простой уровень обзора)

Пример из java2s,

Это необходимо добавить в веб-приложение web.xml

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

создать файл: java2s.tld в /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>

скомпилируйте следующий код в 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;
    }
}

Запустите сервер и загрузите bodyContent.jsp в браузере

<%@ 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>
  • 0
    хотя повторное использование компонентов в порядке, это предназначается для некоторой области
24

Опыт показал, что JSP имеет некоторые недостатки, один из которых трудно избежать смешивания разметки с фактическим кодом.

Если вы можете, подумайте об использовании специализированной технологии для того, что вам нужно сделать. В Java EE 6 есть JSF 2.0, который обеспечивает множество приятных функций, включая склеивание Java beans вместе с страницами JSF с помощью подхода #{bean.method(argument)}.

  • 2
    Старый ответ, но я не могу удержаться, чтобы сказать, что JSF - одно из самых ужасных изобретений в пространстве Java. Попробуйте создать одну (как HTTP GET) ссылку, и вы поймете, почему.
  • 0
    @ Алекс, но все же лучше. Не стесняйтесь рекомендовать что-то еще лучше.
23

Если вы просто хотите избежать недостатков Java-кодирования в JSP, вы можете сделать это даже с помощью скриптов. Просто следуйте некоторой дисциплине, чтобы иметь минимальную Java в JSP и почти нет вычислений и логики на странице 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>
22

Wicket также является альтернативой, которая полностью отделяет java от html, поэтому разработчик и программист могут работать вместе и на разных наборах кода, не понимая друг друга.

Посмотрите на Калитку.

21

Независимо от того, насколько вы стараетесь избегать, когда вы работаете с другими разработчиками, некоторые из них по-прежнему предпочитают скриптлет, а затем вставляют злой код в проект. Поэтому настройка проекта при первом знаке очень важна, если вы действительно хотите уменьшить код сценария. Существует несколько способов преодолеть это (в том числе несколько фреймворков, о которых упоминалось выше). Однако, если вы предпочитаете чистый JSP-путь, используйте файл тегов JSTL. Самое приятное в этом - вы также можете настроить мастер-страницы для своего проекта, чтобы другие страницы могли наследовать мастер-страницы

Создайте главную страницу под названием base.tag под вашими WEB-INF/тегами со следующим контентом

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

На этой странице mater я создал фрагмент под названием "title", так что на дочерней странице я мог вставить больше кодов в это место главной страницы. Кроме того, тег <jsp:doBody/> будет заменен содержимым дочерней страницы

Создать дочернюю страницу (child.jsp) в папке 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> используется для указания главной страницы, которую вы хотите использовать (в данный момент это base.tag). Все содержимое внутри тега <jsp:body> здесь заменит <jsp:doBody/> на главной странице. Ваша дочерняя страница также может содержать любые теги lib, и вы можете использовать ее, как и другие. Однако, если вы используете код сценария здесь (<%= request.getParameter("name") %>...) и попробуйте запустить эту страницу, вы получите JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here. Таким образом, другие люди не могут включить злой код в файл jsp

Вызов этой страницы с вашего контроллера:

Вы можете легко вызвать файл child.jsp с вашего контроллера. Это также хорошо работает с инфраструктурой расположений

21

Вы подняли хороший вопрос, и хотя у вас есть хорошие ответы, я бы посоветовал вам избавиться от JSP. Это устаревшая технология, которая в конечном итоге умрет. Используйте современный подход, например, движки шаблонов. У вас будет очень четкое разделение слоев бизнеса и презентаций и, конечно же, кода Java в шаблонах, поэтому вы можете создавать шаблоны непосредственно из программного обеспечения для редактирования веб-презентаций, в большинстве случаев использующих WYSIWYG.

И, конечно, избегайте фильтров и предварительной и последующей обработки, иначе вы можете столкнуться с проблемами поддержки/отладки, поскольку вы всегда не знаете, где переменная получает значение.

  • 9
    JSP сам по себе является механизмом шаблонов
  • 1
    -1 - Есть много вполне веских причин использовать фильтры, препроцессоры и постпроцессоры. Да, вы можете получить значения, которые кажутся загадочными, но не в том случае, если вы понимаете свою архитектуру.
19

чтобы избежать java-кода в JSP файлах java теперь предоставляет библиотеки тегов, такие как JSTL, также java придумал JSF, в который можно написать все структуры программирования в виде тегов

18

Используйте JSTL Tag libraries в JSP, который будет работать идеально.

17

Просто используйте тег JSTL и выражение EL.

16

Если кто-то действительно против программирования на более языках, чем один, я предлагаю GWT, теоретически вы можете избежать всех элементов JS и HTML, потому что Google Toolkit преобразует весь клиентский и общий код в JS, у вас не будет проблем с ними, поэтому у вас есть веб-сервис без кодирования на любых других языках. Даже вы можете использовать какой-то CSS по умолчанию, поскольку он предоставляется расширениями (smartGWT или Vaadin). Вам не нужно изучать десятки аннотаций.

Конечно, если вы хотите, вы можете взломать себя в глубину кода и добавить JS и обогатить вашу HTML-страницу, но на самом деле вы можете избежать этого, если хотите, и результат будет хорошим, поскольку он был написан в любом другие рамки. Я говорю, что стоит попробовать, а базовый GWT хорошо документирован.

И, конечно же, многие программисты здесь описывают или рекомендуют несколько других решений. GWT предназначен для людей, которые действительно не хотят иметь дело с веб-частью или минимизировать ее.

  • 1
    На самом деле не отвечает на вопрос ОП.
  • 1
    @EvanDonovan хорошо, практически он дает ответ. Вам не нужно связываться с Java-кодами, смешивающимися с другими языками. Я признаю, что он использует Java для кодирования, но он будет переведен в JS без вызовов Java. Но вопрос в том, как избежать хаоса классической JSP. И технология GWT решает это. Я добавил этот ответ, так как никто не упомянул его, но актуален, поскольку он является альтернативой JSP. Я не хотел отвечать на весь вопрос, но добавить ценную информацию для людей, которые ищут альтернативы.
15

Чистая идея из мира Python - это языки атрибутов шаблонов; TAL был введен Zope (поэтому a.k.a. "Zope Page Templates", ZPT) и является стандартом, с реализациями в PHP, XSLT и Java (я использовал воплощения Python/Zope и PHP). В этом классе языков шаблонов один пример может выглядеть следующим образом:

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

Код выглядит как обычный HTML (или XHTML) плюс некоторые специальные атрибуты в пространстве имен XML; его можно просматривать в браузере и безопасно настраивать дизайнером. Существует поддержка макросов и для 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>

Если переводы содержимого доступны, они используются.

Я не очень много знаю о Java-реализации.

  • 1
    С декабря 2009 года JSP сменила Facelets, которая поддерживает этот материал. Facelets также основан на XML. См. Также главу Facelets в руководстве по Java EE 6 и теги ui:xxx в VDL Facelts .
  • 0
    Я не очень хорошо знаю Facelets, но IIRC это все о написании классов, которые реализуют пользовательские элементы XML. Способ TAL / ZPT состоит в том, чтобы иметь шаблоны, которые содержат истинный (X) HTML со специальными атрибутами, которые заполняют или заменяют исходные элементы; Таким образом, вы можете просмотреть рабочий шаблон и увидеть прототип с красивым фиктивным контентом. Я не уверен, что Facelets позволяют настраивать оригинальные элементы HTML (без дополнительного пространства имен) с помощью пользовательских атрибутов.
Показать ещё 1 комментарий
14

Использование сценариев в JSP не является хорошей практикой.

Вместо этого вы можете использовать:

  • Теги JSTL
  • EL выражения
  • Пользовательские теги - вы можете определить свои собственные теги для использования.

Обратитесь к:

12

Конечно, замените <%! counter++; %> на архитектуру производителя-потребителя событий, где бизнес-уровень уведомляется о необходимости увеличивать счетчик, он реагирует соответствующим образом и уведомляет докладчиков, чтобы они обновляли представления. Применяется ряд транзакций базы данных, поскольку в будущем нам нужно будет узнать новое и старое значение счетчика, который увеличил его и с какой целью. Очевидно, что сериализация задействована, поскольку слои полностью развязаны. Вы сможете увеличить ваш счетчик на RMI, IIOP, SOAP. Но требуется только HTML, который вы не реализуете, поскольку это такой мирский случай. Ваша новая цель - достичь 250 шагов в секунду на вашем новом блестящем E7, 64-Гбайт оперативном сервере.

У меня есть более 20 лет в программировании, большинство проектов проваливаются перед секстэтом: Возможность повторного использования Возможность OO-способность Отладочная способность Возможность проверки Необходимость в работоспособности даже необходима. Другие проекты, управляемые людьми, которые заботились только о функциональности, были чрезвычайно успешными. Кроме того, жесткая структура объекта, внедренная слишком рано в проекте, делает код неспособным адаптироваться к резким изменениям в спецификациях (ака проворно).

Поэтому я рассматриваю в качестве промедления активность определения "слоев" или избыточных структур данных либо в начале проекта, либо когда это не требуется.  

11

Технически, JSP конвертируются в Servlets во время выполнения. Первоначально JSP был создан с целью развязки бизнес-логики и логики проектирования, следуя шаблону MVC. Таким образом, JSP представляет собой технически все java-коды во время выполнения. Но для ответа на вопрос библиотеки тегов обычно используются для применения логики (удаления кодов Java) к страницам JSP.

9

Если мы используем в веб-приложении java следующие вещи, java-код можно исключить из переднего плана JSP.

  • Использование архитектуры MVC для веб-приложения

  • Использовать теги JSP

    а. Стандартные теги

    б. Пользовательские теги

  • Язык выражений

5

Как избежать Java-кода в файлах JSP?

Вы можете использовать теги библиотеки вкладок, такие как JSTL, в дополнение к языку выражений (EL). Но EL плохо работает с JSP. Так что, вероятно, лучше полностью отказаться от JSP и использовать Facelets.

Facelets - это первый не-JSP язык объявления страниц, разработанный для JSF (Java Server Faces), который предоставил разработчикам JSF более простую и мощную модель программирования по сравнению с JSP. Это решает различные проблемы, возникающие в JSP для разработки веб-приложений.

Изображение 1324

Источник

  • 0
    Я определенно поддерживаю этот ответ. JSF с или без Facelets. Я думал, что разработка в JSP в основном прекратилась более 10 лет назад. В последний раз я писал JSP в 2000 году!
3

Использование Scriptlets - очень старый способ и не рекомендуется. Если вы хотите прямо вывести что-то на своих страницах JSP, используйте Язык выражений (EL) вместе с JSTL.

Существуют и другие варианты, такие как использование механизма шаблонов, таких как Velocity, Freemarker, Thymeleaf и т.д. Но использование простой JSP с EL и JSTL служит моей цели большую часть времени, и это также кажется самым простым для новичков.

Кроме того, обратите внимание на то, что для уровня бизнес-логики на уровне представления не лучше всего выполнять бизнес-логику на уровне сервиса, и передать результат результата в ваши представления через контроллер.

2

Используйте основную, угловатую структуру javascript для дизайна пользовательского интерфейса и извлекайте данные, используя rest api. Это полностью устранит зависимость java от пользовательского интерфейса.

2

Ничто из этого больше не используется моим другом, мой совет - отделить представление (css, html, javascript и т.д.) от сервера.

В моем случае я обрабатываю свои системы с помощью Angular, и любые данные, необходимые для этого, приводятся с сервера с помощью служб отдыха.

Поверьте, это изменит способ дизайна

1

JSP 2.0 имеет функцию "Файлы тегов", вы можете писать теги без внешнего java кода и tld. Вам нужно создать .tag файл и поместить его в WEB-INF\tags вы даже можете создать структуру каталогов для упаковки ваших тегов.

Например:

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

Используйте его как

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

Кроме того, вы можете легко прочитать тело тега

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

Используй это

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

Образцы очень просты, но здесь вы можете выполнять множество сложных задач. Обратите внимание, что вы можете использовать другие теги (например, JSTL который имеет контрольные метки, такие как if/forEcah/chosen текстовые манипуляции, такие как format/contains/uppercase или даже теги SQL select/update), передавать все параметры вида, например Hashmap, session доступа, request ,... в вашем файле тега тоже.

Файл тега настолько прост, что вам не нужно перезапускать сервер при их изменении, например файлы JSP. Это облегчает их разработку.

Даже если вы используете фреймворк вроде Struts 2, в котором есть много хороших тегов, вы можете обнаружить, что наличие собственных тегов может значительно сократить ваш код. Вы можете передать свои параметры тега в struts и таким образом настроить свой тег framework.

Вы можете использовать тег не только для того, чтобы избежать java, но и свести к минимуму ваши HTML-коды. Я сам пытаюсь просмотреть HTML-коды и быстро создавать теги, как только на моих страницах начнется просмотр дубликатов кода.

(Даже если вы в конечном итоге используете java в своем JSP-коде, который, надеюсь, нет, вы можете инкапсулировать этот код в тег)

0
  1. Сделайте свои значения и параметры внутри своих классов сервлета
  2. Получить эти значения и параметры в вашем JSP с помощью JSTL/Taglib

Хорошая вещь об этом подходе заключается в том, что ваш код также является HTML-кодом!

0

Как говорит многие ответы, используйте JSTL или создайте свои собственные теги. Здесь хорошее объяснение создания пользовательских тегов

-1

Используя теги JSTL вместе с выражением EL, вы можете избежать этого. На странице 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" %>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню