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

Мне сказали, что использование сценариев () на моих страницах JSP – не такая уж отличная идея.

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

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

   My Events -  <link href="/assets/styles.css" rel="stylesheet" type="text/css" />   
<a href='/events/https://stackoverflow.com/questions/2188706/how-to-avoid-using-scriptlets-in-my-jsp-page/Listing.action'>Events <a href='/people/https://stackoverflow.com/questions/2188706/how-to-avoid-using-scriptlets-in-my-jsp-page/Listing.action'>People

Спасибо всем

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

Вот 1 на 1 переписывание с помощью, среди прочего, JSTL (просто drop jstl-1.2.jar in /WEB-INF/lib ) kernel и функции taglib:

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

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

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

Его можно фактически оптимизировать, если вы собрали все эти «жестко закодированные» значения, такие как events и people и тексты ссылок на Map в области приложения и используйте под каждым JSTL для отображения вкладок.

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

   *.jsp true   

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

В стороне, <%= request.getContextPath() %> допустимое использование скриптовлетов, на которое не так нахмурились?

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

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

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

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

а также

 ${fn:contains(pageContext.request.requestURI, '/events/') 

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

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

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

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

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

  1. представление не может изменить модель либо путем прямого изменения объектов модели данных, либо путем вызова методов на модели, которые вызывают побочные эффекты. То есть шаблон может получить доступ к данным из модели и вызвать методы, но такие ссылки должны быть свободными от побочных эффектов. Это правило возникает частично потому, что ссылки на данные должны быть нечувствительными к порядку. См. Раздел 7.1.
  2. представление не может выполнять вычисления по зависимым значениям данных, потому что вычисления могут измениться в будущем, и они должны быть аккуратно инкапсулированы в модели в любом случае. Например, представление не может вычислять цены продажи книг как «$ price * .90». Чтобы быть независимым от модели, представление не может делать предположений о значении данных.
  3. представление не может сравнивать зависимые значения данных , но может проверять свойства данных, такие как наличие / отсутствие или длина значения многозначных данных. Тесты, такие как $ bloodPressure <120, должны быть перенесены в модель, поскольку врачи любят удерживать максимальное систолическое давление на нас. Выражения в представлении должны быть заменены тестом на наличие значения, аналогичного булеву, например $ bloodPressureOk! = Null. Вывод шаблона может быть обусловлен данными модели и вычислениями, условное значение просто должно быть вычислено в модели , Даже простые тесты, которые делают отрицательные значения красными, должны вычисляться в модели; правильный уровень абстракции обычно является чем-то более высоким, например, «отдел х теряет деньги».
  4. представление не может делать предположения типа данных. Некоторые допущения типа очевидны, когда представление предполагает, что значение данных является датой, например, но появляются более тонкие предположения типа: Если шаблон предполагает, что $ userID является целым числом, программатор не может изменить это значение как недействительное -numeric в модели без нарушения шаблона. Это правило запрещает индексирование массива, такое как colorCode [$ topic] и $ name [$ ID]. В дальнейшем представление не может вызывать методы с аргументами, поскольку (статически или динамически) существует предполагаемый тип аргумента, если не может гарантировать модель метод просто рассматривал их как объекты. Кроме того, графические дизайнеры не являются программистами; ожидая, что они вызовут методы и знают, что пройти, нереально.
  5. данные из модели не должны содержать информацию о дисплее или макете. Модель не может передавать какую-либо информационную информацию в представление, замаскированное под значения данных. Это включает в себя не передачу имени шаблона для применения к другим значениям данных.

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

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

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

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

например

   Your Content  

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

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

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

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

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

Вы можете использовать условные обозначения, используя tags .

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

Рамки объявлений:

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

  
Will Not Be Executed
Will Be Executed
Will Not Be Executed

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

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

Interesting Posts

IntelliJ показывает подсказки параметров метода использования – Как отключить его

Java: правый сдвиг по отрицательному числу

Любые хорошие инструменты ORM для разработки Android?

JQuery каждый – цикл Stop и возвращаемый объект

Ошибка грубой вахты – Ожидание … Неустранимая ошибка: смотрите ENOSPC

Установка IP-адреса источника для гнезда UDP

Создание пакета nuget из dlls

Winforms – нажмите / перетащить в любом месте формы, чтобы переместить его, как если бы щелкнул в заголовке формы

Как вы печатаете EXACT значение числа с плавающей запятой?

Перенос данных 50 ТБ из локального кластера Hadoop в хранилище Google Cloud

многослойная архитектура персептрона (MLP): критерии выбора количества скрытых слоев и размер скрытого слоя?

Как распечатать содержимое RDD?

Виртуальные хосты Apache2 не распознают должным образом

Где EXE для подсистемы для Unix-приложений, поэтому я могу использовать его?

C # vs Java generics

Давайте будем гением компьютера.