- •Тема 1. Разработка простейших веб-приложений
- •Тема 2. Взаимодействие с сервлетом
- •Тема 3. Контекст сервлета
- •Тема 4. Веб-сессия
- •Тема 5. Фильтры и взаимодействие сервлетов
- •Тема 6. Безопасность веб-приложений
- •Тема 7. Введение в JSP
- •Тема 8. Встроенные объекты JSP
- •Тема 9. Стандартные действия и JavaBeans
- •Тема 10. Выражения JSP Expression Language
- •Тема 11. JSP Standard Tag Library
- •Тема 12. Локализация веб-приложений
- •Тема 13. Настраиваемые теги JSP
- •Тема 14. Взаимодействие с БД в веб-приложениях
- •Тема 15. Запросы к БД
Учебное пособие по web-программированию (2013)
Рисунок 9.4.
Дополнительную информацию можно найти по адресу: http://www.tutorialspoint.com/jsp/jsp_java_beans.htm
Тема 10. Выражения JSP Expression Language
Основы JSP Expression Language: язык, встроенные объекты, операторы, функции. Описание статических функций с использованием TagLibraryDescriptor.
Способы вывода информации на JSP-страницу:
1.<%= Expression %>
2.<% out.print(Expression); %>
3.<jsp:expression>Expression</jsp:expression>
Результат всегда выводится в формате строки.
Существует язык выражений (Expression Language или EL), специализированный для JSP-страниц.
Формат: ${ expression } Пример: ${ 4.0 >= 3 }
Встроенные объекты EL. pageContext
${ pageContext }
контекст страницы servletContext
${ pageContext.servletContext }
контекст сервлета session
${ pageContext.session }
сессия
-46-
Учебное пособие по web-программированию (2013)
request
${ pageContext.request }
запрос
param
${empty param.Name}
параметр страницы (здесь Name — название параметра) paramValues
${paramValues.Name[1]}
значения параметров (здесь Name[1] — обращение ко 2 параметру по имени Name)
header ${header["host"]}
заголовок
cookie
${cookie.Name.value}
значение Cookie по имени Name
Пример использования объектов EL (рисунок 10.1).
Рисунок 10.1.
Доступ к атрибутам страницы, запроса, сессии и приложения осуществляется классическим способом с использованием следующих объектов:
pageScope
requestScope
sessionScope
◦<% session.setAttribute("book", "BOOK_VALUE"); %>
◦${ sessionScope.book }
applicationScope
Операции EL арифметические и сравнения — классические:
-47-
Учебное пособие по web-программированию (2013)
арифметические
◦+, -, *, / или div, % или mod (деление на цело)
сравнения
◦==, !=, <, >, <=, >=
логические
◦and или &&, or или ||, ! или not
проверка на пустой оператор
◦empty
▪ ${empty ""}
Однако работать язык EL будет только в случае, если он включен в дескрипторе развёртывания web.xml либо явно на странице.
web.xml
<jsp-config> <jsp-property-group>
<url-pattern>*.jsp</url-pattern> <el-ignored>false</el-ignored>
</jsp-property-group> </jsp-config>
JSP-страница
<%@page isELIgnored="true|false"%>
В рамках EL можно вызывать статические Java-методы.
Реализация статических методов осуществляется в следующей последовательности:
Шаг 1. Создать статический метод (рисунок 10.2).
Рисунок 10.2.
Шаг 2. Создать tld-файл, в котором описать имя функции (в теге name), класс функции (в теге function-class), описание метода (в теге funcation-signature) (hbceyjr 10.3).
-48-
Учебное пособие по web-программированию (2013)
Рисунок 10.3.
Шаг 3. Подключить tld-файл к JSP-странице с использованием тега taglib (рисунок 10.4). Формат использования taglib:
<%@taglib prefix="имя_префикса" uri="путь_к_tld-файлу" %>
Формат обращения к функции: ${ имя_префикса : имя_функции }
Рисунок 10.4.
Дополнительную информацию можно найти по адресу: http://www.tutorialspoint.com/jsp/jsp_expression_language.htm
Тема 11. JSP Standard Tag Library
Основы JSP Standard Tag Library (JSTL), работа с библиотекой базовых элементов и SQL. Построение одного и того же приложения с использованием скриплетов и JSTL.
SUN разработала набор готовых тегов, которыми может пользоваться
-49-
Учебное пособие по web-программированию (2013)
разработчик. Наиболее распространёнными являются:
Итераторы и теги условий
◦<c:forEach>, <c:forTokens>, <c:if>, <c:choose>
Использование нескольких языков
◦I18N
Теги SQL
◦setDataSource, query, update, transaction, param
Ограничения при использовании готовых тегов: мощность тегов ниже, чем при использовании скриплетов (на скриплетах можно реализовать более сложные функции), при этом использование готовых тегов увеличивает нагрузку на сервер.
Готовые теги размещены по библиотекам: Базовая библиотека
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Теги форматирования i10n и i18n
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
Библиотека SQL
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
Библиотека XML
<%@ taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml" %>
Дальнейшие примеры тегов будут приводиться с учётом приведённых в данных примерах префиксов.
Теги общего назначения: Установка значений переменных
<c:set var="имя" value="Строковое_значение" scope="page|request|session|application">Вычислимое_значение</c:set>
Удаление переменных
<c:remove var="имя" scope="page|request|session|application"/>
Вывод результатов на страницу
<c:out value="значение" escapeXml="true|false" default="значение по умолчанию"/>
Обработа исключительных ситуаций
<c:catch [var="имя"]> … </c:catch>
Пример использования тегов общего назначения приведён на рисунке 11.1. В примере с помощью тега c:set задаётся зачение переменной с одним и тем же именем, но находящимся в контексте страницы, запроса, сессии и т. п. Затем с помощью c:out забирается одно из значений.
Важно! При разработке программы, использующей JSTL не забудьте подключить библиотеку jstl.jar в проект.
-50-
Учебное пособие по web-программированию (2013)
Рисунок 11.1.
Теги условий: Формат:
<c:if test="условие" [var="имя результата" scope="область видимости"]> Пример:
<c:if test="${user.visitCount > 1}">
С возвращением
</c:if>
Формат:
<c:choose>
<c:when test="условие"> … </c:when> <c:otherwise> … </c:otherwise>
</c:choose>
Пример: <c:choose>
<c:when test="${count == 0}">
Нет попыток
</c:when>
<c:otherwise>
<c:out value="${count}"> попыток </c:otherwise>
</c:choose>
Тег циклов — forEach: Формат:
-51-
Учебное пособие по web-программированию (2013)
<c:forEach var="имя_переменной" items="имя_коллекции"> … </c:forEach>
Пример:
<c:forEach items="${friends}" var="friend"> <h2>
<c:out value="${friend}"/>
</h2>
</c:forEach>
Формат:
<c:forEach var="имя_переменной" begin="начало" end="конец" step="шаг"> … </c:forEach>
Пример:
<c:forEach var="index" begin="0" end="2" step="1"> <h2>
<c:out value="${index}"/> = <c:out value="${friends[index]}"/>
</h2>
</c:forEach>
Тег циклов — forTokens:
Формат:
<c:forTokens items="Строка" delims="разделители" var="имя_переменной" begin="начало" step="шаг"> … </c:forTokens>
Пример:
<c:set var="str" value="Гравитон,Фотон.Бозон Мюон" />
<c:forTokens items="${str}" delims=" ,." var="token" begin="0" step="1"> <h4>
<c:out value="${token}"/>
</h4>
</c:forTokens>
Работа с базой данных осуществляется с использованием следующих ключевых действий:
Настройка соединения
◦<sql:setDataSource>
Отправка запроса к БД
Получение данных из БД
◦<sql:query>
Обновление данных в БД
◦<sql:update>
Работа с БД.
Настройка соединения
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/TEST" user="root" password="pass123"/>
В данном примере соединение с БД MySQL, соответственно, можно заменить на другой драйвер. В строке соединения обязательно указываются имя пользователя и пароль. В переменную «snapshot» записывается информация о соединении.
Выполнение запроса
<sql:query dataSource="${snapshot}" var="result"> SELECT * from Employees;
-52-
Учебное пособие по web-программированию (2013)
</sql:query>
С использованием переменной «snapshot» выполняется SQL запрос к БД, результат выполнения записывается в переменную «result».
Чтение данных
<c:forEach var="row" items="${result.rows}"> <tr><td>
<c:out value="${row.name}"/> </td></tr>
</c:forEach>
Используя цикл c:forEach осуществляется проход по всем результатам исполнения запроса на чтение «result», значения одной строки записываются в переменную «row». В данном примере обращение осуществляется к одному полю по имени «name».
Запись данных в БД
<sql:transaction dataSource="${snapshot}"> <sql:update var="countI">
INSERT INTO Students VALUES (104,'Serge', 'Belyaev'); </sql:update>
<sql:update var="countU">
UPDATE Students SET last = 'Chex' WHERE Id = ? <sql:param value="${studId}" />
</sql:update>
</sql:transaction>
Запись в БД осуществляется с использованием транзакций для соединения с БД «snapshot». Выполняются два запроса: на добавление строчки и на обновление строчки. В обоих случаях количество изменённых строк записывается в переменные countI и countU соответственно. В случае запроса на обновление используется тот же формат, что и при использовании PreparedStatement в стандартных JDBC, т. е. вместо знаков вопроса в SQL будут подставляться соответствующие значения, заданные в виде параметров.
В результате одну и ту же программу можно написать как с использованием скриплетов, так и с использованием стандартных тегов. В данной теме на занятиях мы будем писать программу «Угадай число от 1 до 100» с использованием стандартных тегов, в качестве образца логики предлагается использовать такую же программу, написанную с использованием скриплетов (рисунки 11.2 и 11.3).
-53-