Что такое JSP? Введение в JavaServer Pages

JavaServer Pages (JSP) - это стандартная технология Java, которая позволяет вам писать динамические, управляемые данными страницы для ваших веб-приложений Java. JSP построен на основе спецификации Java Servlet. Эти две технологии обычно работают вместе, особенно в старых веб-приложениях Java. С точки зрения кодирования наиболее очевидное различие между ними заключается в том, что с сервлетами вы пишете код Java, а затем встраиваете разметку на стороне клиента (например, HTML) в этот код, тогда как с JSP вы начинаете с клиентского скрипта или разметки, а затем вставляете Теги JSP для подключения вашей страницы к серверной части Java.

JSP также тесно связан с JSF (JavaServer Faces), спецификацией Java для создания веб-приложений MVC (модель-представление-контроллер). JSP - это относительно более простая и старая технология, чем JSF, которая является стандартом для веб-фреймворков Java, таких как Eclipse Mojarra, MyFaces и PrimeFaces. Хотя нередко можно увидеть, что JSP используется в качестве интерфейса для старых приложений JSF, Facelets является предпочтительной технологией просмотра для современных реализаций JSF.

Хотя JSP не может быть вашим первым выбором для создания динамических веб-страниц, это основная веб-технология Java. Страницы JSP относительно быстро и легко построить, и они легко взаимодействуют с сервлетами Java в контейнере сервлетов, таком как Tomcat. Вы встретите JSP в старых веб-приложениях Java и время от времени можете найти его полезным для создания простых динамических веб-страниц Java. Как разработчик Java, вы должны хотя бы быть знакомы с JSP.

Эта статья будет кратким введением в JavaServer Pages, включая стандартную библиотеку тегов JSP (JSTL). Примеры показывают, как написать простую HTML-страницу, встроить теги JSP для подключения к сервлету Java и запустить страницу в контейнере сервлета.

См. Предыдущие статьи этой серии, чтобы узнать больше о сервлетах Java и JavaServer Faces.

JSP в Джакарте EE

После выпуска Java EE 8 Oracle передала управление Java Enterprise Edition (Java EE) Eclipse Foundation. В дальнейшем корпоративная платформа Java была переименована в Jakarta EE. Наряду со спецификациями Java Servlet и JSF, JSP является одной из веб-технологий Java, включенных для постоянной поддержки и обновлений в Jakarta EE.

Написание JSP-страниц

Простая страница JSP (.jsp) состоит из разметки HTML, встроенной в теги JSP. Когда файл обрабатывается на сервере, HTML-код отображается как представление приложения, веб-страница. Встроенные теги JSP будут использоваться для вызова кода и данных на стороне сервера. На диаграмме на рисунке 1 показано взаимодействие между HTML, JSP и сервером веб-приложений.

Мэтью Тайсон

В листинге 1 показана простая страница JSP.

Листинг 1. Простая страница JSP.

${2 * 2} should equal 4

В листинге 1 вы видите блок HTML, который включает выражение JSP , которое является инструкцией для сервера Java, написанной с использованием языка выражений (EL). В выражении " ${2 * 2}" " ${}" означает синтаксис JSP для интерполяции кода в HTML. При выполнении JSP выдаст результаты выполнения всего, что находится внутри выражения. В этом случае на выходе будет цифра 4.

JSP в контейнере сервлета

Страницы JSP должны быть развернуты внутри контейнера сервлетов Java. Чтобы развернуть веб-приложение Java на основе JSP и сервлетов, вам нужно упаковать свои файлы .jsp, код Java и метаданные приложения в файл .war, который представляет собой простой файл .zip с традиционной структурой для веб-приложений.

После того, как вы загрузили JSP в контейнер сервлета, он будет скомпилирован в сервлет. JSP и сервлеты Java обладают схожими характеристиками, включая способность получать доступ к объектам запроса и отвечать на них. Apache Tomcat 9x - это эталонная реализация спецификаций Servlet 4.0 и JSP 2.3. (Обратите внимание, что обновления между JSP 2.2 и 2.3 относительно незначительны.)

Контейнер сервлетов и сервер приложений

В мире Java контейнер сервлетов , также известный как веб-сервер, похож на облегченную (пивную) версию сервера приложений. Контейнер сервлетов обрабатывает взаимодействия запросов и ответов и позволяет этим взаимодействиям взаимодействовать с подмножеством корпоративных возможностей Java для веб-приложений. Сервер приложений Java включает контейнер сервлетов как часть полного корпоративного стека Java, включая EJB, JPA, JMS и другие.

Пример приложения для JSP

Мы будем использовать пример приложения в Tomcat, чтобы начать работу с JavaServer Pages. Если у вас еще не установлен Tomcat, перейдите на страницу загрузки Tomcat и выберите установку Tomcat для своей операционной системы. На момент написания этой статьи Tomcat 9 является текущим выпуском, совместимым с Servlet 4.0 и JSP 2.3.

Вы можете установить Tomcat как службу Windows или запустить его из командной строки с помощью /bin/catalina.sh startили /bin/catalina.bat. В любом случае запустите Tomcat, а затем перейдите на localhost:8080страницу приветствия Tomcat, показанную на рисунке 2.

Мэтью Тайсон

Неявные объекты в Tomcat

На странице приветствия Tomcat щелкните ссылку " Примеры" , затем щелкните " Примеры JSP" .

Затем откройте веб-приложение Implicit Objects Execute . На рисунке 3 показаны выходные данные для этого приложения. Найдите минутку, чтобы изучить этот вывод.

Мэтью Тайсон

Параметры запроса

Неявные объекты - это встроенные объекты, доступные через страницу JSP. Как разработчик веб-страницы вы будете использовать эти объекты для создания доступа к таким вещам, как параметры запроса , которые представляют собой данные, отправляемые браузером при отправке HTTP-запроса. Рассмотрим URL-адрес браузера для неявных объектов:

 //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar 

Параметр есть ?foo=bar, и вы можете увидеть его отражение в выводе на веб-странице, где в таблице показано «Выражение EL», а значение - «bar». Чтобы проверить это, измените URL-адрес на //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=zork , нажмите Enter , и вы увидите изменение, отраженное в выходных данных.

Этот пример представляет собой очень простое введение в использование тегов JSP для доступа к параметрам запроса на стороне сервера. В этом случае страница JSP использует встроенный (неявный) объект, вызываемый paramдля доступа к параметрам запроса веб-приложения. paramОбъект доступен внутри синтаксиса выражений JSP , который вы видели в листинге 1.

В этом примере мы использовали выражение для некоторых математических вычислений:, ${2 * 2}которое выводит 4.

В этом примере, выражение используется для доступа к объекту и поле на этом объекте: ${param.foo}.

JSP в веб-приложении

На странице "Неявные объекты" щелкните стрелку назад, а затем ссылку " Источник" . Это приведет вас к коду JSP для веб-приложения Implicit Objects, который показан в листинге 2.

Листинг 2. Код JSP для веб-приложения Implicit Objects.

     JSP 2.0 Expression Language - Implicit Objects   
    
This example illustrates some of the implicit objects available in the Expression Language. The following implicit objects are available (not all illustrated here):
  • pageContext - the PageContext object
  • pageScope - a Map that maps page-scoped attribute names to their values
  • requestScope - a Map that maps request-scoped attribute names to their values
  • sessionScope - a Map that maps session-scoped attribute names to their values
  • applicationScope - a Map that maps application-scoped attribute names to their values
  • param - a Map that maps parameter names to a single String parameter value
  • paramValues - a Map that maps parameter names to a String[] of all values for that parameter
  • header - a Map that maps header names to a single String header value
  • headerValues - a Map that maps header names to a String[] of all values for that header
  • initParam - a Map that maps context initialization parameter names to their String parameter value
  • cookie - a Map that maps cookie names to a single Cookie object.
Change Parameter foo =

EL Expression Result
\${param.foo} ${fn:escapeXml(param["foo"])}
\${param["foo"]} ${fn:escapeXml(param["foo"])}
\${header["host"]} ${fn:escapeXml(header["host"])}
\${header["accept"]} ${fn:escapeXml(header["accept"])}
\${header["user-agent"]} ${fn:escapeXml(header["user-agent"])}

JSP functions

If you're familiar with HTML, then Listing 2 should look pretty familiar. You have the expected HTML elements, followed by the ${ } JSP expression syntax introduced in Listing 1. But notice the value for param.foo: ${fn:escapeXml(param["foo"])} . The "fn:escapeXML()" is a JSP function.

A JSP function encapsulates a chunk of reusable functionality. In this case, the functionality is to escape XML. JSP offers a variety of functions, and you can also create functions yourself. To use a function, you import its library into your JSP page, then call the function.

In Listing 2, the escapeXML function is included with the line:

The syntax is pretty clear: it imports the required functions and assigns them a prefix (in this case "fn") that can be used in all following expressions.

The JSP Standard Tag Library (JSTL)

The import line in Listing 2 calls taglib, which is short for tag library, or (in this case) JSP Standard Tag Library (JSTL). Tag libraries define reusable bits of functionality for JSP. JSTL is the standard tag library, containing a collection of taglibs that ship with every servlet and JSP implementation, including Tomcat.

The "functions" library is just one of the taglibs included with JSTL. Another common taglib is the core library, which you import by calling:

Like "fn", the "c" designation is conventional, and you will see it across most JSP pages.

Securing JSP pages

An example tag from the core library is


    

which outputs the tag with the XML already escaped. This function is important because outputting content directly to a web page via ${variable} opens the door to script injection attacks. This simple function is used to protect web pages from such attacks.

The core library also includes various tags for iteration and flow control (like IF/ELSE handling).

JSTL tag classifications

There are five sets of tags included in JSTL, each designed for a specific area of web application functionality:

  • JSTL core: Dealing with logic and execution flow; conventional tag: "c"
  • JSTL formatting: Dealing with formatting (like dates) and internationalization; conventional tag: "fmt".
  • JSTL SQL: Dealing with querying SQL databases (this is usually discouraged in the view layer); conventional tag: "sql".
  • JSTL XML: Dealing with working with XML documents; conventional tag: "x".
  • JSTL functions: Dealing primarily with String manipulations; conventional tag: "fn".

Calling taglibs in JSP pages

Now that you've got a handle on JSP basics, let's make a change to the example application. To start, locate the Implicit Object app in your Tomcat installation. The path is: apache-tomcat-8.5.33/webapps/examples/jsp/jsp2/el.

Open this file and locate the functions include:

just below this line, add a new line:

Hit Return and add another new line:

Now reload the page at //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar.

Вы должны увидеть свои обновления, отраженные в выводе.