Как избежать использования Java-кода в JSP-файлах, используя JSP 2?
Заголовок: Как заменить встроенный Java код в JSP на альтернативные конструкции в JSP 2?
Я понимаю, что использование встроенного Java кода в JSP выглядит устаревшим, например, такие строки как:
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
С выходом JSP версии 2 появились методы, которые позволяют избежать написания Java кода непосредственно в JSP файлах. Какие альтернативные конструкции в JSP 2 можно использовать вместо этих строк, и как называется эта техника?
5 ответ(ов)
Вы можете использовать теги 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}" />
// и так далее
</body>
</html>
В этом примере мы используем тег <c:out>
, чтобы вывести результат выражений EL, таких как арифметические операции и параметры запроса, что позволяет нам сохранять чистоту кода и улучшает читабельность.
Опыт показывает, что JSP имеют некоторые недостатки, одним из которых является сложность в избегании смешивания разметки с реальным кодом.
Если это возможно, рассмотрите использование специализированной технологии для выполнения вашей задачи. В Java EE 6 присутствует JSF 2.0, который предлагает множество удобных функций, включая возможность связывания Java-бинов с JSF-страницами через подход #{bean.method(argument)}
.
Если вы просто хотите избежать недостатков кодирования на Java в JSP, вы можете сделать это даже с помощью скриплетов. Просто следуйте некоторым принципам, чтобы минимизировать количество Java-кода в JSP и избегать каких-либо вычислений и логики на странице JSP.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% // Создание контроллера JSP
MyController clr = new MyController(request, response);
// Обработка действия, если таковое имеется
clr.process(request);
// Обработка перенаправления страницы, если необходимо
// Выполнение всех присваиваний переменных здесь
String showMe = clr.getShowMe(); %>
<html>
<head>
</head>
<body>
<form name="frm1">
<p><%= showMe %>
<p><% for(String str : clr.listOfStrings()) { %>
<p><%= str %><% } %>
// И так далее
</form>
</body>
</html>
Этот подход позволяет сосредоточиться на представлении, избегая смешивания бизнес-логики с отображением.
Чтобы научиться настраивать и создавать собственные теги с использованием JSTL, необходимо учитывать, что EL может вести себя непредсказуемо (ошибки времени выполнения и рефакторинг). Также стоит отметить, что 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">
<!-- Дескриптор библиотеки тегов -->
<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>
<!-- Этот тег манипулирует содержимым своего тела, преобразуя его в верхний регистр -->
<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(); // очищаем буфер для следующей оценки
} catch (IOException e) {
System.out.println("Ошибка в BodyContentTag.doAfterBody(): " + e.getMessage());
e.printStackTrace();
}
int retValue = SKIP_BODY;
if (iterations < howMany)
retValue = EVAL_BODY_AGAIN;
return retValue;
}
}
Теперь запустите сервер и откройте файл bodyContent.jsp
в браузере:
<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
<head>
<title>Пользовательский тег: содержимое тела</title>
</head>
<body>
Эта страница использует пользовательский тег, который манипулирует своим содержимым. Вот его вывод:
<ol>
<java2s:bodyContentTag howMany="3">
<li>java2s.com</li>
</java2s:bodyContentTag>
</ol>
</body>
</html>
Убедитесь, что все работает правильно, и вы сможете настраивать свои собственные теги, используя JSTL! Если у вас возникнут вопросы, не стесняйтесь спрашивать!
Вы подняли хороший вопрос, и хотя вы получили несколько дельных ответов, я бы посоветовал отказаться от JSP. Это устаревшая технология, которая со временем уйдет в прошлое. Используйте более современные подходы, например, движки шаблонов. Это обеспечит четкое разделение бизнес-логики и представления, а также избавит от необходимости использовать Java- код в шаблонах, что позволит вам генерировать шаблоны напрямую из программ для редактирования веб-презентаций, часто с использованием WYSIWYG.
И, конечно, старайтесь избегать фильтров и предобработки или постобработки, иначе вы можете столкнуться с трудностями поддержки и отладки, поскольку всегда есть неопределенность в том, откуда берётся значение переменной.
В чем разница между JSF, Servlet и JSP?
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Java 8: Преобразование List<V> в Map<K, V>
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Что такое PECS (Producer Extends Consumer Super)?