Как я могу избежать кода Java в файлах JSP, используя JSP 2?

avatar
chmoelders
5 июля 2010 в 07:24
301240
31
1730

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

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

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

Источник
Sheldon R.
26 февраля 2015 в 14:30
22

@Koray Tugay, если переменная счетчика объявлена ​​где-то до ее использования, то она, безусловно, действительна ...

Koray Tugay
22 октября 2017 в 17:36
0

@SheldonR. Это действительно: <% = counter ++%> или это: <%! int counter = 0; int x = counter ++; %> но не: <%! int counter = 0; счетчик ++; %>

Sheldon R.
29 марта 2018 в 15:43
0

@KorayTugay, я имел в виду, что если счетчик переменных был объявлен в более раннем блоке скрипта, он должен быть действителен в более позднем блоке. Но, в конце концов, программисты J2EE в наши дни все равно должны использовать переменные EL вместо скриптлетов ...

Ответы (31)

avatar
BalusC
5 июля 2010 в 14:19
1999

Использование скриптлетов (тех <% %> вещей) в JSP действительно крайне не рекомендуется с момента появления taglibs (например, JST14L Language) и тех, которые > вещи) еще в 2001 году.

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

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

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

Исходя из спецификации 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, чтобы обработать запрос GET , например предварительная загрузка некоторого списка из базы данных для отображения в некоторой таблице, если необходимо, на основе некоторых параметров запроса, затем реализация сервлета и запись соответствующего кода в методе 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-код для обработки запроса POST , например, для сбора данных из отправленной HTML-формы и выполнения с ней некоторых бизнес-операций (преобразование, проверка, сохранение в БД и т. Д.) , затем реализовать сервлет и написать соответствующий код в методе 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, вам нужно захватить (существующую) библиотеку тегов управления потоком, например ядро ​​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 framework JSF, уже невозможно использовать скриптлеты . Таким образом, вы автоматически будете вынуждены действовать «правильно».


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

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

См. Также:

svachon
6 июля 2010 в 01:58
119

+1 Отличный ответ. Но не будьте догматичны, иногда использование скриптлетов - это нормально, но это должно быть исключением, подтверждающим правило.

BalusC
6 июля 2010 в 13:25
27

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

svachon
6 июля 2010 в 14:30
5

@BalusC Несколько раз я застревал с java-классами, которые не следовали шаблону getter / setter. ИМХО, это тот случай, когда скрипт выполняет свою работу.

BalusC
6 июля 2010 в 14:37
42

@svachon: я бы обернул эти классы собственными классами javabean и использовал бы их вместо них.

avatar
yurin
22 января 2022 в 19:17
1

Java сам по себе очень хороший язык, но интенсивное использование в корпоративной среде сделало его стандартные решения чрезвычайно (смехотворно) сложными. Примеры: JSTL, JSF, Wicket и т. д.

Вот суперлегкий подход к созданию серверной части на Java:

  • вообще не используйте JSP (или любой другой шаблонизатор);
  • использовать простые шаблоны HTML;
  • используйте JSOUP для анализа шаблонов HTML в объект документа;
  • изменить объект Document, используя его очень интуитивно понятные методы, подобные jQuery;
  • вернуть Document.toString() в качестве ответа на запрос.

Я использую его для одного из своих сторонних проектов (размещал дроплет Digitalocean за 5 долларов, Nginx, Tomcat), и он очень быстрый: по данным Googlebot, среднее время отклика составляет около 160 мс.

avatar
Philippe Damerval
28 августа 2020 в 00:03
1

Многие ответы здесь относятся к маршруту «использовать фреймворк». В этом нет ничего плохого. Однако я не думаю, что это действительно ответ на ваш вопрос, потому что фреймворки могут или не могут использовать JSP, и они не разработаны каким-либо образом с удалением использования java в JSP в качестве основной цели.

Единственный хороший ответ на ваш вопрос «как мне избежать использования Java в JSP»: вы не можете.

Вот для чего нужны JSP - использование Java для рендеринга HTML с динамическими данными / логикой. Последующий вопрос может заключаться в том, сколько Java я должен использовать в своих JSP.
Прежде чем мы ответим на этот вопрос, вам также следует подумать: «Нужно ли мне использовать JSP для создания веб-контента с помощью Java?» Ответ на последний вопрос - нет. Существует множество альтернатив JSP для разработки веб-приложений с использованием Java. Struts, например, не заставляет вас использовать JSP - не поймите меня неправильно, вы можете использовать их, и многие реализации это делают, но вам это не обязательно. Struts даже не заставляет вас использовать HTML. JSP тоже этого не делает, но давайте будем честными, JSP, не создающий HTML, - это довольно странно. Как известно, сервлеты позволяют динамически обслуживать любой контент, который вам нравится, через HTTP. Они являются основной технологией, лежащей в основе практически всего java web - на самом деле JSP - это просто HTML-шаблоны для сервлетов.
Итак, ответ на вопрос, сколько java вы должны поместить в JSP, - «как можно меньше». У меня, конечно, есть java в моих JSP, но он состоит исключительно из определений библиотеки тегов, переменных сеанса и клиента, а также bean-компонентов, инкапсулирующих объекты на стороне сервера. Теги <%%> в моем HTML - это почти исключительно вызовы свойств или выражения переменных. Редкие исключения включают сверхспецифические вычисления, относящиеся к одной странице и вряд ли когда-либо будут использоваться повторно; исправления ошибок, возникающие из-за проблем со страницей, применимые только к одной странице; конкатенации и арифметические операции в последнюю минуту, вытекающие из необычных требований, ограниченных по объему одной страницей; и другие подобные случаи. В кодовом наборе из 1,5 миллионов строк, 3000 JSP и 5000 классов может быть 100 экземпляров таких уникальных фрагментов. Было бы вполне возможно внести эти изменения в определения классов или библиотек тегов, но это было бы чрезмерно сложным из-за специфики каждого случая, потребовалось бы больше времени для написания и отладки и, в результате, потребовалось бы больше времени, чтобы добраться до моего пользователей. Это призыв к суждению. Но не заблуждайтесь, вы не можете писать JSP любого значения без «java», да и не захотели бы этого. У этой возможности есть причина.

avatar
Mehdi
1 декабря 2018 в 16:04
1
  1. Сделайте свои значения и параметры внутри классов сервлетов
  2. Получите эти значения и параметры в JSP с помощью JSTL / Taglib

Этот подход хорош тем, что ваш код также похож на HTML. код!

avatar
Sumesh TG
20 июня 2018 в 13:49
3

Используйте Backbone.js или AngularJS-подобную платформу JavaScript для дизайна пользовательского интерфейса. и получить данные с помощью REST API. Это полностью удалит зависимость Java от пользовательского интерфейса.

avatar
Eduardo
12 декабря 2017 в 19:45
3

Ничего из этого больше не используется, друг мой. Мой совет - отделить представление (CSS, HTML, JavaScript и т. Д.) От сервера.

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

Поверьте, это изменит ваш дизайн.

avatar
adn.911
30 ноября 2017 в 15:59
4

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

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

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

avatar
Vikas Yadav
7 июля 2017 в 20:24
1

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

avatar
bhanwar rathore
15 июля 2016 в 05:48
0

Используя теги 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" %>
avatar
Alireza Fattahi
12 апреля 2016 в 14:55
3

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 и таким образом настроить тег вашего каркаса.

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

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

avatar
Yster
24 декабря 2015 в 11:47
8

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

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

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

Enter image description here

Источник

casgage
1 февраля 2017 в 02:52
0

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

avatar
Razvan
15 марта 2014 в 17:17
15

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

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

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

avatar
kapil das
22 июля 2013 в 05:59
15

Использование скриптлетов в JSP не рекомендуется.

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

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

См.:

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL
avatar
mel3kings
14 июня 2013 в 09:31
11

Технически все JSP преобразуются в сервлеты во время выполнения .

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

Но чтобы ответить на вопрос, библиотеки тегов обычно используются для применения логики (удаления кода Java) к страницам JSP.

avatar
Thai Tran
26 января 2013 в 18:07
20

Независимо от того, насколько вы стараетесь избегать, когда вы работаете с другими разработчиками, некоторые из них все равно предпочтут скриптлет, а затем вставят злой код в проект. Поэтому настройка проекта по первому признаку очень важна, если вы действительно хотите сократить код скриптлета. Есть несколько способов справиться с этим (включая несколько упомянутых выше фреймворков). Однако, если вы предпочитаете чистый способ 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>

На этой главной странице я создал фрагмент под названием «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 со своего контроллера. Это также хорошо работает с каркасом распорок

Lluis Martinez
22 июля 2019 в 20:52
0

«Неважно, насколько вы стараетесь избегать, когда вы работаете с другими разработчиками, некоторые из них все равно предпочтут скриптлет, а затем вставят злой код в проект». См. Ответ «В качестве меры предосторожности: отключить скриптлеты навсегда».

user253751
19 июля 2021 в 15:31
0

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

avatar
CsBalazsHungary
21 января 2013 в 16:04
17

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

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

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

Evan Donovan
2 апреля 2014 в 16:46
1

На самом деле не отвечает на вопрос ОП.

CsBalazsHungary
3 апреля 2014 в 04:17
1

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

avatar
Tobias
21 мая 2012 в 07:51
16

Замечательная идея из мира Python: Языки атрибутов шаблонов ; TAL был введен Zope (он же «Шаблоны страниц Zope», 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; его можно просматривать в браузере и безопасно настраивать дизайнером.

Поддерживаются макросы, а также интернационализация и локализация:

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

BalusC
23 мая 2012 в 18:53
1

С декабря 2009 года на смену JSP пришли Facelets, поддерживающие этот материал. Facelets также основан на XML. См. Также, среди прочего, главу Facelets в руководстве по Java EE 6 и теги ui:xxx в Facelts VDL.

Tobias
31 июля 2012 в 14:28
0

Я не очень хорошо знаю Facelets, но IIRC - это все о написании классов, которые реализуют пользовательские элементы XML. Способ TAL / ZPT состоит в том, чтобы иметь шаблоны, которые содержат истинный (X) HTML со специальными атрибутами, которые заполняют или заменяют исходные элементы; Таким образом, вы можете просмотреть рабочий шаблон и увидеть прототип с красивым фиктивным содержимым. Я не уверен, что Facelets позволяют настраивать исходные элементы HTML (без дополнительного пространства имен) с помощью настраиваемых атрибутов.

Tobias
23 марта 2014 в 08:51
0

Я только что еще раз посмотрел на эту штуку с Facelets. Он содержит всевозможные средства проверки и т. Д. И, следовательно, следует совершенно иной философии, чем TAL. Методика TAL такова: «Держите логику вне шаблона настолько чисто, насколько это возможно; пусть все сложные вещи выполняет контроллер, который его поддерживает». Вы никогда не отдадите шаблон Facelets дизайнеру, чтобы он / она его подправили; это просто невозможно. Что касается сгенерированного контента - это все равно, что постоянно использовать атрибуты tal:replace="structure (expression)".

avatar
dipu
11 мая 2012 в 16:45
27

Если вы просто хотите избежать недостатков 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 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>
avatar
Ajay Takur
2 апреля 2012 в 13:52
9

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

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

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

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

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

  1. Язык выражения
avatar
tomasb
17 августа 2011 в 20:02
26

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

Обратите внимание, что EL - это EviL (исключения времени выполнения и рефакторинг).

Wicket тоже может быть злом (производительность и утомительна для небольших приложений или простого уровня просмотра).

Пример из 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>
tomasb
20 августа 2011 в 20:44
0

хотя возможность повторного использования компонентов в порядке, он нацелен на некоторые области

avatar
Stefan Schubert-Peters
14 августа 2011 в 21:59
228

В качестве меры предосторожности: отключить скриптлеты навсегда

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

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

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
Martin
29 июля 2015 в 21:55
17

@MrSpoon нашел для вас ответ. Согласно этот ответ + комментарий, это отключает скриптлеты <% %>, выражения скриптлетов <%! %> и объявления скриптлетов <%= %>. Это означает, что директивы <%@ %> и комментарии <%-- --%> остаются включенными и пригодными для использования, поэтому вы по-прежнему можете делать комментарии и включать.

avatar
Dmitriy R
12 июля 2011 в 20:20
23

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

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

WarFox
13 июля 2011 в 07:28
12

JSP сам по себе является механизмом шаблонов

mihca
17 июня 2021 в 06:07
1

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

avatar
tanglei
11 июля 2011 в 06:59
17

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

avatar
Chandra Sekhar
5 июня 2011 в 04:23
18

Используйте библиотеки тегов JSTL в JSP. Это сработает отлично.

avatar
msj121
20 мая 2011 в 20:42
25

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

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

avatar
tsand
22 марта 2011 в 18:24
34

Существуют также компонентные фреймворки, такие как Wicket, которые генерируют для вас много HTML.

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

avatar
mahesh
23 февраля 2011 в 06:14
20

Чтобы избежать кода Java в файлах JSP, Java теперь предоставляет библиотеки тегов, такие как JSTL.

Кроме того, в Java появился JSF, в который вы можете записывать все программные структуры в виде тегов.

avatar
Sami Jmii
4 февраля 2011 в 10:41
33

В архитектурном шаблоне MVC JSP представляют уровень представления. Встраивание кода Java в JSP считается плохой практикой.

Вы можете использовать JSTL, freeMarker и скорость с JSP в качестве «механизма шаблонов102».

Поставщик данных для этих тегов зависит от платформ , с которыми вы имеете дело. Struts 2 и WebWork в качестве реализации для шаблона MVC использует OGNL «очень интересную технику для предоставления свойств Beans <196> JSP210».

avatar
Behrang
5 июля 2010 в 08:45
54

Вы можете использовать теги 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>
avatar
Thorbjørn Ravn Andersen
5 июля 2010 в 08:30
27

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

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

Alex
17 августа 2015 в 08:11
4

Старый ответ, но я не могу удержаться, чтобы сказать, что JSF - одно из самых ужасных изобретений в пространстве Java. Попробуйте создать единственную ссылку (как HTTP GET), и вы поймете, почему.

Thorbjørn Ravn Andersen
22 декабря 2016 в 09:05
0

@Alex но все же лучше. Не стесняйтесь порекомендовать что-нибудь еще лучше.

user253751
19 июля 2021 в 15:30
0

Сценарии @ ThorbjørnRavnAndersen

Thorbjørn Ravn Andersen
21 июля 2021 в 11:58
0

@ user253751 Да, скриптлеты - это упомянутый недостаток "смешивания разметки с реальным кодом".

user253751
21 июля 2021 в 12:20
0

Разметка @ ThorbjørnRavnAndersen - это фактический код

Thorbjørn Ravn Andersen
21 июля 2021 в 15:21
0

@ user253751 Что вы пытаетесь сказать?

user253751
21 июля 2021 в 15:45
0

@ ThorbjørnRavnAndersen Скриплеты лучше, чем JSF

Thorbjørn Ravn Andersen
21 июля 2021 в 21:45
0

@ user253751 См. принятый ответ ....

avatar
Bozho
5 июля 2010 в 07:28
109

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

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

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