Как избегать использования scriptlets на моей странице JSP?

Мне сказали что использование scriptlets (<% =... %>) в моем JSP страницы не такая прекрасная идея.

Может кто-то с немного большим опытом java/jsp давать мне некоторые подсказки относительно того, как изменить этот код так его больше 'лучшей практики', независимо от того, что это может быть?

Этот JSP является на самом деле моей sitemesh основной страницей декоратора. В основном мой веб-дизайн имеет полосу вкладки и подменю, и я хочу так или иначе выделить текущую вкладку и показать корректное подменю путем рассмотрения текущего URI запроса.

<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>

<html>
<head>
  <title>My Events - <decorator:title /></title>
  <link href="<%= request.getContextPath() %>/assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>

<div class="tabs">
  <a 
    <%= request.getRequestURI().contains("/events/") ? "class='selected'" : "" %>
    href='<%= request.getContextPath() %>/events/Listing.action'>Events</a>
  <a 
    <%= request.getRequestURI().contains("/people/") ? "class='selected'" : "" %>
    href='<%= request.getContextPath() %>/people/Listing.action'>People</a>
</div>

<div class="submenu">
  <% if(request.getRequestURI().contains("/events/")) { %>
    <a href="Listing.action">List of Events</a>
    |<a href="New.action">New Event</a>
  <% } %>
  <% if(request.getRequestURI().contains("/people/")) { %>
    <a href="Listing.action">List of People</a>
    |<a href="New.action">New Person</a>
  <% } %>  
  &nbsp;
</div>

<div class="body">
  <decorator:body />
</div>

</body>
</html>

Спасибо все

33
задан Chris 2 February 2010 в 23:59
поделиться

7 ответов

Интерпретатор python принимает - в командной строке в качестве синонима stdin , чтобы можно было заменить вызовы pyexec:

python - <<END

См. ссылку на командную строку здесь .

-121--1062046-

Стоит отметить, что для включения другой разметки можно также использовать iniveHTML . Кроме того, если DIV des не имеют идентификатора, можно попробовать использовать метод getElemiceStartName .

Пример для получения первого DIV в документе:

document.getElementsByTagName("div")[0].innerHTML = "<p>This is a <span>new</span> paragraph</p>";

Это позволяет выполнять циклическую проверку нескольких DIV в документе и проверять другие условия.

И как они сказали выше, если у DIV есть идентификатор, который, как вы знаете, всегда будет там, то это лучше использовать:

document.getElementById("theID").innerHTML = "<p>This is a <span>new</span> paragraph</p>";

Проверьте прототип (ссылки ниже) (или jQuery), чтобы справиться с этим, поскольку они облегчают жизнь, особенно когда вы попадаете в селекторы CSS:

-121--1890790-

Я думаю, что это помогает больше, если вы видите своими глазами, что на самом деле это может быть сделано полностью без сценариев.

Вот 1 на 1 перезаписи с помощью среди прочих JSTL (просто drop jstl-1.2.jar в /WEB-INF/lib ) core и functions tallib:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<html>
<head>
  <title>My Events - <decorator:title /></title>
  <link href="${pageContext.request.contextPath}/assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>

<div class="tabs">
  <a 
    ${fn:contains(pageContext.request.requestURI, '/events/') ? 'class="selected"' : ''}
    href="${pageContext.request.contextPath}/events/Listing.action">Events</a>
  <a 
    ${fn:contains(pageContext.request.requestURI, '/people/') ? 'class="selected"' : ''}
    href="${pageContext.request.contextPath}/people/Listing.action">People</a>
</div>

<div class="submenu">
  <c:if test="${fn:contains(pageContext.request.requestURI, '/events/')}">
    <a href="Listing.action">List of Events</a>
    |<a href="New.action">New Event</a>
  </c:if>
  <c:if test="${fn:contains(pageContext.request.requestURI, '/people/')}">
    <a href="Listing.action">List of People</a>
    |<a href="New.action">New Person</a>
  </c:if>
  &nbsp;
</div>

Вот более оптимизированная перезапись, обратите внимание, что я использовал c: Набор для «кэширования» результатов выражения для повторного использования и что я использую HTML < base > тэгов, чтобы избежать размещения пути контекста в каждой ссылке (просто сделайте все относительные URL-адреса на вашей веб-странице относительно нее - без ведущей косой черты!):

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<c:set var="isEvents" value="${fn:contains(pageContext.request.requestURI, '/events/')}" />
<c:set var="isPeople" value="${fn:contains(pageContext.request.requestURI, '/people/')}" />

<html>
<head>
  <title>My Events - <decorator:title /></title>
  <base href="${pageContext.request.contextPath}">
  <link href="assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>

<div class="tabs">
  <a ${isEvents ? 'class="selected"' : ''} href="events/Listing.action">Events</a>
  <a ${isPeople ? 'class="selected"' : ''} href="people/Listing.action">People</a>
</div>

<div class="submenu">
  <c:if test="${isEvents}">
    <a href="Listing.action">List of Events</a>|<a href="New.action">New Event</a>
  </c:if>
  <c:if test="${isPeople}">
    <a href="Listing.action">List of People</a>|<a href="New.action">New Person</a>
  </c:if>
  &nbsp;
</div>

Его можно оптимизировать больше, если собрать все «жестко закодированные» значения, такие как события и люди и ссылка тексты в карте в области приложения и использовать под каждым JSTL < c: forEach > для отображения вкладок.

Что касается фактического вопроса , можно отключить сценарии (и получить ошибки выполнения об их использовании), добавив следующую запись в webapp web.xml . Это может помочь заметить наблюдаемые скрипты.

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

Для получения дополнительной информации об EL обратитесь к учебнику Java EE, часть II, глава 5 . Неявные объекты EL, такие как $ {pageContext} , описаны здесь . Для получения дополнительной информации о JSTL обратитесь к учебнику Java EE, часть II, глава 7 . Обратите внимание, что JSTL и EL - это две отдельные вещи. JSTL представляет собой стандартный tallib , и EL позволяет просто осуществлять программный доступ к внутренним данным. Хотя он обычно используется в tallbs, как JSTL, он также может использоваться автономно в тексте шаблона.

42
ответ дан 27 November 2019 в 18:01
поделиться

Кроме того, это <% = request.getcontextPath ()%> Приемлемое использование сценариев, которые не нахмуриваются так много?

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

Я, вероятно, использовал JSTL и язык выражения, но в основном потому, что он может быть менее набрать, а поддержка IDE может быть лучше (но хорошая JSP IDE также может найти отсутствие закрывающие скобки и такие вещи).

Но принципиально (как в «хранить логику из шаблонов»), я не вижу никакой разницы между

<% if(request.getRequestURI().contains("/events/")) { %>

и

${fn:contains(pageContext.request.requestURI, '/events/') 
9
ответ дан 27 November 2019 в 18:01
поделиться

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

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

6
ответ дан 27 November 2019 в 18:01
поделиться

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

AD Frameworks:

Если вам нравится JSP-способ кодирования, то я бы предложил Struts 2 .

<s:if test="%{false}">
    <div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
    <div>Will Be Executed</div>
</s:elseif>
<s:else>
    <div>Will Not Be Executed</div>
</s:else>

Затем есть компонент-ориентированный JSF .

Если вам нравится Ооп и кодировать все в Java, попробуйте Apache Wicket (мой любимый) или Web Toolkit .

2
ответ дан 27 November 2019 в 18:01
поделиться
  1. Это не указатель, а ссылка на объект.
  2. Это не метод, это сообщение.
-121--1080962-

Время выполнения Objective-C может потребовать возврата объекта к нескольким различным функциям, поэтому требуется ссылка на объект, а не сам объект.

-121--1080967-

Это не прямой ответ на ваш вопрос (и уже есть несколько хороших, поэтому я не буду пытаться добавить к нему), но вы упомянули:

Может ли кто-то с немного больше java/jsp опыт, пожалуйста, дайте мне немного указатели на то, как изменить этот код таким образом его больше «лучшая практика», независимо от того, Это может быть ?

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

При разработке в JSP я лично хотел бы следовать правилам, изложенным в документе Обеспечение строгого разделения модели и вида в шаблонных движках компанией Terence Parr. В документе упоминается назначение двигателей шаблонов (разделение модели и вида) и характеристики хорошего двигателя шаблонов. Он хорошо смотрит на JSP и указывает на то, как он не является хорошим механизмом шаблона. Неудивительно, что JSP в основном слишком мощный и позволяет разработчикам делать слишком много. Я настоятельно рекомендую прочитать эту статью, и она поможет вам ограничиться «хорошими» частями JSP.

Если вы читаете только один раздел в этом документе, прочитайте главу 7, которая включает в себя следующие правила:

  1. вид не может изменить модель либо путем непосредственного изменения модели объектов данных или путем вызова методов на модель, которая вызывает побочные эффекты. То есть шаблон может получить доступ к данным из модели и вызвать методы, но такие ссылки должны быть побочными бесплатно. Это правило возникает частично потому что ссылки на данные должны быть без учета порядка. См. раздел 7.1.
  2. вид не может выполнять вычисления по зависимым данным значения , поскольку вычисления могут изменения в будущем, и они должны быть аккуратно инкапсулированным в модель в любое дело. Например, представление не может вычислить цены продажи книг как «Цена $ * .90». Быть независимым от модель, вид не может предположения о значении данных.
  3. представление не может сравнивать значения зависимых данных , но может тестировать свойства данных, такие как наличие/отсутствие или длина многозначное значение данных. Такие тесты, как $ bleyДавление < 120 должно быть перемещено в модель, которую врачи любят сохранять уменьшение максимального систолического давления на нас. Выражения в представлении должны быть заменен испытанием на наличие моделирование значения - создание логического значения, такого как $ BleySuchesOk! = null Вывод шаблона может зависеть от данных модели и com- putations, условный просто должен быть вычислен в модели. Даже простые тесты, делающие отрицательные значения в модели должен быть вычислен красный цвет;правильный уровень абстракции - usu- союзник что-то более высокий уровень, такой как «Отдел x теряет деньги».
  4. Представление не может делать предположения типа данных. Некоторые типовые допущения: очевиден, когда представление принимает данные значение является датой, например, но более тонкие предположения типа ap- груша: если шаблон предполагает, что $ userID является целое число, pro- граммер не может изменить это значение на нечисловое в модели без разрыва шаблон. Это правило запрещает массив индексирование, например colorCode [$ topic] и $ name [$ ID] Дальнейшее представление невозможно методы вызова с аргументами be- причина (статически или динамически) предполагаемый тип аргумента, если только один может гарантировать метод модели просто рассматривал их как объекты. Кроме того, графические дизайнеры не программисты; ожидая, что они вызовут методы и знать, что передавать нереалистично. Данные
  5. из модели не должны содержать отображаемую информацию или информацию о компоновке. Модель не может пройти дисплея информация - вид, замаскированный под значения данных. Это включает в себя непроведение имя шаблона, к которому применяется другие значения данных.

Между прочим, Теренс создал свой собственный механизм создания шаблонов под названием Последовательностей Template , который якобы делает действительно хорошую работу по обеспечению соблюдения этих правил. У меня нет личного опыта с ним, но я хотел бы проверить его на моем следующем проекте.

6
ответ дан 27 November 2019 в 18:01
поделиться

От разработчика Vala в irc, # vala на irc.gnome.org:

   18:57 < flo> It is of course possible to distribute the C code as
         well. The compiler itself is shiped with vala and C code. We
         actually access C-libraries over an abstract interface with all
         advantages and disadvantages of the libraries we are using,
         including platform dependencies.
-121--4501539-

Вы можете начать с использования библиотек тэгов. Можно использовать стандартную библиотеку тэга JSTL для выполнения большинства общих задач, для которых нужны скрипты. Существует много других более богатых библиотек тэгов, которые используются, как в рамке struts2 или apache.

например.

  <c:if test="${your condition}">
       Your Content
  </c:if>

заменит ваши утверждения.

-121--2526269-

Предпочтительной альтернативой скриптлетам является язык выражения JSTL; здесь - хороший обзор. Вам нужно будет добавить tallib так:

<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>

В качестве примера, JSTL предоставляет кучу неявных объектов, которые дают вам материал, который вам нужен; требуется pageContext.request .

Таким образом, можно заменить <% request.getRequestURI% > на $ {pageContext.request.requestURI} .

Можно выполнить условия с помощью < c: if > тэги.

3
ответ дан 27 November 2019 в 18:01
поделиться

Возможно, вы захотите начать с использования библиотек тегов. Вы можете использовать стандартную библиотеку тегов JSTL , чтобы делать большинство обычных вещей, для которых вам нужны скрипты. Есть много других более богатых библиотек тегов, которые используются как в структуре struts2, так и в apache.

например.

  <c:if test="${your condition}">
       Your Content
  </c:if>

заменит ваши операторы if.

3
ответ дан 27 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: