Учебники

JSP — Краткое руководство

JSP — Обзор

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

Компонент JavaServer Pages — это тип сервлета Java, предназначенный для выполнения роли пользовательского интерфейса для веб-приложения Java. Веб-разработчики пишут JSP в виде текстовых файлов, которые объединяют код HTML или XHTML, элементы XML и встроенные действия и команды JSP.

Используя JSP, вы можете собирать информацию от пользователей через формы веб-страниц, представлять записи из базы данных или другого источника и динамически создавать веб-страницы.

Теги JSP могут использоваться для различных целей, таких как получение информации из базы данных или регистрация пользовательских настроек, доступ к компонентам JavaBeans, передача управления между страницами и обмен информацией между запросами, страницами и т. Д.

Зачем использовать JSP?

Страницы JavaServer часто служат той же цели, что и программы, реализованные с использованием Common Gateway Interface (CGI) . Но JSP предлагает несколько преимуществ по сравнению с CGI.

  • Производительность значительно выше, поскольку JSP позволяет встраивать динамические элементы в сами страницы HTML, а не в отдельные файлы CGI.

  • JSP всегда компилируется перед обработкой сервером, в отличие от CGI / Perl, который требует, чтобы сервер загружал интерпретатор и целевой скрипт каждый раз, когда запрашивается страница.

  • Страницы JavaServer построены поверх API сервлетов Java, поэтому, как и сервлеты, JSP также имеет доступ ко всем мощным API-интерфейсам Enterprise Java, включая JDBC, JNDI, EJB, JAXP и т. Д.

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

Производительность значительно выше, поскольку JSP позволяет встраивать динамические элементы в сами страницы HTML, а не в отдельные файлы CGI.

JSP всегда компилируется перед обработкой сервером, в отличие от CGI / Perl, который требует, чтобы сервер загружал интерпретатор и целевой скрипт каждый раз, когда запрашивается страница.

Страницы JavaServer построены поверх API сервлетов Java, поэтому, как и сервлеты, JSP также имеет доступ ко всем мощным API-интерфейсам Enterprise Java, включая JDBC, JNDI, EJB, JAXP и т. Д.

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

Наконец, JSP является неотъемлемой частью Java EE, полной платформы для приложений корпоративного класса. Это означает, что JSP может играть роль от самых простых приложений до самых сложных и требовательных.

Преимущества JSP

В следующей таблице перечислены другие преимущества использования JSP по сравнению с другими технологиями.

против активных серверных страниц (ASP)

Преимущества JSP двояки. Во-первых, динамическая часть написана на Java, а не на Visual Basic или другом языке, специфичном для MS, поэтому она более мощная и простая в использовании. Во-вторых, он переносим на другие операционные системы и веб-серверы других производителей.

против чистых сервлетов

Более удобно писать (и изменять!) Обычный HTML, чем иметь множество операторов println, которые генерируют HTML.

Включение на стороне сервера (SSI)

На самом деле SSI предназначен только для простых включений, а не для «реальных» программ, которые используют данные форм, устанавливают соединения с базой данных и тому подобное.

против JavaScript

JavaScript может генерировать HTML динамически на клиенте, но вряд ли может взаимодействовать с веб-сервером для выполнения сложных задач, таких как доступ к базе данных, обработка изображений и т. Д.

статический HTML

Обычный HTML, конечно, не может содержать динамическую информацию.

Что дальше?

Я хотел бы шаг за шагом настроить вашу среду, чтобы начать с JSP. Я предполагаю, что вы хорошо разбираетесь в программировании на Java, чтобы приступить к изучению JSP.

Если вы не знакомы с языком программирования Java, мы рекомендуем вам изучить наше руководство по Java, чтобы понять программирование на Java.

JSP — Настройка среды

Среда разработки — это место, где вы разрабатываете свои программы JSP, тестируете их и, наконец, запускаете их.

Это руководство поможет вам настроить среду разработки JSP, которая включает в себя следующие шаги:

Настройка Java Development Kit

Этот шаг включает в себя загрузку реализации Java Software Development Kit (SDK) и соответствующую настройку переменной среды PATH.

Вы можете скачать SDK с сайта Oracle на Java — Java SE Downloads .

После загрузки реализации Java следуйте приведенным инструкциям, чтобы установить и настроить установку. Наконец, установите переменные среды PATH и JAVA_HOME, чтобы они ссылались на каталог, который содержит java и javac , обычно java_install_dir / bin и java_install_dir соответственно.

Если вы используете Windows и устанавливаете SDK в C: \ jdk1.5.0_20 , вам необходимо добавить следующую строку в ваш файл C: \ autoexec.bat .

set PATH = C:\jdk1.5.0_20\bin;%PATH%
set JAVA_HOME = C:\jdk1.5.0_20

Кроме того, в Windows NT / 2000 / XP вы также можете щелкнуть правой кнопкой мыши на « Мой компьютер» , выбрать « Свойства» , затем « Дополнительно» , а затем « Переменные среды» . Затем вы обновите значение PATH и нажмете кнопку ОК.

В Unix (Solaris, Linux и т. Д.), Если SDK установлен в /usr/local/jdk1.5.0_20 и вы используете оболочку C, вы добавите следующее в ваш файл .cshrc .

setenv PATH /usr/local/jdk1.5.0_20/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.5.0_20

В качестве альтернативы, если вы используете интегрированную среду разработки (IDE), такую ​​как Borland JBuilder, Eclipse, IntelliJ IDEA или Sun ONE Studio , скомпилируйте и запустите простую программу, чтобы убедиться, что IDE знает, где вы установили Java.

Настройка веб-сервера: Tomcat

На рынке доступно несколько веб-серверов, поддерживающих разработку JavaServer Pages и Servlets. Некоторые веб-серверы можно скачать бесплатно, и Tomcat является одним из них.

Apache Tomcat — это программная реализация с открытым исходным кодом технологий JavaServer Pages и Servlet, которая может выступать в качестве автономного сервера для тестирования JSP и сервлетов и может быть интегрирована с веб-сервером Apache. Вот шаги для настройки Tomcat на вашем компьютере —

  • Загрузите последнюю версию Tomcat с https://tomcat.apache.org/ .

  • После загрузки установки распакуйте бинарный дистрибутив в удобное место. Например, в C: \ apache-tomcat-5.5.29 для Windows или /usr/local/apache-tomcat-5.5.29 в Linux / Unix и создайте переменную среды CATALINA_HOME, указывающую на эти места.

Загрузите последнюю версию Tomcat с https://tomcat.apache.org/ .

После загрузки установки распакуйте бинарный дистрибутив в удобное место. Например, в C: \ apache-tomcat-5.5.29 для Windows или /usr/local/apache-tomcat-5.5.29 в Linux / Unix и создайте переменную среды CATALINA_HOME, указывающую на эти места.

Tomcat можно запустить, выполнив следующие команды на компьютере с Windows:

%CATALINA_HOME%\bin\startup.bat
 
or
 
C:\apache-tomcat-5.5.29\bin\startup.bat

Tomcat можно запустить, выполнив следующие команды на компьютере с Unix (Solaris, Linux и т. Д.):

$CATALINA_HOME/bin/startup.sh
 
or
 
/usr/local/apache-tomcat-5.5.29/bin/startup.sh

После успешного запуска стандартные веб-приложения, включенные в Tomcat, будут доступны по адресу http: // localhost: 8080 / .

После выполнения вы получите следующий вывод —

Tomcat Домашняя страница

Дополнительную информацию о настройке и запуске Tomcat можно найти в документации, включенной здесь, а также на веб-сайте Tomcat — https://tomcat.apache.org/ .

Tomcat можно остановить, выполнив следующие команды на компьютере с Windows:

%CATALINA_HOME%\bin\shutdown
or

C:\apache-tomcat-5.5.29\bin\shutdown

Tomcat можно остановить, выполнив следующие команды на компьютере с Unix (Solaris, Linux и т. Д.):

$CATALINA_HOME/bin/shutdown.sh

or

/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh

Настройка CLASSPATH

Поскольку сервлеты не являются частью Java Platform Standard Edition, вы должны идентифицировать классы сервлетов для компилятора.

Если вы работаете в Windows, вам нужно поместить следующие строки в ваш файл C: \ autoexec.bat .

set CATALINA = C:\apache-tomcat-5.5.29
set CLASSPATH = %CATALINA%\common\lib\jsp-api.jar;%CLASSPATH%

Кроме того, в Windows NT / 2000 / XP вы также можете щелкнуть правой кнопкой мыши Мой компьютер , выбрать Свойства , затем Дополнительно , затем Переменные среды . Затем вы обновите значение CLASSPATH и нажмете кнопку ОК.

В Unix (Solaris, Linux и т. Д.), Если вы используете оболочку C, вы должны поместить следующие строки в ваш файл .cshrc .

setenv CATALINA = /usr/local/apache-tomcat-5.5.29
setenv CLASSPATH $CATALINA/common/lib/jsp-api.jar:$CLASSPATH

ПРИМЕЧАНИЕ. — Если предположить, что вашим каталогом разработки является C: \ JSPDev (Windows) или / usr / JSPDev (Unix) , то вам также необходимо добавить эти каталоги в CLASSPATH.

JSP — Архитектура

Веб-серверу нужен механизм JSP, т. Е. Контейнер для обработки страниц JSP. Контейнер JSP отвечает за перехват запросов для страниц JSP. В этом руководстве используется Apache со встроенным контейнером JSP для поддержки разработки страниц JSP.

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

На следующем рисунке показано расположение контейнера JSP и файлов JSP в веб-приложении.

Архитектура JSP

Обработка JSP

Следующие шаги объясняют, как веб-сервер создает веб-страницу с использованием JSP —

  • Как и на обычной странице, ваш браузер отправляет HTTP-запрос на веб-сервер.

  • Веб-сервер распознает, что HTTP-запрос предназначен для страницы JSP, и перенаправляет его в механизм JSP. Это делается с помощью страницы URL или JSP, которая заканчивается на .jsp вместо .html .

  • Механизм JSP загружает страницу JSP с диска и преобразует ее в содержимое сервлета. Это преобразование очень простое, в котором весь текст шаблона преобразуется в операторы println (), а все элементы JSP преобразуются в код Java. Этот код реализует соответствующее динамическое поведение страницы.

  • Механизм JSP компилирует сервлет в исполняемый класс и перенаправляет исходный запрос в механизм сервлета.

  • Часть веб-сервера, называемая механизмом сервлетов, загружает класс Servlet и выполняет его. Во время выполнения сервлет производит вывод в формате HTML. Выходные данные далее передаются на веб-сервер механизмом сервлетов в ответе HTTP.

  • Веб-сервер перенаправляет HTTP-ответ вашему браузеру с точки зрения статического HTML-содержимого.

  • Наконец, веб-браузер обрабатывает динамически генерируемую HTML-страницу внутри HTTP-ответа точно так же, как если бы это была статическая страница.

Как и на обычной странице, ваш браузер отправляет HTTP-запрос на веб-сервер.

Веб-сервер распознает, что HTTP-запрос предназначен для страницы JSP, и перенаправляет его в механизм JSP. Это делается с помощью страницы URL или JSP, которая заканчивается на .jsp вместо .html .

Механизм JSP загружает страницу JSP с диска и преобразует ее в содержимое сервлета. Это преобразование очень простое, в котором весь текст шаблона преобразуется в операторы println (), а все элементы JSP преобразуются в код Java. Этот код реализует соответствующее динамическое поведение страницы.

Механизм JSP компилирует сервлет в исполняемый класс и перенаправляет исходный запрос в механизм сервлета.

Часть веб-сервера, называемая механизмом сервлетов, загружает класс Servlet и выполняет его. Во время выполнения сервлет производит вывод в формате HTML. Выходные данные далее передаются на веб-сервер механизмом сервлетов в ответе HTTP.

Веб-сервер перенаправляет HTTP-ответ вашему браузеру с точки зрения статического HTML-содержимого.

Наконец, веб-браузер обрабатывает динамически генерируемую HTML-страницу внутри HTTP-ответа точно так же, как если бы это была статическая страница.

Все вышеупомянутые шаги можно увидеть на следующей диаграмме —

Обработка JSP

Как правило, механизм JSP проверяет, существует ли сервлет для файла JSP и существует ли дата модификации в JSP старше, чем сервлет. Если JSP старше своего сгенерированного сервлета, контейнер JSP предполагает, что JSP не изменился и что сгенерированный сервлет по-прежнему соответствует содержимому JSP. Это делает процесс более эффективным, чем с другими языками сценариев (например, PHP), и, следовательно, быстрее.

Таким образом, страница JSP — это просто еще один способ написания сервлета без необходимости быть мастером программирования на Java. За исключением фазы перевода, страница JSP обрабатывается точно так же, как обычный сервлет.

JSP — жизненный цикл

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

Жизненный цикл JSP определяется как процесс от его создания до разрушения. Это похоже на жизненный цикл сервлета с дополнительным этапом, который требуется для компиляции JSP в сервлет.

Пути, которым следует JSP

Ниже приведены пути, по которым следует JSP.

  • компиляция
  • инициализация
  • выполнение
  • уборка

Четыре основных этапа жизненного цикла JSP очень похожи на жизненный цикл сервлета. Четыре этапа были описаны ниже —

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

Компиляция JSP

Когда браузер запрашивает JSP, механизм JSP сначала проверяет, нужно ли ему компилировать страницу. Если страница никогда не компилировалась или если JSP был изменен с момента последней компиляции, механизм JSP компилирует страницу.

Процесс компиляции включает в себя три этапа —

  • Разбор JSP.
  • Превращение JSP в сервлет.
  • Компиляция сервлета.

Инициализация JSP

Когда контейнер загружает JSP, он вызывает метод jspInit () перед обслуживанием любых запросов. Если вам нужно выполнить JSP-специфическую инициализацию, переопределите метод jspInit ()

public void jspInit(){
   // Initialization code...
}

Как правило, инициализация выполняется только один раз, и, как и в случае с методом init сервлета, вы обычно инициализируете соединения с базой данных, открываете файлы и создаете таблицы поиска в методе jspInit.

Исполнение JSP

Эта фаза жизненного цикла JSP представляет все взаимодействия с запросами, пока JSP не будет уничтожен.

Всякий раз, когда браузер запрашивает JSP, а страница загружается и инициализируется, механизм JSP вызывает метод _jspService () в JSP.

Метод _jspService () принимает HttpServletRequest и HttpServletResponse в качестве своих параметров следующим образом:

void _jspService(HttpServletRequest request, HttpServletResponse response) {
   // Service handling code...
}

Метод _jspService () JSP вызывается по запросу. Он отвечает за генерацию ответа на этот запрос, а этот метод также отвечает за генерацию ответов на все семь методов HTTP, т. Е. GET, POST, DELETE и т. Д.

Очистка JSP

Фаза уничтожения жизненного цикла JSP представляет собой момент, когда JSP удаляется из использования контейнером.

Метод jspDestroy () является JSP-эквивалентом метода destroy для сервлетов. Переопределите jspDestroy, когда вам нужно выполнить какую-либо очистку, такую ​​как освобождение соединений с базой данных или закрытие открытых файлов.

Метод jspDestroy () имеет следующую форму —

public void jspDestroy() {
   // Your cleanup code goes here.
}

JSP — Синтаксис

В этой главе мы обсудим синтаксис в JSP. Мы поймем основное использование простого синтаксиса (то есть элементов), связанного с разработкой JSP.

Элементы JSP

Элементы JSP были описаны ниже —

Скриплет

Скриплет может содержать любое количество операторов языка JAVA, объявлений переменных или методов или выражений, допустимых на языке сценариев страниц.

Ниже приводится синтаксис Scriptlet —

<% code fragment %>

Вы можете написать XML-эквивалент вышеуказанного синтаксиса следующим образом:

<jsp:scriptlet>
   code fragment
</jsp:scriptlet>

Любой текст, теги HTML или элементы JSP, которые вы пишете, должны находиться за пределами скриптлета. Ниже приведен простой и первый пример для JSP:

<html>
   <head><title>Hello World</title></head>
   
   <body>
      Hello World!<br/>
      <%
         out.println("Your IP address is " + request.getRemoteAddr());
      %>
   </body>
</html>

ПРИМЕЧАНИЕ. — При условии, что Apache Tomcat установлен в C: \ apache-tomcat-7.0.2, а ваша среда настроена в соответствии с руководством по настройке среды.

Давайте сохраним приведенный выше код в файле JSP hello.jsp и поместим этот файл в каталог C: \ apache-tomcat7.0.2 \ webapps \ ROOT . Просмотрите то же самое, используя URL http: // localhost: 8080 / hello.jsp . Приведенный выше код сгенерирует следующий результат —

Привет, мир

Декларации JSP

Объявление объявляет одну или несколько переменных или методов, которые вы можете использовать в коде Java позже в файле JSP. Вы должны объявить переменную или метод, прежде чем использовать его в файле JSP.

Ниже приводится синтаксис для объявлений JSP —

<%! declaration; [ declaration; ]+ ... %>

Вы можете написать XML-эквивалент вышеуказанного синтаксиса следующим образом:

<jsp:declaration>
   code fragment
</jsp:declaration>

Ниже приведен пример для деклараций JSP:

<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Circle a = new Circle(2.0); %> 

JSP Expression

Элемент выражения JSP содержит выражение языка сценариев, которое оценивается, преобразуется в строку и вставляется там, где выражение появляется в файле JSP.

Поскольку значение выражения преобразуется в строку, вы можете использовать выражение в строке текста, независимо от того, помечено ли оно тегом HTML, в файле JSP.

Элемент expression может содержать любое выражение, допустимое в соответствии со спецификацией языка Java, но вы не можете использовать точку с запятой для завершения выражения.

Ниже приведен синтаксис выражения JSP —

<%= expression %>

Вы можете написать XML-эквивалент вышеуказанного синтаксиса следующим образом:

<jsp:expression>
   expression
</jsp:expression>

В следующем примере показано выражение JSP —

<html> 
   <head><title>A Comment Test</title></head> 
   
   <body>
      <p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>
   </body> 
</html> 

Приведенный выше код сгенерирует следующий результат —

Today's date: 11-Sep-2010 21:24:25

Today’s date: 11-Sep-2010 21:24:25

Комментарии JSP

Комментарий JSP отмечает текст или операторы, которые контейнер JSP должен игнорировать. Комментарий JSP полезен, когда вы хотите скрыть или «закомментировать» часть вашей страницы JSP.

Ниже приводится синтаксис комментариев JSP —

<%-- This is JSP comment --%>

В следующем примере показаны комментарии JSP —

<html> 
   <head><title>A Comment Test</title></head> 
   
   <body> 
      <h2>A Test of Comments</h2> 
      <%-- This comment will not be visible in the page source --%> 
   </body> 
</html> 

Приведенный выше код сгенерирует следующий результат —

A Test of Comments

Существует небольшое количество специальных конструкций, которые вы можете использовать в различных случаях для вставки комментариев или символов, которые иначе были бы обработаны специально. Вот резюме —

S.No. Синтаксис и цель
1

<% — комментарий -%>

Комментарий JSP. Игнорируется двигателем JSP.

2

<! — комментарий ->

HTML-комментарий. Игнорируется браузером.

3

<\%

Представляет статический <% литерал.

4

% \>

Представляет статический%> литерал.

5

Одиночная кавычка в атрибуте, который использует одинарные кавычки.

6

Двойная кавычка в атрибуте, который использует двойные кавычки.

<% — комментарий -%>

Комментарий JSP. Игнорируется двигателем JSP.

<! — комментарий ->

HTML-комментарий. Игнорируется браузером.

<\%

Представляет статический <% литерал.

% \>

Представляет статический%> литерал.

Одиночная кавычка в атрибуте, который использует одинарные кавычки.

Двойная кавычка в атрибуте, который использует двойные кавычки.

Директивы JSP

Директива JSP влияет на общую структуру класса сервлета. Это обычно имеет следующую форму —

<%@ directive attribute="value" %>

Существует три типа директив тега —

S.No. Директива и описание
1

<% @ page …%>

Определяет зависящие от страницы атрибуты, такие как язык сценариев, страница ошибок и требования к буферизации.

2

<% @ include …%>

Включает файл на этапе перевода.

3

<% @ taglib …%>

Объявляет библиотеку тегов, содержащую пользовательские действия, используемые на странице

<% @ page …%>

Определяет зависящие от страницы атрибуты, такие как язык сценариев, страница ошибок и требования к буферизации.

<% @ include …%>

Включает файл на этапе перевода.

<% @ taglib …%>

Объявляет библиотеку тегов, содержащую пользовательские действия, используемые на странице

Мы объясним директиву JSP в отдельной главе JSP — Директивы

Действия JSP

Действия JSP используют конструкции в синтаксисе XML для управления поведением механизма сервлета. Вы можете динамически вставлять файл, повторно использовать компоненты JavaBeans, перенаправлять пользователя на другую страницу или генерировать HTML для плагина Java.

Для элемента Action существует только один синтаксис, так как он соответствует стандарту XML —

<jsp:action_name attribute="value" />

Элементы действия — это в основном предопределенные функции. В следующей таблице перечислены доступные действия JSP.

S.No. Синтаксис и цель
1

JSP: включить

Включает файл во время запроса страницы.

2

JSP: useBean

Находит или создает экземпляр JavaBean.

3

JSP: SetProperty

Устанавливает свойство JavaBean.

4

JSP: GetProperty

Вставляет свойство JavaBean в вывод.

5

JSP: вперед

Переадресует запрос на новую страницу.

6

JSP: плагин

Генерирует специфичный для браузера код, который создает тег OBJECT или EMBED для плагина Java.

7

JSP: элемент

Определяет элементы XML динамически.

8

JSP: атрибут

Определяет динамически определенный атрибут элемента XML.

9

JSP: тело

Определяет динамически определяемое тело XML-элемента.

10

JSP: текст

Используется для написания текста шаблона на страницах и документах JSP.

JSP: включить

Включает файл во время запроса страницы.

JSP: useBean

Находит или создает экземпляр JavaBean.

JSP: SetProperty

Устанавливает свойство JavaBean.

JSP: GetProperty

Вставляет свойство JavaBean в вывод.

JSP: вперед

Переадресует запрос на новую страницу.

JSP: плагин

Генерирует специфичный для браузера код, который создает тег OBJECT или EMBED для плагина Java.

JSP: элемент

Определяет элементы XML динамически.

JSP: атрибут

Определяет динамически определенный атрибут элемента XML.

JSP: тело

Определяет динамически определяемое тело XML-элемента.

JSP: текст

Используется для написания текста шаблона на страницах и документах JSP.

Мы объясним действия JSP в отдельной главе JSP — Действия

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

JSP поддерживает девять автоматически определенных переменных, которые также называются неявными объектами. Эти переменные —

S.No. Объект и описание
1

запрос

Это объект HttpServletRequest, связанный с запросом.

2

ответ

Это объект HttpServletResponse, связанный с ответом клиенту.

3

из

Это объект PrintWriter, используемый для отправки вывода клиенту.

4

сессия

Это объект HttpSession, связанный с запросом.

5

приложение

Это объект ServletContext, связанный с контекстом приложения.

6

конфиг

Это объект ServletConfig, связанный со страницей.

7

PageContext

Это инкапсулирует использование специфичных для сервера функций, таких как JspWriters с более высокой производительностью.

8

страница

Это просто синоним этого и используется для вызова методов, определенных переведенным классом сервлета.

9

исключение

Объект Exception позволяет получить доступ к данным исключения с помощью назначенного JSP.

запрос

Это объект HttpServletRequest, связанный с запросом.

ответ

Это объект HttpServletResponse, связанный с ответом клиенту.

из

Это объект PrintWriter, используемый для отправки вывода клиенту.

сессия

Это объект HttpSession, связанный с запросом.

приложение

Это объект ServletContext, связанный с контекстом приложения.

конфиг

Это объект ServletConfig, связанный со страницей.

PageContext

Это инкапсулирует использование специфичных для сервера функций, таких как JspWriters с более высокой производительностью.

страница

Это просто синоним этого и используется для вызова методов, определенных переведенным классом сервлета.

исключение

Объект Exception позволяет получить доступ к данным исключения с помощью назначенного JSP.

Мы объясним JSP Implicit Objects в отдельной главе JSP — Неявные Объекты .

Заявления о потоке управления

Вы можете использовать все API и строительные блоки Java в своем JSP-программировании, включая операторы принятия решений, циклы и т. Д.

Заявления о принятии решений

Блок if … else начинается как обычный Scriptlet, но Scriptlet закрывается в каждой строке HTML-текстом, включенным между тегами Scriptlet.

<%! int day = 3; %> 
<html> 
   <head><title>IF...ELSE Example</title></head> 
   
   <body>
      <% if (day == 1 || day == 7) { %>
         <p> Today is weekend</p>
      <% } else { %>
         <p> Today is not weekend</p>
      <% } %>
   </body> 
</html> 

Приведенный выше код сгенерирует следующий результат —

Today is not weekend

Теперь посмотрим на следующий параметр switch … case, который был написан несколько иначе с использованием out.println () и внутри Scriptletas —

<%! int day = 3; %> 
<html> 
   <head><title>SWITCH...CASE Example</title></head> 
   
   <body>
      <% 
         switch(day) {
            case 0:
               out.println("It\'s Sunday.");
               break;
            case 1:
               out.println("It\'s Monday.");
               break;
            case 2:
               out.println("It\'s Tuesday.");
               break;
            case 3:
               out.println("It\'s Wednesday.");
               break;
            case 4:
               out.println("It\'s Thursday.");
               break;
            case 5:
               out.println("It\'s Friday.");
               break;
            default:
               out.println("It's Saturday.");
         }
      %>
   </body> 
</html> 

Приведенный выше код сгенерирует следующий результат —

It's Wednesday.

It’s Wednesday.

Loop Заявления

Вы также можете использовать три основных типа циклических блоков в Java: блоки for, while и do… while в вашем JSP-программировании.

Давайте посмотрим на следующий пример цикла —

<%! int fontSize; %> 
<html> 
   <head><title>FOR LOOP Example</title></head> 
   
   <body>
      <%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
         <font color = "green" size = "<%= fontSize %>">
            JSP Tutorial
      </font><br />
      <%}%>
   </body> 
</html> 

Приведенный выше код сгенерирует следующий результат —


   JSP Tutorial
 
JSP Tutorial
JSP Tutorial

Приведенный выше пример может быть записан с использованием цикла while следующим образом:

<%! int fontSize; %> 
<html> 
   <head><title>WHILE LOOP Example</title></head> 
   
   <body>
      <%while ( fontSize <= 3){ %>
         <font color = "green" size = "<%= fontSize %>">
            JSP Tutorial
         </font><br />
         <%fontSize++;%>
      <%}%>
   </body> 
</html> 

Приведенный выше код сгенерирует следующий результат —


   JSP Tutorial



   JSP Tutorial



   JSP Tutorial

Операторы JSP

JSP поддерживает все логические и арифметические операторы, поддерживаемые Java. В следующей таблице перечислены все операторы с наивысшим приоритетом, которые отображаются вверху таблицы, а операторы с наименьшим приоритетом — внизу.

Внутри выражения операторы с более высоким приоритетом будут оцениваться первыми.

категория оператор Ассоциативность
постфикс () []. (оператор точки) Слева направо
Одинарный ++ — -! ~ Справа налево
Multiplicative * /% Слева направо
присадка + — Слева направо
сдвиг >> >>> << Слева направо
реляционный >> = <<= Слева направо
равенство ==! = Слева направо
Побитовое И & Слева направо
Побитовый XOR ^ Слева направо
Побитовое ИЛИ | Слева направо
Логическое И && Слева направо
Логическое ИЛИ || Слева направо
условный ?: Справа налево
присваивание = + = — = * = / =% = >> = << = & = ^ = | = Справа налево
запятая , Слева направо

JSP Литералы

Язык выражений JSP определяет следующие литералы —

  • Логическое — верно и неверно

  • Целое число — как в Java

  • С плавающей точкой — как в Java

  • Строка — с одинарными и двойными кавычками; «экранируется как \», «экранируется как \», а \ экранируется как \\.

  • Нуль — ноль

Логическое — верно и неверно

Целое число — как в Java

С плавающей точкой — как в Java

Строка — с одинарными и двойными кавычками; «экранируется как \», «экранируется как \», а \ экранируется как \\.

Нуль — ноль

JSP — Директивы

В этой главе мы обсудим Директивы в JSP. Эти директивы предоставляют указания и инструкции контейнеру, рассказывая ему, как обрабатывать определенные аспекты обработки JSP.

Директива JSP влияет на общую структуру класса сервлета. Это обычно имеет следующую форму —

<%@ directive attribute = "value" %>

Директивы могут иметь ряд атрибутов, которые вы можете перечислить в виде пар ключ-значение и разделить запятыми.

Пробелы между символом @ и именем директивы, а также между последним атрибутом и закрывающим%> необязательны.

Существует три типа директив тега —

S.No. Директива и описание
1

<% @ page …%>

Определяет зависящие от страницы атрибуты, такие как язык сценариев, страница ошибок и требования к буферизации.

2

<% @ include …%>

Включает файл на этапе перевода.

3

<% @ taglib …%>

Объявляет библиотеку тегов, содержащую пользовательские действия, используемые на странице

<% @ page …%>

Определяет зависящие от страницы атрибуты, такие как язык сценариев, страница ошибок и требования к буферизации.

<% @ include …%>

Включает файл на этапе перевода.

<% @ taglib …%>

Объявляет библиотеку тегов, содержащую пользовательские действия, используемые на странице

JSP — страница директивы

Директива страницы используется для предоставления инструкций контейнеру. Эти инструкции относятся к текущей странице JSP. Вы можете кодировать директивы страницы в любом месте вашей страницы JSP. По соглашению, директивы страницы кодируются в верхней части страницы JSP.

Ниже приведен основной синтаксис директивы страницы:

<%@ page attribute = "value" %>

Вы можете написать XML-эквивалент вышеуказанного синтаксиса следующим образом:

<jsp:directive.page attribute = "value" />

Атрибуты

В следующей таблице перечислены атрибуты, связанные с директивой страницы —

S.No. Атрибут и цель
1

буфер

Определяет модель буферизации для выходного потока.

2

AutoFlush

Управляет поведением выходного буфера сервлета.

3

Тип содержимого

Определяет схему кодировки символов.

4

errorPage

Определяет URL другого JSP, который сообщает о непроверенных исключениях времени выполнения Java.

5

isErrorPage

Указывает, является ли эта страница JSP URL-адресом, указанным атрибутом errorPage другой страницы JSP.

6

продолжается

Определяет суперкласс, который должен расширять сгенерированный сервлет.

7

Импортировать

Задает список пакетов или классов для использования в JSP, как это делает оператор импорта Java для классов Java.

8

Информация

Определяет строку, к которой можно получить доступ с помощью метода getServletInfo () сервлета.

9

isThreadSafe

Определяет модель потоков для сгенерированного сервлета.

10

язык

Определяет язык программирования, используемый на странице JSP.

11

сессия

Указывает, участвует ли страница JSP в сеансах HTTP

12

isELIgnored

Указывает, будет ли игнорироваться выражение EL на странице JSP.

13

isScriptingEnabled

Определяет, разрешено ли использование элементов сценария.

буфер

Определяет модель буферизации для выходного потока.

AutoFlush

Управляет поведением выходного буфера сервлета.

Тип содержимого

Определяет схему кодировки символов.

errorPage

Определяет URL другого JSP, который сообщает о непроверенных исключениях времени выполнения Java.

isErrorPage

Указывает, является ли эта страница JSP URL-адресом, указанным атрибутом errorPage другой страницы JSP.

продолжается

Определяет суперкласс, который должен расширять сгенерированный сервлет.

Импортировать

Задает список пакетов или классов для использования в JSP, как это делает оператор импорта Java для классов Java.

Информация

Определяет строку, к которой можно получить доступ с помощью метода getServletInfo () сервлета.

isThreadSafe

Определяет модель потоков для сгенерированного сервлета.

язык

Определяет язык программирования, используемый на странице JSP.

сессия

Указывает, участвует ли страница JSP в сеансах HTTP

isELIgnored

Указывает, будет ли игнорироваться выражение EL на странице JSP.

isScriptingEnabled

Определяет, разрешено ли использование элементов сценария.

Проверьте подробности, относящиеся ко всем вышеперечисленным атрибутам, в Директиве страницы .

Директива включения

Директива include используется для включения файла на этапе перевода. Эта директива указывает контейнеру объединять содержимое других внешних файлов с текущим JSP на этапе трансляции. Вы можете кодировать директивы включения в любом месте вашей страницы JSP.

Общая форма использования этой директивы следующая:

<%@ include file = "relative url" >

Имя файла в директиве include на самом деле является относительным URL. Если вы просто указываете имя файла без ассоциированного пути, компилятор JSP предполагает, что файл находится в том же каталоге, что и ваш JSP.

Вы можете написать XML-эквивалент вышеуказанного синтаксиса следующим образом:

<jsp:directive.include file = "relative url" />

Для более подробной информации, связанной с директивой включения, проверьте Директиву включения .

Директива taglib

API страниц JavaServer позволяет определять пользовательские теги JSP, которые выглядят как теги HTML или XML, а библиотека тегов представляет собой набор пользовательских тегов, которые реализуют настраиваемое поведение.

Директива taglib объявляет, что ваша страница JSP использует набор настраиваемых тегов, определяет местоположение библиотеки и предоставляет средства для идентификации настраиваемых тегов на вашей странице JSP.

Директива taglib соответствует синтаксису, приведенному ниже —

<%@ taglib uri="uri" prefix = "prefixOfTag" >

Здесь значение атрибута uri разрешается в местоположение, которое понимает контейнер, а атрибут prefix сообщает контейнеру, какие биты разметки являются настраиваемыми действиями.

Вы можете написать XML-эквивалент вышеуказанного синтаксиса следующим образом:

<jsp:directive.taglib uri = "uri" prefix = "prefixOfTag" />

Для более подробной информации, связанной с директивой taglib, посмотрите директиву Taglib.

JSP — Действия

В этой главе мы обсудим действия в JSP. Эти действия используют конструкции в синтаксисе XML для управления поведением механизма сервлета. Вы можете динамически вставлять файл, повторно использовать компоненты JavaBeans, перенаправлять пользователя на другую страницу или генерировать HTML для плагина Java.

Для элемента Action существует только один синтаксис, так как он соответствует стандарту XML —

<jsp:action_name attribute = "value" />

Элементы действия — это в основном предопределенные функции. В следующей таблице перечислены доступные действия JSP.

S.No. Синтаксис и цель
1

JSP: включить

Включает файл во время запроса страницы.

2

JSP: useBean

Находит или создает экземпляр JavaBean.

3

JSP: SetProperty

Устанавливает свойство JavaBean.

4

JSP: GetProperty

Вставляет свойство JavaBean в вывод.

5

JSP: вперед

Переадресует запрос на новую страницу.

6

JSP: плагин

Генерирует специфичный для браузера код, который создает тег OBJECT или EMBED для плагина Java.

7

JSP: элемент

Определяет элементы XML динамически.

8

JSP: атрибут

Определяет динамически определенный атрибут элемента XML.

9

JSP: тело

Определяет динамически определяемое тело XML-элемента.

10

JSP: текст

Используется для написания текста шаблона на страницах и документах JSP.

JSP: включить

Включает файл во время запроса страницы.

JSP: useBean

Находит или создает экземпляр JavaBean.

JSP: SetProperty

Устанавливает свойство JavaBean.

JSP: GetProperty

Вставляет свойство JavaBean в вывод.

JSP: вперед

Переадресует запрос на новую страницу.

JSP: плагин

Генерирует специфичный для браузера код, который создает тег OBJECT или EMBED для плагина Java.

JSP: элемент

Определяет элементы XML динамически.

JSP: атрибут

Определяет динамически определенный атрибут элемента XML.

JSP: тело

Определяет динамически определяемое тело XML-элемента.

JSP: текст

Используется для написания текста шаблона на страницах и документах JSP.

Общие атрибуты

Есть два атрибута, общих для всех элементов Action: атрибут id и атрибут scope .

Атрибут Id

Атрибут id однозначно идентифицирует элемент Action и позволяет ссылаться на действие внутри страницы JSP. Если Action создает экземпляр объекта, значение id можно использовать для ссылки на него через неявный объект PageContext.

Атрибут области

Этот атрибут идентифицирует жизненный цикл элемента Action. Атрибут id и атрибут scope напрямую связаны, так как атрибут scope определяет срок службы объекта, связанного с id. Атрибут области имеет четыре возможных значения: (a) страница, (b) запрос, (c) сеанс и (d) приложение .

Действие <jsp: include>

Это действие позволяет вставлять файлы на создаваемую страницу. Синтаксис выглядит так —

<jsp:include page = "relative URL" flush = "true" />

В отличие от директивы include , которая вставляет файл во время преобразования страницы JSP в сервлет, это действие вставляет файл во время запроса страницы.

В следующей таблице перечислены атрибуты, связанные с действием включения —

S.No. Атрибут и описание
1

страница

Относительный URL-адрес страницы, которая будет включена.

2

промывать

Логический атрибут определяет, очищен ли буфер включенного ресурса перед его включением.

страница

Относительный URL-адрес страницы, которая будет включена.

промывать

Логический атрибут определяет, очищен ли буфер включенного ресурса перед его включением.

пример

Давайте определим следующие два файла (a) date.jsp и (b) main.jsp следующим образом:

Ниже приводится содержание файла date.jsp

<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

Ниже приводится содержание файла main.jsp

<html>
   <head>
      <title>The include Action Example</title>
   </head>
   
   <body>
      <center>
         <h2>The include action Example</h2>
         <jsp:include page = "date.jsp" flush = "true" />
      </center>
   </body>
</html>

Давайте теперь сохраним все эти файлы в корневом каталоге и попытаемся получить доступ к main.jsp . Вы получите следующий вывод —

The include action Example

Today's date: 12-Sep-2010 14:54:22

Действие <jsp: useBean>

Действие useBean довольно универсально. Сначала он ищет существующий объект, используя переменные id и области видимости. Если объект не найден, он пытается создать указанный объект.

Самый простой способ загрузить бин следующим образом:

<jsp:useBean id = "name" class = "package.class" />

После загрузки класса компонента вы можете использовать действия jsp: setProperty и jsp: getProperty для изменения и получения свойств компонента.

В следующей таблице перечислены атрибуты, связанные с действием useBean —

S.No. Атрибут и описание
1

учебный класс

Обозначает полное имя пакета компонента.

2

тип

Определяет тип переменной, которая будет ссылаться на объект.

3

beanName

Предоставляет имя компонента, как указано методом instantiate () класса java.beans.Beans.

учебный класс

Обозначает полное имя пакета компонента.

тип

Определяет тип переменной, которая будет ссылаться на объект.

beanName

Предоставляет имя компонента, как указано методом instantiate () класса java.beans.Beans.

Давайте теперь обсудим действия jsp: setProperty и jsp: getProperty, прежде чем приводить действительный пример, связанный с этими действиями.

Действие <jsp: setProperty>

Действие setProperty устанавливает свойства Бина. Бин должен быть предварительно определен до этого действия. Существует два основных способа использования действия setProperty:

Вы можете использовать jsp: setProperty после, но вне элемента jsp: useBean , как показано ниже —

<jsp:useBean id = "myName" ... />
...
<jsp:setProperty name = "myName" property = "someProperty" .../>

В этом случае jsp: setProperty выполняется независимо от того, был ли создан новый компонент или был найден существующий компонент.

Второй контекст, в котором может появиться jsp: setProperty , находится внутри тела элемента jsp: useBean , как показано ниже —

<jsp:useBean id = "myName" ... >
   ...
   <jsp:setProperty name = "myName" property = "someProperty" .../>
</jsp:useBean>

Здесь jsp: setProperty выполняется, только если был создан новый объект, а не был найден существующий.

В следующей таблице перечислены атрибуты, связанные с действием setProperty

S.No. Атрибут и описание
1

название

Обозначает компонент, свойство которого будет установлено. Бин должен быть предварительно определен.

2

имущество

Указывает свойство, которое вы хотите установить. Значение «*» означает, что все параметры запроса, чьи имена соответствуют именам свойств бина, будут переданы соответствующим методам установки.

3

значение

Значение, которое должно быть присвоено данному свойству. Значение параметра равно нулю или параметр не существует, действие setProperty игнорируется.

4

пары

Атрибут param — это имя параметра запроса, значение которого должно получить свойство. Вы не можете использовать и значение, и параметр, но допустимо использовать ни то, ни другое.

название

Обозначает компонент, свойство которого будет установлено. Бин должен быть предварительно определен.

имущество

Указывает свойство, которое вы хотите установить. Значение «*» означает, что все параметры запроса, чьи имена соответствуют именам свойств бина, будут переданы соответствующим методам установки.

значение

Значение, которое должно быть присвоено данному свойству. Значение параметра равно нулю или параметр не существует, действие setProperty игнорируется.

пары

Атрибут param — это имя параметра запроса, значение которого должно получить свойство. Вы не можете использовать и значение, и параметр, но допустимо использовать ни то, ни другое.

Действие <jsp: getProperty>

Действие getProperty используется для получения значения заданного свойства, преобразования его в строку и, наконец, вставки его в вывод.

Действие getProperty имеет только два атрибута, оба из которых являются обязательными. Синтаксис действия getProperty следующий:

<jsp:useBean id = "myName" ... />
...
<jsp:getProperty name = "myName" property = "someProperty" .../>

В следующей таблице перечислены обязательные атрибуты, связанные с действием getProperty.

S.No. Атрибут и описание
1

название

Имя Бина, у которого есть свойство для извлечения. Бин должен быть предварительно определен.

2

имущество

Атрибут свойства — это имя свойства Bean, которое нужно получить.

название

Имя Бина, у которого есть свойство для извлечения. Бин должен быть предварительно определен.

имущество

Атрибут свойства — это имя свойства Bean, которое нужно получить.

пример

Давайте определим тестовый компонент, который в дальнейшем будет использоваться в нашем примере —

/* File: TestBean.java */
package action;
 
public class TestBean {
   private String message = "No message specified";
 
   public String getMessage() {
      return(message);
   }
   public void setMessage(String message) {
      this.message = message;
   }
}

Скомпилируйте приведенный выше код в сгенерированный файл TestBean.class и убедитесь, что вы скопировали TestBean.class в папку C: \ apache-tomcat-7.0.2 \ webapps \ WEB-INF \ classes \ action, а переменная CLASSPATH также должна быть установить в эту папку —

Теперь используйте следующий код в файле main.jsp . Это загружает бин и устанавливает / получает простой параметр String —

<html>
   
   <head>
      <title>Using JavaBeans in JSP</title>
   </head>
   
   <body>
      <center>
         <h2>Using JavaBeans in JSP</h2>
         <jsp:useBean id = "test" class = "action.TestBean" />
         <jsp:setProperty name = "test"  property = "message" 
            value = "Hello JSP..." />
            
         <p>Got message....</p>
         <jsp:getProperty name = "test" property = "message" />
      </center>
   </body>
</html>

Давайте теперь попробуем получить доступ к main.jsp , он будет отображать следующий результат —

Using JavaBeans in JSP

Got message.... Hello JSP...

Действие <jsp: forward>

Действие пересылки завершает действие текущей страницы и перенаправляет запрос другому ресурсу, такому как статическая страница, другая страница JSP или сервлет Java.

Ниже приводится синтаксис прямого действия —

<jsp:forward page = "Relative URL" />

В следующей таблице перечислены обязательные атрибуты, связанные с действием вперед —

S.No. Атрибут и описание
1

страница

Должен состоять из относительного URL другого ресурса, такого как статическая страница, другая страница JSP или сервлет Java.

страница

Должен состоять из относительного URL другого ресурса, такого как статическая страница, другая страница JSP или сервлет Java.

пример

Давайте повторно используем следующие два файла (a) date.jsp и (b) main.jsp следующим образом:

Ниже приводится содержание файла date.jsp

<p>Today's date: <%= (new java.util.Date()).toLocaleString()%></p>

Ниже приводится содержание файла main.jsp

<html>
   <head>
      <title>The include Action Example</title>
   </head>
   
   <body>
      <center>
         <h2>The include action Example</h2>
         <jsp:forward page = "date.jsp" />
      </center>
   </body>
</html>

Давайте теперь сохраним все эти файлы в корневом каталоге и попытаемся получить доступ к main.jsp . Это будет отображать результат примерно так, как показано ниже.

Здесь он отбрасывал контент с главной страницы и отображал контент только с переадресованной страницы.

Today's date: 12-Sep-2010 14:54:22

Действие <jsp: plugin>

Действие плагина используется для вставки компонентов Java на страницу JSP. Он определяет тип браузера и вставляет теги <object> или <embed> по мере необходимости.

Если требуемый плагин отсутствует, он загружает плагин и затем выполняет компонент Java. Компонент Java может быть либо апплетом, либо JavaBean.

Действие плагина имеет несколько атрибутов, которые соответствуют общим тегам HTML, используемым для форматирования компонентов Java. Элемент <param> также можно использовать для отправки параметров в апплет или бин.

Ниже приведен типичный синтаксис использования действия плагина —

<jsp:plugin type = "applet" codebase = "dirname" code = "MyApplet.class"
   width = "60" height = "80">
   <jsp:param name = "fontcolor" value = "red" />
   <jsp:param name = "background" value = "black" />
 
   <jsp:fallback>
      Unable to initialize Java Plugin
   </jsp:fallback>
 
</jsp:plugin>

Вы можете попробовать это действие с помощью некоторого апплета, если вам интересно. Новый элемент, элемент <fallback> , можно использовать для указания строки ошибки, которая будет отправлена ​​пользователю в случае сбоя компонента.

The <jsp:element> Action

The <jsp:attribute> Action

The <jsp:body> Action

Действия <jsp: element>, <jsp: attribute> и <jsp: body> используются для динамического определения элементов XML. Слово динамически важно, потому что оно означает, что элементы XML могут генерироваться во время запроса, а не статически во время компиляции.

Ниже приведен простой пример динамического определения элементов XML:

<%@page language = "java" contentType = "text/html"%>
<html xmlns = "http://www.w3c.org/1999/xhtml"
   xmlns:jsp = "http://java.sun.com/JSP/Page">
   
   <head><title>Generate XML Element</title></head>
   
   <body>
      <jsp:element name = "xmlElement">
         <jsp:attribute name = "xmlElementAttr">
            Value for the attribute
         </jsp:attribute>
         
         <jsp:body>
            Body for XML element
         </jsp:body>
      
      </jsp:element>
   </body>
</html>

Это произведет следующий HTML-код во время выполнения —

<html xmlns = "http://www.w3c.org/1999/xhtml" xmlns:jsp = "http://java.sun.com/JSP/Page">
   <head><title>Generate XML Element</title></head>
   
   <body>
      <xmlElement xmlElementAttr = "Value for the attribute">
         Body for XML element
      </xmlElement>
   </body>
</html>

Действие <jsp: text>

Действие <jsp: text> можно использовать для написания текста шаблона на страницах и документах JSP. Ниже приведен простой синтаксис этого действия:

<jsp:text>Template data</jsp:text>

Тело шаблона не может содержать другие элементы; он может содержать только текст и выражения EL (Примечание. Выражения EL объясняются в следующей главе). Обратите внимание, что в файлах XML вы не можете использовать такие выражения, как $ {любой> 0} , потому что знаки больше чем недопустимы. Вместо этого используйте форму gt , например, $ {независимо от gt 0}, или альтернативой является вставка значения в раздел CDATA .

<jsp:text><![CDATA[<br>]]></jsp:text>

Если вам нужно включить объявление DOCTYPE , например для XHTML , вы также должны использовать элемент <jsp: text> следующим образом:

<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "DTD/xhtml1-strict.dtd">]]></jsp:text>

   <head><title>jsp:text action</title></head>
   
   <body>
      <books><book><jsp:text>  
         Welcome to JSP Programming
      </jsp:text></book></books>
   </body>
</html>

Попробуйте приведенный выше пример с действием <jsp: text> и без него.

JSP — неявные объекты

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

В следующей таблице перечислены девять неявных объектов, которые поддерживает JSP.

S.No. Объект и описание
1

запрос

Это объект HttpServletRequest, связанный с запросом.

2

ответ

Это объект HttpServletResponse, связанный с ответом клиенту.

3

из

Это объект PrintWriter, используемый для отправки вывода клиенту.

4

сессия

Это объект HttpSession, связанный с запросом.

5

приложение

Это объект ServletContext, связанный с контекстом приложения.

6

конфиг

Это объект ServletConfig, связанный со страницей.

7

PageContext

Это инкапсулирует использование специфичных для сервера функций, таких как JspWriters с более высокой производительностью.

8

страница

Это просто синоним этого и используется для вызова методов, определенных переведенным классом сервлета.

9

исключение

Объект Exception позволяет получить доступ к данным исключения с помощью назначенного JSP.

запрос

Это объект HttpServletRequest, связанный с запросом.

ответ

Это объект HttpServletResponse, связанный с ответом клиенту.

из

Это объект PrintWriter, используемый для отправки вывода клиенту.

сессия

Это объект HttpSession, связанный с запросом.

приложение

Это объект ServletContext, связанный с контекстом приложения.

конфиг

Это объект ServletConfig, связанный со страницей.

PageContext

Это инкапсулирует использование специфичных для сервера функций, таких как JspWriters с более высокой производительностью.

страница

Это просто синоним этого и используется для вызова методов, определенных переведенным классом сервлета.

исключение

Объект Exception позволяет получить доступ к данным исключения с помощью назначенного JSP.

Объект запроса

Объект запроса является экземпляром объекта javax.servlet.http.HttpServletRequest . Каждый раз, когда клиент запрашивает страницу, механизм JSP создает новый объект для представления этого запроса.

Объект запроса предоставляет методы для получения информации заголовка HTTP, включая данные формы, файлы cookie, методы HTTP и т. Д.

Мы можем охватить полный набор методов, связанных с объектом запроса, в следующей главе — JSP — Клиентский запрос .

Объект ответа

Объект ответа является экземпляром объекта javax.servlet.http.HttpServletResponse . Так же, как сервер создает объект запроса, он также создает объект для представления ответа клиенту.

Объект ответа также определяет интерфейсы, связанные с созданием новых заголовков HTTP. С помощью этого объекта программист JSP может добавлять новые файлы cookie или отметки даты, коды состояния HTTP и т. Д.

Мы рассмотрим полный набор методов, связанных с объектом ответа, в следующей главе — JSP — Ответ сервера .

Вне Объекта

Выходной неявный объект является экземпляром объекта javax.servlet.jsp.JspWriter и используется для отправки содержимого в ответе.

Исходный объект JspWriter создается по-разному в зависимости от того, буферизирована ли страница или нет. Буферизацию можно легко отключить, используя атрибут buffered = ‘false’ директивы страницы.

Объект JspWriter содержит большинство тех же методов, что и класс java.io.PrintWriter . Тем не менее, JspWriter имеет несколько дополнительных методов, предназначенных для буферизации. В отличие от объекта PrintWriter, JspWriter генерирует исключения IOException .

В следующей таблице перечислены важные методы, которые мы будем использовать для написания логических символов char, int, double, object, String и т. Д.

S.No. Метод и описание
1

out.print (dataType dt)

Распечатать значение типа данных

2

out.println (dataType dt)

Выведите значение типа данных, затем завершите строку символом новой строки.

3

out.flush ()

Промойте поток.

out.print (dataType dt)

Распечатать значение типа данных

out.println (dataType dt)

Выведите значение типа данных, затем завершите строку символом новой строки.

out.flush ()

Промойте поток.

Объект сеанса

Объект сеанса является экземпляром javax.servlet.http.HttpSession и ведет себя точно так же, как объекты сеанса ведут себя в Java-сервлетах.

Объект сеанса используется для отслеживания сеанса клиента между клиентскими запросами. Мы рассмотрим полное использование объекта сеанса в следующей главе — JSP — Отслеживание сеанса .

Объект приложения

Объект приложения является прямой оболочкой объекта ServletContext для сгенерированного сервлета и в действительности является экземпляром объекта javax.servlet.ServletContext .

Этот объект является представлением страницы JSP на протяжении всего ее жизненного цикла. Этот объект создается при инициализации страницы JSP и удаляется при удалении страницы JSP методом jspDestroy () .

Добавив атрибут к приложению, вы можете гарантировать, что все файлы JSP, составляющие ваше веб-приложение, имеют к нему доступ.

Мы проверим использование Application Object в главе JSP — Счетчик посещений.

Конфиг Объект

Объект config является экземпляром javax.servlet.ServletConfig и является прямой оболочкой вокруг объекта ServletConfig для сгенерированного сервлета.

Этот объект позволяет программисту JSP получить доступ к параметрам инициализации сервлета или механизма JSP, таким как пути или расположение файлов и т. Д.

Следующий метод конфигурации — единственный, который вы можете использовать, и его использование тривиально:

config.getServletName();

Это возвращает имя сервлета, которое является строкой, содержащейся в элементе <servlet-name>, определенном в файле WEB-INF \ web.xml .

Объект pageContext

Объект pageContext является экземпляром объекта javax.servlet.jsp.PageContext . Объект pageContext используется для представления всей страницы JSP.

Этот объект предназначен для доступа к информации о странице, избегая при этом большей части деталей реализации.

Этот объект хранит ссылки на объекты запроса и ответа для каждого запроса. Объекты application, config, session и out получены путем доступа к атрибутам этого объекта.

Объект pageContext также содержит информацию о директивах, выданных странице JSP, включая информацию о буферизации, errorPageURL и область действия страницы.

Класс PageContext определяет несколько полей, включая PAGE_SCOPE, REQUEST_SCOPE, SESSION_SCOPE и APPLICATION_SCOPE , которые идентифицируют четыре области. Он также поддерживает более 40 методов, около половины из которых унаследованы от класса javax.servlet.jsp.JspContext .

Одним из важных методов является removeAttribute . Этот метод принимает один или два аргумента. Например, pageContext.removeAttribute («attrName») удаляет атрибут из всех областей, а следующий код только удаляет его из области страницы:

pageContext.removeAttribute("attrName", PAGE_SCOPE);

Использование pageContext можно проверить в разделе JSP — Загрузка файлов .

Объект страницы

Этот объект является реальной ссылкой на экземпляр страницы. Его можно рассматривать как объект, представляющий всю страницу JSP.

Объект страницы действительно является прямым синонимом этого объекта.

Объект исключения

Объект исключения — это оболочка, содержащая исключение, созданное на предыдущей странице. Обычно он используется для генерации соответствующего ответа на состояние ошибки.

Мы расскажем о полном использовании этого объекта в главе « Обработка исключений» .

JSP — запрос клиента

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

В следующей таблице перечислены важные данные заголовка, которые поступают из браузера. Эта информация часто используется в веб-программировании —

S.No. Заголовок и описание
1

принимать

Этот заголовок определяет типы MIME, которые могут обрабатывать браузер или другие клиенты. Значения image / png или image / jpeg — две наиболее распространенные возможности.

2

Accept-Charset

Этот заголовок определяет наборы символов, которые браузер может использовать для отображения информации. Например, ISO-8859-1 .

3

Accept-Encoding

Этот заголовок определяет типы кодировок, которые браузер знает, как обрабатывать. Значения gzip или compress являются двумя наиболее распространенными возможностями.

4

Accept-Language

Этот заголовок определяет предпочтительные языки клиента в случае, если сервлет может выдавать результаты более чем на одном языке. Например, en, en-us, ru и т. Д.

5

авторизация

Этот заголовок используется клиентами для идентификации себя при доступе к защищенным паролем веб-страницам.

6

соединение

Этот заголовок указывает, может ли клиент обрабатывать постоянные соединения HTTP. Постоянные соединения позволяют клиенту или другому браузеру получать несколько файлов за один запрос. Значение Keep-Alive означает, что следует использовать постоянные соединения.

7

Content-Length

Этот заголовок применим только к запросам POST и дает размер данных POST в байтах.

8

печенье

Этот заголовок возвращает куки на серверы, которые ранее отправили их в браузер.

9

хозяин

Этот заголовок указывает хост и порт, как указано в исходном URL.

10

If-Modified-Since

Этот заголовок указывает, что клиент хочет страницу, только если она была изменена после указанной даты. Сервер отправляет код 304, который означает Неизмененный заголовок, если более новый результат не доступен.

11

Если-Unmodified-С

Этот заголовок является противоположностью If-Modified-Since ; он указывает, что операция должна завершиться успешно, только если документ старше указанной даты.

12

Referer

Этот заголовок указывает URL-адрес ссылающихся веб-страниц. Например, если вы находитесь на веб-странице 1 и нажимаете ссылку на веб-страницу 2, URL-адрес веб-страницы 1 включается в заголовок Referer, когда браузер запрашивает веб-страницу 2.

13

User-Agent

Этот заголовок идентифицирует браузер или другой клиент, делающий запрос, и может использоваться для возврата различного контента в разные типы браузеров.

принимать

Этот заголовок определяет типы MIME, которые могут обрабатывать браузер или другие клиенты. Значения image / png или image / jpeg — две наиболее распространенные возможности.

Accept-Charset

Этот заголовок определяет наборы символов, которые браузер может использовать для отображения информации. Например, ISO-8859-1 .

Accept-Encoding

Этот заголовок определяет типы кодировок, которые браузер знает, как обрабатывать. Значения gzip или compress являются двумя наиболее распространенными возможностями.

Accept-Language

Этот заголовок определяет предпочтительные языки клиента в случае, если сервлет может выдавать результаты более чем на одном языке. Например, en, en-us, ru и т. Д.

авторизация

Этот заголовок используется клиентами для идентификации себя при доступе к защищенным паролем веб-страницам.

соединение

Этот заголовок указывает, может ли клиент обрабатывать постоянные соединения HTTP. Постоянные соединения позволяют клиенту или другому браузеру получать несколько файлов за один запрос. Значение Keep-Alive означает, что следует использовать постоянные соединения.

Content-Length

Этот заголовок применим только к запросам POST и дает размер данных POST в байтах.

печенье

Этот заголовок возвращает куки на серверы, которые ранее отправили их в браузер.

хозяин

Этот заголовок указывает хост и порт, как указано в исходном URL.

If-Modified-Since

Этот заголовок указывает, что клиент хочет страницу, только если она была изменена после указанной даты. Сервер отправляет код 304, который означает Неизмененный заголовок, если более новый результат не доступен.

Если-Unmodified-С

Этот заголовок является противоположностью If-Modified-Since ; он указывает, что операция должна завершиться успешно, только если документ старше указанной даты.

Referer

Этот заголовок указывает URL-адрес ссылающихся веб-страниц. Например, если вы находитесь на веб-странице 1 и нажимаете ссылку на веб-страницу 2, URL-адрес веб-страницы 1 включается в заголовок Referer, когда браузер запрашивает веб-страницу 2.

User-Agent

Этот заголовок идентифицирует браузер или другой клиент, делающий запрос, и может использоваться для возврата различного контента в разные типы браузеров.

Объект HttpServletRequest

Объект запроса является экземпляром объекта javax.servlet.http.HttpServletRequest . Каждый раз, когда клиент запрашивает страницу, механизм JSP создает новый объект для представления этого запроса.

Объект запроса предоставляет методы для получения информации заголовка HTTP, включая данные формы, файлы cookie, методы HTTP и т. Д.

В следующей таблице перечислены важные методы, которые можно использовать для чтения заголовка HTTP в вашей программе JSP. Эти методы доступны с объектом HttpServletRequest, который представляет запрос клиента к веб-серверу.

S.No. Метод и описание
1

Cookie [] getCookies ()

Возвращает массив, содержащий все объекты Cookie, которые клиент отправил с этим запросом.

2

Перечисление getAttributeNames ()

Возвращает перечисление, содержащее имена атрибутов, доступных для этого запроса.

3

Перечисление getHeaderNames ()

Возвращает перечисление всех имен заголовков, которые содержит этот запрос.

4

Перечисление getParameterNames ()

Возвращает перечисление объектов String, содержащих имена параметров, содержащихся в этом запросе.

5

HttpSession getSession ()

Возвращает текущий сеанс, связанный с этим запросом, или, если запрос не имеет сеанса, создает его.

6

HttpSession getSession (логическое создание)

Возвращает текущий HttpSession, связанный с этим запросом, или, если текущий сеанс отсутствует, а create — true, возвращает новый сеанс.

7

Locale getLocale ()

Возвращает предпочтительный языковой стандарт, в котором клиент будет принимать содержимое, на основе заголовка Accept-Language.

8

Объект getAttribute (String name)

Возвращает значение именованного атрибута в виде объекта или ноль, если атрибута с указанным именем не существует.

9

ServletInputStream getInputStream ()

Извлекает тело запроса в виде двоичных данных, используя ServletInputStream.

10

Строка getAuthType ()

Возвращает имя схемы аутентификации, используемой для защиты сервлета, например, «BASIC» или «SSL», или null, если JSP не был защищен.

11

Строка getCharacterEncoding ()

Возвращает имя кодировки символов, используемой в теле этого запроса.

12

Строка getContentType ()

Возвращает MIME-тип тела запроса или null, если тип не известен.

13

Строка getContextPath ()

Возвращает часть URI запроса, которая указывает контекст запроса.

14

Строка getHeader (имя строки)

Возвращает значение указанного заголовка запроса в виде строки.

15

Строка getMethod ()

Возвращает имя метода HTTP, с помощью которого был сделан этот запрос, например, GET, POST или PUT.

16

Строка getParameter (имя строки)

Возвращает значение параметра запроса в виде строки или ноль, если параметр не существует.

17

Строка getPathInfo ()

Возвращает любую дополнительную информацию о пути, связанную с URL-адресом, отправленным клиентом, когда он сделал этот запрос.

18

Строка getProtocol ()

Возвращает имя и версию протокола, который использует запрос.

19

Строка getQueryString ()

Возвращает строку запроса, которая содержится в URL запроса после пути.

20

Строка getRemoteAddr ()

Возвращает IP-адрес клиента, отправившего запрос.

21

Строка getRemoteHost ()

Возвращает полное имя клиента, отправившего запрос.

22

Строка getRemoteUser ()

Возвращает имя пользователя, сделавшего этот запрос, если пользователь прошел проверку подлинности, или NULL, если пользователь не прошел проверку подлинности.

23

Строка getRequestURI ()

Возвращает часть URL этого запроса от имени протокола до строки запроса в первой строке HTTP-запроса.

24

Строка getRequestedSessionId ()

Возвращает идентификатор сеанса, указанный клиентом.

25

Строка getServletPath ()

Возвращает часть URL этого запроса, которая вызывает JSP.

26

String [] getParameterValues ​​(имя строки)

Возвращает массив объектов String, содержащий все значения, которые имеет данный параметр запроса, или ноль, если параметр не существует.

27

логическое isSecure ()

Возвращает логическое значение, указывающее, был ли этот запрос сделан с использованием безопасного канала, такого как HTTPS.

28

int getContentLength ()

Возвращает длину в байтах тела запроса и становится доступной входному потоку или -1, если длина неизвестна.

29

int getIntHeader (String name)

Возвращает значение указанного заголовка запроса как int.

30

int getServerPort ()

Возвращает номер порта, по которому был получен этот запрос.

Cookie [] getCookies ()

Возвращает массив, содержащий все объекты Cookie, которые клиент отправил с этим запросом.

Перечисление getAttributeNames ()

Возвращает перечисление, содержащее имена атрибутов, доступных для этого запроса.

Перечисление getHeaderNames ()

Возвращает перечисление всех имен заголовков, которые содержит этот запрос.

Перечисление getParameterNames ()

Возвращает перечисление объектов String, содержащих имена параметров, содержащихся в этом запросе.

HttpSession getSession ()

Возвращает текущий сеанс, связанный с этим запросом, или, если запрос не имеет сеанса, создает его.

HttpSession getSession (логическое создание)

Возвращает текущий HttpSession, связанный с этим запросом, или, если текущий сеанс отсутствует, а create — true, возвращает новый сеанс.

Locale getLocale ()

Возвращает предпочтительный языковой стандарт, в котором клиент будет принимать содержимое, на основе заголовка Accept-Language.

Объект getAttribute (String name)

Возвращает значение именованного атрибута в виде объекта или ноль, если атрибута с указанным именем не существует.

ServletInputStream getInputStream ()

Извлекает тело запроса в виде двоичных данных, используя ServletInputStream.

Строка getAuthType ()

Возвращает имя схемы аутентификации, используемой для защиты сервлета, например, «BASIC» или «SSL», или null, если JSP не был защищен.

Строка getCharacterEncoding ()

Возвращает имя кодировки символов, используемой в теле этого запроса.

Строка getContentType ()

Возвращает MIME-тип тела запроса или null, если тип не известен.

Строка getContextPath ()

Возвращает часть URI запроса, которая указывает контекст запроса.

Строка getHeader (имя строки)

Возвращает значение указанного заголовка запроса в виде строки.

Строка getMethod ()

Возвращает имя метода HTTP, с помощью которого был сделан этот запрос, например, GET, POST или PUT.

Строка getParameter (имя строки)

Возвращает значение параметра запроса в виде строки или ноль, если параметр не существует.

Строка getPathInfo ()

Возвращает любую дополнительную информацию о пути, связанную с URL-адресом, отправленным клиентом, когда он сделал этот запрос.

Строка getProtocol ()

Возвращает имя и версию протокола, который использует запрос.

Строка getQueryString ()

Возвращает строку запроса, которая содержится в URL запроса после пути.

Строка getRemoteAddr ()

Возвращает IP-адрес клиента, отправившего запрос.

Строка getRemoteHost ()

Возвращает полное имя клиента, отправившего запрос.

Строка getRemoteUser ()

Возвращает имя пользователя, сделавшего этот запрос, если пользователь прошел проверку подлинности, или NULL, если пользователь не прошел проверку подлинности.

Строка getRequestURI ()

Возвращает часть URL этого запроса от имени протокола до строки запроса в первой строке HTTP-запроса.

Строка getRequestedSessionId ()

Возвращает идентификатор сеанса, указанный клиентом.

Строка getServletPath ()

Возвращает часть URL этого запроса, которая вызывает JSP.

String [] getParameterValues ​​(имя строки)

Возвращает массив объектов String, содержащий все значения, которые имеет данный параметр запроса, или ноль, если параметр не существует.

логическое isSecure ()

Возвращает логическое значение, указывающее, был ли этот запрос сделан с использованием безопасного канала, такого как HTTPS.

int getContentLength ()

Возвращает длину в байтах тела запроса и становится доступной входному потоку или -1, если длина неизвестна.

int getIntHeader (String name)

Возвращает значение указанного заголовка запроса как int.

int getServerPort ()

Возвращает номер порта, по которому был получен этот запрос.

Пример запроса заголовка HTTP

Ниже приведен пример, который использует метод getHeaderNames () HttpServletRequest для чтения информации заголовка HTTP. Этот метод возвращает перечисление, которое содержит информацию заголовка, связанную с текущим HTTP-запросом.

Как только у нас будет Перечисление, мы можем зациклить Перечисление стандартным способом. Мы будем использовать метод hasMoreElements (), чтобы определить, когда следует остановиться, и метод nextElement (), чтобы получить имя для каждого имени параметра.

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>HTTP Header Request Example</title>
   </head>

   <body>
      <center>
         <h2>HTTP Header Request Example</h2>
         
         <table width = "100%" border = "1" align = "center">
            <tr bgcolor = "#949494">
               <th>Header Name</th>
               <th>Header Value(s)</th>
            </tr>
            <%
               Enumeration headerNames = request.getHeaderNames();
               while(headerNames.hasMoreElements()) {
                  String paramName = (String)headerNames.nextElement();
                  out.print("<tr><td>" + paramName + "</td>\n");
                  String paramValue = request.getHeader(paramName);
                  out.println("<td> " + paramValue + "</td></tr>\n");
               }
            %>
         </table>
      </center>
   
   </body>
</html>

Давайте теперь поместим приведенный выше код в main.jsp и попробуем получить к нему доступ.

Пример запроса заголовка HTTP

Название заголовка Значение заголовка (ов)
принимать * / *
принимают язык ан-нас
Агент пользователя Mozilla / 4.0 (совместимый; MSIE 7.0; Windows NT 5.1; Trident / 4.0; InfoPath.2; MS-RTC LM 8)
Accept-Encoding gzip, выкачать
хозяин локальный: 8080
соединение Keep-Alive
кэш-контроль нет кэша

Вы можете попробовать работать над всеми методами одинаково.

JSP — ответ сервера

В этой главе мы обсудим ответ сервера в JSP. Когда веб-сервер отвечает на запрос HTTP, ответ обычно состоит из строки состояния, некоторых заголовков ответа, пустой строки и документа. Типичный ответ выглядит так —

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
   (Blank Line)
<!doctype ...>

<html>
   <head>...</head>
   <body>
      ...
   </body>
</html>

Строка состояния состоит из версии HTTP (HTTP / 1.1 в примере) , кода состояния (в примере 200) и очень короткого сообщения, соответствующего коду состояния (в примере OK) .

Ниже приводится сводка наиболее полезных заголовков ответов HTTP 1.1, которые возвращаются в браузер с веб-сервера. Эти заголовки часто используются в веб-программировании —

S.No. Заголовок и описание
1

Разрешать

Этот заголовок указывает методы запроса ( GET, POST и т. Д.), Которые поддерживает сервер.

2

Cache-Control

Этот заголовок указывает обстоятельства, при которых ответный документ можно безопасно кэшировать. Он может иметь значения public, private или no-cache и т. Д. Public означает, что документ кэшируется, Private означает, что документ предназначен для одного пользователя и может храниться только в приватных (не общих) кэшах, а no-cache означает, что документ никогда не должен кэшироваться.

3

соединение

Этот заголовок инструктирует браузер использовать постоянные HTTP-соединения или нет. Значение close указывает браузеру не использовать постоянные HTTP-соединения, а keep-alive означает использование постоянных соединений.

4

Content-Disposition

Этот заголовок позволяет вам запросить, чтобы браузер попросил пользователя сохранить ответ на диске в файле с заданным именем.

5

Content-Encoding

Этот заголовок определяет способ кодирования страницы во время передачи.

6

Content-Language

Этот заголовок обозначает язык, на котором написан документ. Например, en, en-us, ru и т. Д.

7

Content-Length

Этот заголовок указывает количество байтов в ответе. Эта информация необходима, только если браузер использует постоянное (keep-alive) соединение HTTP.

8

Тип содержимого

Этот заголовок содержит тип MIME ( многоцелевого расширения почты Интернета ) для документа ответа.

9

Истекает

Этот заголовок указывает время, в которое контент должен считаться устаревшим и, следовательно, больше не кэшироваться.

10

Последнее изменение

Этот заголовок указывает, когда документ был последний раз изменен. Затем клиент может кэшировать документ и указать дату в заголовке запроса If-Modified-Since в последующих запросах.

11

Место нахождения

Этот заголовок должен быть включен во все ответы, которые имеют код состояния в 300-х годах. Это уведомляет браузер об адресе документа. Браузер автоматически подключается к этому местоположению и получает новый документ.

12

обновление

Этот заголовок указывает, как скоро браузер должен запросить обновленную страницу. Вы можете указать время в секундах, после которых страница будет обновляться.

13

Retry-After

Этот заголовок можно использовать вместе с ответом 503 (служба недоступна), чтобы сообщить клиенту, как скоро он сможет повторить свой запрос.

14

Set-Cookie

Этот заголовок указывает файл cookie, связанный со страницей.

Разрешать

Этот заголовок указывает методы запроса ( GET, POST и т. Д.), Которые поддерживает сервер.

Cache-Control

Этот заголовок указывает обстоятельства, при которых ответный документ можно безопасно кэшировать. Он может иметь значения public, private или no-cache и т. Д. Public означает, что документ кэшируется, Private означает, что документ предназначен для одного пользователя и может храниться только в приватных (не общих) кэшах, а no-cache означает, что документ никогда не должен кэшироваться.

соединение

Этот заголовок инструктирует браузер использовать постоянные HTTP-соединения или нет. Значение close указывает браузеру не использовать постоянные HTTP-соединения, а keep-alive означает использование постоянных соединений.

Content-Disposition

Этот заголовок позволяет вам запросить, чтобы браузер попросил пользователя сохранить ответ на диске в файле с заданным именем.

Content-Encoding

Этот заголовок определяет способ кодирования страницы во время передачи.

Content-Language

Этот заголовок обозначает язык, на котором написан документ. Например, en, en-us, ru и т. Д.

Content-Length

Этот заголовок указывает количество байтов в ответе. Эта информация необходима, только если браузер использует постоянное (keep-alive) соединение HTTP.

Тип содержимого

Этот заголовок содержит тип MIME ( многоцелевого расширения почты Интернета ) для документа ответа.

Истекает

Этот заголовок указывает время, в которое контент должен считаться устаревшим и, следовательно, больше не кэшироваться.

Последнее изменение

Этот заголовок указывает, когда документ был последний раз изменен. Затем клиент может кэшировать документ и указать дату в заголовке запроса If-Modified-Since в последующих запросах.

Место нахождения

Этот заголовок должен быть включен во все ответы, которые имеют код состояния в 300-х годах. Это уведомляет браузер об адресе документа. Браузер автоматически подключается к этому местоположению и получает новый документ.

обновление

Этот заголовок указывает, как скоро браузер должен запросить обновленную страницу. Вы можете указать время в секундах, после которых страница будет обновляться.

Retry-After

Этот заголовок можно использовать вместе с ответом 503 (служба недоступна), чтобы сообщить клиенту, как скоро он сможет повторить свой запрос.

Set-Cookie

Этот заголовок указывает файл cookie, связанный со страницей.

Объект HttpServletResponse

Объект ответа является экземпляром объекта javax.servlet.http.HttpServletResponse . Так же, как сервер создает объект запроса, он также создает объект для представления ответа клиенту.

Объект ответа также определяет интерфейсы, связанные с созданием новых заголовков HTTP. С помощью этого объекта программист JSP может добавлять новые файлы cookie или метки даты, коды состояния HTTP и т. Д.

Следующие методы могут быть использованы для установки заголовка ответа HTTP в вашей программе сервлета. Эти методы доступны с объектом HttpServletResponse . Этот объект представляет ответ сервера.

S.No. Метод и описание
1

String encodeRedirectURL (String url)

Кодирует указанный URL-адрес для использования в методе sendRedirect или, если кодирование не требуется, возвращает URL-адрес без изменений.

2

String encodeURL (String url)

Кодирует указанный URL-адрес путем включения в него идентификатора сеанса или, если кодирование не требуется, возвращает URL-адрес без изменений.

3

логическое содержит заголовок (строковое имя)

Возвращает логическое значение, указывающее, был ли заданный заголовок ответа уже установлен.

4

логическое isCommitted ()

Возвращает логическое значение, указывающее, был ли принят ответ.

5

void addCookie (Cookie cookie)

Добавляет указанный файл cookie в ответ.

6

void addDateHeader (имя строки, длинная дата)

Добавляет заголовок ответа с указанным именем и датой-значением.

7

void addHeader (String name, String value)

Добавляет заголовок ответа с указанным именем и значением.

8

void addIntHeader (String name, int value)

Добавляет заголовок ответа с указанным именем и целочисленным значением.

9

void flushBuffer ()

Принудительно записывает любой контент в буфере для клиента.

10

сброс void ()

Очищает любые данные, которые существуют в буфере, а также код состояния и заголовки.

11

void resetBuffer ()

Очищает содержимое базового буфера в ответе без очистки заголовков или кода состояния.

12

void sendError (int sc)

Отправляет клиенту сообщение об ошибке, используя указанный код состояния, и очищает буфер.

13

void sendError (int sc, String msg)

Отправляет ответ об ошибке клиенту, используя указанный статус.

14

void sendRedirect (расположение строки)

Отправляет клиенту ответ временного перенаправления, используя указанный URL-адрес местоположения перенаправления.

15

void setBufferSize (int size)

Устанавливает предпочтительный размер буфера для тела ответа.

16

void setCharacterEncoding (String charset)

Устанавливает кодировку символов (кодировка MIME) ответа, отправляемого клиенту, например, в UTF-8.

17

void setContentLength (int len)

Устанавливает длину тела содержимого в ответе в HTTP-сервлетах; этот метод также устанавливает заголовок HTTP Content-Length.

18

void setContentType (тип String)

Устанавливает тип содержимого ответа, отправляемого клиенту, если ответ еще не зафиксирован.

19

void setDateHeader (имя строки, длинная дата)

Устанавливает заголовок ответа с указанным именем и датой-значением.

20

void setHeader (String name, String value)

Устанавливает заголовок ответа с указанным именем и значением.

21

void setIntHeader (имя строки, значение типа int)

Устанавливает заголовок ответа с заданным именем и целочисленным значением.

22

void setLocale (Locale loc)

Устанавливает локаль ответа, если ответ еще не зафиксирован.

23

void setStatus (int sc)

Устанавливает код состояния для этого ответа.

String encodeRedirectURL (String url)

Кодирует указанный URL-адрес для использования в методе sendRedirect или, если кодирование не требуется, возвращает URL-адрес без изменений.

String encodeURL (String url)

Кодирует указанный URL-адрес путем включения в него идентификатора сеанса или, если кодирование не требуется, возвращает URL-адрес без изменений.

логическое содержит заголовок (строковое имя)

Возвращает логическое значение, указывающее, был ли заданный заголовок ответа уже установлен.

логическое isCommitted ()

Возвращает логическое значение, указывающее, был ли принят ответ.

void addCookie (Cookie cookie)

Добавляет указанный файл cookie в ответ.

void addDateHeader (имя строки, длинная дата)

Добавляет заголовок ответа с указанным именем и датой-значением.

void addHeader (String name, String value)

Добавляет заголовок ответа с указанным именем и значением.

void addIntHeader (String name, int value)

Добавляет заголовок ответа с указанным именем и целочисленным значением.

void flushBuffer ()

Принудительно записывает любой контент в буфере для клиента.

сброс void ()

Очищает любые данные, которые существуют в буфере, а также код состояния и заголовки.

void resetBuffer ()

Очищает содержимое базового буфера в ответе без очистки заголовков или кода состояния.

void sendError (int sc)

Отправляет клиенту сообщение об ошибке, используя указанный код состояния, и очищает буфер.

void sendError (int sc, String msg)

Отправляет ответ об ошибке клиенту, используя указанный статус.

void sendRedirect (расположение строки)

Отправляет клиенту ответ временного перенаправления, используя указанный URL-адрес местоположения перенаправления.

void setBufferSize (int size)

Устанавливает предпочтительный размер буфера для тела ответа.

void setCharacterEncoding (String charset)

Устанавливает кодировку символов (кодировка MIME) ответа, отправляемого клиенту, например, в UTF-8.

void setContentLength (int len)

Устанавливает длину тела содержимого в ответе в HTTP-сервлетах; этот метод также устанавливает заголовок HTTP Content-Length.

void setContentType (тип String)

Устанавливает тип содержимого ответа, отправляемого клиенту, если ответ еще не зафиксирован.

void setDateHeader (имя строки, длинная дата)

Устанавливает заголовок ответа с указанным именем и датой-значением.

void setHeader (String name, String value)

Устанавливает заголовок ответа с указанным именем и значением.

void setIntHeader (имя строки, значение типа int)

Устанавливает заголовок ответа с заданным именем и целочисленным значением.

void setLocale (Locale loc)

Устанавливает локаль ответа, если ответ еще не зафиксирован.

void setStatus (int sc)

Устанавливает код состояния для этого ответа.

Пример ответа HTTP-заголовка

В следующем примере будет использоваться метод setIntHeader () для установки заголовка Refresh для имитации цифровых часов —

<%@ page import = "java.io.*,java.util.*" %>

<html>
   
   <head>
      <title>Auto Refresh Header Example</title>
   </head>
   
   <body>
      <center>
         <h2>Auto Refresh Header Example</h2>
         <%
            // Set refresh, autoload time as 5 seconds
            response.setIntHeader("Refresh", 5);
            
            // Get current time
            Calendar calendar = new GregorianCalendar();
            
            String am_pm;
            int hour = calendar.get(Calendar.HOUR);
            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);
            
            if(calendar.get(Calendar.AM_PM) == 0) 
               am_pm = "AM";
            else
               am_pm = "PM";
               String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
               out.println("Current Time is: " + CT + "\n");
         %>
      </center>
   
   </body>
</html>

Теперь поместите приведенный выше код в main.jsp и попробуйте получить к нему доступ. Это будет отображать текущее системное время через каждые 5 секунд следующим образом. Запустите JSP. Вы получите следующий вывод: —

Auto Refresh Header Example

Current Time is: 9:44:50 PM

Вы можете попробовать работать с другими методами аналогичным образом.

JSP — Http коды состояния

В этой главе мы обсудим коды статуса Http в JSP. Формат HTTP-запроса и ответных HTTP-сообщений аналогичен и будет иметь следующую структуру:

  • Начальная строка состояния + CRLF (возврат каретки + перевод строки, т. Е. Новая строка)

  • Ноль или более строк заголовка + CRLF

  • Пустая строка т.е. CRLF

  • Необязательное тело сообщения, такое как файл, данные запроса или выходные данные запроса.

Начальная строка состояния + CRLF (возврат каретки + перевод строки, т. Е. Новая строка)

Ноль или более строк заголовка + CRLF

Пустая строка т.е. CRLF

Необязательное тело сообщения, такое как файл, данные запроса или выходные данные запроса.

Например, заголовок ответа сервера выглядит следующим образом:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
   (Blank Line)
<!doctype ...>

<html>
   <head>...</head>
   
   <body>
      ...
   </body>
</html>

Строка состояния состоит из версии HTTP (HTTP / 1.1 в примере) , кода состояния (в примере 200) и очень короткого сообщения, соответствующего коду состояния (в примере OK) .

В следующей таблице перечислены коды состояния HTTP и связанные сообщения, которые могут быть возвращены с веб-сервера.

Код Сообщение Описание
100 Продолжить Сервер получил только часть запроса, но до тех пор, пока он не был отклонен, клиент должен продолжить выполнение запроса
101 Протоколы переключения Сервер переключает протокол.
200 Хорошо Запрос в порядке
201 созданный Запрос завершен, и создан новый ресурс
202 Принято Запрос принят к обработке, но обработка не завершена.
203 Неавторизованная информация
204 Без содержания
205 Сбросить содержимое
206 Частичное содержание
300 Множественный выбор Список ссылок; пользователь может выбрать ссылку и перейти в это место. Максимум пять адресов.
301 переехал навсегда Запрашиваемая страница перемещена на новый URL.
302 Найденный Запрашиваемая страница временно перемещена на новый URL.
303 Смотрите Другое Запрошенная страница может быть найдена под другим URL.
304 Не модифицировано
305 Используй прокси
306 неиспользуемый Этот код был использован в предыдущей версии. Он больше не используется, но код зарезервирован.
307 Временный редирект Запрашиваемая страница временно перемещена на новый URL.
400 Неверный запрос Сервер не понял запрос.
401 неразрешенный Запрашиваемая страница требует имени пользователя и пароля.
402 Требуется оплата Вы не можете использовать этот код еще.
403 запрещено Доступ к запрашиваемой странице запрещен
404 не обнаружена Сервер не может найти запрашиваемую страницу.
405 метод не разрешен Указанный в запросе метод недопустим.
406 Неприемлимо Сервер может генерировать только ответ, который не принят клиентом.
407 Требуется проверка подлинности прокси Вы должны пройти аутентификацию на прокси-сервере, прежде чем этот запрос будет обработан.
408 Тайм-аут запроса Запрос занял больше времени, чем сервер был готов ждать.
409 конфликт Запрос не может быть выполнен из-за конфликта.
410 Ушел Запрашиваемая страница больше не доступна.
411 Требуемая длина «Длина содержимого» не определена. Сервер не примет запрос без него.
412 Предварительное условие не выполнено Предварительное условие, указанное в запросе, оценивается сервером как ложное.
413 Запросить объект слишком большой Сервер не примет запрос, потому что объект запроса слишком велик.
414 URL-адрес запроса слишком длинный Сервер не примет запрос, потому что URL слишком длинный. Это происходит, когда вы преобразуете запрос «post» в запрос «get» с подробной информацией запроса.
415 Неподдерживаемый тип носителя Сервер не примет запрос, потому что тип носителя не поддерживается.
417 Ожидание не удалось
500 Внутренняя ошибка сервера Запрос не был выполнен. Сервер встретил неожиданное состояние.
501 Не реализованы Запрос не был выполнен. Сервер не поддерживает требуемую функциональность.
502 Bad Gateway Запрос не был выполнен. Сервер получил неверный ответ от вышестоящего сервера.
503 Сервис недоступен Запрос не был выполнен. Сервер временно перегружен или отключен.
504 Время ожидания шлюза Время ожидания истекло.
505 Версия HTTP не поддерживается Сервер не поддерживает версию протокола HTTP .

Методы для установки кода состояния HTTP

Следующие методы могут быть использованы для установки кода состояния HTTP в вашей программе сервлета. Эти методы доступны с объектом HttpServletResponse .

S.No. Метод и описание
1

public void setStatus (int statusCode)

Этот метод устанавливает произвольный код состояния. Метод setStatus принимает int (код состояния) в качестве аргумента. Если в вашем ответе содержится специальный код состояния и документ, обязательно вызовите setStatus, прежде чем фактически возвращать какой-либо контент с помощью PrintWriter .

2

public void sendRedirect (String url)

Этот метод генерирует ответ 302 вместе с заголовком Location, содержащим URL нового документа.

3

public void sendError (int code, String message)

Этот метод отправляет код состояния (обычно 404) вместе с коротким сообщением, которое автоматически форматируется внутри документа HTML и отправляется клиенту.

public void setStatus (int statusCode)

Этот метод устанавливает произвольный код состояния. Метод setStatus принимает int (код состояния) в качестве аргумента. Если в вашем ответе содержится специальный код состояния и документ, обязательно вызовите setStatus, прежде чем фактически возвращать какой-либо контент с помощью PrintWriter .

public void sendRedirect (String url)

Этот метод генерирует ответ 302 вместе с заголовком Location, содержащим URL нового документа.

public void sendError (int code, String message)

Этот метод отправляет код состояния (обычно 404) вместе с коротким сообщением, которое автоматически форматируется внутри документа HTML и отправляется клиенту.

Пример кода состояния HTTP

В следующем примере показано, как код ошибки 407 отправляется в браузер клиента. После этого браузер отобразит сообщение « Требуется аутентификация !!! ».

<html>
   <head>
      <title>Setting HTTP Status Code</title>
   </head>
   
   <body>
      <%
         // Set error code and reason.
         response.sendError(407, "Need authentication!!!" );
      %>
   </body>
</html>

Вы получите следующий вывод —

HTTP Status 407 - Need authentication!!!

type Status report

message Need authentication!!!

description The client must first authenticate itself with the proxy (Need authentication!!!).

Apache Tomcat/5.5.29

type Status report

message Need authentication!!!

description The client must first authenticate itself with the proxy (Need authentication!!!).

Чтобы освоиться с кодами состояния HTTP, попробуйте установить разные коды состояния и их описание.

JSP — Обработка форм

В этой главе мы обсудим обработку форм в JSP. Вы, должно быть, сталкивались со многими ситуациями, когда вам нужно передать некоторую информацию из вашего браузера на веб-сервер и, в конечном итоге, в вашу бэкэнд-программу. Браузер использует два метода для передачи этой информации на веб-сервер. Эти методы — метод GET и метод POST.

Методы обработки формы

Давайте теперь обсудим методы обработки форм.

ПОЛУЧИТЬ метод

Метод GET отправляет закодированную информацию пользователя, добавленную к запросу страницы. Страница и закодированная информация разделены знаком? персонаж следующим образом —

http://www.test.com/hello?key1=value1&key2=value2

Метод GET является методом по умолчанию для передачи информации из браузера на веб-сервер, и он генерирует длинную строку, которая появляется в поле Location: вашего браузера. Рекомендуется, чтобы метод GET лучше не использовать. если у вас есть пароль или другая конфиденциальная информация для передачи на сервер.

Метод GET имеет ограничение по размеру: в строке запроса может быть только 1024 символа .

Эта информация передается с использованием заголовка QUERY_STRING и будет доступна через переменную среды QUERY_STRING, которую можно обработать с помощью методов getQueryString () и getParameter () объекта запроса.

Метод POST

Как правило, более надежным методом передачи информации в бэкэнд-программу является метод POST.

Этот метод упаковывает информацию точно так же, как метод GET, но вместо отправки ее в виде текстовой строки после символа? в URL он отправляет его как отдельное сообщение. Это сообщение поступает в бэкэнд-программу в виде стандартного ввода, который вы можете проанализировать и использовать для обработки.

JSP обрабатывает запросы такого типа, используя метод getParameter () для чтения простых параметров и метод getInputStream () для чтения потока двоичных данных, поступающих от клиента.

Чтение данных формы с использованием JSP

JSP автоматически обрабатывает данные формы, используя следующие методы в зависимости от ситуации:

  • getParameter () — Вы вызываете метод request.getParameter (), чтобы получить значение параметра формы.

  • getParameterValues ​​() — Вызовите этот метод, если параметр появляется более одного раза и возвращает несколько значений, например, флажок.

  • getParameterNames ()вызовите этот метод, если вы хотите получить полный список всех параметров в текущем запросе.

  • getInputStream () — вызывает этот метод для чтения потока двоичных данных, поступающих от клиента.

getParameter () — Вы вызываете метод request.getParameter (), чтобы получить значение параметра формы.

getParameterValues ​​() — Вызовите этот метод, если параметр появляется более одного раза и возвращает несколько значений, например, флажок.

getParameterNames ()вызовите этот метод, если вы хотите получить полный список всех параметров в текущем запросе.

getInputStream () — вызывает этот метод для чтения потока двоичных данных, поступающих от клиента.

Пример метода GET с использованием URL

Следующий URL-адрес передаст два значения программе HelloForm с помощью метода GET.

HTTP: // локальный: 8080 / main.jsp first_name = ZARA & last_name = ALI

Ниже приведена JSP-программа main.jsp для обработки ввода, получаемого от веб-браузера. Мы собираемся использовать метод getParameter (), который позволяет очень легко получить доступ к переданной информации —

<html>
   <head>
      <title>Using GET Method to Read Form Data</title>
   </head>
   
   <body>
      <h1>Using GET Method to Read Form Data</h1>
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

Теперь введите http: // localhost: 8080 / main.jsp? First_name = ZARA & last_name = ALI в поле Location: вашего браузера. Это сгенерирует следующий результат —

Использование метода GET для чтения данных формы

  • Имя : ZARA

  • Фамилия : АЛИ

Имя : ZARA

Фамилия : АЛИ

Пример метода GET с использованием формы

Ниже приведен пример, который передает два значения, используя HTML-форму и кнопку отправки. Мы будем использовать тот же JSP main.jsp для обработки этого ввода.

<html>
   <body>
      
      <form action = "main.jsp" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
      
   </body>
</html>

Сохраните этот HTML-файл в файле Hello.htm и поместите его в каталог <Tomcat-installation-directory> / webapps / ROOT . Когда вы получите доступ к http: // localhost: 8080 / Hello.htm , вы получите следующий вывод.

Имя:
Фамилия:

<p> Попробуйте ввести имя и фамилию, а затем нажмите кнопку отправки, чтобы увидеть результат на локальном компьютере, на котором запущен tomcat. На основе предоставленного ввода, он будет генерировать результат, аналогичный указанному в приведенном выше примере.


Пример метода POST с использованием формы

Давайте сделаем небольшую модификацию в вышеупомянутой JSP для обработки как метода GET, так и метода POST. Ниже приведена JSP-программа main.jsp, которая обрабатывает ввод данных через веб-браузер с использованием методов GET или POST.

Infact нет никаких изменений в вышеупомянутой JSP, потому что изменен единственный способ передачи параметров и никакие двоичные данные не передаются в программу JSP. Понятия, связанные с обработкой файлов, будут объяснены в отдельной главе, где нам нужно прочитать поток двоичных данных.

<html>
   <head>
      <title>Using GET and POST Method to Read Form Data</title>
   </head>
   
   <body>
      <center>
      <h1>Using POST Method to Read Form Data</h1>
      
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

Ниже приводится содержимое файла Hello.htm

<html>
   <body>
      
      <form action = "main.jsp" method = "POST">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
      
   </body>
</html>

Давайте теперь сохраним main.jsp и hello.htm в каталоге <Tomcat-installationdirectory> / webapps / ROOT . При доступе к http: // localhost: 8080 / Hello.htm вы получите следующий вывод.

Имя:
Фамилия:

Попробуйте ввести имя и фамилию, а затем нажмите кнопку отправки, чтобы увидеть результат на локальном компьютере, на котором запущен tomcat.

На основании предоставленных данных вы получите результаты, аналогичные приведенным выше.


Передача данных флажка в программу JSP

Флажки используются, когда требуется выбрать более одной опции.

Ниже приведен пример HTML-кода CheckBox.htm для формы с двумя флажками.

<html>
   <body>
      
      <form action = "main.jsp" method = "POST" target = "_blank">
         <input type = "checkbox" name = "maths" checked = "checked" /> Maths
         <input type = "checkbox" name = "physics"  /> Physics
         <input type = "checkbox" name = "chemistry" checked = "checked" /> Chemistry
         <input type = "submit" value = "Select Subject" />
      </form>
      
   </body>
</html>

Приведенный выше код сгенерирует следующий результат —

математика физика Химия

Далее следует программа JSP main.jsp для обработки ввода, заданного веб-браузером для кнопки-флажка.

<html>
   <head>
      <title>Reading Checkbox Data</title>
   </head>
   
   <body>
      <h1>Reading Checkbox Data</h1>
      
      <ul>
         <li><p><b>Maths Flag:</b>
            <%= request.getParameter("maths")%>
         </p></li>
         <li><p><b>Physics Flag:</b>
            <%= request.getParameter("physics")%>
         </p></li>
         <li><p><b>Chemistry Flag:</b>
            <%= request.getParameter("chemistry")%>
         </p></li>
      </ul>
   
   </body>
</html>

Вышеуказанная программа сгенерирует следующий результат —

Reading Checkbox Data

  • Maths Flag : : on

  • Physics Flag: : null

  • Chemistry Flag: : on

Maths Flag : : on

Physics Flag: : null

Chemistry Flag: : on

Чтение всех параметров формы

Ниже приведен общий пример, который использует метод getParameterNames () HttpServletRequest для чтения всех доступных параметров формы. Этот метод возвращает перечисление, которое содержит имена параметров в неуказанном порядке.

Как только у нас будет Enumeration, мы можем зациклить Enumeration стандартным способом, используя метод hasMoreElements (), чтобы определить, когда остановиться, и используя метод nextElement (), чтобы получить имя каждого параметра.

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>HTTP Header Request Example</title>
   </head>

   <body>
      <center>
         <h2>HTTP Header Request Example</h2>
         <table width = "100%" border = "1" align = "center">
            <tr bgcolor = "#949494">
               <th>Param Name</th>
               <th>Param Value(s)</th>
            </tr>
            <%
               Enumeration paramNames = request.getParameterNames();
               while(paramNames.hasMoreElements()) {
                  String paramName = (String)paramNames.nextElement();
                  out.print("<tr><td>" + paramName + "</td>\n");
                  String paramValue = request.getHeader(paramName);
                  out.println("<td> " + paramValue + "</td></tr>\n");
               }
            %>
         </table>
      </center>
   
   </body>
</html>

Ниже приводится содержание Hello.htm

<html>
   <body>
      
      <form action = "main.jsp" method = "POST" target = "_blank">
         <input type = "checkbox" name = "maths" checked = "checked" /> Maths
         <input type = "checkbox" name = "physics"  /> Physics
         <input type = "checkbox" name = "chemistry" checked = "checked" /> Chem
         <input type = "submit" value = "Select Subject" />
      </form>
   
   </body>
</html>

Теперь попробуйте вызвать JSP с помощью приведенного выше Hello.htm; это сгенерирует результат, подобный приведенному ниже, на основе предоставленного ввода —

Чтение всех параметров формы

Имя параметра Значение параметра (ов)
математика на
химия на

Вы можете попробовать вышеупомянутую JSP, чтобы прочитать данные любой другой формы, имеющие другие объекты, такие как текстовое поле, переключатель или раскрывающийся список и т. Д.

JSP — Фильтры

В этой главе мы обсудим фильтры в JSP. Фильтры сервлетов и JSP — это классы Java, которые можно использовать в программировании сервлетов и JSP для следующих целей:

  • Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.

  • Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.

Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.

Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.

Существуют различные типы фильтров, предлагаемые спецификациями —

  • Фильтры аутентификации
  • Фильтры сжатия данных
  • Фильтры шифрования
  • Фильтры, запускающие события доступа к ресурсам
  • Фильтры преобразования изображений
  • Фильтры журналирования и аудита
  • Цепные фильтры MIME-TYPE
  • Фильтры токенизации
  • Фильтры XSL / T, которые преобразуют содержимое XML

Фильтры развертываются в файле дескриптора развертывания web.xml и затем сопоставляются с именами сервлетов, JSP или шаблонами URL в дескрипторе развертывания вашего приложения. Файл дескриптора развертывания web.xml находится в каталоге <Tomcat-installation-directory> \ conf .

Когда контейнер JSP запускает ваше веб-приложение, он создает экземпляр каждого фильтра, который вы объявили в дескрипторе развертывания. Фильтры выполняются в том порядке, в котором они объявлены в дескрипторе развертывания.

Методы фильтрации сервлетов

Фильтр — это просто класс Java, который реализует интерфейс javax.servlet.Filter . Интерфейс javax.servlet.Filter определяет три метода:

S.No. Метод и описание
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Этот метод вызывается контейнером каждый раз, когда пара запрос / ответ проходит через цепочку из-за клиентского запроса на ресурс в конце цепочки.

2

public void init (FilterConfig filterConfig)

Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он помещается в службу.

3

публичный void destroy ()

Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он выводится из эксплуатации.

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Этот метод вызывается контейнером каждый раз, когда пара запрос / ответ проходит через цепочку из-за клиентского запроса на ресурс в конце цепочки.

public void init (FilterConfig filterConfig)

Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он помещается в службу.

публичный void destroy ()

Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он выводится из эксплуатации.

Пример фильтра JSP

В следующем примере показано, как распечатать IP-адрес клиента и текущую дату и время при каждом обращении к любому файлу JSP. Этот пример даст вам общее представление о фильтре JSP, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию —

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) throws ServletException {
      // Get init parameter 
      String testParam = config.getInitParameter("test-param"); 
 
      //Print the init parameter 
      System.out.println("Test Param: " + testParam); 
   }
   public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws java.io.IOException, ServletException {
      
      // Get the IP address of client machine.   
      String ipAddress = request.getRemoteAddr();
      
      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString());
      
      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }
   public void destroy( ) {
      /* Called before the Filter instance is removed 
      from service by the web container*/
   }
}

Скомпилируйте LogFilter.java обычным способом и поместите файл LogFilter.class в <каталог-установки Tomcat> / webapps / ROOT / WEB-INF / classes .

Сопоставление фильтров JSP в Web.xml

Фильтры определяются и затем сопоставляются с именем файла URL или JSP, почти так же, как определяется сервлет, а затем сопоставляются с шаблоном URL в файле web.xml . Создайте следующую запись для тега фильтра в файле дескриптора развертывания web.xml

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Вышеупомянутый фильтр будет применяться ко всем сервлетам и JSP, потому что мы указали / * в нашей конфигурации. Вы можете указать конкретный сервлет или путь JSP, если хотите применить фильтр только к нескольким сервлетам или JSP.

Теперь попробуйте вызвать любой сервлет или JSP, и вы увидите сгенерированный журнал в журнале вашего веб-сервера. Вы можете использовать Log4J logger для входа выше журнала в отдельном файле.

Использование нескольких фильтров

Ваше веб-приложение может определять несколько разных фильтров с определенной целью. Учтите, вы определяете два фильтра AuthenFilter и LogFilter . Остальная часть процесса останется, как описано выше, за исключением того, что вам нужно создать другое отображение, как указано ниже —

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
 
<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
 
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
 
<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Порядок применения фильтров

Порядок элементов сопоставления фильтра в web.xml определяет порядок, в котором веб-контейнер применяет фильтр к сервлету или JSP. Чтобы изменить порядок фильтра, нужно просто изменить элементы сопоставления фильтра в файле web.xml .

Например, в приведенном выше примере сначала будет применен LogFilter, а затем AuthenFilter к любому сервлету или JSP; следующий пример обратный порядок —

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
 
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

JSP — Обработка файлов cookie

В этой главе мы обсудим обработку файлов cookie в JSP. Файлы cookie — это текстовые файлы, которые хранятся на клиентском компьютере и хранятся для различных целей отслеживания информации. JSP прозрачно поддерживает HTTP-куки с использованием базовой технологии сервлетов.

Есть три шага, вовлеченных в идентификацию и возвращение пользователей —

  • Серверный скрипт отправляет набор файлов cookie в браузер. Например, имя, возраст или идентификационный номер и т. Д.

  • Браузер хранит эту информацию на локальном компьютере для дальнейшего использования.

  • Когда браузер в следующий раз отправляет какой-либо запрос на веб-сервер, он отправляет информацию о файлах cookie на сервер, и сервер использует эту информацию для идентификации пользователя или может быть для какой-то другой цели.

Серверный скрипт отправляет набор файлов cookie в браузер. Например, имя, возраст или идентификационный номер и т. Д.

Браузер хранит эту информацию на локальном компьютере для дальнейшего использования.

Когда браузер в следующий раз отправляет какой-либо запрос на веб-сервер, он отправляет информацию о файлах cookie на сервер, и сервер использует эту информацию для идентификации пользователя или может быть для какой-то другой цели.

В этой главе вы узнаете, как установить или сбросить файлы cookie, как получить к ним доступ и как их удалить с помощью программ JSP.

Анатомия Печенья

Файлы cookie обычно устанавливаются в заголовке HTTP (хотя JavaScript также может устанавливать файлы cookie непосредственно в браузере). JSP, который устанавливает cookie, может отправлять заголовки, которые выглядят примерно так:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT; 
   path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html

Как видите, заголовок Set-Cookie содержит пару имя-значение, дату по Гринвичу, путь и домен . Имя и значение будут закодированы в URL. Поле expires — это инструкция для браузера «забыть» cookie после заданного времени и даты.

Если браузер настроен для хранения файлов cookie, он будет хранить эту информацию до истечения срока действия. Если пользователь указывает браузеру на любую страницу, соответствующую пути и домену файла cookie, он отправляет файл cookie на сервер. Заголовки браузера могут выглядеть примерно так:

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126

Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz

Затем JSP-скрипт получит доступ к файлам cookie через метод request request.getCookies (), который возвращает массив объектов Cookie .

Servlet Cookies Методы

В следующей таблице перечислены полезные методы, связанные с объектом Cookie, которые можно использовать при работе с файлами cookie в JSP.

S.No. Метод и описание
1

public void setDomain (шаблон String)

Этот метод устанавливает домен, к которому применяется cookie; например, tutorialspoint.com.

2

public String getDomain ()

Этот метод получает домен, к которому применяется cookie; например, tutorialspoint.com.

3

public void setMaxAge (int expiry)

Этот метод устанавливает, сколько времени (в секундах) должно пройти до истечения срока действия cookie. Если вы не установите это, cookie будет длиться только для текущего сеанса.

4

public int getMaxAge ()

Этот метод возвращает максимальный возраст файла cookie, указанный в секундах. По умолчанию -1 указывает, что файл cookie будет сохраняться до завершения работы браузера.

5

public String getName ()

Этот метод возвращает имя куки. Имя не может быть изменено после создания.

6

public void setValue (String newValue)

Этот метод устанавливает значение, связанное с cookie.

7

public String getValue ()

Этот метод получает значение, связанное с cookie.

8

public void setPath (String uri)

Этот метод устанавливает путь, к которому применяется этот файл cookie. Если вы не укажете путь, файл cookie будет возвращен для всех URL-адресов в том же каталоге, что и текущая страница, а также для всех подкаталогов.

9

public String getPath ()

Этот метод получает путь, к которому применяется этот файл cookie.

10

public void setSecure (логический флаг)

Этот метод устанавливает логическое значение, указывающее, следует ли отправлять cookie-файлы только через зашифрованные (т. Е. SSL) соединения.

11

public void setComment (строковое назначение)

Этот метод задает комментарий, который описывает цель куки. Комментарий полезен, если браузер представляет файл cookie пользователю.

12

public String getComment ()

Этот метод возвращает комментарий, описывающий назначение этого файла cookie, или ноль, если файл cookie не имеет комментариев.

public void setDomain (шаблон String)

Этот метод устанавливает домен, к которому применяется cookie; например, tutorialspoint.com.

public String getDomain ()

Этот метод получает домен, к которому применяется cookie; например, tutorialspoint.com.

public void setMaxAge (int expiry)

Этот метод устанавливает, сколько времени (в секундах) должно пройти до истечения срока действия cookie. Если вы не установите это, cookie будет длиться только для текущего сеанса.

public int getMaxAge ()

Этот метод возвращает максимальный возраст файла cookie, указанный в секундах. По умолчанию -1 указывает, что файл cookie будет сохраняться до завершения работы браузера.

public String getName ()

Этот метод возвращает имя куки. Имя не может быть изменено после создания.

public void setValue (String newValue)

Этот метод устанавливает значение, связанное с cookie.

public String getValue ()

Этот метод получает значение, связанное с cookie.

public void setPath (String uri)

Этот метод устанавливает путь, к которому применяется этот файл cookie. Если вы не укажете путь, файл cookie будет возвращен для всех URL-адресов в том же каталоге, что и текущая страница, а также для всех подкаталогов.

public String getPath ()

Этот метод получает путь, к которому применяется этот файл cookie.

public void setSecure (логический флаг)

Этот метод устанавливает логическое значение, указывающее, следует ли отправлять cookie-файлы только через зашифрованные (т. Е. SSL) соединения.

public void setComment (строковое назначение)

Этот метод задает комментарий, который описывает цель куки. Комментарий полезен, если браузер представляет файл cookie пользователю.

public String getComment ()

Этот метод возвращает комментарий, описывающий назначение этого файла cookie, или ноль, если файл cookie не имеет комментариев.

Настройка файлов cookie с помощью JSP

Настройка файлов cookie с помощью JSP включает три этапа:

Шаг 1: Создание объекта Cookie

Вы вызываете конструктор Cookie с именем cookie и значением cookie, которые являются строками.

Cookie cookie = new Cookie("key","value");

Имейте в виду, что ни имя, ни значение не должны содержать пробелов или любого из следующих символов:

[ ] ( ) = , " / ? @ : ;

Шаг 2: Установка максимального возраста

Вы используете setMaxAge, чтобы указать, как долго (в секундах) файл cookie должен быть действительным. Следующий код установит cookie на 24 часа.

cookie.setMaxAge(60*60*24); 

Шаг 3: Отправка Cookie в заголовки ответа HTTP

Вы используете response.addCookie для добавления файлов cookie в заголовок ответа HTTP следующим образом

response.addCookie(cookie);

пример

Давайте изменим наш пример формы, чтобы установить файлы cookie для имени и фамилии.

<%
   // Create cookies for first and last names.      
   Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
   Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));
   
   // Set expiry date after 24 Hrs for both the cookies.
   firstName.setMaxAge(60*60*24); 
   lastName.setMaxAge(60*60*24); 
   
   // Add both the cookies in the response header.
   response.addCookie( firstName );
   response.addCookie( lastName );
%>

<html>
   <head>
      <title>Setting Cookies</title>
   </head>
   
   <body>
      <center>
         <h1>Setting Cookies</h1>
      </center>
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

Давайте поместим приведенный выше код в файл main.jsp и используем его на следующей HTML-странице:

<html>
   <body>
      
      <form action = "main.jsp" method = "GET">
         First Name: <input type = "text" name = "first_name">
         <br />
         Last Name: <input type = "text" name = "last_name" />
         <input type = "submit" value = "Submit" />
      </form>
      
   </body>
</html>

Сохраните вышеуказанный HTML-контент в файле hello.jsp и поместите hello.jsp и main.jsp в каталог <Tomcat-Installation-Directory> / webapps / ROOT . Когда вы получите доступ к http: // localhost: 8080 / hello.jsp , вот фактический результат вышеприведенной формы.

Имя:
Фамилия:

Попробуйте ввести имя и фамилию, а затем нажмите кнопку отправки. Это отобразит имя и фамилию на вашем экране, а также установит два файла cookie: firstName и lastName . Эти куки будут переданы обратно на сервер, когда вы в следующий раз нажмете кнопку «Отправить».

В следующем разделе мы объясним, как вы можете получить доступ к этим файлам cookie в своем веб-приложении.

Чтение Cookies с JSP

Для чтения файлов cookie необходимо создать массив объектов javax.servlet.http.Cookie , вызвав метод getCookies () объекта HttpServletRequest . Затем прокрутите массив и используйте методы getName () и getValue () для доступа к каждому файлу cookie и связанному значению.

пример

Давайте теперь прочитаем куки, которые были установлены в предыдущем примере —

<html>
   <head>
      <title>Reading Cookies</title>
   </head>
   
   <body>
      <center>
         <h1>Reading Cookies</h1>
      </center>
      <%
         Cookie cookie = null;
         Cookie[] cookies = null;
         
         // Get an array of Cookies associated with the this domain
         cookies = request.getCookies();
         
         if( cookies != null ) {
            out.println("<h2> Found Cookies Name and Value</h2>");
            
            for (int i = 0; i < cookies.length; i++) {
               cookie = cookies[i];
               out.print("Name : " + cookie.getName( ) + ",  ");
               out.print("Value: " + cookie.getValue( )+" <br/>");
            }
         } else {
            out.println("<h2>No cookies founds</h2>");
         }
      %>
   </body>
   
</html>

Теперь давайте поместим приведенный выше код в файл main.jsp и попробуем получить к нему доступ. Если для файла cookie first_name задано значение «John», а для файла cookie last_name — «Player», то при запуске http: // localhost: 8080 / main.jsp отобразится следующий результат:

Found Cookies Name and Value

Name : first_name, Value: John

Name : last_name, Value: Player

Name : first_name, Value: John

Name : last_name, Value: Player

Удалить куки с JSP

Удалить куки очень просто. Если вы хотите удалить куки, то вам просто нужно выполнить следующие три шага —

  • Прочитайте уже существующий файл cookie и сохраните его в объекте Cookie.

  • Задайте возраст файла cookie равным нулю, используя метод setMaxAge () для удаления существующего файла cookie.

  • Добавьте этот cookie обратно в заголовок ответа.

Прочитайте уже существующий файл cookie и сохраните его в объекте Cookie.

Задайте возраст файла cookie равным нулю, используя метод setMaxAge () для удаления существующего файла cookie.

Добавьте этот cookie обратно в заголовок ответа.

пример

В следующем примере показано, как удалить существующий файл cookie с именем «first_name», и при следующем запуске JSP main.jsp в следующий раз он вернет нулевое значение для first_name.

<html>
   <head>
      <title>Reading Cookies</title>
   </head>
   
   <body>
      <center>
         <h1>Reading Cookies</h1>
      </center>
      <%
         Cookie cookie = null;
         Cookie[] cookies = null;
         
         // Get an array of Cookies associated with the this domain
         cookies = request.getCookies();
         
         if( cookies != null ) {
            out.println("<h2> Found Cookies Name and Value</h2>");
            
            for (int i = 0; i < cookies.length; i++) {
               cookie = cookies[i];
               
               if((cookie.getName( )).compareTo("first_name") == 0 ) {
                  cookie.setMaxAge(0);
                  response.addCookie(cookie);
                  out.print("Deleted cookie: " + 
                  cookie.getName( ) + "<br/>");
               }
               out.print("Name : " + cookie.getName( ) + ",  ");
               out.print("Value: " + cookie.getValue( )+" <br/>");
            }
         } else {
            out.println(
            "<h2>No cookies founds</h2>");
         }
      %>
   </body>
   
</html>

Теперь давайте поместим приведенный выше код в файл main.jsp и попробуем получить к нему доступ. Будет отображаться следующий результат —

Cookies Name and Value

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Deleted cookie : first_name

Name : first_name, Value: John

Name : last_name, Value: Player

Теперь запустите http: // localhost: 8080 / main.jsp еще раз, и он должен отобразить только один файл cookie следующим образом:

Found Cookies Name and Value

Name : last_name, Value: Player

Вы можете удалить свои куки в Internet Explorer вручную. Начните с меню Сервис и выберите Свойства обозревателя. Чтобы удалить все файлы cookie, нажмите кнопку «Удалить файлы cookie».

JSP — отслеживание сеансов

В этой главе мы обсудим отслеживание сеансов в JSP. HTTP — это протокол без сохранения состояния, который означает, что каждый раз, когда клиент извлекает веб-страницу, клиент открывает отдельное соединение с веб-сервером, и сервер автоматически не ведет запись предыдущего запроса клиента.

Поддержание сеанса между веб-клиентом и сервером

Давайте теперь обсудим несколько вариантов поддержки сеанса между веб-клиентом и веб-сервером.

Печенье

Веб-сервер может назначить уникальный идентификатор сеанса в виде файла cookie каждому веб-клиенту, и для последующих запросов от клиента они могут быть распознаны с использованием полученного файла cookie.

Это может быть неэффективным способом, поскольку браузер иногда не поддерживает cookie. Не рекомендуется использовать эту процедуру для поддержания сеансов.

Скрытые поля формы

Веб-сервер может отправить скрытое поле формы HTML вместе с уникальным идентификатором сеанса следующим образом:

<input type = "hidden" name = "sessionid" value = "12345">

Эта запись означает, что при отправке формы указанные имя и значение автоматически включаются в данные GET или POST . Каждый раз, когда веб-браузер отправляет запрос обратно, значение session_id может использоваться для отслеживания различных веб-браузеров.

Это может быть эффективным способом отслеживания сеанса, но нажатие на обычную (<A HREF…>) гипертекстовую ссылку не приводит к отправке формы, поэтому скрытые поля формы также не могут поддерживать общее отслеживание сеанса.

Перезапись URL

Вы можете добавить некоторые дополнительные данные в конце каждого URL. Эти данные идентифицируют сеанс; сервер может связать этот идентификатор сеанса с данными, которые он сохранил об этом сеансе.

Например, с http://tutorialspoint.com/file.htm;sessionid=12345 идентификатор сеанса прикрепляется как sessionid = 12345, к которому можно получить доступ на веб-сервере для идентификации клиента.

Перезапись URL — лучший способ поддерживать сеансы и работает для браузеров, когда они не поддерживают куки. Недостатком здесь является то, что вам придется динамически генерировать каждый URL для назначения идентификатора сеанса, хотя страница является простой статической страницей HTML.

Объект сеанса

Помимо вышеупомянутых опций, JSP использует сервлет HttpSession Interface. Этот интерфейс позволяет идентифицировать пользователя.

  • одностраничный запрос или
  • посетить веб-сайт или
  • хранить информацию об этом пользователе

По умолчанию в JSP включено отслеживание сеансов, и для каждого нового клиента автоматически создается новый объект HttpSession. Отключение отслеживания сеанса требует явного отключения его путем установки атрибута сеанса директивы страницы в false следующим образом:

<%@ page session = "false" %>

Механизм JSP предоставляет объект HttpSession автору JSP через неявный объект сеанса . Поскольку объект сеанса уже предоставлен программисту JSP, программист может немедленно начать хранение и извлечение данных из объекта без какой-либо инициализации или getSession () .

Вот краткое изложение важных методов, доступных через объект сеанса —

S.No. Метод и описание
1

открытый объект getAttribute (имя строки)

Этот метод возвращает объект, связанный с указанным именем в этом сеансе, или ноль, если объект не связан с именем.

2

публичное перечисление getAttributeNames ()

Этот метод возвращает Перечисление объектов String, содержащих имена всех объектов, связанных с этим сеансом.

3

public long getCreationTime ()

Этот метод возвращает время создания сеанса, измеренное в миллисекундах с полуночи 1 января 1970 года по Гринвичу.

4

public String getId ()

Этот метод возвращает строку, содержащую уникальный идентификатор, назначенный этому сеансу.

5

public long getLastAccessedTime ()

Этот метод возвращает последний раз, когда клиент отправил запрос, связанный с этим сеансом, в виде количества миллисекунд с полуночи 1 января 1970 года по Гринвичу.

6

public int getMaxInactiveInterval ()

Этот метод возвращает максимальный интервал времени в секундах, в течение которого контейнер сервлета будет держать этот сеанс открытым между клиентскими обращениями.

7

public void invalidate ()

Этот метод делает недействительным этот сеанс и отменяет привязку любых объектов, связанных с ним.

8

public boolean isNew ()

Этот метод возвращает true, если клиент еще не знает о сеансе или если клиент решает не присоединяться к сеансу.

9

public void removeAttribute (String name)

Этот метод удаляет объект, связанный с указанным именем из этого сеанса.

10

public void setAttribute (имя строки, значение объекта)

Этот метод привязывает объект к этому сеансу, используя указанное имя.

11

public void setMaxInactiveInterval (int interval)

Этот метод указывает время в секундах между клиентскими запросами, прежде чем контейнер сервлета аннулирует этот сеанс.

открытый объект getAttribute (имя строки)

Этот метод возвращает объект, связанный с указанным именем в этом сеансе, или ноль, если объект не связан с именем.

публичное перечисление getAttributeNames ()

Этот метод возвращает Перечисление объектов String, содержащих имена всех объектов, связанных с этим сеансом.

public long getCreationTime ()

Этот метод возвращает время создания сеанса, измеренное в миллисекундах с полуночи 1 января 1970 года по Гринвичу.

public String getId ()

Этот метод возвращает строку, содержащую уникальный идентификатор, назначенный этому сеансу.

public long getLastAccessedTime ()

Этот метод возвращает последний раз, когда клиент отправил запрос, связанный с этим сеансом, в виде количества миллисекунд с полуночи 1 января 1970 года по Гринвичу.

public int getMaxInactiveInterval ()

Этот метод возвращает максимальный интервал времени в секундах, в течение которого контейнер сервлета будет держать этот сеанс открытым между клиентскими обращениями.

public void invalidate ()

Этот метод делает недействительным этот сеанс и отменяет привязку любых объектов, связанных с ним.

public boolean isNew ()

Этот метод возвращает true, если клиент еще не знает о сеансе или если клиент решает не присоединяться к сеансу.

public void removeAttribute (String name)

Этот метод удаляет объект, связанный с указанным именем из этого сеанса.

public void setAttribute (имя строки, значение объекта)

Этот метод привязывает объект к этому сеансу, используя указанное имя.

public void setMaxInactiveInterval (int interval)

Этот метод указывает время в секундах между клиентскими запросами, прежде чем контейнер сервлета аннулирует этот сеанс.

Пример отслеживания сеанса

В этом примере описывается, как использовать объект HttpSession для определения времени создания и времени последнего обращения к сеансу. Мы связали бы новый сеанс с запросом, если он еще не существует.

<%@ page import = "java.io.*,java.util.*" %>
<%
   // Get session creation time.
   Date createTime = new Date(session.getCreationTime());
   
   // Get last access time of this Webpage.
   Date lastAccessTime = new Date(session.getLastAccessedTime());

   String title = "Welcome Back to my website";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");

   // Check if this is new comer on your Webpage.
   if (session.isNew() ){
      title = "Welcome to my website";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } 
   visitCount = (Integer)session.getAttribute(visitCountKey);
   visitCount = visitCount + 1;
   userID = (String)session.getAttribute(userIDKey);
   session.setAttribute(visitCountKey,  visitCount);
%>

<html>
   <head>
      <title>Session Tracking</title>
   </head>
   
   <body>
      <center>
         <h1>Session Tracking</h1>
      </center>
      
      <table border = "1" align = "center"> 
         <tr bgcolor = "#949494">
            <th>Session info</th>
            <th>Value</th>
         </tr> 
         <tr>
            <td>id</td>
            <td><% out.print( session.getId()); %></td>
         </tr> 
         <tr>
            <td>Creation Time</td>
            <td><% out.print(createTime); %></td>
         </tr> 
         <tr>
            <td>Time of Last Access</td>
            <td><% out.print(lastAccessTime); %></td>
         </tr> 
         <tr>
            <td>User ID</td>
            <td><% out.print(userID); %></td>
         </tr> 
         <tr>
            <td>Number of visits</td>
            <td><% out.print(visitCount); %></td>
         </tr> 
      </table> 
   
   </body>
</html>

Теперь поместите приведенный выше код в main.jsp и попробуйте получить доступ к http: // localhost: 8080 / main.jsp . Как только вы запустите URL, вы получите следующий результат —

Добро пожаловать на мой сайт

Информация о сеансе

Информация о сессии значение
Я бы 0AE3EC93FF44E3C525B4351B77ABB2D5
Время создания Вт июн 08 17:26:40 GMT + 04: 00 2010
Время последнего доступа Вт июн 08 17:26:40 GMT + 04: 00 2010
Идентификатор пользователя ABCD
Количество посещений 0

Теперь попробуйте запустить тот же JSP во второй раз, вы получите следующий результат.

Добро пожаловать обратно на мой сайт

Информация о сеансе

тип информации значение
Я бы 0AE3EC93FF44E3C525B4351B77ABB2D5
Время создания Вт июн 08 17:26:40 GMT + 04: 00 2010
Время последнего доступа Вт июн 08 17:26:40 GMT + 04: 00 2010
Идентификатор пользователя ABCD
Количество посещений 1

Удаление данных сеанса

Когда вы закончите с данными сеанса пользователя, у вас есть несколько вариантов —

  • Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с конкретным ключом.

  • Удалить весь сеанс. Вы можете вызвать открытый метод void invalidate (), чтобы отменить весь сеанс.

  • Установка времени ожидания сеанса. Вы можете вызвать открытый метод void setMaxInactiveInterval (int interval), чтобы установить время ожидания для сеанса индивидуально.

  • Выйти из системы — на серверах, которые поддерживают сервлеты 2.4, вы можете вызвать logout для выхода клиента из Web-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.

  • Конфигурация web.xml. Если вы используете Tomcat, кроме вышеупомянутых методов, вы можете настроить время ожидания сеанса в файле web.xml следующим образом.

Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с конкретным ключом.

Удалить весь сеанс. Вы можете вызвать открытый метод void invalidate (), чтобы отменить весь сеанс.

Установка времени ожидания сеанса. Вы можете вызвать открытый метод void setMaxInactiveInterval (int interval), чтобы установить время ожидания для сеанса индивидуально.

Выйти из системы — на серверах, которые поддерживают сервлеты 2.4, вы можете вызвать logout для выхода клиента из Web-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.

Конфигурация web.xml. Если вы используете Tomcat, кроме вышеупомянутых методов, вы можете настроить время ожидания сеанса в файле web.xml следующим образом.

<session-config>
   <session-timeout>15</session-timeout>
</session-config>

Время ожидания выражается в минутах и ​​переопределяет время ожидания по умолчанию, равное 30 минутам в Tomcat.

Метод getMaxInactiveInterval () в сервлете возвращает период ожидания для этого сеанса в секундах. Поэтому, если ваш сеанс настроен в web.xml на 15 минут, getMaxInactiveInterval () возвращает 900.

JSP — загрузка файлов

В этой главе мы обсудим выгрузку файлов в JSP. JSP может использоваться с тегом HTML-формы, чтобы пользователи могли загружать файлы на сервер. Загруженный файл может быть текстовым файлом, двоичным файлом, файлом изображения или просто любым документом.

Создание формы загрузки файла

Давайте теперь поймем, как создать форму загрузки файла. Следующий HTML-код создает форму загрузчика. Ниже приведены важные моменты, которые следует отметить —

  • Атрибут метода формы должен быть установлен в метод POST, и метод GET не может быть использован.

  • Атрибут формы enctype должен быть установлен в multipart / form-data .

  • Атрибут действия формы должен быть установлен в файл JSP, который будет обрабатывать загрузку файлов на сервер. Следующий пример использует файл программы uploadFile.jsp для загрузки файла.

  • Для загрузки одного файла вы должны использовать один тег <input … /> с атрибутом type = «file» . Чтобы разрешить загрузку нескольких файлов, включите более одного входного тега с разными значениями для атрибута имени. Браузер связывает кнопку «Обзор» с каждым из них.

Атрибут метода формы должен быть установлен в метод POST, и метод GET не может быть использован.

Атрибут формы enctype должен быть установлен в multipart / form-data .

Атрибут действия формы должен быть установлен в файл JSP, который будет обрабатывать загрузку файлов на сервер. Следующий пример использует файл программы uploadFile.jsp для загрузки файла.

Для загрузки одного файла вы должны использовать один тег <input … /> с атрибутом type = «file» . Чтобы разрешить загрузку нескольких файлов, включите более одного входного тега с разными значениями для атрибута имени. Браузер связывает кнопку «Обзор» с каждым из них.

<html>
   <head>
      <title>File Uploading Form</title>
   </head>
   
   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      <form action = "UploadServlet" method = "post"
         enctype = "multipart/form-data">
         <input type = "file" name = "file" size = "50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
   </body>
   
</html>

Это покажет следующий результат. Теперь вы можете выбрать файл с локального ПК, и когда пользователь нажимает «Загрузить файл», форма отправляется вместе с выбранным файлом —

File Upload

Select a file to upload −



Select a file to upload −

ПРИМЕЧАНИЕ. — Вышеуказанная форма является просто фиктивной формой и не будет работать, вы должны попробовать приведенный выше код на своем компьютере, чтобы она работала

Написание внутреннего JSP-скрипта

Давайте теперь определим место, где будут храниться загруженные файлы. Вы можете жестко запрограммировать это в своей программе, или это имя каталога также можно добавить, используя внешнюю конфигурацию, такую ​​как элемент context-param в web.xml, следующим образом:

<web-app>
....
<context-param> 
   <description>Location to store uploaded file</description> 
   <param-name>file-upload</param-name> 
   <param-value>
      c:\apache-tomcat-5.5.29\webapps\data\
   </param-value> 
</context-param>
....
</web-app>

Ниже приведен исходный код для UploadFile.jsp . Это может обрабатывать загрузку нескольких файлов одновременно. Давайте теперь рассмотрим следующее, прежде чем приступить к загрузке файлов.

  • Следующий пример зависит от FileUpload ; убедитесь, что у вас есть последняя версия файла commons-fileupload.xxjar в вашем classpath. Вы можете скачать его с https://commons.apache.org/fileupload/ .

  • FileUpload зависит от ввода-вывода Commons; убедитесь, что у вас есть последняя версия файла commons-io-xxjar в вашем classpath. Вы можете скачать его с https://commons.apache.org/io/ .

  • При тестировании следующего примера вы должны загрузить файл меньшего размера, чем maxFileSize, иначе файл не будет загружен.

  • Убедитесь, что вы заранее создали каталоги c: \ temp и c: \ apache-tomcat5.5.29 \ webapps \ data .

Следующий пример зависит от FileUpload ; убедитесь, что у вас есть последняя версия файла commons-fileupload.xxjar в вашем classpath. Вы можете скачать его с https://commons.apache.org/fileupload/ .

FileUpload зависит от ввода-вывода Commons; убедитесь, что у вас есть последняя версия файла commons-io-xxjar в вашем classpath. Вы можете скачать его с https://commons.apache.org/io/ .

При тестировании следующего примера вы должны загрузить файл меньшего размера, чем maxFileSize, иначе файл не будет загружен.

Убедитесь, что вы заранее создали каталоги c: \ temp и c: \ apache-tomcat5.5.29 \ webapps \ data .

<%@ page import = "java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import = "javax.servlet.http.*" %>
<%@ page import = "org.apache.commons.fileupload.*" %>
<%@ page import = "org.apache.commons.fileupload.disk.*" %>
<%@ page import = "org.apache.commons.fileupload.servlet.*" %>
<%@ page import = "org.apache.commons.io.output.*" %>

<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   ServletContext context = pageContext.getServletContext();
   String filePath = context.getInitParameter("file-upload");

   // Verify the content type
   String contentType = request.getContentType();
   
   if ((contentType.indexOf("multipart/form-data") >= 0)) {
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );
      
      try { 
         // Parse the request to get file items.
         List fileItems = upload.parseRequest(request);

         // Process the uploaded file items
         Iterator i = fileItems.iterator();

         out.println("<html>");
         out.println("<head>");
         out.println("<title>JSP File upload</title>");  
         out.println("</head>");
         out.println("<body>");
         
         while ( i.hasNext () ) {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () ) {
               // Get the uploaded file parameters
               String fieldName = fi.getFieldName();
               String fileName = fi.getName();
               boolean isInMemory = fi.isInMemory();
               long sizeInBytes = fi.getSize();
            
               // Write the file
               if( fileName.lastIndexOf("\\") >= 0 ) {
                  file = new File( filePath + 
                  fileName.substring( fileName.lastIndexOf("\\"))) ;
               } else {
                  file = new File( filePath + 
                  fileName.substring(fileName.lastIndexOf("\\")+1)) ;
               }
               fi.write( file ) ;
               out.println("Uploaded Filename: " + filePath + 
               fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
      } catch(Exception ex) {
         System.out.println(ex);
      }
   } else {
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>"); 
      out.println("</body>");
      out.println("</html>");
   }
%>

Теперь попробуйте загрузить файлы, используя HTML-форму, которую вы создали выше. При попытке http: // localhost: 8080 / UploadFile.htm , он будет отображать следующий результат. Это поможет вам загрузить любой файл с вашего локального компьютера.

File Upload

Select a file to upload −


Select a file to upload −

Если ваш JSP-скрипт работает нормально, ваш файл должен быть загружен в каталог c: \ apache-tomcat5.5.29 \ webapps \ data \ .

JSP — дата обработки

В этой главе мы обсудим, как обрабатывать данные в JSP. Одним из наиболее важных преимуществ использования JSP является то, что вы можете использовать все методы, доступные в ядре Java. Мы проведем вас через класс Date, который доступен в пакете java.util ; этот класс инкапсулирует текущую дату и время.

Класс Date поддерживает два конструктора. Первый конструктор инициализирует объект с текущей датой и временем.

Date( )

Следующий конструктор принимает один аргумент, равный количеству миллисекунд, прошедших с полуночи 1 января 1970 года.

Date(long millisec)

Если у вас есть объект Date, вы можете вызвать любой из следующих методов поддержки, чтобы поиграть с датами:

S.No. Методы и описание
1

логическое после (Дата дата)

Возвращает true, если вызывающий объект Date содержит дату, которая позже даты, указанной в date, в противном случае он возвращает false.

2

логическое значение до (дата дата)

Возвращает true, если вызывающий объект Date содержит дату, более раннюю, чем та, которая указана в date, в противном случае он возвращает false.

3

Клон объекта ()

Дублирует вызывающий объект Date.

4

int compareTo (Дата дата)

Сравнивает значение вызывающего объекта со значением даты. Возвращает 0, если значения равны. Возвращает отрицательное значение, если вызывающий объект раньше даты. Возвращает положительное значение, если вызывающий объект позже даты.

5

int compareTo (Object obj)

Действует одинаково для compareTo (Date), если obj имеет класс Date. В противном случае он создает исключение ClassCastException.

6

логическое равенство (дата объекта)

Возвращает true, если вызывающий объект Date содержит то же время и дату, что и объект, указанный в date, в противном случае он возвращает false.

7

long getTime ()

Возвращает количество миллисекунд, прошедших с 1 января 1970 года.

8

int hashCode ()

Возвращает хеш-код для вызывающего объекта.

9

void setTime (долгое время)

Устанавливает время и дату, указанные по времени, которое представляет истекшее время в миллисекундах с полуночи 1 января 1970 года.

10

Строка toString ()

Преобразует вызывающий объект Date в строку и возвращает результат.

логическое после (Дата дата)

Возвращает true, если вызывающий объект Date содержит дату, которая позже даты, указанной в date, в противном случае он возвращает false.

логическое значение до (дата дата)

Возвращает true, если вызывающий объект Date содержит дату, более раннюю, чем та, которая указана в date, в противном случае он возвращает false.

Клон объекта ()

Дублирует вызывающий объект Date.

int compareTo (Дата дата)

Сравнивает значение вызывающего объекта со значением даты. Возвращает 0, если значения равны. Возвращает отрицательное значение, если вызывающий объект раньше даты. Возвращает положительное значение, если вызывающий объект позже даты.

int compareTo (Object obj)

Действует одинаково для compareTo (Date), если obj имеет класс Date. В противном случае он создает исключение ClassCastException.

логическое равенство (дата объекта)

Возвращает true, если вызывающий объект Date содержит то же время и дату, что и объект, указанный в date, в противном случае он возвращает false.

long getTime ()

Возвращает количество миллисекунд, прошедших с 1 января 1970 года.

int hashCode ()

Возвращает хеш-код для вызывающего объекта.

void setTime (долгое время)

Устанавливает время и дату, указанные по времени, которое представляет истекшее время в миллисекундах с полуночи 1 января 1970 года.

Строка toString ()

Преобразует вызывающий объект Date в строку и возвращает результат.

Получение текущей даты и времени

С программой JSP очень легко получить текущую дату и время. Вы можете использовать простой объект Date с методом toString () для печати текущей даты и времени следующим образом:

<%@ page import = "java.io.*,java.util.*, javax.servlet.*" %>

<html>
   <head>
      <title>Display Current Date & Time</title>
   </head>
   
   <body>
      <center>
         <h1>Display Current Date & Time</h1>
      </center>
      <%
         Date date = new Date();
         out.print( "<h2 align = \"center\">" +date.toString()+"</h2>");
      %>
   </body>
</html>

Давайте теперь сохраним код в CurrentDate.jsp и затем вызовем этот JSP, используя URL-адрес http: // localhost: 8080 / CurrentDate.jsp . Вы получите следующий результат —

Display Current Date & Time

Mon Jun 21 21:46:49 GMT+04:00 2010

Обновите страницу с помощью URL-адреса http: // localhost: 8080 / CurrentDate.jsp . Вы найдете разницу в секундах при каждом обновлении.

Сравнение дат

Как обсуждалось в предыдущих разделах, вы можете использовать все доступные методы Java в ваших JSP-скриптах. Если вам нужно сравнить две даты, рассмотрите следующие методы —

  • Вы можете использовать метод getTime () для получения количества миллисекунд, прошедших с полуночи 1 января 1970 года, для обоих объектов, а затем сравнить эти два значения.

  • Вы можете использовать методы before (), after () и equals (), потому что 12-е число месяца предшествует 18-му; например, новая Дата (99, 2, 12) .before (новая Дата (99, 2, 18)) возвращает true.

  • Вы можете использовать метод compareTo () ; этот метод определяется интерфейсом Comparable и реализуется датой.

Вы можете использовать метод getTime () для получения количества миллисекунд, прошедших с полуночи 1 января 1970 года, для обоих объектов, а затем сравнить эти два значения.

Вы можете использовать методы before (), after () и equals (), потому что 12-е число месяца предшествует 18-му; например, новая Дата (99, 2, 12) .before (новая Дата (99, 2, 18)) возвращает true.

Вы можете использовать метод compareTo () ; этот метод определяется интерфейсом Comparable и реализуется датой.

Форматирование даты с использованием SimpleDateFormat

SimpleDateFormat — это конкретный класс для форматирования и анализа дат с учетом языка. SimpleDateFormat позволяет начать с выбора любых пользовательских шаблонов для форматирования даты и времени.

Давайте изменим приведенный выше пример следующим образом:

<%@ page import = "java.io.*,java.util.*" %>
<%@ page import = "javax.servlet.*,java.text.*" %>

<html>
   <head>
      <title>Display Current Date & Time</title>
   </head>
   
   <body>
      <center>
         <h1>Display Current Date & Time</h1>
      </center>
      <%
         Date dNow = new Date( );
         SimpleDateFormat ft = 
         new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
         out.print( "<h2 align=\"center\">" + ft.format(dNow) + "</h2>");
      %>
   </body>
</html>

Скомпилируйте вышеприведенный сервлет еще раз и затем вызовите этот сервлет, используя URL-адрес http: // localhost: 8080 / CurrentDate . Вы получите следующий результат —

Display Current Date & Time

Mon 2010.06.21 at 10:06:44 PM GMT+04:00

Простые коды формата DateFormat

Чтобы указать формат времени, используйте строку шаблона времени. В этом шаблоне все буквы ASCII зарезервированы как буквы шаблона, которые определены следующим образом:

символ Описание пример
г Обозначение эпохи ОБЪЯВЛЕНИЕ
Y Год в четыре цифры 2001
M Месяц в году Июль или 07
d День в месяце 0
час Час в AM / PM (1 ~ 12) 2
ЧАС Час в день (0 ~ 23) 22
м Минута в час 30
s Секунда в минуту 55
S миллисекунды 234
Е День в неделю вторник
D День в году 360
F День недели в месяце 2 (вторая среда в июле)
вес Неделя в году 40
W Неделя в месяце
AM / PM маркер ВЕЧЕРА
К Час в день (1 ~ 24) 24
К Час в AM / PM (0 ~ 11) 0
Z Часовой пояс Восточное стандартное время
Побег для текста Разделитель
« Одинарные цитаты `

Для получения полного списка постоянных доступных методов для манипулирования датой, вы можете обратиться к стандартной документации Java.

JSP — перенаправление страниц

В этой главе мы обсудим перенаправление страниц с помощью JSP. Перенаправление страниц обычно используется, когда документ перемещается в новое место, и нам нужно отправить клиента в это новое место. Это может быть из-за балансировки нагрузки или для простой рандомизации.

Простейший способ перенаправления запроса на другую страницу — использование метода ответа объекта sendRedirect () . Ниже приведена подпись этого метода —

public void response.sendRedirect(String location)
throws IOException 

Этот метод отправляет ответ в браузер вместе с кодом состояния и новым местоположением страницы. Вы также можете использовать методы setStatus () и setHeader () вместе для достижения одного и того же примера перенаправления —

....
String site = "http://www.newpage.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site); 
....

пример

В этом примере показано, как JSP выполняет перенаправление страниц в другое место.

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>Page Redirection</title>
   </head>
   
   <body>
      <center>
         <h1>Page Redirection</h1>
      </center>
      <%
         // New location to be redirected
         String site = new String("http://www.photofuntoos.com");
         response.setStatus(response.SC_MOVED_TEMPORARILY);
         response.setHeader("Location", site); 
      %>
   </body>
</html>

Теперь давайте поместим приведенный выше код в PageRedirect.jsp и вызовем этот JSP, используя URL-адрес http: // localhost: 8080 / PageRedirect.jsp . Это приведет вас к указанному URL-адресу http://www.photofuntoos.com .

JSP — Счетчик хитов

В этой главе мы обсудим счетчик посещений в JSP. Счетчик посещений сообщает вам о количестве посещений определенной страницы вашего веб-сайта. Обычно вы прикрепляете счетчик посещений к своей странице index.jsp, предполагая, что люди впервые попадают на вашу домашнюю страницу.

Для реализации счетчика посещений вы можете использовать объект Application Implicit и связанные с ним методы getAttribute () и setAttribute () .

Этот объект является представлением страницы JSP на протяжении всего ее жизненного цикла. Этот объект создается при инициализации страницы JSP и удаляется при удалении страницы JSP методом jspDestroy () .

Ниже приведен синтаксис для установки переменной на уровне приложения.

application.setAttribute(String Key, Object Value);

Вы можете использовать описанный выше метод для установки переменной счетчика посещений и сброса той же самой переменной. Ниже приведен метод чтения переменной, установленной предыдущим методом:

application.getAttribute(String Key);

Каждый раз, когда пользователь заходит на вашу страницу, вы можете прочитать текущее значение счетчика посещений, увеличить его на единицу и снова установить для использования в будущем.

пример

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

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>Application object in JSP</title>
   </head>
   
   <body>
      <%
         Integer hitsCount = (Integer)application.getAttribute("hitCounter");
         if( hitsCount ==null || hitsCount == 0 ) {
            /* First visit */
            out.println("Welcome to my website!");
            hitsCount = 1;
         } else {
            /* return visit */
            out.println("Welcome back to my website!");
            hitsCount += 1;
         }
         application.setAttribute("hitCounter", hitsCount);
      %>
      <center>
         <p>Total number of visits: <%= hitsCount%></p>
      </center>
   
   </body>
</html>

Теперь давайте поместим приведенный выше код в main.jsp и вызовем этот JSP, используя URL-адрес http: // localhost: 8080 / main.jsp . Это отобразит значение счетчика посещений, которое увеличивается по мере обновления страницы. Вы можете попробовать получить доступ к странице с помощью различных браузеров, и вы увидите, что счетчик посещений будет увеличиваться с каждым попаданием, и вы получите результат следующим образом:

Welcome back to my website!

Total number of visits: 12

Welcome back to my website!

Total number of visits: 12

Сброс счетчика хитов

Что, когда вы перезапустите свое приложение, то есть веб-сервер, это сбросит переменную вашего приложения, и ваш счетчик обнулится. Чтобы избежать этой потери, рассмотрите следующие пункты —

  • Определите таблицу базы данных с одним счетчиком, скажем, Hitcount. Присвойте ему нулевое значение.

  • С каждым попаданием читайте таблицу, чтобы получить значение hitcount.

  • Увеличьте значение hitcount на единицу и обновите таблицу новым значением.

  • Отобразить новое значение количества посещений как общее число посещений страницы.

  • Если вы хотите посчитать хиты для всех страниц, примените вышеуказанную логику для всех страниц.

Определите таблицу базы данных с одним счетчиком, скажем, Hitcount. Присвойте ему нулевое значение.

С каждым попаданием читайте таблицу, чтобы получить значение hitcount.

Увеличьте значение hitcount на единицу и обновите таблицу новым значением.

Отобразить новое значение количества посещений как общее число посещений страницы.

Если вы хотите посчитать хиты для всех страниц, примените вышеуказанную логику для всех страниц.

JSP — Автообновление

В этой главе мы обсудим Автообновление в JSP. Рассмотрим веб-страницу, на которой отображается результат игры в реальном времени, статус фондового рынка или коэффициент обмена валюты. Для всех таких типов страниц вам необходимо регулярно обновлять веб-страницу, используя кнопку обновления или перезагрузки в браузере.

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

Самым простым способом обновления веб-страницы является использование метода setIntHeader () объекта ответа. Ниже приведена подпись этого метода —

public void setIntHeader(String header, int headerValue)

Этот метод отправляет в браузер заголовок «Обновить» вместе с целочисленным значением, которое указывает временной интервал в секундах.

Пример автоматического обновления страницы

В следующем примере мы будем использовать метод setIntHeader () для установки заголовка Refresh . Это поможет имитировать цифровые часы —

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>Auto Refresh Header Example</title>
   </head>
   
   <body>
      <center>
         <h2>Auto Refresh Header Example</h2>
         <%
            // Set refresh, autoload time as 5 seconds
            response.setIntHeader("Refresh", 5);
            
            // Get current time
            Calendar calendar = new GregorianCalendar();
            String am_pm;
            
            int hour = calendar.get(Calendar.HOUR);
            int minute = calendar.get(Calendar.MINUTE);
            int second = calendar.get(Calendar.SECOND);
            
            if(calendar.get(Calendar.AM_PM) == 0)
               am_pm = "AM";
            else
               am_pm = "PM";
            String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
            out.println("Crrent Time: " + CT + "\n");
         %>
      </center>
   
   </body>
</html>

Теперь поместите приведенный выше код в main.jsp и попробуйте получить к нему доступ. Это будет отображать текущее системное время через каждые 5 секунд следующим образом. Просто запустите JSP и подождите, чтобы увидеть результат —

Auto Refresh Header Example

Current Time is: 9:44:50 PM

JSP — отправка электронной почты

В этой главе мы обсудим, как отправлять электронные письма, используя JSP. Чтобы отправить электронное письмо с использованием JSP, на вашем компьютере должны быть установлены JavaMail API и Java Activation Framework (JAF) .

  • Вы можете загрузить последнюю версию JavaMail (Версия 1.2) со стандартного веб-сайта Java.

  • Вы можете загрузить последнюю версию JavaBeans Activation Framework JAF (версия 1.0.2) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JavaMail (Версия 1.2) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JavaBeans Activation Framework JAF (версия 1.0.2) со стандартного веб-сайта Java.

Загрузите и разархивируйте эти файлы во вновь созданных каталогах верхнего уровня. Вы найдете несколько файлов JAR для обоих приложений. Вам необходимо добавить файлы mail.jar и Activation.jar в CLASSPATH.

Отправить простое письмо

Вот пример отправки простого электронного письма с вашего компьютера. Предполагается, что ваш локальный хост подключен к Интернету и способен отправлять электронную почту. Убедитесь, что все файлы JAR из пакета Java Email API и пакета JAF доступны в CLASSPATH.

<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>

<%
   String result;
   
   // Recipient's email ID needs to be mentioned.
   String to = "abcd@gmail.com";

   // Sender's email ID needs to be mentioned
   String from = "mcmohd@gmail.com";

   // Assuming you are sending email from localhost
   String host = "localhost";

   // Get system properties object
   Properties properties = System.getProperties();

   // Setup mail server
   properties.setProperty("mail.smtp.host", host);

   // Get the default Session object.
   Session mailSession = Session.getDefaultInstance(properties);

   try {
      // Create a default MimeMessage object.
      MimeMessage message = new MimeMessage(mailSession);
      
      // Set From: header field of the header.
      message.setFrom(new InternetAddress(from));
      
      // Set To: header field of the header.
      message.addRecipient(Message.RecipientType.TO,
                               new InternetAddress(to));
      // Set Subject: header field
      message.setSubject("This is the Subject Line!");
      
      // Now set the actual message
      message.setText("This is actual message");
      
      // Send message
      Transport.send(message);
      result = "Sent message successfully....";
   } catch (MessagingException mex) {
      mex.printStackTrace();
      result = "Error: unable to send message....";
   }
%>

<html>
   <head>
      <title>Send Email using JSP</title>
   </head>
   
   <body>
      <center>
         <h1>Send Email using JSP</h1>
      </center>
      
      <p align = "center">
         <% 
            out.println("Result: " + result + "\n");
         %>
      </p>
   </body>
</html>

Теперь давайте поместим приведенный выше код в файл SendEmail.jsp и вызовем этот JSP с помощью URL-адреса http: // localhost: 8080 / SendEmail.jsp . Это поможет отправить электронное письмо на указанный адрес электронной почты abcd@gmail.com . Вы получите следующий ответ —

Send Email using JSP

Result: Sent message successfully....

Result: Sent message successfully….

Если вы хотите отправить электронное письмо нескольким получателям, используйте следующие методы для указания нескольких идентификаторов электронной почты:

void addRecipients(Message.RecipientType type, Address[] addresses)
throws MessagingException

Вот описание параметров —

  • type — Это будет установлено в TO, CC или BCC. Здесь CC представляет Carbon Copy, а BCC представляет Black Carbon Copy. Пример Message.RecipientType.TO

  • адреса — это массив идентификатора электронной почты. Вам нужно будет использовать метод InternetAddress () при указании идентификаторов электронной почты

type — Это будет установлено в TO, CC или BCC. Здесь CC представляет Carbon Copy, а BCC представляет Black Carbon Copy. Пример Message.RecipientType.TO

адреса — это массив идентификатора электронной почты. Вам нужно будет использовать метод InternetAddress () при указании идентификаторов электронной почты

Отправить HTML письмо

Вот пример для отправки электронного письма в формате HTML с вашего компьютера. Предполагается, что ваш локальный хост подключен к Интернету и способен отправлять электронную почту. Убедитесь, что все файлы JAR из пакета Java Email API и пакета JAF доступны в CLASSPATH.

Этот пример очень похож на предыдущий, за исключением того, что здесь мы используем метод setContent () для установки содержимого, второй аргумент которого — «text / html», чтобы указать, что содержимое HTML включено в сообщение.

Используя этот пример, вы можете отправить столько HTML контента, сколько вам нужно.

<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>

<%
   String result;
   
   // Recipient's email ID needs to be mentioned.
   String to = "abcd@gmail.com";

   // Sender's email ID needs to be mentioned
   String from = "mcmohd@gmail.com";

   // Assuming you are sending email from localhost
   String host = "localhost";

   // Get system properties object
   Properties properties = System.getProperties();

   // Setup mail server
   properties.setProperty("mail.smtp.host", host);

   // Get the default Session object.
   Session mailSession = Session.getDefaultInstance(properties);

   try {
      // Create a default MimeMessage object.
      MimeMessage message = new MimeMessage(mailSession);
      
      // Set From: header field of the header.
      message.setFrom(new InternetAddress(from));
      
      // Set To: header field of the header.
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
      
      // Set Subject: header field
      message.setSubject("This is the Subject Line!");
     
      // Send the actual HTML message, as big as you like
      message.setContent("<h1>This is actual message</h1>", "text/html" );
      
      // Send message
      Transport.send(message);
      result = "Sent message successfully....";
   } catch (MessagingException mex) {
      mex.printStackTrace();
      result = "Error: unable to send message....";
   }
%>

<html>
   <head>
      <title>Send HTML Email using JSP</title>
   </head>

   <body>
      <center>
         <h1>Send Email using JSP</h1>
      </center>
      
      <p align = "center">
         <% 
            out.println("Result: " + result + "\n");
         %>
      </p>
   </body>
</html>

Давайте теперь используем вышеупомянутую JSP для отправки HTML-сообщения с заданным идентификатором электронной почты.

Отправить вложение в электронном письме

Ниже приведен пример отправки электронного письма с вложением с вашего компьютера.

<%@ page import = "java.io.*,java.util.*,javax.mail.*"%>
<%@ page import = "javax.mail.internet.*,javax.activation.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>

<%
   String result;
   
   // Recipient's email ID needs to be mentioned.
   String to = "abcd@gmail.com";

   // Sender's email ID needs to be mentioned
   String from = "mcmohd@gmail.com";

   // Assuming you are sending email from localhost
   String host = "localhost";

   // Get system properties object
   Properties properties = System.getProperties();

   // Setup mail server
   properties.setProperty("mail.smtp.host", host);

   // Get the default Session object.
   Session mailSession = Session.getDefaultInstance(properties);

   try {
      // Create a default MimeMessage object.
      MimeMessage message = new MimeMessage(mailSession);

      // Set From: header field of the header.
      message.setFrom(new InternetAddress(from));

      // Set To: header field of the header.
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

      // Set Subject: header field
      message.setSubject("This is the Subject Line!");

      // Create the message part 
      BodyPart messageBodyPart = new MimeBodyPart();

      // Fill the message
      messageBodyPart.setText("This is message body");
      
      // Create a multipart message
      Multipart multipart = new MimeMultipart();

      // Set text message part
      multipart.addBodyPart(messageBodyPart);

      // Part two is attachment
      messageBodyPart = new MimeBodyPart();
      
      String filename = "file.txt";
      DataSource source = new FileDataSource(filename);
      messageBodyPart.setDataHandler(new DataHandler(source));
      messageBodyPart.setFileName(filename);
      multipart.addBodyPart(messageBodyPart);

      // Send the complete message parts
      message.setContent(multipart );

      // Send message
      Transport.send(message);
      String title = "Send Email";
      result = "Sent message successfully....";
   } catch (MessagingException mex) {
      mex.printStackTrace();
      result = "Error: unable to send message....";
   }
%>

<html>
   <head>
      <title>Send Attachment Email using JSP</title>
   </head>
   
   <body>
      <center>
         <h1>Send Attachment Email using JSP</h1>
      </center>
      
      <p align = "center">
         <%out.println("Result: " + result + "\n");%>
      </p>
   </body>
</html>

Теперь давайте запустим вышеупомянутую JSP, чтобы отправить файл в виде вложения вместе с сообщением с указанным идентификатором электронной почты.

Часть аутентификации пользователя

Если для аутентификации требуется предоставить идентификатор пользователя и пароль на сервер электронной почты, вы можете установить эти свойства следующим образом:

props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");

Остальная часть механизма отправки электронной почты останется, как описано выше.

Использование форм для отправки электронной почты

Вы можете использовать форму HTML для принятия параметров электронной почты, а затем вы можете использовать объект запроса, чтобы получить всю информацию следующим образом:

String to = request.getParameter("to");
String from = request.getParameter("from");
String subject = request.getParameter("subject");
String messageText = request.getParameter("body");

Получив всю информацию, вы можете использовать вышеупомянутые программы для отправки электронной почты.

JSP — учебник по стандартной библиотеке тегов (JSTL)

В этой главе мы поймем различные теги в JSP. Стандартная библиотека тегов JavaServer Pages (JSTL) представляет собой набор полезных тегов JSP, которые включают основные функциональные возможности, общие для многих приложений JSP.

JSTL поддерживает общие структурные задачи, такие как итерация и условные выражения, теги для манипулирования документами XML, теги интернационализации и теги SQL. Он также предоставляет платформу для интеграции существующих пользовательских тегов с тегами JSTL.

Установить библиотеку JSTL

Чтобы начать работать с JSP-тегами, вам необходимо сначала установить библиотеку JSTL. Если вы используете контейнер Apache Tomcat, выполните следующие два шага:

Шаг 1 — Загрузите бинарный дистрибутив из Apache Standard Taglib и распакуйте сжатый файл.

Шаг 2. Чтобы использовать Standard Taglib из своего дистрибутива Jakarta Taglibs , просто скопируйте JAR-файлы из каталога lib в дистрибутиве в каталог webapps \ ROOT \ WEB-INF \ lib вашего приложения.

Чтобы использовать любую из библиотек, вы должны включить директиву <taglib> в верхней части каждой JSP, которая использует библиотеку.

Классификация тегов JSTL

По своим функциям теги JSTL можно классифицировать по следующим группам библиотек тегов JSTL, которые можно использовать при создании страницы JSP:

  • Основные теги

  • Форматирование тегов

  • Теги SQL

  • Теги XML

  • Функции JSTL

Основные теги

Форматирование тегов

Теги SQL

Теги XML

Функции JSTL

Основные теги

Основная группа тегов — это наиболее часто используемые теги JSTL. Ниже приведен синтаксис для включения библиотеки JSTL Core в ваш JSP —

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

В следующей таблице перечислены основные теги JSTL —

S.No. Тег и описание
1 <с: из>

Как <% = …>, но для выражений.

2 <c: set>

Устанавливает результат вычисления выражения в область видимости.

3 <c: удалить>

Удаляет переменную области действия (из определенной области, если она указана).

4 <с: улов>

Ловит любой Throwable, который происходит в его теле и, возможно, подвергает его.

5 <с: если>

Простой условный тег, который вычисляет свое тело, если предоставленное условие истинно.

6 <с: выбрать>

Простой условный тег, который устанавливает контекст для взаимоисключающих условных операций, помеченных <когда> и <в противном случае> .

7 <с: когда>

Подтег тега <выбрать>, который включает его тело, если его условие принимает значение «истина» .

8 <c: иначе>

Подтег тега <выбрать>, который следует за тегами <когда> и выполняется, только если все предыдущие условия оцениваются как «ложные» .

9 <с: импорт>

Извлекает абсолютный или относительный URL-адрес и предоставляет его содержимое либо странице, либо String в «var» , либо Reader в «varReader» .

10 <c: forEach>

Базовый тег итерации, принимающий множество различных типов коллекций и поддерживающий поднаборы и другие функции.

11 <с: forTokens>

Перебирает токены, разделенные предоставленными разделителями.

12 <с: PARAM>

Добавляет параметр в URL-адрес содержащего тега import .

13 <c: redirect>

Перенаправляет на новый URL.

14 <с: URL>

Создает URL с необязательными параметрами запроса

Как <% = …>, но для выражений.

Устанавливает результат вычисления выражения в область видимости.

Удаляет переменную области действия (из определенной области, если она указана).

Ловит любой Throwable, который происходит в его теле и, возможно, подвергает его.

Простой условный тег, который вычисляет свое тело, если предоставленное условие истинно.

Простой условный тег, который устанавливает контекст для взаимоисключающих условных операций, помеченных <когда> и <в противном случае> .

Подтег тега <выбрать>, который включает его тело, если его условие принимает значение «истина» .

Подтег тега <выбрать>, который следует за тегами <когда> и выполняется, только если все предыдущие условия оцениваются как «ложные» .

Извлекает абсолютный или относительный URL-адрес и предоставляет его содержимое либо странице, либо String в «var» , либо Reader в «varReader» .

Базовый тег итерации, принимающий множество различных типов коллекций и поддерживающий поднаборы и другие функции.

Перебирает токены, разделенные предоставленными разделителями.

Добавляет параметр в URL-адрес содержащего тега import .

Перенаправляет на новый URL.

Создает URL с необязательными параметрами запроса

Форматирование тегов

Теги форматирования JSTL используются для форматирования и отображения текста, даты, времени и чисел для интернационализированных веб-сайтов. Ниже приведен синтаксис для включения библиотеки форматирования в ваш JSP —

<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>

В следующей таблице перечислены форматирование тегов JSTL —

S.No. Тег и описание
1 <FMT: FormatNumber>

Для визуализации числового значения с определенной точностью или форматом.

2 <FMT: parseNumber>

Анализирует строковое представление числа, валюты или процента.

3 <FMT: FormatDate>

Форматирует дату и / или время, используя предоставленные стили и шаблон.

4 <FMT: parseDate>

Разбирает строковое представление даты и / или времени

5 <FMT: расслоение>

Загружает пакет ресурсов, который будет использоваться его телом тега.

6 <FMT: Setlocale>

Сохраняет данную локаль в переменной конфигурации локали.

7 <FMT: setBundle>

Загружает пакет ресурсов и сохраняет его в именованной переменной области действия или в переменной конфигурации пакета.

8 <FMT: TIMEZONE>

Определяет часовой пояс для любых операций форматирования или анализа времени, вложенных в его тело.

9 <FMT: setTimeZone>

Сохраняет данный часовой пояс в переменной конфигурации часового пояса

10 <FMT: сообщение>

Отображает интернационализированное сообщение.

11 <FMT: requestEncoding>

Устанавливает кодировку символа запроса

Для визуализации числового значения с определенной точностью или форматом.

Анализирует строковое представление числа, валюты или процента.

Форматирует дату и / или время, используя предоставленные стили и шаблон.

Разбирает строковое представление даты и / или времени

Загружает пакет ресурсов, который будет использоваться его телом тега.

Сохраняет данную локаль в переменной конфигурации локали.

Загружает пакет ресурсов и сохраняет его в именованной переменной области действия или в переменной конфигурации пакета.

Определяет часовой пояс для любых операций форматирования или анализа времени, вложенных в его тело.

Сохраняет данный часовой пояс в переменной конфигурации часового пояса

Отображает интернационализированное сообщение.

Устанавливает кодировку символа запроса

Теги SQL

Библиотека тегов SQL JSTL предоставляет теги для взаимодействия с реляционными базами данных (RDBMS), такими как Oracle, mySQL или Microsoft SQL Server .

Ниже приведен синтаксис для включения библиотеки JSTL SQL в ваш JSP —

<%@ taglib prefix = "sql" uri = "http://java.sun.com/jsp/jstl/sql" %>

В следующей таблице перечислены теги SQL JSTL.

S.No. Тег и описание
1 <SQL: setDataSource>

Создает простой источник данных, подходящий только для прототипирования

2 <SQL: запрос>

Выполняет SQL-запрос, определенный в его теле или через атрибут sql.

3 <SQL: обновление>

Выполняет обновление SQL, определенное в его теле или через атрибут sql.

4 <SQL: PARAM>

Устанавливает параметр в операторе SQL на указанное значение.

5 <SQL: dateParam>

Устанавливает параметр в операторе SQL в указанное значение java.util.Date.

6 <sql: транзакция>

Предоставляет вложенные элементы действий базы данных с общим подключением, настроенным для выполнения всех операторов как одной транзакции.

Создает простой источник данных, подходящий только для прототипирования

Выполняет SQL-запрос, определенный в его теле или через атрибут sql.

Выполняет обновление SQL, определенное в его теле или через атрибут sql.

Устанавливает параметр в операторе SQL на указанное значение.

Устанавливает параметр в операторе SQL в указанное значение java.util.Date.

Предоставляет вложенные элементы действий базы данных с общим подключением, настроенным для выполнения всех операторов как одной транзакции.

Теги XML

XML-теги JSTL обеспечивают JSP-ориентированный способ создания и управления XML-документами. Ниже приведен синтаксис для включения библиотеки JSTL XML в ваш JSP.

Библиотека тегов XML JSTL имеет пользовательские теги для взаимодействия с данными XML. Это включает в себя анализ XML, преобразование данных XML и управление потоком на основе выражений XPath.

<%@ taglib prefix = "x" 
   uri = "http://java.sun.com/jsp/jstl/xml" %>

Прежде чем приступить к примерам, вам нужно будет скопировать следующие две библиотеки, связанные с XML и XPath, в ваш <каталог установки Tomcat> \ lib

XercesImpl.jar — загрузите его с https://www.apache.org/dist/xerces/j/

xalan.jar — загрузите его с https://xml.apache.org/xalan-j/index.html

Ниже приведен список тегов XML JSTL —

S.No. Тег и описание
1 <х: из>

Как <% = …>, но для выражений XPath.

2 <х: синтаксический>

Используется для анализа данных XML, указанных либо через атрибут, либо в теле тега.

3 <x: set>

Устанавливает переменную в значение выражения XPath.

4 <x: if>

Оценивает тестовое выражение XPath и, если оно истинно, обрабатывает его тело. Если условие проверки ложно, тело игнорируется.

5 <х: Foreach>

Зацикливать узлы в XML-документе.

6 <х: выбрать>

Простой условный тег, который устанавливает контекст для взаимоисключающих условных операций, помеченных тегами <when> и <else> .

7 <х: когда>

Подтег тега <выбрать>, который включает его тело, если его выражение равно ‘true’.

8 <x: в противном случае>

Подтег тега <выбрать>, который следует за тегами <когда> и выполняется, только если все предыдущие условия оцениваются как «ложные».

9 <x: transform>

Применяет XSL-преобразование к XML-документу.

10 <x: param>

Используется вместе с тегом transform для установки параметра в таблице стилей XSLT

Как <% = …>, но для выражений XPath.

Используется для анализа данных XML, указанных либо через атрибут, либо в теле тега.

Устанавливает переменную в значение выражения XPath.

Оценивает тестовое выражение XPath и, если оно истинно, обрабатывает его тело. Если условие проверки ложно, тело игнорируется.

Зацикливать узлы в XML-документе.

Простой условный тег, который устанавливает контекст для взаимоисключающих условных операций, помеченных тегами <when> и <else> .

Подтег тега <выбрать>, который включает его тело, если его выражение равно ‘true’.

Подтег тега <выбрать>, который следует за тегами <когда> и выполняется, только если все предыдущие условия оцениваются как «ложные».

Применяет XSL-преобразование к XML-документу.

Используется вместе с тегом transform для установки параметра в таблице стилей XSLT

Функции JSTL

JSTL включает в себя ряд стандартных функций, большинство из которых являются общими функциями для работы со строками. Ниже приведен синтаксис для включения библиотеки функций JSTL в ваш JSP —

<%@ taglib prefix = "fn" 
   uri = "http://java.sun.com/jsp/jstl/functions" %>

В следующей таблице перечислены различные функции JSTL —

S.No. Описание функции
1 п: содержит ()

Проверяет, содержит ли входная строка указанную подстроку.

2 п: containsIgnoreCase ()

Проверяет, содержит ли входная строка указанную подстроку без учета регистра.

3 п: EndsWith ()

Проверяет, заканчивается ли входная строка указанным суффиксом.

4 п: escapeXml ()

Экранирует символы, которые можно интерпретировать как разметку XML.

5 п: IndexOf ()

Возвращает индекс со строкой первого вхождения указанной подстроки.

6 п: присоединиться ()

Объединяет все элементы массива в строку.

7 п: длина ()

Возвращает количество элементов в коллекции или количество символов в строке.

8 п: заменить ()

Возвращает строку, полученную в результате замены во входной строке всех вхождений данной строкой.

9 п: сплит ()

Разбивает строку на массив подстрок.

10 п: StartsWith ()

Проверяет, начинается ли входная строка с указанного префикса.

11 п: подстрока ()

Возвращает подмножество строки.

12 п: substringAfter ()

Возвращает подмножество строки после определенной подстроки.

13 п: substringBefore ()

Возвращает подмножество строки перед определенной подстрокой.

14 п: toLowerCase ()

Преобразует все символы строки в нижний регистр.

15 п: toUpperCase ()

Преобразует все символы строки в верхний регистр.

16 п: отделка ()

Удаляет пробелы с обоих концов строки.

Проверяет, содержит ли входная строка указанную подстроку.

Проверяет, содержит ли входная строка указанную подстроку без учета регистра.

Проверяет, заканчивается ли входная строка указанным суффиксом.

Экранирует символы, которые можно интерпретировать как разметку XML.

Возвращает индекс со строкой первого вхождения указанной подстроки.

Объединяет все элементы массива в строку.

Возвращает количество элементов в коллекции или количество символов в строке.

Возвращает строку, полученную в результате замены во входной строке всех вхождений данной строкой.

Разбивает строку на массив подстрок.

Проверяет, начинается ли входная строка с указанного префикса.

Возвращает подмножество строки.

Возвращает подмножество строки после определенной подстроки.

Возвращает подмножество строки перед определенной подстрокой.

Преобразует все символы строки в нижний регистр.

Преобразует все символы строки в верхний регистр.

Удаляет пробелы с обоих концов строки.

JSP — доступ к базе данных

В этой главе мы обсудим, как получить доступ к базе данных с помощью JSP. Мы предполагаем, что вы хорошо понимаете, как работает приложение JDBC. Прежде чем начать доступ к базе данных через JSP, убедитесь, что вы правильно настроили среду JDBC вместе с базой данных.

Более подробно о том, как получить доступ к базе данных с помощью JDBC и ее настройке среды, вы можете прочитать в нашем руководстве по JDBC .

Чтобы начать с базовой концепции, давайте создадим таблицу и создадим несколько записей в этой таблице следующим образом:

Создать таблицу

Чтобы создать таблицу « Сотрудники» в базе данных EMP, выполните следующие действия:

Шаг 1

Откройте командную строку и перейдите в каталог установки следующим образом:

C:\>
C:\>cd Program Files\MySQL\bin
C:\Program Files\MySQL\bin>

Шаг 2

Войдите в базу данных следующим образом —

C:\Program Files\MySQL\bin>mysql -u root -p
Enter password: ********
mysql>

Шаг 3

Создайте таблицу Employee в базе данных TEST следующим образом — —

mysql> use TEST;
mysql> create table Employees
   (
      id int not null,
      age int not null,
      first varchar (255),
      last varchar (255)
   );
Query OK, 0 rows affected (0.08 sec)
mysql>

Создать записи данных

Давайте теперь создадим несколько записей в таблице Employee следующим образом — —

mysql> INSERT INTO Employees VALUES (100, 18, 'Zara', 'Ali');
Query OK, 1 row affected (0.05 sec)
 
mysql> INSERT INTO Employees VALUES (101, 25, 'Mahnaz', 'Fatma');
Query OK, 1 row affected (0.00 sec)
 
mysql> INSERT INTO Employees VALUES (102, 30, 'Zaid', 'Khan');
Query OK, 1 row affected (0.00 sec)
 
mysql> INSERT INTO Employees VALUES (103, 28, 'Sumit', 'Mittal');
Query OK, 1 row affected (0.00 sec)
 
mysql>

ВЫБЕРИТЕ Операцию

Следующий пример показывает, как мы можем выполнить инструкцию SQL SELECT, используя JTSL в JSP-программировании.

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>SELECT Operation</title>
   </head>

   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root"  password = "pass123"/>
 
      <sql:query dataSource = "${snapshot}" var = "result">
         SELECT * from Employees;
      </sql:query>
 
      <table border = "1" width = "100%">
         <tr>
            <th>Emp ID</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Age</th>
         </tr>
         
         <c:forEach var = "row" items = "${result.rows}">
            <tr>
               <td><c:out value = "${row.id}"/></td>
               <td><c:out value = "${row.first}"/></td>
               <td><c:out value = "${row.last}"/></td>
               <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Доступ к вышеуказанной JSP, будет отображаться следующий результат —

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Khan 30
103 Sumit Mittal 28

ВСТАВИТЬ Операция

Следующий пример показывает, как мы можем выполнить инструкцию SQL INSERT, используя JTSL в JSP-программировании.

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>JINSERT Operation</title>
   </head>
   
   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root"  password = "pass123"/>
         <sql:update dataSource = "${snapshot}" var = "result">
         INSERT INTO Employees VALUES (104, 2, 'Nuha', 'Ali');
      </sql:update>
 
      <sql:query dataSource = "${snapshot}" var = "result">
         SELECT * from Employees;
      </sql:query>
 
      <table border = "1" width = "100%">
         <tr>
            <th>Emp ID</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Age</th>
         </tr>
         
         <c:forEach var = "row" items = "${result.rows}">
            <tr>
               <td><c:out value = "${row.id}"/></td>
               <td><c:out value = "${row.first}"/></td>
               <td><c:out value = "${row.last}"/></td>
               <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Доступ к вышеуказанной JSP, будет отображаться следующий результат -

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Khan 30
103 Sumit Mittal 28
104 Nuha Ali 2

УДАЛЕНИЕ Операция

Следующий пример показывает, как мы можем выполнить инструкцию SQL DELETE, используя JTSL в JSP-программировании.

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>DELETE Operation</title>
   </head>
   
   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root" password = "pass123"/>
 
      <c:set var = "empId" value = "103"/>
 
      <sql:update dataSource = "${snapshot}" var = "count">
         DELETE FROM Employees WHERE Id = ?
         <sql:param value = "${empId}" />
      </sql:update>
 
      <sql:query dataSource = "${snapshot}" var = "result">
         SELECT * from Employees;
      </sql:query>
 
      <table border = "1" width = "100%">
         <tr>
            <th>Emp ID</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Age</th>
         </tr>
            
         <c:forEach var = "row" items = "${result.rows}">
            <tr>
               <td><c:out value = "${row.id}"/></td>
               <td><c:out value = "${row.first}"/></td>
               <td><c:out value = "${row.last}"/></td>
               <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Доступ к вышеуказанной JSP, будет отображаться следующий результат -

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Khan 30

ОБНОВЛЕНИЕ Операция

Следующий пример показывает, как мы можем выполнить инструкцию SQL UPDATE, используя JTSL в JSP-программировании.

<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
 
<html>
   <head>
      <title>DELETE Operation</title>
   </head>
   
   <body>
      <sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
         url = "jdbc:mysql://localhost/TEST"
         user = "root" password = "pass123"/>
 
      <c:set var = "empId" value = "102"/>
 
      <sql:update dataSource = "${snapshot}" var = "count">
         UPDATE Employees SET WHERE last = 'Ali'
         <sql:param value = "${empId}" />
      </sql:update>
 
      <sql:query dataSource = "${snapshot}" var = "result">
         SELECT * from Employees;
      </sql:query>
 
      <table border = "1" width = "100%">
         <tr>
            <th>Emp ID</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Age</th>
         </tr>
            
         <c:forEach var = "row" items = "${result.rows}">
            <tr>
               <td><c:out value = "${row.id}"/></td>
               <td><c:out value = "${row.first}"/></td>
               <td><c:out value = "${row.last}"/></td>
               <td><c:out value = "${row.age}"/></td>
            </tr>
         </c:forEach>
      </table>
 
   </body>
</html>

Доступ к вышеуказанной JSP, будет отображаться следующий результат -

Emp ID First Name Last Name Age
100 Zara Ali 18
101 Mahnaz Fatma 25
102 Zaid Ali 30

JSP - XML-данные

Когда вы отправляете данные XML через HTTP, имеет смысл использовать JSP для обработки входящих и исходящих документов XML; например, документы RSS. Поскольку документ XML - это просто набор текста, создать его с помощью JSP гораздо проще, чем создать документ HTML.

Отправка XML из JSP

Вы можете отправлять содержимое XML с помощью JSP так же, как отправляете HTML. Единственное отличие состоит в том, что вы должны установить тип содержимого вашей страницы text / xml. Чтобы установить тип содержимого, используйте тег <% @ page%> , например так:

<%@ page contentType = "text/xml" %>

Следующий пример покажет, как отправить XML-контент в браузер -

<%@ page contentType = "text/xml" %>

<books>
   <book>
      <name>Padam History</name>
      <author>ZARA</author>
      <price>100</price>
   </book>
</books>

Получите доступ к вышеуказанному XML с помощью различных браузеров, чтобы увидеть представление дерева документов вышеупомянутого XML.

Обработка XML в JSP

Прежде чем приступить к обработке XML с использованием JSP, вам необходимо скопировать следующие две библиотеки, связанные с XML и XPath, в <каталог установки Tomcat> \ lib -

XercesImpl.jar - загрузите его с https://www.apache.org/dist/xerces/j/

xalan.jar - загрузите его с https://xml.apache.org/xalan-j/index.html

Давайте поместим следующий контент в файл books.xml -

<books>
   <book>
      <name>Padam History</name>
      <author>ZARA</author>
      <price>100</price>
   </book>
   
   <book>
      <name>Great Mistry</name>
      <author>NUHA</author>
      <price>2000</price>
   </book>
</books>

Попробуйте следующий main.jsp , сохраняя в том же каталоге -

<%@ taglib prefix = "c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "x" uri="http://java.sun.com/jsp/jstl/xml" %>
 
<html>
   <head>
      <title>JSTL x:parse Tags</title>
   </head>

   <body>
      <h3>Books Info:</h3>
      <c:import var = "bookInfo" url="http://localhost:8080/books.xml"/>
 
      <x:parse xml = "${bookInfo}" var = "output"/>
      <b>The title of the first book is</b>: 
      <x:out select = "$output/books/book[1]/name" />
      <br>
      
      <b>The price of the second book</b>: 
      <x:out select = "$output/books/book[2]/price" />
   </body>
</html>

Получите доступ к вышеуказанной JSP с помощью http: // localhost: 8080 / main.jsp , будет показан следующий результат -

Books Info:

The title of the first book is :Padam History The price of the second book : 2000

Форматирование XML с помощью JSP

Рассмотрим следующую таблицу стилей XSLT style.xsl -

<?xml version = "1.0"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
   version = "1.0">
 
   <xsl:output method = "html" indent = "yes"/>
   <xsl:template match = "/">
      <html>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>
    
   <xsl:template match = "books">
      <table border = "1" width = "100%">
         <xsl:for-each select = "book">
            <tr>
               <td>
                  <i><xsl:value-of select = "name"/></i>
               </td>
               
               <td>
                  <xsl:value-of select = "author"/>
               </td>
               
               <td>
                  <xsl:value-of select = "price"/>
               </td>
            </tr>
         </xsl:for-each>
      </table>
   
   </xsl:template>
</xsl:stylesheet>

Теперь рассмотрим следующий файл JSP -

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "x" uri = "http://java.sun.com/jsp/jstl/xml" %>
 
<html>
   <head>
      <title>JSTL x:transform Tags</title>
   </head>
   
   <body>
      <h3>Books Info:</h3>
      <c:set var = "xmltext">
         <books>
            <book>
               <name>Padam History</name>
               <author>ZARA</author>
               <price>100</price>
            </book>
            
            <book>
               <name>Great Mistry</name>
               <author>NUHA</author>
               <price>2000</price>
            </book>
         </books>
      </c:set>
 
      <c:import url = "http://localhost:8080/style.xsl" var = "xslt"/>
      <x:transform xml = "${xmltext}" xslt = "${xslt}"/>
   </body>
</html>

Будет показан следующий результат -

Books Info:

Padam History ZARA 100
Great Mistry NUHA 2000

Чтобы узнать больше об обработке XML с использованием JSTL, вы можете проверить стандартную библиотеку тегов JSP .

JSP - JavaBeans

JavaBean - это специально сконструированный класс Java, написанный на Java и закодированный в соответствии со спецификациями API JavaBeans.

Ниже приведены уникальные характеристики, которые отличают JavaBean от других классов Java.

  • Он предоставляет конструктор по умолчанию без аргументов.

  • Он должен быть сериализуемым и тем, который может реализовывать интерфейс Serializable .

  • Он может иметь ряд свойств, которые могут быть прочитаны или записаны.

  • Он может иметь несколько методов " getter " и " setter " для свойств.

Он предоставляет конструктор по умолчанию без аргументов.

Он должен быть сериализуемым и тем, который может реализовывать интерфейс Serializable .

Он может иметь ряд свойств, которые могут быть прочитаны или записаны.

Он может иметь несколько методов " getter " и " setter " для свойств.

Свойства JavaBeans

Свойство JavaBean - это именованный атрибут, к которому может обращаться пользователь объекта. Атрибут может иметь любой тип данных Java, включая классы, которые вы определяете.

Свойство JavaBean может быть доступно для чтения, записи, только для чтения или только для записи . Доступ к свойствам JavaBean осуществляется через два метода в классе реализации JavaBean -

S.No. Метод и описание
1

получить PropertyName ()

Например, если имя свойства firstName , имя вашего метода будет getFirstName () для чтения этого свойства. Этот метод называется аксессором.

2

установить PropertyName ()

Например, если имя свойства firstName , имя вашего метода будет setFirstName () для записи этого свойства. Этот метод называется мутатором.

получить PropertyName ()

Например, если имя свойства firstName , имя вашего метода будет getFirstName () для чтения этого свойства. Этот метод называется аксессором.

установить PropertyName ()

Например, если имя свойства firstName , имя вашего метода будет setFirstName () для записи этого свойства. Этот метод называется мутатором.

Атрибут только для чтения будет иметь только метод getPropertyName () , а атрибут только для записи будет иметь только метод setPropertyName () .

Пример JavaBeans

Рассмотрим студенческий класс с несколькими свойствами -

package com.tutorialspoint;

public class StudentsBean implements java.io.Serializable {
   private String firstName = null;
   private String lastName = null;
   private int age = 0;

   public StudentsBean() {
   }
   public String getFirstName(){
      return firstName;
   }
   public String getLastName(){
      return lastName;
   }
   public int getAge(){
      return age;
   }
   public void setFirstName(String firstName){
      this.firstName = firstName;
   }
   public void setLastName(String lastName){
      this.lastName = lastName;
   }
   public void setAge(Integer age){
      this.age = age;
   }
}

Доступ к JavaBeans

Действие useBean объявляет JavaBean для использования в JSP. После объявления компонент становится переменной сценария, к которой могут обращаться как элементы сценария, так и другие пользовательские теги, используемые в JSP. Полный синтаксис тега useBean выглядит следующим образом:

<jsp:useBean id = "bean's name" scope = "bean's scope" typeSpec/>

Здесь значения для атрибута области могут быть страницей, запросом, сеансом или приложением в зависимости от ваших требований. Значением атрибута id может быть любое значение, если оно является уникальным именем среди других объявлений useBean в той же JSP.

В следующем примере показано, как использовать действие useBean -

<html>
   <head>
      <title>useBean Example</title>
   </head>
   
   <body>
      <jsp:useBean id = "date" class = "java.util.Date" /> 
      <p>The date/time is <%= date %>
   </body>
</html>

Вы получите следующий результат - -

The date/time is Thu Sep 30 11:18:11 GST 2010 

Доступ к свойствам JavaBeans

Наряду с действием <jsp: useBean ...> вы можете использовать действие <jsp: getProperty /> для доступа к методам get и действие <jsp: setProperty /> для доступа к методам set. Вот полный синтаксис -

<jsp:useBean id = "id" class = "bean's class" scope = "bean's scope">
   <jsp:setProperty name = "bean's id" property = "property name"  
      value = "value"/>
   <jsp:getProperty name = "bean's id" property = "property name"/>
   ...........
</jsp:useBean>

Атрибут name ссылается на идентификатор JavaBean, ранее введенный в JSP с помощью действия useBean. Атрибут свойства - это имя методов get или set, которые должны быть вызваны.

В следующем примере показано, как получить доступ к данным, используя приведенный выше синтаксис:

<html>
   <head>
      <title>get and set properties Example</title>
   </head>
   
   <body>
      <jsp:useBean id = "students" class = "com.tutorialspoint.StudentsBean"> 
         <jsp:setProperty name = "students" property = "firstName" value = "Zara"/>
         <jsp:setProperty name = "students" property = "lastName" value = "Ali"/>
         <jsp:setProperty name = "students" property = "age" value = "10"/>
      </jsp:useBean>

      <p>Student First Name: 
         <jsp:getProperty name = "students" property = "firstName"/>
      </p>
      
      <p>Student Last Name: 
         <jsp:getProperty name = "students" property = "lastName"/>
      </p>
      
      <p>Student Age: 
         <jsp:getProperty name = "students" property = "age"/>
      </p>

   </body>
</html>

Давайте сделаем так, чтобы StudentsBean.class был доступен в CLASSPATH. Получите доступ к вышеуказанной JSP. будет показан следующий результат -

Student First Name: Zara 

Student Last Name: Ali 

Student Age: 10 

JSP - Пользовательские теги

В этой главе мы обсудим пользовательские теги в JSP. Пользовательский тег - это пользовательский элемент языка JSP. Когда страница JSP, содержащая пользовательский тег, преобразуется в сервлет, тег преобразуется в операции над объектом, называемым обработчиком тега. Затем веб-контейнер вызывает эти операции при выполнении сервлета страницы JSP.

Расширения тегов JSP позволяют создавать новые теги, которые можно вставлять непосредственно на страницу JavaServer. В спецификации JSP 2.0 представлены простые обработчики тегов для написания этих пользовательских тегов.

Чтобы написать собственный тег, вы можете просто расширить класс SimpleTagSupport и переопределить метод doTag () , где вы можете разместить свой код для генерации содержимого для тега.

Создать тег "Hello"

Предположим, вы хотите определить пользовательский тег с именем <ex: Hello>, и вы хотите использовать его следующим образом без тела:

<ex:Hello />

Чтобы создать собственный тег JSP, вы должны сначала создать класс Java, который действует как обработчик тега. Давайте теперь создадим класс HelloTag следующим образом:

package com.tutorialspoint;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   public void doTag() throws JspException, IOException {
      JspWriter out = getJspContext().getOut();
      out.println("Hello Custom Tag!");
   }
}

Приведенный выше код имеет простое кодирование, где метод doTag () берет текущий объект JspContext с помощью метода getJspContext () и использует его для отправки «Hello Custom Tag!» к текущему объекту JspWriter

Давайте скомпилируем вышеприведенный класс и скопируем его в каталог, доступный в переменной окружения CLASSPATH. Наконец, создайте следующий файл библиотеки тегов: <Tomcat-Installation-Directory> webapps \ ROOT \ WEB-INF \ custom.tld .

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD</short-name>
   
   <tag>
      <name>Hello</name>
      <tag-class>com.tutorialspoint.HelloTag</tag-class>
      <body-content>empty</body-content>
   </tag>
</taglib>

Давайте теперь используем определенный выше пользовательский тег Hello в нашей программе JSP следующим образом:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello/>
   </body>
</html>

Вызовите JSP выше, и это должно привести к следующему результату -

Hello Custom Tag!

Доступ к телу тега

Вы можете включить сообщение в тело тега, как вы видели со стандартными тегами. Предположим, вы хотите определить пользовательский тег с именем <ex: Hello> и использовать его следующим образом с телом:

<ex:Hello>
   This is message body
</ex:Hello>

Давайте внесем следующие изменения в приведенный выше код тега для обработки тела тега:

package com.tutorialspoint;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   StringWriter sw = new StringWriter();
   public void doTag()
   
   throws JspException, IOException {
      getJspBody().invoke(sw);
      getJspContext().getOut().println(sw.toString());
   }
}

Здесь выходные данные, полученные в результате вызова, сначала записываются в StringWriter, а затем записываются в JspWriter, связанный с тегом. Нам нужно изменить файл TLD следующим образом -

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD with Body</short-name>
   
   <tag>
      <name>Hello</name>
      <tag-class>com.tutorialspoint.HelloTag</tag-class>
      <body-content>scriptless</body-content>
   </tag>
</taglib>

Давайте теперь назовем вышеуказанный тег с правильным телом следующим образом:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello>
         This is message body
      </ex:Hello>
   </body>
</html>

Вы получите следующий результат -

This is message body

Атрибуты пользовательских тегов

Вы можете использовать различные атрибуты вместе со своими пользовательскими тегами. Чтобы принять значение атрибута, пользовательский класс тега должен реализовать методы установки, идентичные методам установки JavaBean, как показано ниже -

package com.tutorialspoint;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   private String message;

   public void setMessage(String msg) {
      this.message = msg;
   }
   StringWriter sw = new StringWriter();
   public void doTag()
   
   throws JspException, IOException {
      if (message != null) {
         /* Use message from attribute */
         JspWriter out = getJspContext().getOut();
         out.println( message );
      } else {
         /* use message from the body */
         getJspBody().invoke(sw);
         getJspContext().getOut().println(sw.toString());
      }
   }
}

Атрибут имеет имя «message» , поэтому метод установки - setMessage () . Давайте теперь добавим этот атрибут в файл TLD, используя элемент <attribute> следующим образом:

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD with Body</short-name>
   
   <tag>
      <name>Hello</name>
      <tag-class>com.tutorialspoint.HelloTag</tag-class>
      <body-content>scriptless</body-content>
      
      <attribute>
         <name>message</name>
      </attribute>
   
   </tag>
</taglib>

Давайте следовать JSP с атрибутом сообщения следующим образом:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello message = "This is custom tag" />
   </body>
</html>

Это даст следующий результат -

This is custom tag

Рассмотрите возможность включения следующих свойств для атрибута:

S.No. Недвижимость и цель
1

название

Элемент name определяет имя атрибута. Имя каждого атрибута должно быть уникальным для определенного тега.

2

требуется

Это указывает, является ли этот атрибут обязательным или необязательным. Это было бы ложным для необязательного.

3

rtexprvalue

Объявляет, допустимо ли значение выражения времени выполнения для атрибута тега

4

тип

Определяет тип класса Java этого атрибута. По умолчанию он принят как String

5

описание

Информационное описание может быть предоставлено.

6

фрагмент

Объявляет, следует ли рассматривать это значение атрибута как JspFragment .

название

Элемент name определяет имя атрибута. Имя каждого атрибута должно быть уникальным для определенного тега.

требуется

Это указывает, является ли этот атрибут обязательным или необязательным. Это было бы ложным для необязательного.

rtexprvalue

Объявляет, допустимо ли значение выражения времени выполнения для атрибута тега

тип

Определяет тип класса Java этого атрибута. По умолчанию он принят как String

описание

Информационное описание может быть предоставлено.

фрагмент

Объявляет, следует ли рассматривать это значение атрибута как JspFragment .

Ниже приведен пример для указания свойств, связанных с атрибутом:

.....
   <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
   </attribute>
.....

Если вы используете два атрибута, вы можете изменить свой TLD следующим образом:

.....
   <attribute>
      <name>attribute_name1</name>
      <required>false</required>
      <type>java.util.Boolean</type>
      <fragment>false</fragment>
   </attribute>
   
   <attribute>
      <name>attribute_name2</name>
      <required>true</required>
      <type>java.util.Date</type>
   </attribute>
.....

JSP - язык выражений (EL)

Язык выражений JSP (EL) позволяет легко получать доступ к данным приложения, хранящимся в компонентах JavaBeans. JSP EL позволяет вам создавать выражения (а) арифметические и (б) логические. В выражении JSP EL вы можете использовать целые числа, числа с плавающей запятой, строки, встроенные константы true и false для логических значений и null.

Простой синтаксис

Обычно, когда вы указываете значение атрибута в теге JSP, вы просто используете строку. Например -

<jsp:setProperty name = "box" property = "perimeter" value = "100"/>

JSP EL позволяет вам указать выражение для любого из этих значений атрибута. Простой синтаксис для JSP EL следующий:

${expr}

Здесь expr указывает само выражение. Наиболее распространенными операторами в JSP EL являются . и [] . Эти два оператора позволяют получить доступ к различным атрибутам Java Beans и встроенным объектам JSP.

Например, приведенный выше синтаксис тега <jsp: setProperty> может быть записан с помощью выражения вроде -

<jsp:setProperty name = "box" property = "perimeter" 
   value = "${2*box.width+2*box.height}"/>

Когда JSP-компилятор видит форму $ {} в атрибуте, он генерирует код для оценки выражения и подставляет значение expresson.

Вы также можете использовать выражения JSP EL в тексте шаблона для тега. Например, тег <jsp: text> просто вставляет свое содержимое в тело JSP. Следующее объявление <jsp: text> вставляет <h1> Hello JSP! </ H1> в вывод JSP -

<jsp:text>
   <h1>Hello JSP!</h1>
</jsp:text>

Теперь вы можете включить выражение JSP EL в тело тега <jsp: text> (или любого другого тега) с тем же синтаксисом $ {}, который вы используете для атрибутов. Например -

<jsp:text>
   Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>

EL выражения могут использовать скобки для группировки подвыражений. Например, $ {(1 + 2) * 3} равно 9, а $ {1 + (2 * 3)} равно 7 .

Чтобы отключить вычисление выражений EL, мы указываем атрибут isELIgnored директивы страницы, как показано ниже:

<%@ page isELIgnored = "true|false" %>

Допустимые значения этого атрибута: true и false. Если это правда, EL выражения игнорируются, когда они появляются в статическом тексте или атрибутах тега. Если оно ложно, выражения EL оцениваются контейнером.

Основные операторы в EL

Язык выражений JSP (EL) поддерживает большинство арифметических и логических операторов, поддерживаемых Java. В следующей таблице перечислены наиболее часто используемые операторы -

S.No. Оператор и описание
1

,

Доступ к свойству боба или записи на карте

2

[]

Доступ к массиву или элементу списка

3

()

Сгруппируйте подвыражение, чтобы изменить порядок оценки

4

+

прибавление

5

-

Вычитание или отрицание значения

6

*

умножение

7

/ или div

разделение

8

% или мод

По модулю (остаток)

9

== или экв

Тест на равенство

10

! = или ne

Тест на неравенство

11

<или lt

Тест на менее чем

12

> или GT

Тест на более чем

13

<= или le

Тест на меньше или равно

14

> = или ge

Тест на больше или равно

15

&& или и

Тест на логическое И

16

|| или или

Тест на логическое ИЛИ

17

! или нет

Унарное булево дополнение

18

пустой

Проверка пустых значений переменных

,

Доступ к свойству боба или записи на карте

[]

Доступ к массиву или элементу списка

()

Сгруппируйте подвыражение, чтобы изменить порядок оценки

+

прибавление

-

Вычитание или отрицание значения

*

умножение

/ или div

разделение

% или мод

По модулю (остаток)

== или экв

Тест на равенство

! = или ne

Тест на неравенство

<или lt

Тест на менее чем

> или GT

Тест на более чем

<= или le

Тест на меньше или равно

> = или ge

Тест на больше или равно

&& или и

Тест на логическое И

|| или или

Тест на логическое ИЛИ

! или нет

Унарное булево дополнение

пустой

Проверка пустых значений переменных

Функции в JSP EL

JSP EL позволяет использовать функции и в выражениях. Эти функции должны быть определены в библиотеках пользовательских тегов. Использование функции имеет следующий синтаксис -

${ns:func(param1, param2, ...)}

Где ns - это пространство имен функции, func - это имя функции, а param1 - это первое значение параметра. Например, функция fn: length , которая является частью библиотеки JSTL. Эта функция может быть использована следующим образом, чтобы получить длину строки.

${fn:length("Get my length")}

Чтобы использовать функцию из любой библиотеки тегов (стандартной или пользовательской), вы должны установить эту библиотеку на своем сервере и включить библиотеку в свой JSP с помощью директивы <taglib>, как описано в главе JSTL.

JSP EL неявные объекты

Язык выражений JSP поддерживает следующие неявные объекты:

S.No Неявный объект и описание
1

PageScope

Переменные в области видимости из области видимости страницы

2

requestScope

Переменные в области видимости из области запроса

3

sessionScope

Переменные в области видимости из области сеанса

4

applicationScope

Переменные в области видимости из области приложения

5

пары

Параметры запроса в виде строк

6

paramValues

Параметры запроса в виде коллекций строк

7

заголовок

Заголовки HTTP-запросов в виде строк

8

HeaderValues

Заголовки HTTP-запросов как коллекции строк

9

initParam

Параметры инициализации контекста

10

печенье

Значения cookie

11

PageContext

Объект JSP PageContext для текущей страницы

PageScope

Переменные в области видимости из области видимости страницы

requestScope

Переменные в области видимости из области запроса

sessionScope

Переменные в области видимости из области сеанса

applicationScope

Переменные в области видимости из области приложения

пары

Параметры запроса в виде строк

paramValues

Параметры запроса в виде коллекций строк

заголовок

Заголовки HTTP-запросов в виде строк

HeaderValues

Заголовки HTTP-запросов как коллекции строк

initParam

Параметры инициализации контекста

печенье

Значения cookie

PageContext

Объект JSP PageContext для текущей страницы

Вы можете использовать эти объекты в выражении, как если бы они были переменными. Следующие примеры помогут вам понять концепции -

Объект pageContext

Объект pageContext предоставляет вам доступ к объекту JSP pageContext. Через объект pageContext вы можете получить доступ к объекту запроса. Например, чтобы получить доступ к строке входящего запроса, вы можете использовать следующее выражение:

${pageContext.request.queryString}

Объекты Scope

Переменные pageScope, requestScope, sessionScope и applicationScope обеспечивают доступ к переменным, хранящимся на каждом уровне области.

Например, если вам нужен явный доступ к переменной box в области приложения, вы можете получить к ней доступ через переменную applicationScope как applicationScope.box .

Param и paramValues ​​Объекты

Объекты param и paramValues ​​предоставляют вам доступ к значениям параметров, обычно доступным через методы request.getParameter и request.getParameterValues .

Например, чтобы получить доступ к параметру с именем order, используйте выражение $ {param.order} или $ {param ["order"]} .

Ниже приведен пример доступа к параметру запроса с именем username -

<%@ page import = "java.io.*,java.util.*" %>
<%String title = "Accessing Request Param";%>

<html>
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>${param["username"]}</p>
      </div>
   </body>
</html>

Объект param возвращает одиночные строковые значения, тогда как объект paramValues ​​возвращает строковые массивы.

объекты header и headerValues

Объекты header и headerValues ​​предоставляют вам доступ к значениям заголовка, обычно доступным через методы request.getHeader и request.getHeaders .

Например, чтобы получить доступ к заголовку с именем user-agent, используйте выражение $ {header.user-agent} или $ {header ["user-agent"]} .

Ниже приведен пример доступа к параметру заголовка с именем user-agent -

<%@ page import = "java.io.*,java.util.*" %>
<%String title = "User Agent Example";%>

<html>
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>${header["user-agent"]}</p>
      </div>
   </body>
</html>

Вывод будет выглядеть примерно так:

User Agent Example

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; .NET4.0C; InfoPath.2)

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0;
SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729;
Media Center PC 6.0; HPNTDF; .NET4.0C; InfoPath.2)

Объект header возвращает одиночные строковые значения, тогда как объект headerValues ​​возвращает строковые массивы.

JSP - обработка исключений

В этой главе. мы обсудим, как обрабатывать исключения в JSP. Когда вы пишете код JSP, вы можете делать ошибки кодирования, которые могут возникнуть в любой части кода. В вашем коде JSP могут возникнуть следующие типы ошибок:

Проверенные исключения

Проверенное исключение - это исключение, которое обычно является ошибкой пользователя или проблемой, которую программист не может предвидеть. Например, если файл должен быть открыт, но файл не найден, возникает исключение. Эти исключения нельзя просто игнорировать во время компиляции.

Исключения во время выполнения

Исключение времени выполнения - это исключение, которого программист мог бы избежать. В отличие от проверенных исключений, исключения во время выполнения игнорируются во время компиляции.

ошибки

Это вовсе не исключения, а проблемы, которые возникают вне контроля пользователя или программиста. Ошибки обычно игнорируются в вашем коде, потому что вы редко можете что-либо сделать с ошибкой. Например, если переполнение стека происходит, возникнет ошибка. Они также игнорируются во время компиляции.

Далее мы обсудим способы обработки исключительных ситуаций / ошибок во время выполнения в вашем коде JSP.

Использование объекта исключения

Объект исключения является экземпляром подкласса Throwable (например, java.lang. NullPointerException) и доступен только на страницах ошибок. В следующей таблице перечислены важные методы, доступные в классе Throwable.

S.No. Методы и описание
1

public String getMessage ()

Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.

2

public Throwable getCause ()

Возвращает причину исключения в виде объекта Throwable.

3

public String toString ()

Возвращает имя класса, объединенного с результатом getMessage () .

4

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err , поток вывода ошибок.

5

public StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.

6

public Throwable fillInStackTrace ()

Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.

public String getMessage ()

Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.

public Throwable getCause ()

Возвращает причину исключения в виде объекта Throwable.

public String toString ()

Возвращает имя класса, объединенного с результатом getMessage () .

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err , поток вывода ошибок.

public StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.

public Throwable fillInStackTrace ()

Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.

JSP дает вам возможность указать страницу ошибок для каждого JSP. Всякий раз, когда страница генерирует исключение, контейнер JSP автоматически вызывает страницу ошибки.

Ниже приведен пример указания страницы ошибки для main.jsp . Чтобы настроить страницу ошибки, используйте директиву <% @ page errorPage = "xxx"%> .

<%@ page errorPage = "ShowError.jsp" %>

<html>
   <head>
      <title>Error Handling Example</title>
   </head>
   
   <body>
      <%
         // Throw an exception to invoke the error page
         int x = 1;
         
         if (x == 1) {
            throw new RuntimeException("Error condition!!!");
         }
      %>
   </body>
</html>

Теперь мы напишем один JSP ShowError.jsp для обработки ошибок, который приведен ниже. Обратите внимание, что страница обработки ошибок содержит директиву <% @ page isErrorPage = "true"%> . Эта директива заставляет компилятор JSP генерировать переменную экземпляра исключения.

<%@ page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <p>Sorry, an error occurred.</p>
      <p>Here is the exception stack trace: </p>
      <pre><% exception.printStackTrace(response.getWriter()); %></pre>
   </body>
</html>

Получив доступ к main.jsp , вы получите вывод, похожий на следующий:

java.lang.RuntimeException: Error condition!!!
......

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

Использование тегов JSTL для страницы ошибок

Вы можете использовать JSTL-теги, чтобы написать страницу с ошибкой ShowError.jsp . Эта страница имеет почти ту же логику, что и в приведенном выше примере, с лучшей структурой и большим количеством информации -

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <table width = "100%" border = "1">
         <tr valign = "top">
            <td width = "40%"><b>Error:</b></td>
            <td>${pageContext.exception}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>URI:</b></td>
            <td>${pageContext.errorData.requestURI}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Status code:</b></td>
            <td>${pageContext.errorData.statusCode}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Stack trace:</b></td>
            <td>
               <c:forEach var = "trace" 
                  items = "${pageContext.exception.stackTrace}">
                  <p>${trace}</p>
               </c:forEach>
            </td>
         </tr>
      </table>

   </body>
</html>

Получите доступ к main.jsp, будет сгенерировано следующее:

Opps...

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Используя Try ... Catch Block

Если вы хотите обрабатывать ошибки на одной и той же странице и хотите выполнить какое-то действие вместо запуска страницы с ошибками, вы можете использовать блок try .... catch .

Ниже приведен простой пример, который показывает, как использовать блок try ... catch. Давайте поместим следующий код в main.jsp -

<html>
   <head>
      <title>Try...Catch Example</title>
   </head>
   
   <body>
      <%
         try {
            int i = 1;
            i = i / 0;
            out.println("The answer is " + i);
         }
         catch (Exception e) {
            out.println("An exception occurred: " + e.getMessage());
         }
      %>
   </body>
</html>

Получите доступ к main.jsp, он должен сгенерировать вывод, похожий на следующий:

An exception occurred: / by zero 

JSP - отладка

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

Ниже приведены несколько советов и предложений, которые могут помочь вам в вашей отладке.

Использование System.out.println ()

System.out.println () легко использовать в качестве маркера для проверки, выполняется ли определенный фрагмент кода или нет. Мы можем также распечатать значения переменных. Рассмотрим следующие дополнительные моменты -

  • Поскольку объект System является частью основных объектов Java, его можно использовать везде без необходимости устанавливать какие-либо дополнительные классы. Это включает в себя сервлеты, JSP, RMI, EJB, обычные компоненты и классы и автономные приложения .

  • По сравнению с остановкой в ​​точках останова запись в System.out не сильно мешает нормальному потоку выполнения приложения, что делает его очень ценным, когда iming имеет решающее значение.

Поскольку объект System является частью основных объектов Java, его можно использовать везде без необходимости устанавливать какие-либо дополнительные классы. Это включает в себя сервлеты, JSP, RMI, EJB, обычные компоненты и классы и автономные приложения .

По сравнению с остановкой в ​​точках останова запись в System.out не сильно мешает нормальному потоку выполнения приложения, что делает его очень ценным, когда iming имеет решающее значение.

Ниже приведен синтаксис для использования System.out.println () -

System.out.println("Debugging message");

В следующем примере показано, как использовать System.out.print () -

<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

<html>
   <head><title>System.out.println</title></head>
   <body>
      <c:forEach var = "counter" begin = "1" end = "10" step = "1" >
      
         <c:out value = "${counter-5}"/></br>
         <% System.out.println( "counter = " + pageContext.findAttribute("counter") ); %>
      </c:forEach>
      
   </body>
</html>

Получив доступ к вышеуказанной JSP, браузер покажет следующий результат -

-4
-3
-2
-1
0
1
2
3
4
5

Если вы используете Tomcat, вы также найдете эти строки, добавленные в конец stdout.log в каталоге logs.

counter = 1
counter = 2
counter = 3
counter = 4
counter = 5
counter = 6
counter = 7
counter = 8
counter = 9
counter = 10

Таким образом, вы можете вносить переменные и другую информацию в системный журнал, который можно проанализировать, чтобы выяснить причину проблемы или по другим причинам.

Использование JDB Logger

Инфраструктура ведения журнала J2SE предназначена для предоставления служб ведения журнала для любого класса, работающего в JVM. Мы можем использовать эту платформу для регистрации любой информации.

Давайте перепишем приведенный выше пример, используя JDK logger API -

<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@page import = "java.util.logging.Logger" %>

<html>
   <head><title>Logger.info</title></head>
   
   <body>
      <% Logger logger = Logger.getLogger(this.getClass().getName());%>

      <c:forEach var = "counter" begin = "1" end = "10" step = "1" >
      <c:set var = "myCount" value = "${counter-5}" />
      <c:out value = "${myCount}"/></br>
         <% String message = "counter = "
            + pageContext.findAttribute("counter") + "myCount = "
            + pageContext.findAttribute("myCount");
            logger.info( message );
         %>
      </c:forEach>
      
   </body>
</html>

Приведенный выше код сгенерирует аналогичный результат в браузере и в stdout.log, но у вас будет дополнительная информация в stdout.log . Мы будем использовать метод info регистратора, потому что и регистрируем сообщение только для информационных целей. Ниже приведен снимок файла stdout.log:

24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 1 myCount = -4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 2 myCount = -3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 3 myCount = -2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 4 myCount = -1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 5 myCount = 0
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 6 myCount = 1
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 7 myCount = 2
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 8 myCount = 3
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 9 myCount = 4
24-Sep-2010 23:31:31 org.apache.jsp.main_jsp _jspService
INFO: counter = 10 myCount = 5

Сообщения можно отправлять на разных уровнях с помощью вспомогательных функций Суровый (), Предупреждение (), Информация (), Конфигурация (), Точный (), Тонкий () и Лучший () . Здесь метод finest () может использоваться для регистрации самой точной информации, а метод heavy () может использоваться для регистрации серьезной информации.

Вы можете использовать Log4J Framework для регистрации сообщений в разных файлах в зависимости от их серьезности и важности.

Инструменты отладки

NetBeans - это бесплатная интегрированная среда разработки Java с открытым исходным кодом, которая поддерживает разработку автономных приложений Java и веб-приложений, поддерживающих спецификации JSP и сервлетов, а также включает отладчик JSP.

NetBeans поддерживает следующие основные функции отладки:

  • Контрольные точки
  • Пошаговое выполнение кода
  • Контрольные точки

Вы можете обратиться к документации по NetBeans, чтобы понять описанные выше функции отладки.

Использование JDB Debugger

Вы можете отлаживать JSP и сервлеты с помощью тех же команд jdb, которые вы используете для отладки апплета или приложения.

Чтобы отладить JSP или сервлет, вы можете отладить sun.servlet.http.HttpServer , а затем наблюдать, как HttpServer выполняет JSP / сервлеты в ответ на HTTP-запросы, которые мы делаем из браузера. Это очень похоже на отладку апплетов. Разница в том, что с апплетами отлаживаемой программой является sun.applet.AppletViewer .

Большинство отладчиков скрывают эту деталь, автоматически зная, как отлаживать апплеты. Пока они не сделают то же самое для JSP, вы должны помочь отладчику, учитывая следующее:

  • Установите путь к классу вашего отладчика. Это поможет вам найти sun.servlet.http.Http-Server и связанные с ним классы.

  • Установите путь к классу вашего отладчика. Это поможет вам найти ваш JSP и вспомогательные классы, обычно ROOT \ WEB-INF \ classes .

Установите путь к классу вашего отладчика. Это поможет вам найти sun.servlet.http.Http-Server и связанные с ним классы.

Установите путь к классу вашего отладчика. Это поможет вам найти ваш JSP и вспомогательные классы, обычно ROOT \ WEB-INF \ classes .

После того как вы установили правильный путь к классу , начните отладку sun.servlet.http.HttpServer . Вы можете установить точки останова в любой JSP, которая вас интересует в отладке, а затем использовать веб-браузер для запроса к HttpServer для данного JSP (http: // localhost: 8080 / JSPToDebug) . Исполнение здесь останавливается на контрольных точках.

Использование комментариев

Комментарии в вашем коде могут помочь процессу отладки различными способами. Комментарии могут использоваться многими другими способами в процессе отладки.

JSP использует комментарии Java, а однострочные (// ...) и многострочные (/ * ... * /) комментарии могут использоваться для временного удаления частей вашего Java-кода. Если ошибка исчезнет, ​​внимательно посмотрите на код, который вы только что прокомментировали, и выясните проблему.

Заголовки клиента и сервера

Иногда, когда JSP ведет себя не так, как ожидалось, полезно взглянуть на необработанный HTTP-запрос и ответ. Если вы знакомы со структурой HTTP, вы можете прочитать запрос и ответ и посмотреть, что именно происходит с этими заголовками.

Важные советы по отладке

Вот список некоторых советов по отладке JSP -

  • Попросите браузер показать необработанное содержимое отображаемой страницы. Это может помочь выявить проблемы с форматированием. Обычно это опция в меню «Вид».

  • Убедитесь, что браузер не кэширует вывод предыдущего запроса, принудительно перезагрузив страницу. В Netscape Navigator используйте Shift-Reload ; с помощью Internet Explorer используйте Shift-Refresh .

Попросите браузер показать необработанное содержимое отображаемой страницы. Это может помочь выявить проблемы с форматированием. Обычно это опция в меню «Вид».

Убедитесь, что браузер не кэширует вывод предыдущего запроса, принудительно перезагрузив страницу. В Netscape Navigator используйте Shift-Reload ; с помощью Internet Explorer используйте Shift-Refresh .

JSP - Безопасность

Страницы и сервлеты JavaServer предоставляют веб-разработчикам несколько механизмов для защиты приложений. Ресурсы защищены декларативным способом, указав их в дескрипторе развертывания приложения и присвоив им роль.

Доступно несколько уровней аутентификации: от базовой аутентификации с использованием идентификаторов и паролей до сложной аутентификации с использованием сертификатов.

Ролевая аутентификация

Механизм аутентификации в спецификации сервлета использует метод, называемый защитой на основе ролей . Идея состоит в том, что вместо ограничения ресурсов на уровне пользователя вы создаете роли и ограничиваете ресурсы по ролям.

Вы можете определить разные роли в файле tomcat-users.xml , который находится в домашнем каталоге Tomcat в файле conf. Пример этого файла показан ниже -

<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
   <role rolename = "tomcat"/>
   <role rolename = "role1"/>
   <role rolename = "manager"/>
   <role rolename = "admin"/>
   <user username = "tomcat" password = "tomcat" roles = "tomcat"/>
   <user username = "role1" password = "tomcat" roles = "role1"/>
   <user username = "both" password = "tomcat" roles = "tomcat,role1"/>
   <user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>

Этот файл определяет простое сопоставление между именем пользователя, паролем и ролью . Обратите внимание, что данный пользователь может иметь несколько ролей; например, username = "both" входит в роль "tomcat" и роль "role1".

После того как вы определили и определили разные роли, ограничения безопасности на основе ролей могут быть наложены на разные ресурсы веб-приложения с помощью элемента <security-constraint> в файле web.xml, доступном в каталоге WEB-INF.

Ниже приведен пример записи в файле web.xml.

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>
            Let only managers use this app
         </description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <login-config>
      <auth-method>BASIC</auth-method>
   </login-config>
   ...
</web-app>

Вышеуказанные записи будут означать -

  • Любой HTTP-запрос GET или POST к URL-адресу, совпадающему с / secured / *, будет подвергнут ограничениям безопасности.

  • Человек с ролью менеджера получает доступ к защищенным ресурсам.

  • Элемент login-config используется для описания ОСНОВНОЙ формы аутентификации.

Любой HTTP-запрос GET или POST к URL-адресу, совпадающему с / secured / *, будет подвергнут ограничениям безопасности.

Человек с ролью менеджера получает доступ к защищенным ресурсам.

Элемент login-config используется для описания ОСНОВНОЙ формы аутентификации.

Если вы попытаетесь просмотреть любой URL, включая каталог / security , появится следующее диалоговое окно с запросом имени пользователя и пароля. Если вы предоставите пользователю «admin» и пароль «secrer» , то у вас будет доступ к URL-адресу, сопоставленному с / secured / *, поскольку мы определили пользователя admin с ролью администратора, которому разрешен доступ к этому ресурсу.

Аутентификация на основе форм

Когда вы используете метод аутентификации FORM, вы должны предоставить форму входа в систему, чтобы запросить у пользователя имя пользователя и пароль. Ниже приведен простой код login.jsp . Это помогает создать форму для той же цели -

<html>
   <body bgcolor = "#ffffff">
      
      <form method = "POST" action ="j_security_check">
         <table border = "0">
            <tr>
               <td>Login</td>
               <td><input type = "text" name="j_username"></td>
            </tr>
            <tr>
               <td>Password</td>
               <td><input type = "password" name="j_password"></td>
            </tr>
         </table>
         <input type = "submit" value = "Login!">
      </form>
      
   </body>
</html>

Здесь вы должны убедиться, что форма входа в систему должна содержать элементы формы с именами j_username и j_password . Действие в теге <form> должно быть j_security_check . POST должен использоваться как метод формы. В то же время вам придется изменить тег <login-config>, указав метод auth как FORM -

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>Let only managers use this app</description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <login-config>
      <auth-method>FORM</auth-method>
      <form-login-config>
         <form-login-page>/login.jsp</form-login-page>
         <form-error-page>/error.jsp</form-error-page>
      </form-login-config>
   </login-config>
   ...
</web-app>

Теперь, когда вы пытаетесь получить доступ к любому ресурсу с URL / secured / * , он отобразит приведенную выше форму с запросом идентификатора пользователя и пароля. Когда контейнер видит действие « j_security_check », он использует некоторый внутренний механизм для аутентификации вызывающей стороны.

Если вход в систему успешен, и вызывающему разрешено получить доступ к защищенному ресурсу, тогда контейнер использует идентификатор сеанса для идентификации сеанса входа в систему для вызывающего с этого момента. Контейнер поддерживает сеанс входа в систему с помощью файла cookie, содержащего идентификатор сеанса. Сервер отправляет cookie обратно клиенту, и пока вызывающий объект представляет этот cookie последующими запросами, контейнер будет знать, кто является вызывающим.

В случае сбоя входа в систему сервер отправляет обратно страницу, определенную параметром form-error-page

Здесь j_security_check - это действие, которое приложения, использующие вход на основе формы, должны указывать для формы входа. В той же форме вы также должны иметь элемент управления вводом текста с именем j_username и элемент управления вводом пароля с именем j_password . Когда вы видите это, это означает, что информация, содержащаяся в форме, будет отправлена ​​на сервер, который проверит имя и пароль. Как это сделать, зависит от сервера.

Проверьте стандартные реализации областей, чтобы понять, как j_security_check работает для контейнера Tomcat.

Программная безопасность в сервлете / JSP

Объект HttpServletRequest предоставляет следующие методы, которые можно использовать для анализа информации о безопасности во время выполнения.

S.No. Метод и описание
1

Строка getAuthType ()

Метод getAuthType () возвращает объект String, который представляет имя схемы аутентификации, используемой для защиты сервлета.

2

логическое isUserInRole (роль java.lang.String)

Метод isUserInRole () возвращает логическое значение: true, если пользователь находится в данной роли, или false, если это не так.

3

Строка getProtocol ()

Метод getProtocol () возвращает объект String, представляющий протокол, который использовался для отправки запроса. Это значение можно проверить, чтобы определить, использовался ли безопасный протокол.

4

логическое isSecure ()

Метод isSecure () возвращает логическое значение, представляющее, был ли запрос сделан с использованием HTTPS. Значение true означает, что это так и соединение безопасно. Значение false означает, что запрос не был.

5

Принцип getUserPrinciple ()

Метод getUserPrinciple () возвращает объект java.security.Principle, который содержит имя текущего аутентифицированного пользователя.

Строка getAuthType ()

Метод getAuthType () возвращает объект String, который представляет имя схемы аутентификации, используемой для защиты сервлета.

логическое isUserInRole (роль java.lang.String)

Метод isUserInRole () возвращает логическое значение: true, если пользователь находится в данной роли, или false, если это не так.

Строка getProtocol ()

Метод getProtocol () возвращает объект String, представляющий протокол, который использовался для отправки запроса. Это значение можно проверить, чтобы определить, использовался ли безопасный протокол.

логическое isSecure ()

Метод isSecure () возвращает логическое значение, представляющее, был ли запрос сделан с использованием HTTPS. Значение true означает, что это так и соединение безопасно. Значение false означает, что запрос не был.

Принцип getUserPrinciple ()

Метод getUserPrinciple () возвращает объект java.security.Principle, который содержит имя текущего аутентифицированного пользователя.

Например, для Страницы JavaServer, которая ссылается на страницы для менеджеров, у вас может быть следующий код:

<% if (request.isUserInRole("manager")) { %>
   <a href = "managers/mgrreport.jsp">Manager Report</a>
   <a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>

Проверяя роль пользователя в JSP или сервлете, вы можете настроить веб-страницу таким образом, чтобы показывать пользователю только те элементы, к которым он имеет доступ. Если вам нужно имя пользователя, которое было введено в форме аутентификации, вы можете вызвать метод getRemoteUser в объекте запроса.

JSP - Интернационализация | i18n | l10n

В этой главе мы обсудим концепцию интернационализации в JSP. Прежде чем мы продолжим, давайте разберемся в следующих трех важных терминах:

  • Интернационализация (i18n) - это означает, что веб-сайт может предоставлять различные версии контента, переведенные на язык или национальность посетителя.

  • Локализация (l10n) - это означает добавление ресурсов на веб-сайт для его адаптации к определенному географическому или культурному региону, например, перевод на хинди на веб-сайт.

  • локаль - это особый культурный или географический регион. Обычно его называют символом языка, за которым следует символ страны, разделенный подчеркиванием. Например, « en_US » представляет английский язык для США.

Интернационализация (i18n) - это означает, что веб-сайт может предоставлять различные версии контента, переведенные на язык или национальность посетителя.

Локализация (l10n) - это означает добавление ресурсов на веб-сайт для его адаптации к определенному географическому или культурному региону, например, перевод на хинди на веб-сайт.

локаль - это особый культурный или географический регион. Обычно его называют символом языка, за которым следует символ страны, разделенный подчеркиванием. Например, « en_US » представляет английский язык для США.

Есть несколько вещей, о которых следует позаботиться при создании глобального веб-сайта. Это руководство не даст вам полной информации по этому вопросу, но даст вам хороший пример того, как вы можете предложить свою веб-страницу на разных языках интернет-сообществу, дифференцируя их местоположение, то есть локаль.

JSP может подобрать подходящую версию сайта в зависимости от локали запрашивающей стороны и предоставить соответствующую версию сайта в соответствии с местным языком, культурой и требованиями. Ниже приведен метод объекта запроса, который возвращает объект Locale.

java.util.Locale request.getLocale() 

Обнаружение локали

Ниже приведены важные методы локали, которые вы можете использовать для определения местоположения запрашивающего, языка и, конечно, локали . Все перечисленные ниже методы отображают название страны и название языка, заданные в браузере запрашивающей стороны.

S.No. Метод и описание
1

Строка getCountry ()

Этот метод возвращает код страны / региона в верхнем регистре для этой локали в двухбуквенном формате ISO 3166.

2

Строка getDisplayCountry ()

Этот метод возвращает имя страны локали, которая подходит для отображения пользователю.

3

Строка getLanguage ()

Этот метод возвращает код языка в нижнем регистре для этой локали в формате ISO 639.

4

Строка getDisplayLanguage ()

Этот метод возвращает имя языка локали, которое подходит для отображения пользователю.

5

Строка getISO3Country ()

Этот метод возвращает трехбуквенное сокращение для страны этого региона.

6

Строка getISO3Language ()

Этот метод возвращает трехбуквенное сокращение для языка этой локали.

Строка getCountry ()

Этот метод возвращает код страны / региона в верхнем регистре для этой локали в двухбуквенном формате ISO 3166.

Строка getDisplayCountry ()

Этот метод возвращает имя страны локали, которая подходит для отображения пользователю.

Строка getLanguage ()

Этот метод возвращает код языка в нижнем регистре для этой локали в формате ISO 639.

Строка getDisplayLanguage ()

Этот метод возвращает имя языка локали, которое подходит для отображения пользователю.

Строка getISO3Country ()

Этот метод возвращает трехбуквенное сокращение для страны этого региона.

Строка getISO3Language ()

Этот метод возвращает трехбуквенное сокращение для языка этой локали.

пример

В следующем примере показано, как отобразить язык и связанную страну для запроса в JSP -

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%
   //Get the client's Locale
   Locale locale = request.getLocale();
   String language = locale.getLanguage();
   String country = locale.getCountry();
%>

<html>
   <head>
      <title>Detecting Locale</title>
   </head>

   <body>
      <center>
         <h1>Detecting Locale</h1>
      </center>
      
      <p align = "center">
         <% 
            out.println("Language : " + language  + "<br />");
            out.println("Country  : " + country   + "<br />");
         %>
      </p>
   </body>
</html>

Настройка языков

JSP может выводить страницу, написанную на западноевропейском языке, таком как английский, испанский, немецкий, французский, итальянский, голландский и т. Д. Здесь важно установить заголовок Content-Language для правильного отображения всех символов.

Другим важным моментом является отображение всех специальных символов с использованием сущностей HTML; например, "& # 241;" представляет «ñ» и «& # 161;» представляет «¡» следующим образом -

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>

<%
   // Set response content type
   response.setContentType("text/html");
   
   // Set spanish language code.
   response.setHeader("Content-Language", "es");
   String title = "En Español";
%>

<html>
   <head>
      <title><%  out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><%  out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>En Español</p>
         <p>¡Hola Mundo!</p>
      </div>
   </body>
</html>

Локальные даты

Вы можете использовать класс java.text.DateFormat и его статический метод getDateTimeInstance () для форматирования даты и времени, специфичных для локали. Ниже приведен пример, который показывает, как форматировать даты, специфичные для данной локали.

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.DateFormat,java.util.Date" %>

<%
   String title = "Locale Specific Dates";
   
   //Get the client's Locale
   Locale locale = request.getLocale( );
   
   String date = DateFormat.getDateTimeInstance(
      DateFormat.FULL, 
      DateFormat.SHORT, 
      locale).format(new Date( ));
%>

<html>
   
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>Local Date: <%  out.print(date); %></p>
      </div>
   </body>
</html>

Локальная валюта

Вы можете использовать класс java.txt.NumberFormat и его статический метод getCurrencyInstance () для форматирования числа, такого как тип long или double, в конкретной валюте. Ниже приведен пример, который показывает, как форматировать валюту, специфичную для данной локали.

<%@ page import = "java.io.*,java.util.Locale" %>
<%@ page import = "javax.servlet.*,javax.servlet.http.* "%>
<%@ page import = "java.text.NumberFormat,java.util.Date" %>

<%
   String title = "Locale Specific Currency";
   
   //Get the client's Locale
   Locale locale = request.getLocale( );
   
   NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
   String formattedCurr = nft.format(1000000);
%>

<html>
   
   <head>
      <title><% out.print(title); %></title>
   </head>
   
   <body>
      <center>
         <h1><% out.print(title); %></h1>
      </center>
      
      <div align = "center">
         <p>Formatted Currency: <%  out.print(formattedCurr); %></p>
      </div>
   </body>
</html>

Процент локали

Вы можете использовать класс java.txt.NumberFormat и его статический метод getPercentInstance (), чтобы получить определенный процент локали. В следующем примере показано, как отформатировать проценты, специфичные для данной локали -