Содержание
-
ссылка: #overview[ 1. Обзор]
-
ссылка: #jsp[ 2. JavaServer Pages]
-
ссылка: # синтаксис[ 2.1. Синтаксис JSP]
-
ссылка: #contents[ 2.2. Статическое и динамическое содержимое]
-
link: #implicit[ 2.3. Implicit Object]]
-
link: #implicit[ 2.4. Другие неявные объекты]
-
ссылка: # директивы[ 2.5. директивы]
-
ссылка: #page[ 2.6. Директивы страницы]
-
ссылка: #threeExamples[ 3.0. Три примера]
-
link: #htmlRendered[ 3.1. HTML отображается в сервлете]
-
link: #staticJava[ 3.2. Java в статическом контенте JSP]
-
ссылка: # пересылка[ 3.3. JSP с пересылкой]
-
ссылка: #tryIt[ 3.4. Попробуйте!]
-
ссылка: # заключение[ 4. заключение]
1. Обзор
-
JavaServer Pages (JSP) позволяет вводить dynamic контент в static контент, используя Java и Java Servlets . Мы можем делать запросы к сервлету Java, выполнять соответствующую логику и отображать конкретное представление на стороне сервера для использования на стороне клиента ** . В этой статье будет представлен полный обзор страниц JavaServer с использованием Java 8 и Jave 7 EE.
Мы начнем с изучения нескольких ключевых понятий, относящихся к JSP, а именно: различия между содержимым dynamic и static , жизненным циклом JSP и синтаксисом JSP, а также директивами и неявными объектами, созданными при компиляции!
2. JavaServer Pages
JavaServer Pages (JSP) позволили передавать специфичные для Java данные или помещать их в представление .jsp и использовать их на стороне клиента.
-
JSP-файлы - это, по сути, файлы .html ** с некоторым дополнительным синтаксисом и парой незначительных начальных различий:
, суффикс .html заменяется на .jsp (он считается .jsp
тип файла) и , следующий тег добавляется в верхнюю часть элементов разметки .html:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Давайте рассмотрим некоторые ключевые концепции JSP.
2.1. Синтаксис JSP
Есть два способа добавить код Java в .jsp. Во-первых, мы можем использовать базовый синтаксис Java Scriptlet, который включает размещение блоков кода Java в двух тегах Scriptlet:
<% Java code here %>
Второй метод специфичен для XML:
<jsp:scriptlet>
Java code here
</jsp:scriptlet>
Важно отметить, что с JSP можно использовать условную логику на стороне клиента, используя предложения if , then и else , а затем заключить соответствующие блоки разметки в эти скобки.
<% if (doodad) {%>
<div>Doodad!</div>
<% } else { %>
<p>Hello!</p>
<% } %>
Например, если doodad имеет значение true, мы отображаем первый элемент div , в противном случае мы отображаем второй элемент p !
2.2. Static и Dynamic Содержание
Статическое веб-содержимое - это основные средства, которые используются независимо от запросов RESTful, SOAP, HTTP, HTTPS или другой предоставленной пользователем информации.
Контент Static , однако, является фиксированным и не изменяется пользовательским вводом.
Dynamic веб-контент - это те ресурсы, которые реагируют, изменяются или изменяются в свете действий или информации пользователя
Технология JSP позволяет четко разделить обязанности между dynamic и static содержимым.
Сервер (сервлет) управляет содержимым dynamic , а клиент (действительная страница .jsp) является контекстом static , в который вводится динамическое содержимое.
Давайте посмотрим на implicit объектов , которые создаются JSP и которые позволяют вам получить доступ к JSP-соответствующих данных на стороне сервера!
2.3. Неявные объекты
Неявные объекты генерируются механизмом JSP автоматически во время __компиляции.
Implicit objects включают в себя объекты HttpRequest и HttpResponse и предоставляют различные серверные функции для использования в вашем сервлете и для взаимодействия с вашим .jsp! Вот список implicit объектов , которые создаются:
-
request ** request принадлежит к классу javax.servlet.http.HttpServletRequest .
Объект request предоставляет все входные данные пользователя и делает их доступными на стороне сервера.
-
response ** response принадлежит классу javax.servlet.http.HttpServletResponse и определяет, что передается обратно клиентской стороне после выполнения request .
Давайте подробнее рассмотрим неявные объекты request и response , поскольку они являются наиболее важными и интенсивно используемыми.
Пример ниже демонстрирует очень простой, неполный, сервлет-метод для обработки запросов GET. Я опустил большинство деталей, чтобы мы могли сосредоточиться на том, как использовать объекты request и response :
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String message = request.getParameter("message");
response.setContentType("text/html");
. . .
}
Во-первых, мы видим, что объекты request и response передаются в качестве параметров в метод, делая их доступными в его области видимости.
Мы можем получить доступ к параметрам запроса, используя функцию .getParameter () .
Выше мы зацепили параметр message и инициализировали строковую переменную, чтобы мы могли использовать ее в нашей логике на стороне сервера. Мы также можем получить доступ к объекту response , который определяет, как и как будут передаваться данные в представление.
Выше мы устанавливаем тип контента для него. Нам не нужно возвращать объект response для отображения его полезной нагрузки на странице JSP при рендере!
-
out ** out принадлежит классу javax.servlet.jsp.JspWriter и используется для записи содержимого на клиент.
Существует как минимум два способа печати на вашей странице JSP, и их стоит обсудить здесь. out создается автоматически и позволяет записывать в память, а затем в объект response :
out.print(“hello”);
out.println(“world”);
Это оно!
Второй подход может быть более производительным, поскольку он позволяет писать напрямую в объект response ! Здесь мы используем PrintWriter :
PrintWriter out = response.getWriter();
out.println("Hello World");
2.4. Другие неявные объекты
Вот некоторые другие неявные объекты, которые также полезно знать!
-
session ** session принадлежит классу javax.servlet.http.HttpSession поддерживает пользовательские данные в течение всего сеанса.
-
application ** application принадлежит классу javax.servlet.ServletContext хранит параметры всего приложения, установленные при инициализации или к которым необходимо получить доступ во всем приложении.
-
исключение ** + exception принадлежит классу javax.servlet.jsp.JspException используется для отображения сообщений об ошибках на страницах JSP с тегом <% @ page isErrorPage = ”true”%> .
-
page ** page принадлежит классу java.lang.Object позволяет получить доступ к текущей информации сервлета или ссылаться на нее.
-
pageContext ** pageContext принадлежит классу javax.servlet.jsp.PageContext по умолчанию page scope, но может использоваться для доступа к request , application и session attribute .
-
config ** config принадлежит классу javax.servlet.ServletConfig - это объект конфигурации сервлета, позволяющий получить контекст, имя и параметры сервлета.
Теперь, когда мы рассмотрели implicit objects , предоставляемые JSP, давайте перейдем к directives , которые позволяют страницам .jsp (косвенно) получать доступ к некоторым из этих объектов.
2.5. Директивы
JSP предоставляет готовые директивы, которые можно использовать для определения основных функций для наших файлов JSP. Директивы JSP состоят из двух частей: (1) самой директивы и (2) атрибута этой директивы, которой присвоено значение.
С помощью тегов директив можно ссылаться на три вида директив: <% @ page …%> , который определяет зависимости и атрибуты JSP, включая content type и language , <% @ include …%> , которые указывает импорт или файл, который будет использоваться, и <% @ taglib …%> , который указывает библиотеку тегов, определяющую настраиваемые действия, которые будут использоваться страницей.
Так, например, директива страницы будет указана с использованием тегов JSP следующим образом: <% @ page attribute = ”value”%>
И мы можем сделать это, используя XML следующим образом: <jsp: directive.page attribute = ”value”/>
2.6. Атрибуты директивы страницы
Есть много атрибутов, которые могут быть объявлены внутри директивы страницы:
-
autoFlush _ <% @ page autoFlush = ”false”%> _ + **
autoFlush контролирует вывод буфера, очищая его при достижении размера буфера. Значение по умолчанию верно__.
-
buffer _ <% @ page buffer = ”19kb”%> _ **
buffer устанавливает размер буфера, используемого нашей страницей JSP. Значение по умолчанию составляет 8 КБ.
-
errorPage _ <% @ page errorPage = ”errHandler.jsp”%> _ + **
errorPage определяет страницу JSP как страницу ошибки.
-
extends _ <% @ page extends = ”org.apache.jasper.runtime.HttpJspBase”%> _ **
extends указывает суперкласс соответствующего кода сервлета.
-
info ** <% @ page info = ”Это мой JSP!”%>
info используется для установки текстового описания для JSP.
-
isELIgnored ** <% @ page isELIgnored = ”true”%>
isELIgnored указывает, будет ли страница игнорировать Expression Language (EL) в JSP. EL позволяет уровню представления взаимодействовать с Java-управляемыми bean-компонентами и делает это с помощью синтаксиса $ \ {…} , и хотя мы не будем вдаваться в подробности EL здесь, ниже приведены несколько примеров, которые являются достаточными построить наш пример приложения JSP! Значением по умолчанию для isELIgnored является false .
-
isErrorPage ** <% @ page isErrorPage = ”true”%>
isErrorPage говорит, является ли страница страницей с ошибкой. Мы должны указать страницу ошибки, если мы создадим обработчик ошибок для нашей страницы в приложении.
-
isThreadSafe ** <% @ page isThreadSafe = ”false”%>
isThreadSafe имеет значение по умолчанию true . isThreadSafe определяет, может ли JSP использовать многопоточность сервлета. В общем, вы никогда не захотите отключать эту функцию.
-
language ** <% @ page language = ”java”%>
language определяет, какой язык сценариев использовать в JSP. Значением по умолчанию является Java .
-
session ** <% @ page session = ”value”%>
session определяет, поддерживать ли сеанс HTTP. По умолчанию он имеет значение true и принимает значения true или false .
-
trimDirectiveWhitespaces ** <% @ page trimDirectiveWhitespaces = ”true”%>
trimDirectiveWhitespaces удаляет пробелы на странице JSP, уплотняя код в более компактный блок во время компиляции. Установка этого значения в true может помочь уменьшить размер кода JSP. Значение по умолчанию неверно__.
3. Три примера
Теперь, когда мы рассмотрели концепции, являющиеся центральными для JSP, давайте применим эти концепции к некоторым базовым примерам, которые помогут вам запустить и запустить ваш первый сервлет JSP!
Существует три основных способа внедрить Java в .jsp, и мы рассмотрим каждый из этих способов ниже с использованием собственных функций Java 8 и Java EE.
Сначала мы сделаем так, чтобы наша разметка на стороне сервера отображалась на стороне клиента.
Во-вторых, мы рассмотрим, как добавить код Java непосредственно в наш файл .jsp независимо от объектов javax.servlet.http ‘s request и response .
В-третьих, мы продемонстрируем, как перенаправить HttpServletRequest в конкретный .jsp и связать с ним обработанную серверную Java.
Давайте настроим наш проект в Eclipse, используя тип File/New/Project/Web/Dynamic web project/ , который будет размещен в Tomcat!
После создания проекта вы должны увидеть:
|-project
|- WebContent
|- META-INF
|- MANIFEST.MF
|- WEB-INF
|- lib
|- src
Мы собираемся добавить несколько файлов в структуру приложения, чтобы мы получили:
|-project
|- WebContent
|- META-INF
|- MANIFEST.MF
|- WEB-INF
|-lib
** -web.xml
|- ExampleTree.jsp
|- ExampleTwo.jsp
** - index.jsp
|- src
|- com
|- baeldung
** - ExampleOne.java
** - ExampleThree.java
Давайте настроим index.jsp , который будет отображаться при доступе к контексту URL в Tomcat 8:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP Examples</title>
</head>
<body>
<h1>Simple JSP Examples</h1>
<p>Invoke HTML rendered by Servlet: <a href="ExampleOne" target="__blank">here</a></p>
<p>Java in static page: <a href="ExampleTwo.jsp" target="__blank">here</a></p>
<p>Java injected by Servlet: <a href="ExampleThree?message=hello!" target="__blank">here</a></p>
</body>
</html>
Есть три a , каждая из которых связана с одним из примеров, которые мы рассмотрим ниже в разделах с 4.1 по 4.4.
Мы также должны убедиться, что у нас есть настроенный web.xml :
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ExampleOne</servlet-name>
<servlet-class>com.baeldung.ExampleOne</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ExampleOne</servlet-name>
<url-pattern>/ExampleOne</url-pattern>
</servlet-mapping>
Главное замечание здесь - как правильно сопоставить каждый из наших сервлетов с определенным отображением сервлета. Таким образом, каждый сервлет связывается с определенной конечной точкой, где он может потребляться! Теперь мы рассмотрим все остальные файлы ниже!
3.1. HTML отображается в сервлете
В этом примере мы фактически пропустим создание файла .jsp!
Вместо этого мы создадим строковое представление нашей разметки и затем запишем его в ответ GET с помощью PrintWriter после того, как сервлет ExampleOne получит запрос GET
public class ExampleOne extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(
"<!DOCTYPE html><html>" +
"<head>" +
"<meta charset=\"UTF-8\"/>" +
"<title>HTML Rendered by Servlet</title>" +
"</head>" +
"<body>" +
"<h1>HTML Rendered by Servlet</h1></br>" +
"<p>This page was rendered by the ExampleOne Servlet!</p>" +
"</body>" +
"</html>"
);
}
}
То, что мы делаем здесь, - это добавление нашей разметки напрямую через нашу обработку запросов сервлета. Вместо тега JSP мы генерируем наш HTML вместе с любыми вставляемыми специфическими для Java данными, только на стороне сервера без статической JSP!
Ранее мы рассмотрели объект out , который является функцией JspWriter .
Выше я использовал объект PrintWriter , который записывает непосредственно в объект response .
JspWriter фактически буферизует строку для записи в память, которая затем записывается в объекты response после очистки буфера в памяти.
PrintWriter уже присоединен к объекту response . По этим причинам я предпочел писать напрямую в объект response в примерах выше и ниже.
3.2. Java в статическом контенте JSP
Здесь мы создаем файл JSP с именем ExampleTwo.jsp с тегом JSP. Как видно выше, это позволяет добавлять Java непосредственно в нашу разметку. Здесь мы случайным образом печатаем элемент String[] :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<head>
<title>Java in Static Page Example</title>
</head>
<body>
<h1>Java in Static Page Example</h1>
<%
String[]arr = {"What's up?", "Hello", "It's a nice day today!"};
String greetings = arr[(int)(Math.random() ** arr.length)];
%>
<p><%= greetings %></p>
</body>
</html>
Выше вы увидите объявление переменной в объектах тегов JSP:
type variableName и initialization , как обычная Java.
Я включил приведенный выше пример, чтобы продемонстрировать, как добавить Java на статическую страницу, не обращаясь к конкретному сервлету. Здесь Java просто добавляется на страницу, а жизненный цикл JSP берет на себя все остальное.
3.3. JSP с пересылкой
Теперь для нашего последнего и наиболее сложного примера! Здесь мы собираемся использовать аннотацию @ WebServlet для ExampleThree, которая устраняет необходимость в отображениях сервлета в server.xml .
@WebServlet(
name = "ExampleThree",
description = "JSP Servlet With Annotations",
urlPatterns = {"/ExampleThree"}
)
public class ExampleThree extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String message = request.getParameter("message");
request.setAttribute("text", message);
request.getRequestDispatcher("/ExampleThree.jsp").forward(request, response);
}
}
ExampleThree принимает параметр URL, переданный как message , связывает этот параметр с объектом request , а затем перенаправляет этот объект request в ExampleThree.jsp .
Таким образом, мы не только достигли действительно динамического веб-опыта, но и в приложении, содержащем несколько файлов .jsp.
getRequestDispatcher (). forward () - это простой способ убедиться, что отображается правильная страница .jsp.
Все данные, привязанные к объекту request , отправленные его (.jsp файл) способом, будут отображены! Вот как мы справляемся с этой последней частью:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<head>
<title>Java Binding Example</title>
</head>
<body>
<h1>Bound Value</h1>
<p>You said: ${text}</p>
</body>
</html>
Обратите внимание на тег JSP, добавленный в начало ExampleThree.jsp . Вы заметите, что я переключил теги JSP здесь. Я использую язык выражений (который я упоминал ранее) для визуализации нашего параметра set (который связан как $ \ {text} )!
3.4. Попробуйте!
Теперь мы экспортируем наше приложение в .war для запуска и размещения в Tomcat 8! Найдите свой server.xml , и мы обновим наш Context на:
<Context path="/spring-mvc-xml" docBase="${catalina.home}/webapps/spring-mvc-xml">
</Context>
Это позволит нам получить доступ к нашим сервлетам и JSP на localhost: 8080/spring-mvc-xml/jsp/index.jsp ! Возьмите рабочую копию по адресу:
GitHub .
Congrats!
4. Заключение
Мы покрыли довольно много земли! Мы узнали о том, что JavaServer Pages, для чего они были введены для выполнения, их жизненный цикл, как создавать их, и, наконец, несколько различных способов их реализации!
На этом мы заканчиваем введение в JSP! Будьте здоровы и используйте!