Я новичок в Java EE и знаю, что-то вроде следующих трех строк
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
это старый способ кодирования, и в JSP версии 2 существует метод, позволяющий избежать Java-кода в файлах JSP. Может кто-нибудь сказать, пожалуйста, альтернативные линии JSP 2, и как называется эта техника?
Ответы:
Использование скриптлетов (те
<% %>
вещи) в JSP действительно крайне не рекомендуется с момента рождения taglibs (например, JSTL ) и EL ( Expression Language , те${}
вещи) еще в 2001 году.Основными недостатками скриплетов являются:
СамSunOracle также рекомендует в соглашениях о кодировании JSP избегать использования скриптлетов, когда те же функции возможны с помощью (тега) классов. Вот несколько ссылок:Как заменить скриптлеты полностью зависит от единственной цели кода / логики. Чаще всего этот код помещается в полноценный класс Java:
Если вы хотите вызывать один и тот же код Java при каждом запросе, в меньшей или большей степени независимо от запрашиваемой страницы, например, проверяя, вошел ли пользователь в систему, тогда внедрите фильтр и напишите соответствующий код в
doFilter()
методе. Например:При отображении на соответствующие
<url-pattern>
страницы JSP, представляющие интерес, вам не нужно копировать и вставлять один и тот же фрагмент кода на все страницы JSP.Если вы хотите вызвать некоторый Java-код для предварительной обработки запроса, например, предварительно загрузить некоторый список из базы данных для отображения в некоторой таблице, при необходимости, основываясь на некоторых параметрах запроса, то реализуйте сервлет и напишите соответствующий код в
doGet()
методе. Например:Так легче справляться с исключениями. К БД не обращаются во время рендеринга JSP, но задолго до того, как JSP был отображен. У вас все еще есть возможность изменить ответ всякий раз, когда доступ к БД вызывает исключение. В приведенном выше примере будет отображена страница ошибки 500 по умолчанию, которую вы в любом случае можете настроить с помощью
<error-page>
inweb.xml
.Если вы хотите вызвать некоторый Java-код для постобработки запроса, например, обработки отправки формы, то реализуйте сервлет и напишите соответствующий код в
doPost()
методе. Например:Это облегчает работу с различными адресами на странице результатов: повторное отображение формы с ошибками проверки в случае ошибки (в этом конкретном примере вы можете повторно отобразить ее, используя
${message}
в EL ), или просто переход на нужную целевую страницу в случае успеха.Если вы хотите вызвать некоторый Java-код для управления планом выполнения и / или местом назначения запроса и ответа, то реализуйте сервлет в соответствии с шаблоном фронт-контроллера MVC . Например:
Или просто используйте MVC-фреймворк, такой как JSF , Spring MVC , Wicket и т. Д., Чтобы в итоге вы получили только страницу JSP / Facelets и класс JavaBean без необходимости использования собственного сервлета.
Если вы хотите вызвать некоторый Java-код для управления потоком внутри страницы JSP, то вам нужно получить (существующий) taglib управления потоком, такой как ядро JSTL . Например, отображение
List<Product>
в таблице:С тегами в стиле XML, которые хорошо вписываются в этот HTML, код лучше читается (и, следовательно, лучше поддерживается), чем набор скриплетов с различными открывающими и закрывающими скобками ( «Куда, черт возьми, относится эта закрывающая скобка?» ). Легкая помощь состоит в том, чтобы настроить ваше веб-приложение на выдачу исключения, когда скриптлеты все еще используются, добавив следующую часть
web.xml
:В Facelets , преемник JSP, который является частью Java EE при условии MVC Framework JSF , это уже не возможно использовать скриптлет . Таким образом, вы автоматически будете вынуждены делать все правильно.
Если вы хотите вызвать некоторый Java-код для доступа и отображения «внутренних данных» на странице JSP, то вам нужно использовать EL (Expression Language), эти
${}
вещи. Например, повторное отображение введенных значений ввода:В
${param.foo}
отображает итоговый документrequest.getParameter("foo")
.Если вы хотите вызывать некоторый служебный Java-код непосредственно на странице JSP (обычно это
public static
методы), то вам нужно определить их как функции EL. В JSTL есть стандартные функции taglib , но вы также можете легко создавать функции самостоятельно . Вот пример того, как JSTLfn:escapeXml
полезен для предотвращения атак XSS .Обратите внимание, что чувствительность XSS никоим образом не связана конкретно с Java / JSP / JSTL / EL / чем бы то ни было, эту проблему необходимо учитывать в каждом разрабатываемом веб-приложении. Проблема скриплетов заключается в том, что они не предоставляют встроенных предупреждений, по крайней мере, не используя стандартный Java API. Преемник JSP Facelets уже неявно экранирует HTML, поэтому вам не нужно беспокоиться о дырах XSS в Facelets.
Смотрите также:
источник
<% response.getWriter().flush(); %>
между</head>
и<body>
для повышения производительности анализа веб-страницы в браузере. Но это использование, в свою очередь, совершенно незначительно, когда размер выходного буфера на стороне сервера мал (1 ~ 2 КБ). Смотрите также эту статью .В качестве меры предосторожности: отключите скрипты насовсем
Поскольку обсуждается другой вопрос , вы можете и всегда должны отключать скриптлеты в
web.xml
дескрипторе веб-приложения.Я всегда делал бы это, чтобы любой разработчик не добавлял скриптлеты, особенно в крупных компаниях, где вы рано или поздно потеряете обзор. Эти
web.xml
параметры выглядят следующим образом :источник
<%-- comment that i don't want in the final HTML --%>
. Я считаю полезным использовать эти, а не комментарии HTML.<% %>
, выражения<%! %>
скриптлетов и объявления скриптлетов<%= %>
. Это означает, что директивы<%@ %>
и комментарии<%-- --%>
остаются включенными и пригодными для использования, поэтому вы все равно можете делать комментарии и включения.JSTL предлагает теги для условных выражений, циклов, множеств, операций получения и т. Д. Например:
JSTL работает с атрибутами запроса - они чаще всего устанавливаются в запросе сервлетом, который перенаправляет в JSP.
источник
Я не уверен, правильно ли я понял.
Вы должны прочитать кое-что о MVC. Spring MVC & Struts 2 являются двумя наиболее распространенными решениями.
источник
Вы можете использовать теги JSTL вместе с выражениями EL, чтобы избежать смешивания кода Java и HTML:
источник
Существуют также основанные на компонентах фреймворки, такие как Wicket, которые генерируют много HTML для вас. Тэги, которые заканчиваются в HTML, являются чрезвычайно простыми, и в них практически отсутствует смешанная логика. В результате мы получаем почти пустые HTML-страницы с типичными HTML-элементами. Недостатком является то, что в Wicket API есть много компонентов для изучения, и некоторые вещи могут быть труднодостижимы при этих ограничениях.
источник
В архитектурном шаблоне MVC JSP представляют слой View. Встраивание кода Java в JSP считается плохой практикой. Вы можете использовать JSTL , FreeMarker , скорость с JSP в качестве «движка шаблонов». Поставщик данных для этих тегов зависит от структур, с которыми вы имеете дело.
Struts 2
аwebwork
в качестве реализации для MVC Pattern используется OGNL «очень интересная техника для представления свойств Beans в JSP».источник
Опыт показывает, что у JSP есть некоторые недостатки, один из которых заключается в том, что трудно избежать смешения разметки с реальным кодом.
Если вы можете, то подумайте об использовании специализированной технологии для того, что вам нужно сделать. В Java EE 6 есть JSF 2.0, который предоставляет множество полезных функций, включая склейку Java-бинов вместе с JSF-страницами с помощью этого
#{bean.method(argument)}
подхода.источник
если вы просто хотите избежать недостатков Java-кодирования в JSP, вы можете сделать это даже с помощью скриптов. Просто следуйте некоторой дисциплине, чтобы иметь минимальный Java в JSP и почти нет вычислений и логики на странице JSP.
источник
Научитесь настраивать и писать свои собственные теги, используя JSTL
Обратите внимание, что EL - это EviL (исключения во время выполнения, рефакторинг).
Wicket также может быть плохим ( производительность, сложная для небольших приложений или простого уровня просмотра).
Пример из java2s ,
Это должно быть добавлено в web.xml веб-приложения
создать файл: java2s.tld в / WEB-INF /
скомпилируйте следующий код в WEB-INF \ classes \ com \ java2s
Запустите сервер и загрузите bodyContent.jsp в браузер
источник
Wicket также является альтернативой, которая полностью отделяет java от html, поэтому дизайнер и программист могут работать вместе и над разными наборами кода, практически не понимая друг друга.
Посмотри на калитку.
источник
Вы задали хороший вопрос, и, хотя вы получили хорошие ответы, я бы посоветовал вам избавиться от JSP. Это устаревшая технология, которая в конечном итоге умрет. Используйте современный подход, например, шаблонизаторы. У вас будет очень четкое разделение бизнес-уровня и уровня представления, и, конечно, не будет Java-кода в шаблонах, поэтому вы сможете создавать шаблоны непосредственно из программного обеспечения для редактирования веб-презентаций, в большинстве случаев используя WYSIWYG.
И, конечно же, держитесь подальше от фильтров, предварительной и постобработки, иначе вы можете столкнуться с трудностями поддержки / отладки, поскольку вы всегда не знаете, где переменная получает значение.
источник
во избежание java-кода в JSP-файлах java теперь предоставляет библиотеки тегов, такие как JSTL, также java предлагает JSF, в который вы можете записывать все программные структуры в виде тегов
источник
Независимо от того, сколько вы пытаетесь избежать, когда вы работаете с другими разработчиками, некоторые из них по-прежнему предпочитают скриптлет и затем вставляют злой код в проект. Поэтому настройка проекта при первом знаке очень важна, если вы действительно хотите уменьшить код скриптлета. Есть несколько методов, чтобы преодолеть это (в том числе несколько фреймворков, которые другие упоминали). Однако, если вы предпочитаете чистый способ JSP, используйте файл тегов JSTL. Приятно то, что вы также можете настроить главные страницы для своего проекта, чтобы другие страницы могли наследовать главные страницы
Создайте главную страницу с именем base.tag под своими тегами WEB-INF / со следующим содержимым
На этой основной странице я создал фрагмент с названием «title», чтобы на дочерней странице я мог вставить больше кодов в это место главной страницы. Также тег
<jsp:doBody/>
будет заменен содержимым дочерней страницыСоздайте дочернюю страницу (child.jsp) в папке WebContent:
<t:base>
используется для указания главной страницы, которую вы хотите использовать (в данный момент это base.tag). Весь контент внутри тега<jsp:body>
будет заменен<jsp:doBody/>
на вашей главной странице. Ваша дочерняя страница также может содержать любой тег lib, и вы можете использовать его, как и другие упомянутые выше. Тем не менее, если вы используете какой-либо код скриплета здесь (<%= request.getParameter("name") %>
...) и попытаетесь запустить эту страницу, вы получитеJasperException because Scripting elements ( <%!, <jsp:declaration, <%=, <jsp:expression, <%, <jsp:scriptlet ) are disallowed here
. Поэтому другие люди не могут включить злой код в файл jsp.Вызов этой страницы с вашего контроллера:
Вы можете легко вызвать файл child.jsp с вашего контроллера. Это также хорошо работает со структурой стоек
источник
Используйте
JSTL Tag libraries
в JSP, это будет отлично работать.источник
Просто используйте тег JSTL и выражение EL.
источник
Если кто-то действительно против программирования на большем количестве языков, чем один , я предлагаю GWT, теоретически вы можете избежать всех элементов JS и HTML, поскольку Google Toolkit преобразует весь клиентский и общий код в JS, у вас не будет проблем с ними, поэтому у вас есть веб-сервис без кодирования на других языках. Даже вы можете использовать какой-то CSS по умолчанию откуда-то, как это задано расширениями (smartGWT или Vaadin). Вам не нужно изучать десятки аннотаций.
Конечно, если вы хотите, вы можете взломать себя до глубины кода и внедрить JS и обогатить свою HTML-страницу, но на самом деле вы можете избежать этого, если хотите, и результат будет хорошим, как это было написано в любой другой среде. Я говорю, стоит попробовать, и основной GWT хорошо документирован.
И, конечно же, многие коллеги-программисты описывают или рекомендуют несколько других решений. GWT для людей, которые действительно не хотят иметь дело с веб-частью или минимизировать ее.
источник
Отличная идея из мира Python - это языки атрибутов Template ; TAL был введен Zope (следовательно, «Шаблоны страниц Zope», ZPT) и является стандартом, также с реализациями на PHP, XSLT и Java (я использовал инкарнации Python / Zope и PHP). В этом классе шаблонных языков один приведенный выше пример может выглядеть так:
Код выглядит как обычный HTML (или XHTML) плюс некоторые специальные атрибуты в пространстве имен XML; его можно просмотреть с помощью браузера и безопасно настроить дизайнером. Также есть поддержка макросов и i18n:
Если доступны переводы контента, они используются.
Хотя я не очень разбираюсь в реализации Java .
источник
ui:xxx
теги в Facelts VDL .tal:replace="structure (expression)"
атрибуты постоянно.Использование скриптлетов в JSP не является хорошей практикой.
Вместо этого вы можете использовать:
Пожалуйста, обратитесь к:
источник
Конечно, замени
<%! counter++; %>
архитектуру производителя событий-потребителей, где бизнес-уровень уведомляется о необходимости увеличения счетчика, он соответствующим образом реагирует и уведомляет докладчиков, чтобы они обновили представления. В этом участвует ряд транзакций базы данных, поскольку в будущем нам нужно будет знать новое и старое значение счетчика, кто его увеличил и с какой целью. Очевидно, что это связано с сериализацией, поскольку слои полностью отделены друг от друга. Вы сможете увеличить свой счетчик по RMI, IIOP, SOAP. Но требуется только HTML, который вы не реализуете, поскольку это такой обыденный случай. Ваша новая цель - достичь 250 приращений в секунду на вашем новом блестящем сервере E7, 64 ГБ ОЗУ.Я занимаюсь программированием более 20 лет, большинство проектов проваливаются до появления секстета: возможность повторного использования, возможность замены, возможность OO, возможность отладки, тестируемость. Другие проекты, выполняемые людьми, которые заботились только о функциональности, были чрезвычайно успешными. Кроме того, жесткая объектная структура, реализованная слишком рано в проекте, делает код неспособным адаптироваться к резким изменениям в спецификациях (иначе говоря, гибким).
Поэтому я считаю промедлением деятельность по определению «слоев» или избыточных структур данных либо в начале проекта, либо когда это не требуется специально.
источник
Технически все JSP преобразуются в сервлеты во время выполнения . Изначально JSP был создан с целью разделения бизнес-логики и логики проектирования в соответствии с шаблоном MVC. Таким образом, JSP технически - это все java-коды во время выполнения. Но чтобы ответить на этот вопрос, библиотеки тегов обычно используются для применения логики (удаления кодов Java) к страницам JSP.
источник
Если мы используем следующие вещи в веб-приложении Java, код Java может быть исключен с переднего плана JSP.
Использовать архитектуру MVC для веб-приложения
Используйте теги JSP
а. Стандартные теги
б. Пользовательские теги
Язык выражения
источник
Как избежать Java-кода в файлах JSP?
Вы можете использовать теги библиотеки вкладок, такие как JSTL, в дополнение к языку выражений ( EL ). Но EL плохо работает с JSP. Так что, вероятно, лучше полностью отказаться от JSP и использовать Facelets .
Facelets - это первый не-JSP язык объявления страниц, разработанный для JSF (Java Server Faces), который предоставил разработчикам JSF более простую и мощную модель программирования по сравнению с JSP. Это решает различные проблемы, возникающие в JSP для разработки веб-приложений.
Источник
источник
Использование Scriptlets является очень старым способом и не рекомендуется. Если вы хотите напрямую что-то выводить на своих страницах JSP, просто используйте язык выражений (EL) вместе с JSTL .
Есть и другие варианты, такие как использование шаблонизатора, такого как Velocity, Freemarker, Thymeleaf и т. Д. Но использование простой JSP с EL и JSTL служит моей цели большую часть времени, и это также кажется самым простым для новичка.
Кроме того, обратите внимание, что не рекомендуется использовать бизнес-логику на уровне представления, вы должны выполнять свою бизнес-логику на уровне службы и передавать результат вывода в представления через контроллер.
источник
Ничего из этого больше не используется, мой друг, мой совет - отделить представление (css, html, javascript и т. Д.) От сервера.
В моем случае мои системы обрабатывают представление с помощью Angular, и любые необходимые данные доставляются с сервера с использованием служб отдыха.
Поверьте, это изменит ваш дизайн
источник
Используйте основу, угловой, как javascript framework для дизайна пользовательского интерфейса и извлекайте данные с помощью rest api. Это полностью удалит Java-зависимость из пользовательского интерфейса.
источник
JSP 2.0 имеет функцию под названием «Файлы тегов» , вы можете писать теги без внешнего
java
кода иtld
. Вам нужно создать.tag
файл и поместить его в себя,WEB-INF\tags
вы даже можете создать структуру каталогов для упаковки ваших тегов.Например:
Используйте это как
Кроме того, вы можете легко прочитать тело тега
Используй это
Примеры очень просты, но вы можете выполнить здесь много сложных задач. Пожалуйста , обратите внимание вы можете использовать другие метки (например ,
JSTL
которая имеет контрольные метки , как сif/forEcah/chosen
текстом , какformat/contains/uppercase
или даже SQL теговselect/update
), передать все добрые параметры, напримерHashmap
, доступsession
,request
... в файле теги тоже.Файл тегов разработан так просто, что вам не нужно было перезагружать сервер при их изменении, как файлы JSP. Это облегчает их разработку.
Даже если вы используете такую среду, как Struts 2, которая имеет много хороших тегов, вы можете обнаружить, что наличие собственных тегов может значительно сократить ваш код. Вы можете передать параметры вашего тега в распорки и таким образом настроить тег вашего фреймворка.
Вы можете использовать тег не только, чтобы избежать Java, но и минимизировать ваши HTML-коды. Я сам стараюсь просматривать HTML-коды и создавать теги, как только на моих страницах появляются дубликаты кода.
(Даже если вы в конечном итоге используете Java в своем коде JSP, что, я надеюсь, не так, вы можете инкапсулировать этот код в тег)
источник
Как говорится во многих ответах, используйте JSTL или создайте свои собственные теги. Вот хорошее объяснение о создании пользовательских тегов
источник
источник
Используя теги JSTL вместе с выражением EL, вы можете избежать этого. Поместите следующие вещи на вашей странице JSP:
источник