JSP (Страницы JavaServer) является основанной на Java технологией представления, работающей на машине сервера, которая позволяет Вам писать текст шаблона в (клиентские языки как HTML, CSS, JavaScript и так далее) и взаимодействовать с кодом Java бэкенда.

JSP (страницы JavaServer)

JSP является технологией представления Java, работающей на сервере, который позволяет Вам писать текст шаблона на клиентских языках как HTML, CSS, JavaScript и так далее. JSP поддерживает так называемые taglibs, которые поддерживаются частями кода Java, с которым можно управлять потоком страницы и/или произвести динамично (программно). Известный taglib является JSTL. JSP также поддерживает Язык выражения (EL) с синтаксисом как ${} который может привыкнуть к данным бэкенда доступа (на самом деле, атрибуты, которые доступны на странице, запросе, сессии и областях действия приложения), главным образом в сочетании с taglibs.

Жизненный цикл

Когда JSP требуют впервые или когда веб-приложение запустит, контейнер сервлета скомпилирует файл JSP в расширение класса HttpServlet и используйте его в течение времени жизни веб-приложения. Можно найти сгенерированный исходный код в рабочем каталоге сервера. В, например, Tomcat, это /work каталог. По запросу JSP контейнер сервлета выполнит скомпилированный класс JSP и отправит сгенерированный вывод (обычно просто HTML/CSS/JS) через веб-сервер по сети к стороне клиента, которая в свою очередь отображает его в браузере.

Установка JSP

Для выполнения JSP Вам нужно:

  • JDK (JRE только достаточен, если сервер имеет свой собственный компилятор).
  • Контейнер сервлета.
  • Дополнительно, Java EE осведомленный IDE (Интегрированный Редактор Разработки).

Как установить JDK, или JRE обрисован в общих чертах здесь: https://docs.oracle.com/javase/9/install/overview-jdk-9-and-jre-9-installation.htm

Существует несколько контейнеров сервлета.

Существуют также серверы JAVA EE-приложения, которые в свою очередь также содержат контейнер сервлета около другого Java API EE, такие как JSF, JPA, EJB, и т.д. См. также, Что такое точно Java EE?

Установка контейнера сервлета является обычно просто вопросом загрузки zip/gz файла и извлечения его в местоположении к Вашему выбору.

Обычно также требуется использовать IDE, такой как Eclipse, IntelliJ или Netbeans, таким образом, Вы не должны вручную компилировать и создавать исходные файлы с javac много раз. Достойные IDE имеют плагины, чтобы эффективно интегрировать контейнер сервлета и импортировать необходимый Java API EE в путь сборки проекта. См. также, Как я импортирую javax.servlet API в своем проекте 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 для большего количества детали.

Scriptlets

Можно также встроить необработанный код Java в файле JSP с помощью scriptlets (они <% %> вещи).

<%@ 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, POJOs или даже объекты JPA. Другие лучшие практики включают предотвращение scriplets, создавая допускающие повторное использование теги шаблона, и используют 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, так как это - единственный способ отправить данные с браузера на веб-сервер. Вы могли:

  • используйте DOM HTML, чтобы управлять скрытым полем ввода и заполнить его данными и при необходимости отправить использование формы form.submit() так, чтобы это было доступно request.getParameter().
  • использовать window.location сделать "перенаправление" к новому URL с переменной JavaScript как параметр запроса.
  • использовать XMLHttpRequest для отправки асинхронного (ajax) запрашивают с переменной JS как параметр запроса.
  • позвольте JavaScript установить его как cookie так, чтобы это было доступно request.getCookies() в последующих запросах.

См. также Java Доступа / Сервлет / JSP / JSTL / переменные EL в JavaScript.

Facelets

Начиная с Java EE 6 за JSP следовал Facelets как технология представления по умолчанию для Java EE платформа MVC JSF (Поверхности JavaServer). Начиная с учебного руководства по Java EE 6 JSP не рассматривают подробно больше. Необходимо возвратиться к учебному руководству по Java EE 5, если Вы хотите изучить JSP. См. также https://stackoverflow.com/questions/4845032/wheres-the-official-jsp-tutorial.

Ресурсы онлайн

Часто задаваемые вопросы

Связанные страницы информации о теге