Описание тега jsp
JSP (страницы JavaServer)
JSP - это технология представления Java, работающая на сервере, которая позволяет писать текст шаблона на клиентских языках, таких как HTML, CSS, JavaScript и т. Д. JSP поддерживает так называемые библиотеки тегов, которые поддерживаются частями кода Java, с помощью которых вы можете управлять потоком страницы и / или выводить динамически (программно). Хорошо известный taglib - это JSTL. JSP также поддерживает язык выражений ( EL) с синтаксисом вроде${}
которые можно использовать для доступа к бэкэнд-данным (фактически, атрибутам, которые доступны на странице, запросе, сеансе и в областях приложения), в основном в сочетании с taglibs.
Жизненный цикл
Когда JSP запрашивается в первый раз или когда запускается веб-приложение, контейнер сервлетов скомпилирует файл JSP в класс, расширяющий HttpServlet
и использовать его в течение всего срока службы веб-приложения. Вы можете найти сгенерированный исходный код в рабочем каталоге сервера. Например, в Tomcat это/work
каталог. По запросу JSP контейнер сервлета выполнит скомпилированный класс JSP и отправит сгенерированный вывод (обычно просто HTML/CSS/JS) через веб-сервер по сети на клиентскую сторону, которая, в свою очередь, отображает его в браузере.
Установка JSP
Для запуска JSP вам необходимо:
- JDK (JRE достаточно, только если на сервере есть собственный компилятор).
- Контейнер сервлета.
- Необязательно, IDE с поддержкой Java EE (интегрированный редактор разработки).
Как установить JDK или JRE описано здесь: https://docs.oracle.com/javase/9/install/overview-jdk-9-and-jre-9-installation.htm
Есть несколько контейнеров сервлетов.
Существуют также серверы приложений Java EE, которые, в свою очередь, также содержат контейнер сервлетов наряду с другими API-интерфейсами Java EE, такими как JSF, JPA, EJB и т. Д. См. Также Что такое Java EE?
Для установки контейнера сервлетов обычно достаточно загрузить файл zip/gz и распаковать его в любом месте по вашему выбору.
Как правило, вы также хотели бы использовать среду IDE, такую как Eclipse, IntelliJ или Netbeans, поэтому вам не нужно вручную компилировать и создавать исходные файлы с помощьюjavac
вновь и вновь. У достойных IDE есть плагины для беспрепятственной интеграции контейнера сервлетов и импорта необходимых API Java EE в путь сборки проекта. См. Также Как импортировать API javax.servlet в мой проект Eclipse?
Привет мир
В этом примере используются JSTL и EL для отображения IP-адреса пользователя и сегодняшней даты.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<jsp:useBean id="date" class="java.util.Date" />
<!DOCTYPE html>
<html lang="en">
<head>
<title>JSP Hello World</title>
</head>
<body>
<h1>Hello</h1>
<p>Welcome, user from <c:out value="${pageContext.request.remoteAddr}" />
<p>It's now <fmt:formatDate value="${date}" pattern="MM/dd/yyyy HH:mm" />
</body>
</html>
Сохранить как /hello.jsp
и откройте его по http://localhost:8080/contextname/hello.jsp.
Если JSTL не работает (теги JSTL не анализируются / не выполняются и все еще присутствуют в сгенерированном HTML-выводе, когда вы щелкаете правой кнопкой мыши и просматриваете исходный код в браузере), то, вероятно, ваш контейнер сервлета не поддерживает его из коробки (как Tomcat). Вы можете установить его, просто загрузив jstl-1.2.jar в/WEB-INF/lib
. Если это все еще не работает, обратитесь к странице информации JSTL для получения более подробной информации.
Скриплеты
Вы также можете встроить необработанный код Java в файл JSP с помощью скриптлетов (<% %>
вещи).
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html lang="en">
<head>
<title>JSP Hello World</title>
</head>
<body>
<h1>Hello</h1>
<p>Welcome, user from <%= request.getRemoteAddr() %>
<p>It's now <%= new SimpleDateFormat("MM/dd/yyyy HH:mm").format(new Date()) %>
</body>
</html>
Однако его использование в соответствии с соглашениями о кодировании JSP не рекомендуется для других целей, кроме быстрого прототипирования.
Лучшие практики
С помощью JSP легко написать неподдерживаемый код, поэтому были разработаны некоторые передовые методы. Основной практикой является использование JSP в качестве представления в шаблоне проектирования контроллера представления модели. Иногда это называют дизайном Модели 2, в котором сервлеты используются в качестве контроллера. Модель может быть JavaBeans, POJO или даже объектами JPA. Другие передовые методы включают отказ от скриптов, создание повторно используемых тегов шаблонов и использование JSTL, чтобы не изобретать колесо заново.
Предварительная загрузка данных и постобработка форм
Чтобы предварительно загрузить данные для отображения в JSP и пост-обработку отправки формы, вы хотите использовать сервлет. Дополнительные сведения см. На странице информации о тегах сервлетов.
JavaScript
Важно понимать, что JSP запускается на веб-сервере, производя вывод HTML, и что JavaScript является частью вывода HTML, который выполняется только в браузере. Таким образом, JSP и JavaScript не работают синхронно, как можно было бы ожидать от кода. Чтобы позволить JavaScript "получить доступ" к переменным JSP, все, что вам нужно сделать, это позволить JSP/JSTL/EL печатать их, как если бы это была переменная Javascript. Таким образом, любая функция JavaScript, однажды выполненная в браузере, может получить к ней доступ. В приведенном ниже примере идентификатор сеанса на стороне сервера выводится в виде переменной JavaScript с использованием EL:
<script>var jsessionid = '${pageContext.session.id}';</script>
Если вы откроете эту страницу в браузере и выполните Просмотр исходного кода, вы увидите что-то вроде:
<script>var jsessionid = '4C147636FF923CA7EA642F2E10DB95F1';</script>
(обратите внимание, что эти одинарные кавычки, таким образом, были обязательными для представления строкового значения JavaScript!)
Затем, чтобы позволить JSP "получить доступ" к переменным JavaScript, вам необходимо отправить переменную JavaScript обратно на сервер с помощью HTTP-запроса, поскольку это единственный способ отправить данные из браузера на веб-сервер. Ты мог бы:
- использовать HTML DOM для управления скрытым полем ввода и заполнения его данными, и при необходимости отправить форму, используя
form.submit()
так что это доступноrequest.getParameter()
. - использовать
window.location
чтобы выполнить "перенаправление" на новый URL-адрес с переменной JavaScript в качестве параметра запроса. - использовать
XMLHttpRequest
для отправки асинхронного (ajax) запроса с переменной JS в качестве параметра запроса. - пусть JavaScript установит его как файл cookie, чтобы он был доступен
request.getCookies()
в последующих запросах.
См. Также Доступ к переменным Java / Servlet / JSP / JSTL / EL в JavaScript.
Facelets
Начиная с Java EE 6, на смену JSP пришли Facelets в качестве технологии представления по умолчанию для JSF среды Java EE MVC (JavaServer Faces). Начиная с учебника Java EE 6, JSP больше не рассматривается подробно. Вам нужно вернуться к руководству по Java EE 5, если вы хотите изучить JSP. См. Также https://stackru.com/questions/4845032/wheres-the-official-jsp-tutorial.
Интернет-ресурсы
- Википедия: JavaServer Pages
- Начальные и промежуточные руководства по сервлетам и JSP
- Расширенные руководства по сервлетам и JSP
- Электронная книга основных сервлетов и JavaServer Pages
Часто задаваемые вопросы
- Проверьте вкладку "часто" тега JSP