Как избежать Java-кода в файлах JSP? - PullRequest
1618 голосов
/ 05 июля 2010

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

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

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

Ответы [ 30 ]

25 голосов
/ 21 мая 2011

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

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

24 голосов
/ 13 июля 2011

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

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

21 голосов
/ 26 января 2013

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

21 голосов
/ 23 февраля 2011

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

19 голосов
/ 05 июня 2011

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

18 голосов
/ 11 июля 2011

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

17 голосов
/ 21 января 2013

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

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

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

16 голосов
/ 21 мая 2012

Прекрасная идея из мира 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 .

15 голосов
/ 22 июля 2013

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

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

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

Пожалуйста, обратитесь к:

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL
14 голосов
/ 15 марта 2014

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

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

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

...