JavaRush /Java блог /Random UA /Що таке JSP? Розбираємось з можливостями на практиці
Анзор Кармов
31 рівень
Санкт-Петербург

Що таке JSP? Розбираємось з можливостями на практиці

Стаття з групи Random UA
JSP або Java Server Pages — це технологія Java, яка дозволяє створювати динамічні веб-сторінки для програм Java. У цій статті ми детальніше поговоримо про те, що таке JSP, обговоримо деякі можливості даної технології, розглянемо структуру JSP сторінок, а також спробуємо на практиці поглянути на те, що це Java Server Pages. Що таке JSP?  Розбираємося з можливостями на практиці.Але для початку поговоримо про переваги та важливість JSP. JSP дозволяє розробнику:
  • отримувати дані з веб-сторінки Java-код;
  • надсилати дані з Java коду на веб-сторінку;
  • писати Java-код, прямо всередині html (проте зловживати цим не варто).
Необхідність знання JSP можна оцінити досить високо з кількох причин:
  • JSP – одна з основних Java web-технологій;
  • JSP широко використовується в більшості компаній та проектів;
  • JSP безшовно інтегрується з сервлет Java всередині контейнера сервлетів.

JSP - визначення

Наведу визначення з Вікіпедії: JSP (JavaServer Pages)— технологія, що дозволяє веб-розробникам створювати вміст, що має як статичні, так і динамічні компоненти. Сторінка JSP містить текст двох типів: статичні вихідні дані, які можуть бути оформлені в одному з текстових форматів HTML, SVG, WML, або XML та JSP-елементи, які конструюють динамічний вміст. Крім цього, можуть використовуватися бібліотеки JSP-тегів, а також Expression Language (EL) для впровадження Java-коду в статичний вміст JSP-сторінок. Код JSP-сторінки транслюється в Java-код сервлета за допомогою компілятора JSP-сторінок Jasper, а потім компілюється в байт-код віртуальної машини Java (JVM). Контейнери сервлетів, здатні виконувати JSP-сторінки, написані платформно-незалежною мовою Java. Технологія JSP є платформно-незалежною,

Структура JSP сторінки

Загалом під JSP розуміються динамічні веб-сторінки, у яких динамічна частина генерується з допомогою Java, а статична формується з допомогою мов розмітки, найчастіше HTML. Така сторінка є текстовим документом з розширенням .jsp, написаним однією з мов розмітки (таких як HTML, SVG, WML і XML), з вкрапленнями JSP елементів (або jsp тегів). Всередині даних тегів містяться звернення до серверного коду (даних), а також виконуються деякі обчислення. Дані файли обробляються на сервері, в результаті чого всі JSP теги перетворюються на html теги, і на виході виходить звичайна html сторінка. На схемі нижче представлена ​​діаграма структури JSP сторінки та її взаємодії із сервером. Що таке JSP?  Розбираємось з можливостями на практиці - 2Приклад найпростішої JSP сторінки:
<html>
  <body>
    <p> ${2 + 2} равно 4 </p>
  </body>
</html>
У цьому прикладі всередину html коду "впроваджено" JSP вираз, написаний спеціальною мовою Expression Language (EL) . Він надає важливий механізм взаємодії шару подання (веб-сторінок) із шаром бізнес-логіки програми (Java-коду). Як видно з прикладу, JSP вираз укладено у фігурні дужки, з провідним знаком долара – ${...}. Все, що знаходиться всередині фігурних дужок, обчислюється на сервері, і результат цього виразу наводиться в html, у те місце, де спочатку визначено вираз JSP. Після обробки всіх тегів сторінка набуде наступного вигляду:
<html>
  <body>
    <p> 4 равно 4 </p>
  </body>
</html>

Встановлення та запуск контейнера сервлетів

Оскільки код JSP транслюється в код Java-сервлета, нам потрібно десь роздобути якийсь контейнер сервлетів, щоб ми могли говорити про роботу JSP. Інакше, без контейнера, JSP не почне працювати. Але для початку наведемо визначення контейнера сервлетів. Контейнер сервлетів — програма, яка є сервером, який займається системною підтримкою сервлетів і забезпечує їх життєвий цикл відповідно до правил, визначених у специфікаціях. Може працювати як повноцінний самостійний веб-сервер, бути постачальником сторінок іншого веб-сервера або інтегруватися в Java EE сервер додатків. Одним із найпопулярніших контейнерів сервлетів є Apache Tomcat. Що таке JSP?  Розбираємось з можливостями на практиці - 3Варто зазначити, що Tomcat – це не повноцінний Java EE сервер додатків. Однак для життєвих потреб сервлетів та JSP-сторінок сервера Tomcat більш ніж достатньо. Приступимо до встановлення. Завантажити Tomcat можна з офіційної сторінки . Для Windows встановити томкат можна таким чином:
  1. Завантажуємо 32-bit/64-bit Windows Service Installer.

  2. Запускаємо файл.

  3. Далі слідуємо звичайній процедурі встановлення:

    1. не забуваємо відзначити галочку Examples на відповідному вікні інсталятора:

      Що таке JSP?  Розбираємось з можливостями на практиці - 4
    2. та вказати шлях до попередньо встановленої JRE:

      Що таке JSP?  Розбираємось з можливостями на практиці - 5
  4. Після встановлення запускаємо Tomcat та відкриваємо браузер. Переходимо на http://localhost:8080/ .

Якщо ви бачите стартову сторінку томкату, то установка виконана успішно і сервер запущений. Для запуску та зупинки Tomcat в ручному режимі, можна запустити один з двох файлів, що виконуються в директорії bin. Вона знаходиться всередині директорії, в яку інстальовано Tomcat: Що таке JSP?  Розбираємось з можливостями на практиці - 6

Демонстраційні програми. Приховані об'єкти

Давайте подивимося на деякі можливості JSP у дії. Одна з них – доступ до так званих прихованих об'єктів ( Implicit Objects ). Це об'єкти, до яких можна отримати доступ, використовуючи мову виразів EL (Expression Language). Прикладом таких об'єктів можуть бути HTTP заголовки або параметри URL. Розкриємо (або освіжимо в пам'яті) що таке параметри URL. Нижче наведено URL з параметрами. Параметри виділені жирним шрифтом: http://example.net/foo/bar ?param1=value1¶m2=value2&a=1&name=Tom Параметри завжди починаються із символу питання (?). Далі слідує ім'я параметра, після – через знак рівності – визначається значення параметра. Параметрів може бути кілька чи один. Якщо їх кілька, кожна пара ім'я-значення поділяється символом амперсанда (&). У прикладі вище було визначено кілька параметрів та їх значення:
Ім'я параметра Значення параметра
param1 value1
param2 value2
a 1
name Tom
Погляньмо на те, як можна отримати доступ до прихованих об'єктів у JSP, у тому числі параметрів URL. Для цього запустимо Tomcat і відкриємо браузер на сторінці http://localhost:8080/ Потім перейдемо на сторінку Examples: Що таке JSP?  Розбираємось з можливостями на практиці - 7Після чого перейдемо за посиланням JSP Examples: Що таке JSP?  Розбираємось з можливостями на практиці - 8На сторінці прикладів перейдемо за посиланням Implicit Objects -> Execute: Що таке JSP?  Розбираємось з можливостями на практиці - 9На цій сторінці можна побачити приклад використання прихованих об'єктів. Нижче – скрін сторінки з докладними роз'ясненнями: Що таке JSP?  Розбираємось з можливостями на практиці - 10Спробуйте змінити значення параметраfoo, використовуючи для цього відповідне поле на сторінці, після чого зверніть увагу, що значення даного параметра змінилося також і в адресаному рядку. Представлена ​​сторінка не має великого функціонала, проте вона є гарним довідником, до якого можна звертатися надалі, коли потрібно буде отримати доступ до того чи іншого прихованого об'єкта. На цій сторінці наведено перелік прихованих об'єктів, до яких можна отримати доступ. А нижче в таблиці демонструється, як можна отримати доступ до того чи іншого об'єкта.

JSP функції

Тепер повернемося на попередню сторінку і поглянемо на вихідний код сторінки “приховані об'єкти”: Що таке JSP?  Розбираємось з можливостями на практиці - 11Ось він:
<%@page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

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

    <blockquote>
      <u><b>Change Parameter</b></u>
      <form action="implicit-objects.jsp" method="GET">
          foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}">
          <input type="submit">
      </form>
      <br>
      <code>
        <table border="1">
          <thead>
            <td><b>EL Expression</b></td>
            <td><b>Result</b></td>
          </thead>
          <tr>
            <td>\${param.foo}</td>
            <td>${fn:escapeXml(param["foo"])} </td>
          </tr>
          <tr>
            <td>\${param["foo"]}</td>
            <td>${fn:escapeXml(param["foo"])} </td>
          </tr>
          <tr>
            <td>\${header["host"]}</td>
            <td>${fn:escapeXml(header["host"])} </td>
          </tr>
          <tr>
            <td>\${header["accept"]}</td>
            <td>${fn:escapeXml(header["accept"])} </td>
          </tr>
          <tr>
            <td>\${header["user-agent"]}</td>
            <td>${fn:escapeXml(header["user-agent"])} </td>
          </tr>
        </table>
      </code>
    </blockquote>
  </body>
</html>
Якщо ви знайомі з HTML, вихідний код сторінки має бути цілком зрозумілий. Зверніть увагу на ці рядки:
<tr>
  <td>${param.foo}</td>
  <td>${fn:escapeXml(param["foo"])} </td>
</tr>
Тут ми бачимо html теги <tr>та <td>. За тегами <td>слідують JSP теги, загорнуті у фігурні дужки ${ }. Однак зверніть увагу, як виводиться значення URL параметра foo:
${fn:escapeXml(param["foo"])}
Значення виводиться через використання JSP функції fn:escapeXml(). JSP функції інкапсулюють деяку функціональність, яку можна перевикористовувати. У цьому випадку це екранування XML. Технологія JSP надає широкий вибір функцій на вибір, а також можливість створювати свої власні функції. Щоб використовувати JSP функцію, необхідно імпортувати в JSP файл відповідну бібліотеку, в якій визначено цю функцію.

Бібліотеки тегів

Подивимося ще один рядок вихідного коду (другий рядок), представленого вище:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
Саме в такий спосіб імпортуються бібліотеки тегів. Синтаксис інтуїтивно зрозумілий. Ми визначаємо кілька речей:
  • taglib(tag library – бібліотеку тегів);
  • url, яким розташовується дана бібліотека;
  • префікс (у разі fn) через який можна буде викликати функції визначені у цій бібліотеці.
На прикладі вище ми розглядали імпорт функцій. Саме у нашому прикладі ми імпортували бібліотеку JSTL (JSP Standard Tag Library). JSTL - це стандартна бібліотека тегів, що містить набір різних бібліотек, які поставляються разом з кожною реалізацією сервлетів та JSP, включаючи Tomcat. Ще однією популярною бібліотекою тегів є core, яку можна імпортувати так:
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
Як і у випадку з fn, позначення cопціональне та загальноприйняте. Таке позначення можна зустріти скрізь, де використовуються дані бібліотеки. Наведемо приклад функції з бібліотеки core:
<c:out value = "${'<div>'}"/>
Ця функція просто виведе тег <div>. У цій функції вже здійснюється екранування XML. Ця функція важлива з погляду безпеки, оскільки виводячи значення змінних безпосередньо, через ${variable}, ми відкриваємо двері для скрипт ін'єкцій.

Редагування JSP

Тепер, озброївшись новими знаннями, спробуємо внести зміни до демонстраційної програми всередині Tomcat. Для цього знайдемо вихідний код цієї сторінки всередині папки, в яку було встановлено цей контейнер сервлетів. Даний файл можна знайти за наступною адресаою: ...\Apache Software Foundation\Tomcat 9.0\webapps\examples\jsp\jsp2\el Потім відкриємо в будь-якому текстовому редакторі файл implicit-objects.jsp Додамо імпорт бібліотеки core, а потім з її допомогою здійснимо висновок якогось тексту: Що таке JSP?  Розбираємось з можливостями на практиці - 12Тепер оновимо сторінку прихованих об'єктів та поглянемо на внесені зміни: Що таке JSP?  Розбираємось з можливостями на практиці - 13

Підсумки

Отже, ми поверхово розглянули таку технологію, як JSP. Ми обговорабо:
  • що таке JSP;
  • структуру JSP сторінки;
  • процедуру встановлення та запуску контейнера сервлетів Tomcat;
  • демонстраційний додаток з доступу до прихованих об'єктів, що входить до постачання дистрибутива сервера Tomcat;
  • JSP функції та бібліотеки тегів.

Що далі?

Для закріплення матеріалу можна:
  1. Повторити все описане у цій статті.
  2. Розглянути інші демонстраційні програми, які входять до поставки сервера Tomcat.
  3. Написати самостійно додаток та задеплоїти його в контейнер сервлетів. Як посібник можна скористатися статтею Створення найпростішого веб-проекту в IntelliJ Idea Enterprise. Покроково, з картинками.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ