Руководство по страницам JavaServer (JSP)

Содержание

  • ссылка: #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 ! Возьмите рабочую копию по адресу:

Congrats!

4. Заключение

Мы покрыли довольно много земли! Мы узнали о том, что JavaServer Pages, для чего они были введены для выполнения, их жизненный цикл, как создавать их, и, наконец, несколько различных способов их реализации!

На этом мы заканчиваем введение в JSP! Будьте здоровы и используйте!