Учебники

Сервлеты — Краткое руководство

Сервлеты — Обзор

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

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

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

  • Производительность значительно лучше.

  • Сервлеты выполняются в адресном пространстве веб-сервера. Нет необходимости создавать отдельный процесс для обработки каждого запроса клиента.

  • Сервлеты не зависят от платформы, потому что они написаны на Java.

  • Диспетчер безопасности Java на сервере налагает ряд ограничений для защиты ресурсов на компьютере сервера. Так что сервлетам доверяют.

  • Полная функциональность библиотек классов Java доступна сервлету. Он может связываться с апплетами, базами данных или другим программным обеспечением через сокеты и механизмы RMI, которые вы уже видели.

Производительность значительно лучше.

Сервлеты выполняются в адресном пространстве веб-сервера. Нет необходимости создавать отдельный процесс для обработки каждого запроса клиента.

Сервлеты не зависят от платформы, потому что они написаны на Java.

Диспетчер безопасности Java на сервере налагает ряд ограничений для защиты ресурсов на компьютере сервера. Так что сервлетам доверяют.

Полная функциональность библиотек классов Java доступна сервлету. Он может связываться с апплетами, базами данных или другим программным обеспечением через сокеты и механизмы RMI, которые вы уже видели.

Сервлеты Архитектура

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

Сервлеты Архитектура

Задачи сервлетов

Сервлеты выполняют следующие основные задачи —

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

  • Прочитать неявные данные HTTP-запроса, отправленные клиентами (браузерами). Сюда входят файлы cookie, типы мультимедиа и схемы сжатия, понятные браузеру, и так далее.

  • Обработайте данные и сгенерируйте результаты. Этот процесс может потребовать обращения к базе данных, выполнения вызова RMI или CORBA, вызова веб-службы или непосредственного вычисления ответа.

  • Отправьте явные данные (т. Е. Документ) клиентам (браузерам). Этот документ может быть отправлен в различных форматах, включая текст (HTML или XML), двоичный файл (изображения GIF), Excel и т. Д.

  • Отправьте неявный HTTP-ответ клиентам (браузерам). Это включает в себя информирование браузеров или других клиентов о типе возвращаемого документа (например, HTML), настройку файлов cookie и параметров кэширования и другие подобные задачи.

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

Прочитать неявные данные HTTP-запроса, отправленные клиентами (браузерами). Сюда входят файлы cookie, типы мультимедиа и схемы сжатия, понятные браузеру, и так далее.

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

Отправьте явные данные (т. Е. Документ) клиентам (браузерам). Этот документ может быть отправлен в различных форматах, включая текст (HTML или XML), двоичный файл (изображения GIF), Excel и т. Д.

Отправьте неявный HTTP-ответ клиентам (браузерам). Это включает в себя информирование браузеров или других клиентов о типе возвращаемого документа (например, HTML), настройку файлов cookie и параметров кэширования и другие подобные задачи.

Пакеты сервлетов

Сервлеты Java — это классы Java, запускаемые веб-сервером, который имеет интерпретатор, поддерживающий спецификацию Java Servlet.

Сервлеты могут быть созданы с помощью пакетов javax.servlet и javax.servlet.http , которые являются стандартной частью корпоративной версии Java, расширенной версии библиотеки классов Java, которая поддерживает крупномасштабные проекты разработки.

Эти классы реализуют спецификации Java Servlet и JSP. На момент написания этого руководства использовались версии Java Servlet 2.5 и JSP 2.1.

Java-сервлеты были созданы и скомпилированы, как и любой другой класс Java. После установки пакетов сервлетов и добавления их в Classpath вашего компьютера вы можете скомпилировать сервлеты с помощью компилятора Java JDK или любого другого текущего компилятора.

Что дальше?

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

Сервлеты — Настройка среды

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

Как и в любой другой программе на Java, вам нужно скомпилировать сервлет с помощью Java-компилятора javac, и после компиляции приложение сервлета будет развернуто в настроенной среде для тестирования и запуска.

Эта настройка среды разработки включает следующие шаги:

Настройка 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.8.0_65, вы должны поместить следующую строку в ваш файл C: \ autoexec.bat.

set PATH = C:\jdk1.8.0_65\bin;%PATH% 
set JAVA_HOME = C:\jdk1.8.0_65 

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

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

setenv PATH /usr/local/jdk1.8.0_65/bin:$PATH 
setenv JAVA_HOME /usr/local/jdk1.8.0_65

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

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

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

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

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

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

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

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

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

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

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

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

После запуска веб-приложения по умолчанию, включенные в Tomcat, будут доступны по адресу http: // localhost: 8080 / . Если все в порядке, он должен отобразить следующий результат —

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

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

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

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

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

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

Настройка CLASSPATH

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

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

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

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

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

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

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

Сервлеты — Жизненный цикл

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

  • Сервлет инициализируется путем вызова метода init () .

  • Сервлет вызывает метод service () для обработки запроса клиента.

  • Сервлет завершается вызовом метода destroy () .

  • Наконец, сервлет — это сборщик мусора сборщиком мусора JVM.

Сервлет инициализируется путем вызова метода init () .

Сервлет вызывает метод service () для обработки запроса клиента.

Сервлет завершается вызовом метода destroy () .

Наконец, сервлет — это сборщик мусора сборщиком мусора JVM.

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

Метод init ()

Метод init вызывается только один раз. Он вызывается только при создании сервлета и впоследствии не вызывается для пользовательских запросов. Таким образом, он используется для одноразовой инициализации, так же как и в случае с методом init апплетов.

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

Когда пользователь вызывает сервлет, создается один экземпляр каждого сервлета, каждый запрос пользователя приводит к созданию нового потока, который передается doGet или doPost в зависимости от ситуации. Метод init () просто создает или загружает некоторые данные, которые будут использоваться на протяжении всей жизни сервлета.

Определение метода init выглядит так:

public void init() throws ServletException {
   // Initialization code...
}

Служба () Метод

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

Каждый раз, когда сервер получает запрос на сервлет, он порождает новый поток и вызывает службу. Метод service () проверяет тип HTTP-запроса (GET, POST, PUT, DELETE и т. Д.) И при необходимости вызывает методы doGet, doPost, doPut, doDelete и т. Д.

Вот подпись этого метода —

public void service(ServletRequest request, ServletResponse response) 
   throws ServletException, IOException {
}

Метод service () вызывается контейнером, а метод service вызывает соответствующие методы doGet, doPost, doPut, doDelete и т. Д. Таким образом, вы не имеете ничего общего с методом service (), но вы переопределяете doGet () или doPost () в зависимости от того, какой тип запроса вы получаете от клиента.

DoGet () и doPost () являются наиболее часто используемыми методами в каждом запросе службы. Вот подпись этих двух методов.

Метод doGet ()

Запрос GET является результатом обычного запроса URL или формы HTML, в которой не указан МЕТОД, и он должен обрабатываться методом doGet ().

public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   // Servlet code
}

Метод doPost ()

Запрос POST является результатом HTML-формы, в которой в качестве МЕТОДА указан POST, и он должен обрабатываться методом doPost ().

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   // Servlet code
}

Метод destroy ()

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

После вызова метода destroy () объект сервлета помечается для сборки мусора. Определение метода уничтожения выглядит так:

public void destroy() {
   // Finalization code...
}

Архитектурная схема

На следующем рисунке показан типичный сценарий жизненного цикла сервлета.

  • Сначала HTTP-запросы, поступающие на сервер, делегируются в контейнер сервлета.

  • Контейнер сервлета загружает сервлет перед вызовом метода service ().

  • Затем контейнер сервлета обрабатывает несколько запросов, порождая несколько потоков, причем каждый поток выполняет метод service () одного экземпляра сервлета.

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

Контейнер сервлета загружает сервлет перед вызовом метода service ().

Затем контейнер сервлета обрабатывает несколько запросов, порождая несколько потоков, причем каждый поток выполняет метод service () одного экземпляра сервлета.

Жизненный цикл сервлета

Сервлеты — Примеры

Сервлеты — это классы Java, которые обслуживают HTTP-запросы и реализуют интерфейс javax.servlet.Servlet . Разработчики веб-приложений обычно пишут сервлеты, которые расширяют javax.servlet.http.HttpServlet, абстрактный класс, который реализует интерфейс сервлета и специально разработан для обработки HTTP-запросов.

Образец кода

Ниже приведен пример структуры исходного кода примера сервлета, демонстрирующий Hello World —

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class HelloWorld extends HttpServlet {
 
   private String message;

   public void init() throws ServletException {
      // Do required initialization
      message = "Hello World";
   }

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      // Actual logic goes here.
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
   }

   public void destroy() {
      // do nothing.
   }
}

Компиляция сервлета

Давайте создадим файл с именем HelloWorld.java с кодом, показанным выше. Поместите этот файл в C: \ ServletDevel (в Windows) или в / usr / ServletDevel (в Unix). Этот путь должен быть добавлен в CLASSPATH, прежде чем продолжить.

Если ваша среда правильно настроена, перейдите в каталог ServletDevel и скомпилируйте HelloWorld.java следующим образом:

$ javac HelloWorld.java

Если сервлет зависит от каких-либо других библиотек, вы должны также включить эти файлы JAR в свой CLASSPATH. Я включил только JAR-файл servlet-api.jar, потому что я не использую никакую другую библиотеку в программе Hello World.

В этой командной строке используется встроенный компилятор javac, поставляемый с Sun Microsystems Java Software Development Kit (JDK). Чтобы эта команда работала правильно, вы должны указать расположение Java SDK, которое вы используете, в переменной среды PATH.

Если все пойдет хорошо, приведенная выше компиляция выдаст файл HelloWorld.class в том же каталоге. В следующем разделе объясняется, как скомпилированный сервлет будет развернут в производстве.

Развертывание сервлета

По умолчанию приложение сервлета находится в пути <Tomcat-instaldirectory> / webapps / ROOT, а файл класса будет находиться в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes.

Если у вас есть полное имя класса com.myorg.MyServlet , то этот класс сервлета должен находиться в WEB-INF / classes / com / myorg / MyServlet.class.

А пока давайте скопируем HelloWorld.class в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes и создадим следующие записи в файле web.xml, расположенном в <Tomcat-installation-directory> / webapps / ROOT / WEB- INF /

<servlet>
   <servlet-name>HelloWorld</servlet-name>
   <servlet-class>HelloWorld</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>HelloWorld</servlet-name>
   <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

Над записями, которые будут созданы внутри тегов <web-app> … </ web-app>, доступных в файле web.xml. В этой таблице уже могут быть различные записи, но не берите в голову.

Вы почти закончили, теперь давайте запустим сервер Tomcat, используя <Tomcat-installationdirectory> \ bin \ startup.bat (в Windows) или <Tomcat-InstallationDirectory> /bin/startup.sh (в Linux / Solaris и т. Д.) И, наконец, наберите http: // localhost: 8080 / HelloWorld в адресной строке браузера. Если все будет хорошо, вы получите следующий результат

Пример сервлета

Сервлеты — Данные формы

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

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

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

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

Метод GET является методом по умолчанию для передачи информации из браузера на веб-сервер, и он создает длинную строку, которая появляется в поле «Местоположение:» вашего браузера. Никогда не используйте метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру: в строке запроса можно использовать только 1024 символа.

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

Метод POST

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

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

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

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

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

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

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

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

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

Пример получения метода с использованием URL

Вот простой URL, который передаст два значения программе HelloForm, используя метод GET.

http: // localhost: 8080 / HelloForm? first_name = ZARA & last_name = ALI

Ниже приведена программа сервлета HelloForm.java для обработки входных данных, данных веб-браузером. Мы собираемся использовать метод getParameter (), который упрощает доступ к передаваемой информации —

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class HelloForm extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Using GET Method to Read Form Data";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>" +
         "</html>"
      );
   }
}

Предполагая, что ваша среда настроена правильно, скомпилируйте HelloForm.java следующим образом:

$ javac HelloForm.java

Если все пойдет хорошо, приведенная выше компиляция выдаст файл HelloForm.class . Затем вам нужно будет скопировать этот файл класса в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes и создать следующие записи в файле web.xml, расположенном в <Tomcat-installation-directory> / webapps / ROOT / WEB- INF /

<servlet>
   <servlet-name>HelloForm</servlet-name>
   <servlet-class>HelloForm</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>HelloForm</servlet-name>
   <url-pattern>/HelloForm</url-pattern>
</servlet-mapping>

Теперь введите http: // localhost: 8080 / HelloForm? First_name = ZARA & last_name = ALI в поле Location: вашего браузера и убедитесь, что вы уже запустили tomcat-сервер, прежде чем запускать указанную выше команду в браузере. Это приведет к следующему результату —

Using GET Method to Read Form Data

  • First Name : ZARA
  • Last Name : ALI

Пример метода GET с использованием формы

Вот простой пример, который передает два значения, используя HTML FORM и кнопку отправки. Мы собираемся использовать тот же Servlet HelloForm для обработки этого ввода.

<html>
   <body>
      <form action = "HelloForm" 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-InstallationDirectory> / webapps / ROOT. Когда вы обращаетесь к http: // localhost: 8080 / Hello.htm , вот фактический результат вышеприведенной формы.

Имя: Фамилия:

Попробуйте ввести имя и фамилию, а затем нажмите кнопку «Отправить», чтобы увидеть результат на локальном компьютере, на котором запущен tomcat. На основе предоставленного ввода, он будет генерировать результат, аналогичный указанному в приведенном выше примере.

Пример метода POST с использованием формы

Давайте немного изменим вышеприведенный сервлет, чтобы он мог обрабатывать как методы GET, так и методы POST. Ниже приведена программа сервлета HelloForm.java для обработки входных данных, данных веб-браузером, с использованием методов GET или POST.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class HelloForm extends HttpServlet {

   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Using GET Method to Read Form Data";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>"
         "</html>"
      );
   }

   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      doGet(request, response);
   }
}

Теперь скомпилируйте и разверните вышеупомянутый сервлет и протестируйте его, используя Hello.htm с методом POST следующим образом:

<html>
   <body>
      <form action = "HelloForm" 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>

Вот фактический результат вышеприведенной формы. Попробуйте ввести имя и фамилию, а затем нажмите кнопку «Отправить», чтобы увидеть результат на локальном компьютере, на котором запущен tomcat.

Имя: Фамилия:

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

Передача данных флажка в программу сервлета

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

Вот пример HTML-кода CheckBox.htm для формы с двумя флажками

<html>
   <body>
      <form action = "CheckBox" 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>

Результатом этого кода является следующая форма

математика физика Химия

Ниже приведена программа сервлета CheckBox.java для обработки ввода, заданного веб-браузером для кнопки-флажка.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class CheckBox extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading Checkbox Data";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>Maths Flag : </b>: "
                  + request.getParameter("maths") + "\n" +
                  "  <li><b>Physics Flag: </b>: "
                  + request.getParameter("physics") + "\n" +
                  "  <li><b>Chemistry Flag: </b>: "
                  + request.getParameter("chemistry") + "\n" +
               "</ul>\n" +
            "</body>"
         "</html>"
      );
   }

   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

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

Reading Checkbox Data

  • Maths Flag : : on
  • Physics Flag: : null
  • Chemistry Flag: : on

Чтение всех параметров формы

Ниже приведен общий пример, который использует метод getParameterNames () из HttpServletRequest для чтения всех доступных параметров формы. Этот метод возвращает перечисление, которое содержит имена параметров в неопределенном порядке

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

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class ReadParams extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading All Form Parameters";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n" +
         "<h1 align = \"center\">" + title + "</h1>\n" +
         "<table width = \"100%\" border = \"1\" align = \"center\">\n" +
         "<tr bgcolor = \"#949494\">\n" +
            "<th>Param Name</th>"
            "<th>Param Value(s)</th>\n"+
         "</tr>\n"
      );

      Enumeration paramNames = request.getParameterNames();

      while(paramNames.hasMoreElements()) {
         String paramName = (String)paramNames.nextElement();
         out.print("<tr><td>" + paramName + "</td>\n<td>");
         String[] paramValues = request.getParameterValues(paramName);

         // Read single valued data
         if (paramValues.length == 1) {
            String paramValue = paramValues[0];
            if (paramValue.length() == 0)
               out.println("<i>No Value</i>");
               else
               out.println(paramValue);
         } else {
            // Read multiple valued data
            out.println("<ul>");

            for(int i = 0; i < paramValues.length; i++) {
               out.println("<li>" + paramValues[i]);
            }
            out.println("</ul>");
         }
      }
      out.println("</tr>\n</table>\n</body></html>");
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

Теперь попробуйте приведенный выше сервлет в следующей форме:

<html>
   <body>
      <form action = "ReadParams" 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>

Теперь вызов сервлета с использованием вышеуказанной формы приведет к следующему результату:

Reading All Form Parameters

Param Name Param Value(s)
maths on
chemistry on

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

Сервлеты — Клиентский HTTP-запрос

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

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

Sr.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 включается в заголовок Referrer, когда браузер запрашивает веб-страницу 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 включается в заголовок Referrer, когда браузер запрашивает веб-страницу 2.

User-Agent

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

Методы чтения заголовка HTTP

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

Sr.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-запросом.

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

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class DisplayHeader extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "HTTP Header Request Example";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n"+
         "<body bgcolor = \"#f0f0f0\">\n" +
         "<h1 align = \"center\">" + title + "</h1>\n" +
         "<table width = \"100%\" border = \"1\" align = \"center\">\n" +
         "<tr bgcolor = \"#949494\">\n" +
         "<th>Header Name</th><th>Header Value(s)</th>\n"+
         "</tr>\n"
      );
 
      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");
      }
      out.println("</table>\n</body></html>");
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      doGet(request, response);
   }
}

Теперь вызов вышеупомянутого сервлета приведет к следующему результату —

HTTP Header Request Example

Header Name Header Value(s)
accept */*
accept-language en-us
user-agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8)
accept-encoding gzip, deflate
host localhost:8080
connection Keep-Alive
cache-control no-cache

Сервлеты — HTTP-ответ сервера

Как обсуждалось в предыдущей главе, когда веб-сервер отвечает на запрос 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, которые возвращаются в браузер со стороны веб-сервера, и вы бы очень часто использовали их в веб-программировании.

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

Разрешать

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

2

Cache-Control

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

3

соединение

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

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 означает, что документ предназначен для одного пользователя и может храниться только в приватных (не общих) кэшах, а nocache означает, что документ никогда не должен кэшироваться.

соединение

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

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, связанный со страницей.

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

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

Sr.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-заголовка

Вы уже видели, как метод setContentType () работал в предыдущих примерах, и в следующем примере также будет использоваться тот же метод, дополнительно мы будем использовать метод setIntHeader () для установки заголовка Refresh .

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class Refresh extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
   
      // Set refresh, autoload time as 5 seconds
      response.setIntHeader("Refresh", 5);
 
      // Set response content type
      response.setContentType("text/html");
 
      // 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;
    
      PrintWriter out = response.getWriter();
      String title = "Auto Refresh Header Setting";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n"+
         "<body bgcolor = \"#f0f0f0\">\n" +
         "<h1 align = \"center\">" + title + "</h1>\n" +
         "<p>Current Time is: " + CT + "</p>\n"
      );
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

Теперь вызов вышеуказанного сервлета будет отображать текущее системное время через каждые 5 секунд следующим образом. Просто запустите сервлет и подождите, чтобы увидеть результат —

Auto Refresh Header Setting

Current Time is: 9:44:50 PM

Current Time is: 9:44:50 PM

Сервлеты — Http коды состояния

Формат сообщений 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 protocol».

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

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

Sr.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 в клиентский браузер, и браузер покажет вам «Требуется аутентификация !!!» сообщение.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class showError extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set error code and reason.
      response.sendError(407, "Need authentication!!!" );
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

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

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!!!).

Сервлеты — Письменные фильтры

Фильтры сервлетов — это классы Java, которые можно использовать в программировании сервлетов для следующих целей:

  • Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.

  • Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.

Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.

Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.

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

  • Фильтры аутентификации.
  • Фильтры сжатия данных.
  • Фильтры шифрования.
  • Фильтры, запускающие события доступа к ресурсам.
  • Фильтры преобразования изображений.
  • Фильтры журналирования и аудита.
  • Цепные фильтры MIME-TYPE.
  • Фильтры токенизации.
  • Фильтры XSL / T, которые преобразуют содержимое XML.

Фильтры развертываются в файле дескриптора развертывания web.xml и затем сопоставляются с именами сервлетов или шаблонами URL в дескрипторе развертывания вашего приложения.

Когда веб-контейнер запускает ваше веб-приложение, он создает экземпляр каждого фильтра, который вы объявили в дескрипторе развертывания. Фильтры выполняются в том порядке, в котором они объявлены в дескрипторе развертывания.

Методы фильтрации сервлетов

Фильтр — это просто класс Java, который реализует интерфейс javax.servlet.Filter. Интерфейс javax.servlet.Filter определяет три метода:

Sr.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 ()

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

Фильтр сервлетов — пример

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

// 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 обычным способом и поместите ваш файл классов в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes

Отображение фильтра сервлетов в Web.xml

Фильтры определяются и затем сопоставляются с URL-адресом или сервлетом, почти так же, как определяется сервлет, а затем сопоставляется с шаблоном URL-адреса. Создайте следующую запись для тега фильтра в файле дескриптора развертывания 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>

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

Теперь попробуйте вызвать любой сервлет обычным способом, и вы увидите сгенерированный журнал в журнале вашего веб-сервера. Вы можете использовать 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 определяет порядок, в котором веб-контейнер применяет фильтр к сервлету. Чтобы изменить порядок фильтра, нужно просто изменить элементы сопоставления фильтра в файле web.xml.

Например, в приведенном выше примере сначала будет применен LogFilter, а затем будет применен AuthenFilter к любому сервлету, но в следующем примере будет изменен порядок:

<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>

Сервлеты — обработка исключений

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

Вам придется использовать элемент error-page в web.xml, чтобы указать вызов сервлетов в ответ на определенные исключения или коды состояния HTTP.

Конфигурация web.xml

Учтите, у вас есть сервлет ErrorHandler, который будет вызываться всякий раз, когда есть какое-либо определенное исключение или ошибка. Ниже будет запись, созданная в web.xml.

<!-- servlet definition -->
<servlet>
   <servlet-name>ErrorHandler</servlet-name>
   <servlet-class>ErrorHandler</servlet-class>
</servlet>

<!-- servlet mappings -->
<servlet-mapping>
   <servlet-name>ErrorHandler</servlet-name>
   <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<!-- error-code related error pages -->
<error-page>
   <error-code>404</error-code>
   <location>/ErrorHandler</location>
</error-page>

<error-page>
   <error-code>403</error-code>
   <location>/ErrorHandler</location>
</error-page>

<!-- exception-type related error pages -->
<error-page>
   <exception-type>
      javax.servlet.ServletException
   </exception-type >
   <location>/ErrorHandler</location>
</error-page>

<error-page>
   <exception-type>java.io.IOException</exception-type >
   <location>/ErrorHandler</location>
</error-page>

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

<error-page>
   <exception-type>java.lang.Throwable</exception-type >
   <location>/ErrorHandler</location>
</error-page>

Ниже приведены замечания, которые необходимо отметить в отношении вышеупомянутого web.xml для обработки исключений.

  • Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.

  • Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.

  • Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.

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

Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.

Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.

Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.

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

Атрибуты запроса — ошибки / исключения

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

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

javax.servlet.error.status_code

Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer.

2

javax.servlet.error.exception_type

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

3

javax.servlet.error.message

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

4

javax.servlet.error.request_uri

Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

5

javax.servlet.error.exception

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

6

javax.servlet.error.servlet_name

Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

javax.servlet.error.status_code

Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer.

javax.servlet.error.exception_type

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

javax.servlet.error.message

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

javax.servlet.error.request_uri

Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

javax.servlet.error.exception

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

javax.servlet.error.servlet_name

Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

Пример сервлета обработчика ошибок

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

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

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class ErrorHandler extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
         
      // Analyze the servlet exception       
      Throwable throwable = (Throwable)
      request.getAttribute("javax.servlet.error.exception");
      Integer statusCode = (Integer)
      request.getAttribute("javax.servlet.error.status_code");
      String servletName = (String)
      request.getAttribute("javax.servlet.error.servlet_name");
         
      if (servletName == null) {
         servletName = "Unknown";
      }
      String requestUri = (String)
      request.getAttribute("javax.servlet.error.request_uri");
      
      if (requestUri == null) {
         requestUri = "Unknown";
      }

      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Error/Exception Information";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n");

      if (throwable == null && statusCode == null) {
         out.println("<h2>Error information is missing</h2>");
         out.println("Please return to the <a href=\"" + 
            response.encodeURL("http://localhost:8080/") + 
            "\">Home Page</a>.");
      } else if (statusCode != null) {
         out.println("The status code : " + statusCode);
      } else {
         out.println("<h2>Error information</h2>");
         out.println("Servlet Name : " + servletName + "</br></br>");
         out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>");
         out.println("The request URI: " + requestUri + "<br><br>");
         out.println("The exception message: " + throwable.getMessage( ));
      }
      out.println("</body>");
      out.println("</html>");
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

Скомпилируйте ErrorHandler.java обычным способом и поместите ваш файл класса в / WebApps / ROOT / WEB-INF / классы.

Давайте добавим следующую конфигурацию в web.xml для обработки исключений:

<servlet>
   <servlet-name>ErrorHandler</servlet-name>
   <servlet-class>ErrorHandler</servlet-class>
</servlet>

<!-- servlet mappings -->
<servlet-mapping>
   <servlet-name>ErrorHandler</servlet-name>
   <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<error-page>
   <error-code>404</error-code>
   <location>/ErrorHandler</location>
</error-page>

<error-page>
   <exception-type>java.lang.Throwable</exception-type >
   <location>/ErrorHandler</location>
</error-page>

Теперь попробуйте использовать сервлет, который вызывает любое исключение или вводит неправильный URL-адрес, это приведет к тому, что Web-контейнер вызовет сервлет ErrorHandler и отобразит соответствующее сообщение, как запрограммировано. Например, если вы введете неправильный URL-адрес, будет показан следующий результат:

The status code : 404

Приведенный выше код может не работать с некоторыми веб-браузерами. Так что попробуйте с Mozilla и Safari, и это должно работать.

Сервлеты — Обработка печенья

Куки-файлы — это текстовые файлы, которые хранятся на клиентском компьютере и хранятся в целях отслеживания различной информации. Сервлеты Java прозрачно поддерживают файлы cookie HTTP.

Есть три шага, вовлеченных в идентификацию возвращающихся пользователей —

  • Серверный скрипт отправляет набор файлов cookie в браузер. Например, имя, возраст или идентификационный номер и т. Д.

  • Браузер хранит эту информацию на локальном компьютере для дальнейшего использования.

  • Когда в следующий раз браузер отправляет какой-либо запрос на веб-сервер, он отправляет информацию о файлах cookie на сервер, и сервер использует эту информацию для идентификации пользователя.

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

Браузер хранит эту информацию на локальном компьютере для дальнейшего использования.

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

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

Анатомия Печенья

Файлы cookie обычно устанавливаются в заголовке HTTP (хотя JavaScript также может устанавливать файлы cookie непосредственно в браузере). Сервлет, который устанавливает 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

Сервлет получит доступ к cookie через метод request request.getCookies (), который возвращает массив объектов Cookie .

Servlet Cookies Методы

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

Sr.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 не имеет комментариев.

Настройка Cookies с сервлетом

Настройка куки с сервлетом включает три шага:

(1) Создание объекта Cookie — Вы вызываете конструктор Cookie с именем cookie и значением cookie, оба из которых являются строками.

Cookie cookie = new Cookie("key","value");

Имейте в виду, что ни имя, ни значение не должны содержать пробелов или любого из следующих символов:

[ ] ( ) = , " / ? @ : ;

(2) Установка максимального возраста — вы используете setMaxAge, чтобы указать, как долго (в секундах) должен быть действителен cookie. Следующее настроило бы печенье на 24 часа.

cookie.setMaxAge(60 * 60 * 24); 

(3) Отправка Cookie в заголовки ответа HTTP — Вы используете response.addCookie для добавления файлов cookie в заголовок ответа HTTP следующим образом:

response.addCookie(cookie);

пример

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

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class HelloForm extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // 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 );

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Setting Cookies Example";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head>
               <title>" + title + "</title>
            </head>\n" +
            
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<ul>\n" +
                  "  <li><b>First Name</b>: "
                  + request.getParameter("first_name") + "\n" +
                  "  <li><b>Last Name</b>: "
                  + request.getParameter("last_name") + "\n" +
               "</ul>\n" +
            "</body>
         </html>"
      );
   }
}

Скомпилируйте приведенный выше сервлет HelloForm и создайте соответствующую запись в файле web.xml и, наконец, попробуйте перейти на страницу HTML для вызова сервлета.

 
<html>
   <body>
      <form action = "HelloForm" 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-installationdirectory> / webapps / ROOT. Когда вы обращаетесь к http: // localhost: 8080 / Hello.htm , вот фактический результат вышеприведенной формы.

Имя:
Фамилия:

Попробуйте ввести имя и фамилию, а затем нажмите кнопку «Отправить». Это будет отображать имя и фамилию на вашем экране, и в то же время будут установлены два куки firstName и lastName, которые будут переданы обратно на сервер, когда вы в следующий раз нажмете кнопку «Отправить».

В следующем разделе объясняется, как вы получите доступ к этим файлам cookie в своем веб-приложении.

Чтение куки с сервлетом

Для чтения файлов cookie необходимо создать массив объектов javax.servlet.http.Cookie , вызвав метод getCookies () объекта HttpServletRequest . Затем прокрутите массив и используйте методы getName () и getValue () для доступа к каждому файлу cookie и связанному значению.

пример

Давайте прочитаем куки, которые мы установили в предыдущем примере —

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class ReadCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;

      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n" );

      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>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Скомпилируйте приведенный выше сервлет ReadCookies и создайте соответствующую запись в файле web.xml. Если бы вы установили для cookie «first_name» значение «John», а для cookie «last_name» — «Player», то при запуске http: // localhost: 8080 / ReadCookies будет отображаться следующий результат:

Found Cookies Name and Value

Name : first_name, Value: John
Name : last_name, Value: Player

Удалить куки с сервлетом

Удалить куки очень просто. Если вы хотите удалить куки, вам просто нужно выполнить следующие три шага —

  • Прочитайте уже существующий файл cookie и сохраните его в объекте Cookie.

  • Задайте возраст файла cookie равным нулю, используя метод setMaxAge (), чтобы удалить существующий файл cookie.

  • Добавьте этот cookie обратно в заголовок ответа.

Прочитайте уже существующий файл cookie и сохраните его в объекте Cookie.

Задайте возраст файла cookie равным нулю, используя метод setMaxAge (), чтобы удалить существующий файл cookie.

Добавьте этот cookie обратно в заголовок ответа.

пример

В следующем примере удаляется существующий файл cookie с именем «first_name», и при следующем запуске сервлета ReadCookies в следующий раз он возвращает нулевое значение для first_name.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class DeleteCookies extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      Cookie cookie = null;
      Cookie[] cookies = null;
         
      // Get an array of Cookies associated with this domain
      cookies = request.getCookies();

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
         
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n" );
         
      if( cookies != null ) {
         out.println("<h2> 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>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

Скомпилируйте вышеуказанный сервлет DeleteCookies и создайте соответствующую запись в файле web.xml. Теперь при запуске http: // localhost: 8080 / DeleteCookies будет отображаться следующий результат —

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 / ReadCookies, и он отобразит только один файл cookie следующим образом:

Found Cookies Name and Value

Name : last_name, Value: Player

Вы можете удалить свои куки в Internet Explorer вручную. Начните с меню Сервис и выберите Свойства обозревателя. Чтобы удалить все куки, нажмите Удалить куки.

Сервлеты — Отслеживание сеансов

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

Тем не менее, существуют следующие три способа поддерживать сеанс между веб-клиентом и веб-сервером:

Печенье

Веб-сервер может назначить уникальный идентификатор сеанса в виде файла 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 — лучший способ поддерживать сеансы, и он работает, даже если браузеры не поддерживают файлы cookie. Недостаток перезаписи URL заключается в том, что вам придется динамически генерировать каждый URL для назначения идентификатора сеанса, даже в случае простой статической HTML-страницы.

Объект HttpSession

Помимо вышеупомянутых трех способов, сервлет предоставляет интерфейс HttpSession, который позволяет идентифицировать пользователя по нескольким запросам страниц или посещению веб-сайта и хранить информацию об этом пользователе.

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

Вы получите объект HttpSession, вызвав открытый метод getSession () объекта HttpServletRequest, как показано ниже:

HttpSession session = request.getSession();

Вам необходимо вызвать request.getSession (), прежде чем отправлять какое-либо содержимое документа клиенту. Вот краткое изложение важных методов, доступных через объект HttpSession —

Sr.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 для определения времени создания и времени последнего обращения к сеансу. Мы связали бы новый сеанс с запросом, если он еще не существует.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
         
      // Create a session object if it is already not  created.
      HttpSession session = request.getSession(true);
         
      // Get session creation time.
      Date createTime = new Date(session.getCreationTime());
         
      // Get last access time of this web page.
      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 web page.
      if (session.isNew()) {
         title = "Welcome to my website";
         session.setAttribute(userIDKey, userID);
      } else {
         visitCount = (Integer)session.getAttribute(visitCountKey);
         visitCount = visitCount + 1;
         userID = (String)session.getAttribute(userIDKey);
      }
      session.setAttribute(visitCountKey,  visitCount);

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";

      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">Session Infomation</h2>\n" +
               "<table border = \"1\" align = \"center\">\n" +
                  
                  "<tr bgcolor = \"#949494\">\n" +
                     "  <th>Session info</th><th>value</th>
                  </tr>\n" +
                     
                  "<tr>\n" +
                     "  <td>id</td>\n" +
                     "  <td>" + session.getId() + "</td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Creation Time</td>\n" +
                     "  <td>" + createTime + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Time of Last Access</td>\n" +
                     "  <td>" + lastAccessTime + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>User ID</td>\n" +
                     "  <td>" + userID + "  </td>
                  </tr>\n" +
                  
                  "<tr>\n" +
                     "  <td>Number of visits</td>\n" +
                     "  <td>" + visitCount + "</td>
                  </tr>\n" +
               "</table>\n" +
            "</body>
         </html>"
      );
   }
}

Скомпилируйте вышеприведенный сервлет SessionTrack и создайте соответствующую запись в файле web.xml. Теперь при запуске http: // localhost: 8080 / SessionTrack будет отображать следующий результат при первом запуске —

Welcome to my website

Session Infomation

Session info value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 0

Теперь попробуйте запустить тот же сервлет во второй раз, он будет отображать следующий результат.

Welcome Back to my website

Session Infomation

info type value
id 0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access Tue Jun 08 17:26:40 GMT+04:00 2010
User ID ABCD
Number of visits 1

Удаление данных сеанса

Когда вы закончите с данными сеанса пользователя, у вас есть несколько вариантов —

  • Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с определенным ключом.

  • Удалить весь сеанс. Вы можете вызвать public void invalidate () для удаления всего сеанса.

  • Установка времени ожидания сеанса. Вы можете вызвать открытый метод void setMaxInactiveInterval (int interval), чтобы установить время ожидания для сеанса индивидуально.

  • Выйти из системы — на серверах, которые поддерживают сервлеты 2.4, вы можете вызвать logout для выхода клиента из Web-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.

  • Конфигурация web.xml. Если вы используете Tomcat, помимо вышеупомянутых методов, вы можете настроить время ожидания сеанса в файле web.xml следующим образом.

Удалить определенный атрибут. Вы можете вызвать открытый метод void removeAttribute (String name), чтобы удалить значение, связанное с определенным ключом.

Удалить весь сеанс. Вы можете вызвать public 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.

Сервлеты — Доступ к базе данных

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

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

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

Создать таблицу

Чтобы создать таблицу « Сотрудники» в базе данных TEST, выполните следующие действия:

Шаг 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>

Доступ к базе данных

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

// Loading required libraries
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
 
public class DatabaseAccess extends HttpServlet{

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
   
      // JDBC driver name and database URL
      static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
      static final String DB_URL="jdbc:mysql://localhost/TEST";

      //  Database credentials
      static final String USER = "root";
      static final String PASS = "password";

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      String title = "Database Result";
      
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor = \"#f0f0f0\">\n" +
         "<h1 align = \"center\">" + title + "</h1>\n");
      try {
         // Register JDBC driver
         Class.forName("com.mysql.jdbc.Driver");

         // Open a connection
         Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

         // Execute SQL query
         Statement stmt = conn.createStatement();
         String sql;
         sql = "SELECT id, first, last, age FROM Employees";
         ResultSet rs = stmt.executeQuery(sql);

         // Extract data from result set
         while(rs.next()){
            //Retrieve by column name
            int id  = rs.getInt("id");
            int age = rs.getInt("age");
            String first = rs.getString("first");
            String last = rs.getString("last");

            //Display values
            out.println("ID: " + id + "<br>");
            out.println(", Age: " + age + "<br>");
            out.println(", First: " + first + "<br>");
            out.println(", Last: " + last + "<br>");
         }
         out.println("</body></html>");

         // Clean-up environment
         rs.close();
         stmt.close();
         conn.close();
      } catch(SQLException se) {
         //Handle errors for JDBC
         se.printStackTrace();
      } catch(Exception e) {
         //Handle errors for Class.forName
         e.printStackTrace();
      } finally {
         //finally block used to close resources
         try {
            if(stmt!=null)
               stmt.close();
         } catch(SQLException se2) {
         } // nothing we can do
         try {
            if(conn!=null)
            conn.close();
         } catch(SQLException se) {
            se.printStackTrace();
         } //end finally try
      } //end try
   }
} 

Теперь давайте скомпилируем вышеприведенный сервлет и создадим следующие записи в web.xml

....
<servlet>
   <servlet-name>DatabaseAccess</servlet-name>
   <servlet-class>DatabaseAccess</servlet-class>
</servlet>
 
<servlet-mapping>
   <servlet-name>DatabaseAccess</servlet-name>
   <url-pattern>/DatabaseAccess</url-pattern>
</servlet-mapping>
....

Теперь вызовите этот сервлет, используя URL http: // localhost: 8080 / DatabaseAccess, который будет отображать следующий ответ —

Database Result

ID: 100, Age: 18, First: Zara, Last: Ali ID: 101, Age: 25, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal

Сервлеты — Загрузка файлов

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

Создание формы загрузки файла

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

  • Атрибут метода формы должен быть установлен в метод POST, и метод GET не может использоваться

  • Атрибут формы enctype должен быть установлен в multipart / form-data .

  • Атрибут действия формы должен быть установлен в файл сервлета, который будет обрабатывать загрузку файлов на бэкэнд-сервер. Следующий пример использует сервлет UploadServlet для загрузки файла.

  • Для загрузки одного файла вы должны использовать один тег <input … /> с атрибутом type = «file». Чтобы разрешить загрузку нескольких файлов, включите более одного входного тега с разными значениями для атрибута имени. Браузер связывает кнопку «Обзор» с каждым из них.

Атрибут метода формы должен быть установлен в метод POST, и метод GET не может использоваться

Атрибут формы enctype должен быть установлен в multipart / form-data .

Атрибут действия формы должен быть установлен в файл сервлета, который будет обрабатывать загрузку файлов на бэкэнд-сервер. Следующий пример использует сервлет UploadServlet для загрузки файла.

Для загрузки одного файла вы должны использовать один тег <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: 


NOTE: This is just dummy form and would not work.

Написание серверного бэкенда

Ниже приведен сервлет UploadServlet, который позаботится о том, чтобы принять загруженный файл и сохранить его в каталоге <каталог-установки Tomcat> / webapps / data. Это имя каталога также может быть добавлено с использованием внешней конфигурации, такой как элемент 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>

Ниже приведен исходный код UploadServlet, который может обрабатывать загрузку нескольких файлов одновременно. Прежде чем продолжить, убедитесь, что:

  • Следующий пример зависит от FileUpload, поэтому убедитесь, что в вашем classpath установлена ​​последняя версия файла commons-fileupload.xxjar . Вы можете скачать его с https://commons.apache.org/fileupload/ .

  • FileUpload зависит от ввода-вывода Commons, поэтому убедитесь, что в вашем пути к классам установлена ​​последняя версия файла commons-io-xxjar . Вы можете скачать его с https://commons.apache.org/io/ .

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

  • Убедитесь, что вы заранее создали каталоги c: \ temp и c: \ apache-tomcat8.0.28 \ webapps \ data.

Следующий пример зависит от FileUpload, поэтому убедитесь, что в вашем classpath установлена ​​последняя версия файла commons-fileupload.xxjar . Вы можете скачать его с https://commons.apache.org/fileupload/ .

FileUpload зависит от ввода-вывода Commons, поэтому убедитесь, что в вашем пути к классам установлена ​​последняя версия файла commons-io-xxjar . Вы можете скачать его с https://commons.apache.org/io/ .

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

Убедитесь, что вы заранее создали каталоги c: \ temp и c: \ apache-tomcat8.0.28 \ webapps \ data.

// Import required java libraries
import java.io.*;
import java.util.*;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {
   
   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath = getServletContext().getInitParameter("file-upload"); 
   }
   
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, java.io.IOException {
   
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
   
      if( !isMultipart ) {
         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>");
         return;
      }
  
      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>Servlet 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();
               String contentType = fi.getContentType();
               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: " + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
         } catch(Exception ex) {
            System.out.println(ex);
         }
      }
      
      public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, java.io.IOException {

         throw new ServletException("GET method used with " +
            getClass( ).getName( )+": POST method required.");
      }
   }
}

Компилировать и запускать сервлет

Скомпилируйте вышеприведенный сервлет UploadServlet и создайте необходимую запись в файле web.xml следующим образом.

 
<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>

Теперь попробуйте загрузить файлы, используя HTML-форму, которую вы создали выше. Если вы попробуете http: // localhost: 8080 / UploadFile.htm, будет показан следующий результат, который поможет вам загрузить любой файл с вашего локального компьютера.

 
File Upload: 

Select a file to upload:


Select a file to upload:

Если ваш скрипт сервлета работает нормально, ваш файл должен быть загружен в каталог c: \ apache-tomcat8.0.28 \ webapps \ data \.

Сервлеты — дата обработки

Одним из наиболее важных преимуществ использования Servlet является то, что вы можете использовать большинство методов, доступных в ядре Java. Этот учебник проведет вас через предоставленный Java класс Date, который доступен в пакете java.util , этот класс инкапсулирует текущую дату и время.

Класс Date поддерживает два конструктора. Первый конструктор инициализирует объект с текущей датой и временем.

Date( )

Следующий конструктор принимает один аргумент, равный количеству миллисекунд, прошедших с полуночи 1 января 1970 г.

Date(long millisec)

Если у вас есть объект Date, вы можете вызвать любой из следующих методов поддержки, чтобы поиграть с датами:

Sr.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 в строку и возвращает результат.

Получение текущей даты и времени

Это очень легко получить текущую дату и время в сервлете Java. Вы можете использовать простой объект Date с методом toString () для печати текущей даты и времени следующим образом:

// Import required java libraries
import java.io.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class CurrentDate extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Display Current Date & Time";
      Date date = new Date();
      String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">" + date.toString() + "</h2>\n" +
            "</body>
         </html>"
      );
   }
}

Теперь давайте скомпилируем вышеприведенный сервлет и создадим соответствующие записи в web.xml, а затем вызовем этот сервлет, используя URL http: // localhost: 8080 / CurrentDate. Это даст следующий результат —

Display Current Date & Time

Mon Jun 21 21:46:49 GMT+04:00 2010

Попробуйте обновить URL http: // localhost: 8080 / CurrentDate, и вы найдете разницу в секундах при каждом обновлении.

Сравнение дат

Как я уже упоминал выше, вы можете использовать все доступные методы Java в вашем сервлете. Если вам нужно сравнить две даты, используйте следующие методы:

  • Вы можете использовать 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 позволяет начать с выбора любых пользовательских шаблонов для форматирования даты и времени.

Давайте изменим приведенный выше пример следующим образом —

// Import required java libraries
import java.io.*;
import java.text.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
 
// Extend HttpServlet class
public class CurrentDate extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
      String title = "Display Current Date & Time";
      Date dNow = new Date( );
      SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
      String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">" + ft.format(dNow) + "</h2>\n" +
            "</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 День в месяце 10
час Час в AM / PM (1 ~ 12) 12
ЧАС Час в день (0 ~ 23) 22
м Минута в час 30
s Секунда в минуту 55
S миллисекунды 234
Е День в неделю вторник
D День в году 360
F День недели в месяце 2 (вторая среда в июле)
вес Неделя в году 40
W Неделя в месяце 1
AM / PM маркер ВЕЧЕРА
К Час в день (1 ~ 24) 24
К Час в AM / PM (0 ~ 11) 10
Z Часовой пояс Восточное стандартное время
Побег для текста Разделитель
« Одинарные цитаты `

Полный список постоянно доступных методов для манипулирования датой вы можете найти в стандартной документации Java.

Сервлеты — перенаправление страниц

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

Самый простой способ перенаправить запрос на другую страницу — использовать метод sendRedirect () объекта ответа. Ниже приведена подпись этого метода —

public void HttpServletResponse.sendRedirect(String location) 
throws IOException 

Этот метод отправляет ответ в браузер вместе с кодом состояния и новым местоположением страницы. Вы также можете использовать методы setStatus () и setHeader () вместе, чтобы достичь того же самого —

.... 
String site = "http://www.newpage.com" ; 
response.setStatus(response.SC_MOVED_TEMPORARILY); 
response.setHeader("Location", site);  
.... 

пример

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

import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PageRedirect extends HttpServlet {
    
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      // Set response content type
      response.setContentType("text/html");

      // New location to be redirected
      String site = new String("http://www.photofuntoos.com");

      response.setStatus(response.SC_MOVED_TEMPORARILY);
      response.setHeader("Location", site);    
   }
} 

Теперь давайте скомпилируем вышеприведенный сервлет и создадим следующие записи в web.xml

....
<servlet>
   <servlet-name>PageRedirect</servlet-name>
   <servlet-class>PageRedirect</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>PageRedirect</servlet-name>
   <url-pattern>/PageRedirect</url-pattern>
</servlet-mapping>
....

Теперь вызовите этот сервлет, используя URL http: // localhost: 8080 / PageRedirect. Это перенаправит вас на URL http://www.photofuntoos.com.

Сервлеты — Счетчик хитов

Счетчик посещений для веб-страницы

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

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

  • Инициализируйте глобальную переменную в методе init ().

  • Увеличивайте глобальную переменную каждый раз, когда вызывается метод doGet () или doPost ().

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

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

  • Вы можете отобразить значение глобального счетчика, чтобы показать общее количество посещений на вашем веб-сайте. Этот шаг также необязателен.

Инициализируйте глобальную переменную в методе init ().

Увеличивайте глобальную переменную каждый раз, когда вызывается метод doGet () или doPost ().

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

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

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

Здесь я предполагаю, что веб-контейнер не будет перезапущен. Если он будет перезапущен или уничтожен сервлет, счетчик попаданий будет сброшен.

пример

В этом примере показано, как реализовать простой счетчик посещений страницы.

import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PageHitCounter extends HttpServlet {

   private int hitCount; 

   public void init() { 
      // Reset hit counter.
      hitCount = 0;
   } 

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      // Set response content type
      response.setContentType("text/html");

      // This method executes whenever the servlet is hit 
      // increment hitCount 
      hitCount++; 
      PrintWriter out = response.getWriter();
      String title = "Total Number of Hits";
      String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">" + hitCount + "</h2>\n" +
            "</body>
         </html>"
      );
   }
   
   public void destroy() { 
      // This is optional step but if you like you
      // can write hitCount value in your database.
   } 
} 

Теперь давайте скомпилируем вышеприведенный сервлет и создадим следующие записи в web.xml

<servlet>
   <servlet-name>PageHitCounter</servlet-name>
   <servlet-class>PageHitCounter</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>PageHitCounter</servlet-name>
   <url-pattern>/PageHitCounter</url-pattern>
</servlet-mapping>
....

Теперь вызовите этот сервлет, используя URL http: // localhost: 8080 / PageHitCounter. Это будет увеличивать счетчик на единицу каждый раз, когда обновляется эта страница, и будет отображаться следующий результат —

Total Number of Hits

6

Hit Counter for a Website:

Hit Counter for a Website:

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

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

  • Инициализируйте глобальную переменную в методе init () фильтра.

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

  • При необходимости вы можете использовать таблицу базы данных для хранения значения глобальной переменной в методе фильтра destroy (). Это значение можно прочитать внутри метода init (), когда фильтр будет инициализирован в следующий раз. Этот шаг не является обязательным.

Инициализируйте глобальную переменную в методе init () фильтра.

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

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

Здесь я предполагаю, что веб-контейнер не будет перезапущен. Если он будет перезапущен или уничтожен сервлет, счетчик попаданий будет сброшен.

пример

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

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class SiteHitCounter implements Filter {

   private int hitCount; 

   public void  init(FilterConfig config) throws ServletException {
      // Reset hit counter.
      hitCount = 0;
   }

   public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws java.io.IOException, ServletException {

      // increase counter by one
      hitCount++;

      // Print the counter.
      System.out.println("Site visits count :"+ hitCount );

      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }
   
   public void destroy() { 
      // This is optional step but if you like you
      // can write hitCount value in your database.
   } 
} 

Теперь давайте скомпилируем вышеприведенный сервлет и создадим следующие записи в web.xml

....
<filter>
   <filter-name>SiteHitCounter</filter-name>
   <filter-class>SiteHitCounter</filter-class>
</filter>

<filter-mapping>
   <filter-name>SiteHitCounter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
....

Теперь вызовите любой URL, например URL http: // localhost: 8080 /. Это будет увеличивать счетчик на единицу каждый раз, когда любая страница получает попадание, и будет отображать следующее сообщение в журнале —

Site visits count : 1
Site visits count : 2
Site visits count : 3
Site visits count : 4
Site visits count : 5
..................

Сервлеты — автоматическое обновление страницы

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

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

Самым простым способом обновления веб-страницы является использование метода setIntHeader () объекта ответа. Ниже приведена подпись этого метода —

public void setIntHeader(String header, int headerValue)

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

Пример автоматического обновления страницы

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

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Extend HttpServlet class
public class Refresh extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set refresh, autoload time as 5 seconds
      response.setIntHeader("Refresh", 5);
 
      // Set response content type
      response.setContentType("text/html");
 
      // 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;
    
      PrintWriter out = response.getWriter();
      String title = "Auto Page Refresh using Servlet";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n"+
         "<body bgcolor = \"#f0f0f0\">\n" +
         "<h1 align = \"center\">" + title + "</h1>\n" +
         "<p>Current Time is: " + CT + "</p>\n"
      );
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

Теперь давайте скомпилируем вышеприведенный сервлет и создадим следующие записи в web.xml

....
 <servlet>
     <servlet-name>Refresh</servlet-name>
     <servlet-class>Refresh</servlet-class>
 </servlet>
 
 <servlet-mapping>
     <servlet-name>Refresh</servlet-name>
     <url-pattern>/Refresh</url-pattern>
 </servlet-mapping>
....

Теперь вызовите этот сервлет, используя URL http: // localhost: 8080 / Refresh, который будет отображать текущее системное время через каждые 5 секунд, как показано ниже. Просто запустите сервлет и подождите, чтобы увидеть результат —

Auto Page Refresh using Servlet

Current Time is: 9:44:50 PM

Current Time is: 9:44:50 PM

Сервлеты — Отправка электронной почты

Чтобы отправить электронное письмо с помощью сервлета, достаточно просто, но для начала на вашем компьютере должны быть установлены JavaMail API и Java Activation Framework (JAF) .

  • Вы можете загрузить последнюю версию JavaMail (Версия 1.2) со стандартного веб-сайта Java.

  • Вы можете загрузить последнюю версию JAF (Версия 1.1.1) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JavaMail (Версия 1.2) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JAF (Версия 1.1.1) со стандартного веб-сайта Java.

Загрузите и разархивируйте эти файлы, во вновь созданных каталогах верхнего уровня вы найдете несколько jar-файлов для обоих приложений. Вам необходимо добавить файлы mail.jar и активации.jar в ваш CLASSPATH.

Отправить простое письмо

Вот пример отправки простого электронного письма с вашего компьютера. Здесь предполагается, что ваш локальный хост подключен к Интернету и достаточно способен отправить электронное письмо. В то же время убедитесь, что все файлы JAR из пакета Java Email API и пакета JAF доступны в CLASSPATH.

// File Name SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendEmail extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";
 
      // Sender's email ID needs to be mentioned
      String from = "[email protected]";
 
      // Assuming you are sending email from localhost
      String host = "localhost";
 
      // Get system properties
      Properties properties = System.getProperties();
 
      // Setup mail server
      properties.setProperty("mail.smtp.host", host);
 
      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);
      
      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);
         
         // 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);
         String title = "Send Email";
         String res = "Sent message successfully....";
         String docType =
            "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
         
         out.println(docType +
            "<html>\n" +
               "<head><title>" + title + "</title></head>\n" +
               "<body bgcolor = \"#f0f0f0\">\n" +
                  "<h1 align = \"center\">" + title + "</h1>\n" +
                  "<p align = \"center\">" + res + "</p>\n" +
               "</body>
            </html>"
         );
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
} 

Теперь давайте скомпилируем вышеприведенный сервлет и создадим следующие записи в web.xml

....
 <servlet>
   <servlet-name>SendEmail</servlet-name>
   <servlet-class>SendEmail</servlet-class>
</servlet>
 
<servlet-mapping>
   <servlet-name>SendEmail</servlet-name>
   <url-pattern>/SendEmail</url-pattern>
</servlet-mapping>
....

Теперь вызовите этот сервлет, используя URL http: // localhost: 8080 / SendEmail, который отправит электронное письмо на указанный адрес электронной почты [email protected] и отобразит следующий ответ:

Send Email

Sent message successfully....

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.

// File Name SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendEmail extends HttpServlet {
    
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";
 
      // Sender's email ID needs to be mentioned
      String from = "[email protected]";
 
      // Assuming you are sending email from localhost
      String host = "localhost";
 
      // Get system properties
      Properties properties = System.getProperties();
 
      // Setup mail server
      properties.setProperty("mail.smtp.host", host);
 
      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);
      
      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      try {
         
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);
         
         // 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);
         String title = "Send Email";
         String res = "Sent message successfully....";
         String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
         
         out.println(docType +
            "<html>\n" +
               "<head><title>" + title + "</title></head>\n" +
               "<body bgcolor = \"#f0f0f0\">\n" +
                  "<h1 align = \"center\">" + title + "</h1>\n" +
                  "<p align = \"center\">" + res + "</p>\n" +
               "</body>
            </html>"
         );
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
} 

Скомпилируйте и запустите приведенный выше сервлет, чтобы отправить HTML-сообщение с указанным идентификатором электронной почты.

Отправить вложение в электронном письме

Вот пример отправки электронного письма с приложением с вашего компьютера. Здесь предполагается, что ваш локальный хост подключен к Интернету и достаточно способен отправить электронное письмо.

// File Name SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
 
public class SendEmail extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";
 
      // Sender's email ID needs to be mentioned
      String from = "[email protected]";
 
      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();
 
      // Setup mail server
      properties.setProperty("mail.smtp.host", host);
 
      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);
      
	  // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);
 
         // 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 multipar 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";
         String res = "Sent message successfully....";
         String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
         
         out.println(docType +
            "<html>\n" +
               "<head><title>" + title + "</title></head>\n" +
               "<body bgcolor = \"#f0f0f0\">\n" +
                  "<h1 align = \"center\">" + title + "</h1>\n" +
                  "<p align = \"center\">" + res + "</p>\n" +
               "</body>
            </html>"
         );
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
} 

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

Часть аутентификации пользователя

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

 props.setProperty("mail.user", "myuser");
 props.setProperty("mail.password", "mypwd");

Остальная часть механизма отправки электронной почты останется такой, как описано выше.

Сервлеты — Упаковка

Структура веб-приложения, включающая подкаталог WEB-INF, является стандартной для всех веб-приложений Java и определяется спецификацией API сервлета. Дано имя каталога верхнего уровня myapp. Вот как выглядит эта структура каталогов:

/myapp
   /images
   /WEB-INF
      /classes
      /lib

Подкаталог WEB-INF содержит дескриптор развертывания приложения с именем web.xml. Все файлы HTML должны храниться в каталоге верхнего уровня, который является myapp . Для пользователя-администратора вы найдете каталог ROOT в качестве родительского каталога.

Создание сервлетов в пакетах

Каталог WEB-INF / classes содержит все классы сервлетов и другие файлы классов в структуре, которая соответствует имени их пакета. Например, если у вас есть полное имя класса com.myorg.MyServlet , этот класс сервлета должен находиться в следующем каталоге:

/myapp/WEB-INF/classes/com/myorg/MyServlet.class 

Ниже приведен пример создания класса MyServlet с именем пакета com.myorg.

// Name your package
package com.myorg;  

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class MyServlet extends HttpServlet {
 
   private String message;
 
   public void init() throws ServletException {
      // Do required initialization
      message = "Hello World";
   }
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");
 
      // Actual logic goes here.
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
   }

   public void destroy() {
      // do nothing.
   }
}

Компиляция сервлетов в пакетах

Нет ничего особенного в том, чтобы скомпилировать класс, доступный в пакете. Самый простой способ — сохранить ваш Java-файл по полному пути, как указано выше, класс будет храниться в com.myorg. Вам также необходимо добавить этот каталог в CLASSPATH.

Предполагая, что ваша среда настроена правильно, перейдите в каталог <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes и скомпилируйте MyServlet.java следующим образом

$ javac MyServlet.java

Если сервлет зависит от каких-либо других библиотек, вы должны также включить эти файлы JAR в свой CLASSPATH. Я включил только JAR-файл servlet-api.jar, потому что я не использую никакую другую библиотеку в программе Hello World.

В этой командной строке используется встроенный компилятор javac, поставляемый с Sun Microsystems Java Software Development Kit (JDK). Чтобы эта команда работала правильно, вы должны указать расположение Java SDK, которое вы используете, в переменной среды PATH.

Если все пойдет хорошо, приведенная выше компиляция выдаст файл MyServlet.class в том же каталоге. В следующем разделе объясняется, как скомпилированный сервлет будет развернут в производстве.

Развертывание упакованного сервлета

По умолчанию приложение сервлета находится в пути <Tomcat-instaldirectory> / webapps / ROOT, а файл класса будет находиться в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes.

Если у вас есть полное имя класса com.myorg.MyServlet , то этот класс сервлета должен находиться в WEB-INF / classes / com / myorg / MyServlet.class, и вам потребуется создать следующие записи в файле web.xml, расположенном по адресу в <каталог-установки Tomcat> / webapps / ROOT / WEB-INF /

<servlet>
   <servlet-name>MyServlet</servlet-name>
   <servlet-class>com.myorg.MyServlet</servlet-class>
</servlet>
 
<servlet-mapping>
   <servlet-name>MyServlet</servlet-name>
   <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

Над записями, которые будут созданы внутри тегов <web-app> … </ web-app>, доступных в файле web.xml. В этой таблице уже могут быть различные записи, но не берите в голову.

Вы почти закончили, теперь давайте запустим сервер Tomcat, используя <Tomcat-installationdirectory> \ bin \ startup.bat (в Windows) или <Tomcat-InstallationDirectory> /bin/startup.sh (в Linux / Solaris и т. Д.) И, наконец, наберите http: // localhost: 8080 / MyServlet в адресной строке браузера. Если все будет хорошо, вы получите следующий результат —

Hello World

Сервлеты — Отладка

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

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

System.out.println ()

System.out.println () легко использовать в качестве маркера для проверки, выполняется ли определенный фрагмент кода или нет. Мы можем также распечатать значения переменных. Дополнительно —

  • Поскольку объект System является частью основных объектов Java, его можно использовать везде без необходимости устанавливать какие-либо дополнительные классы. Это включает в себя сервлеты, JSP, RMI, EJB, обычные компоненты и классы и автономные приложения.

  • Остановка в технике точек останова останавливает нормальное выполнение и, следовательно, занимает больше времени. Принимая во внимание, что запись в System.out не сильно мешает нормальному потоку выполнения приложения, что делает его очень ценным, когда время имеет решающее значение.

Поскольку объект System является частью основных объектов Java, его можно использовать везде без необходимости устанавливать какие-либо дополнительные классы. Это включает в себя сервлеты, JSP, RMI, EJB, обычные компоненты и классы и автономные приложения.

Остановка в технике точек останова останавливает нормальное выполнение и, следовательно, занимает больше времени. Принимая во внимание, что запись в System.out не сильно мешает нормальному потоку выполнения приложения, что делает его очень ценным, когда время имеет решающее значение.

Ниже приведен синтаксис для использования System.out.println () —

System.out.println("Debugging message");

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

Регистрация сообщений

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

Servlet API также предоставляет простой способ вывода информации с помощью метода log () следующим образом:

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ContextLog extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, java.io.IOException {
    
      String par = request.getParameter("par1");
      
      //Call the two ServletContext.log methods
      ServletContext context = getServletContext( );

      if (par == null || par.equals(""))
         //log version with Throwable parameter
         context.log("No message received:", new IllegalStateException("Missing parameter"));
      else
         context.log("Here is the visitor's message: " + par);
      
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      String title = "Context Log";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + title + "</h1>\n" +
               "<h2 align = \"center\">Messages sent</h2>\n" +
            "</body>
         </html>"
      );
   } //doGet
}

ServletContext записывает свои текстовые сообщения в файл журнала контейнера сервлета. С Tomcat эти журналы находятся в <Tomcat-Installation-Directory> / logs.

Файлы журнала дают представление о появлении новых ошибок или частоте возникновения проблем. По этой причине хорошо использовать функцию log () в предложении catch исключений, которые обычно не должны возникать.

Использование JDB Debugger

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

Чтобы отладить сервлет, мы отлаживаем sun.servlet.http.HttpServer и внимательно наблюдаем, как HttpServer выполняет сервлеты в ответ на HTTP-запросы, сделанные из браузера. Это очень похоже на отладку апплетов. Разница в том, что с апплетами отлаживаемой программой является sun.applet.AppletViewer.

Большинство отладчиков скрывают эту деталь, автоматически зная, как отлаживать апплеты. Пока они не сделают то же самое для сервлетов, вы должны помочь отладчику, выполнив следующее:

  • Задайте путь к классу вашего отладчика, чтобы он мог найти sun.servlet.http.Http-Server и связанные с ним классы.

  • Задайте путь к классу вашего отладчика, чтобы он также мог находить ваши сервлеты и вспомогательные классы, обычно это server_root / servlets и server_root / classes.

Задайте путь к классу вашего отладчика, чтобы он мог найти sun.servlet.http.Http-Server и связанные с ним классы.

Задайте путь к классу вашего отладчика, чтобы он также мог находить ваши сервлеты и вспомогательные классы, обычно это server_root / servlets и server_root / classes.

Обычно вы не хотите, чтобы server_root / servlets находились в вашем classpath, потому что это отключает перезагрузку сервлета. Это включение, однако, полезно для отладки. Это позволяет вашему отладчику устанавливать точки останова в сервлете до того, как пользовательский загрузчик сервлета в HttpServer загрузит сервлет.

После того как вы установили правильный путь к классу, начните отладку sun.servlet.http.HttpServer. Вы можете установить точки останова в любом сервлете, который вас интересует в отладке, а затем использовать веб-браузер, чтобы запросить HttpServer для данного сервлета (http: // localhost: 8080 / servlet / ServletToDebug). Вы должны увидеть, что выполнение остановлено на ваших точках останова.

Использование комментариев

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

Сервлет использует комментарии Java, а однострочные (// …) и многострочные (/ * … * /) комментарии могут использоваться для временного удаления частей вашего Java-кода. Если ошибка исчезнет, ​​внимательно посмотрите на код, который вы только что прокомментировали, и выясните проблему.

Заголовки клиента и сервера

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

Важные советы по отладке

Вот список некоторых советов по отладке сервлетов:

  • Помните, что server_root / classes не перезагружается, и что server_root / servlets, вероятно, делает.

  • Попросите браузер показать необработанное содержимое отображаемой страницы. Это может помочь выявить проблемы с форматированием. Обычно это опция в меню «Вид».

  • Убедитесь, что браузер не кэширует вывод предыдущего запроса, принудительно перезагрузив страницу. В Netscape Navigator используйте Shift-Reload; с помощью Internet Explorer используйте Shift-Refresh.

  • Убедитесь, что метод init () вашего сервлета принимает параметр ServletConfig и сразу вызывает super.init (config).

Помните, что server_root / classes не перезагружается, и что server_root / servlets, вероятно, делает.

Попросите браузер показать необработанное содержимое отображаемой страницы. Это может помочь выявить проблемы с форматированием. Обычно это опция в меню «Вид».

Убедитесь, что браузер не кэширует вывод предыдущего запроса, принудительно перезагрузив страницу. В Netscape Navigator используйте Shift-Reload; с помощью Internet Explorer используйте Shift-Refresh.

Убедитесь, что метод init () вашего сервлета принимает параметр ServletConfig и сразу вызывает super.init (config).

Сервлеты — Интернационализация

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

  • Интернационализация (i18n) — это означает, что веб-сайт может предоставлять различные версии контента, переведенные на язык или национальность посетителя.

  • Локализация (l10n) — это означает добавление ресурсов на веб-сайт для адаптации к конкретному географическому или культурному региону.

  • локаль — это особый культурный или географический регион. Обычно его называют символом языка, за которым следует символ страны, который отделен подчеркиванием. Например, «en_US» представляет английский язык для США.

Интернационализация (i18n) — это означает, что веб-сайт может предоставлять различные версии контента, переведенные на язык или национальность посетителя.

Локализация (l10n) — это означает добавление ресурсов на веб-сайт для адаптации к конкретному географическому или культурному региону.

локаль — это особый культурный или географический регион. Обычно его называют символом языка, за которым следует символ страны, который отделен подчеркиванием. Например, «en_US» представляет английский язык для США.

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

Сервлет может подобрать соответствующую версию сайта в зависимости от локали запрашивающей стороны и предоставить соответствующую версию сайта в соответствии с местным языком, культурой и требованиями. Ниже приведен метод объекта запроса, который возвращает объект Locale.

java.util.Locale request.getLocale() 

Обнаружение локали

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

Sr.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 ()

Этот метод возвращает трехбуквенное сокращение для языка этой локали.

пример

Этот пример показывает, как вы отображаете язык и связанную страну для запроса —

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;

public class GetLocale extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
   
      //Get the client's Locale
      Locale locale = request.getLocale();
      String language = locale.getLanguage();
      String country = locale.getCountry();

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String title = "Detecting Locale";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + language + "</h1>\n" +
               "<h2 align = \"center\">" + country + "</h2>\n" +
         "</body>
         </html>"
      );
   }
} 

Настройка языков

Сервлет может выводить страницу, написанную на западноевропейском языке, таком как английский, испанский, немецкий, французский, итальянский, голландский и т. Д. Здесь важно установить заголовок ContentLanguage для правильного отображения всех символов.

Второй момент — отобразить все специальные символы с использованием сущностей HTML, например, «& # 241;» представляет «ñ» и «& # 161;» представляет «¡» следующим образом:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;

public class DisplaySpanish extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      // Set spanish language code.
      response.setHeader("Content-Language", "es");

      String title = "En Espa&ntilde;ol";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1>" + "En Espa&ntilde;ol:" + "</h1>\n" +
               "<h1>" + "&iexcl;Hola Mundo!" + "</h1>\n" +
            "</body>
         </html>"
      );
   }
} 

Локальные даты

Вы можете использовать класс java.text.DateFormat и его статический метод getDateTimeInstance () для форматирования даты и времени, специфичных для локали. Ниже приведен пример, который показывает, как форматировать даты, специфичные для данной локали.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.DateFormat;
import java.util.Date;

public class DateLocale extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      
      //Get the client's Locale
      Locale locale = request.getLocale( );
      String date = DateFormat.getDateTimeInstance(DateFormat.FULL, 
         DateFormat.SHORT, locale).format(new Date( ));

      String title = "Locale Specific Dates";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
     
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + date + "</h1>\n" +
            "</body>
         </html>"
      );
   }
} 

Локальная валюта

Вы можете использовать класс java.txt.NumberFormat и его статический метод getCurrencyInstance () для форматирования числа, например типа long или double, в валюте, определенной для локали. Ниже приведен пример, который показывает, как форматировать валюту, специфичную для данной локали.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;

public class CurrencyLocale extends HttpServlet {
    
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      //Get the client's Locale
      Locale locale = request.getLocale( );
      NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
      String formattedCurr = nft.format(1000000);

      String title = "Locale Specific Currency";
      String docType =
         "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + formattedCurr + "</h1>\n" +
            "</body>
         </html>"
      );
   }
} 

Процент локали

Вы можете использовать класс java.txt.NumberFormat и его статический метод getPercentInstance (), чтобы получить определенный процент локали. Ниже приведен пример, который показывает, как отформатировать проценты, специфичные для данной локали.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;

public class PercentageLocale extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      
      //Get the client's Locale
      Locale locale = request.getLocale( );
      NumberFormat nft = NumberFormat.getPercentInstance(locale);
      String formattedPerc = nft.format(0.51);

      String title = "Locale Specific Percentage";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
      
      out.println(docType +
         "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor = \"#f0f0f0\">\n" +
               "<h1 align = \"center\">" + formattedPerc + "</h1>\n" +
            "</body>
         </html>"
      );
   }
} 

Сервлеты — Аннотации

Итак, вы узнали, как сервлет использует дескриптор развертывания (файл web.xml) для развертывания приложения на веб-сервере. Servlet API 3.0 представил новый пакет под названием javax.servlet.annotation. Он предоставляет типы аннотаций, которые можно использовать для аннотирования класса сервлета. Если вы используете аннотацию, то дескриптор развертывания (web.xml) не требуется. Но вы должны использовать tomcat7 или любую более позднюю версию tomcat.

Аннотации могут заменить эквивалентную конфигурацию XML в файле дескриптора веб-развертывания (web.xml), такую ​​как объявление сервлета и отображение сервлета. Контейнеры сервлетов будут обрабатывать аннотированные классы во время развертывания.

Типы аннотаций, представленные в Servlet 3.0:

Sr.No. Аннотация и описание
1

@WebServlet

Объявить сервлет.

2

@WebInitParam

Чтобы указать параметр инициализации.

3

@WebFilter

Чтобы объявить фильтр сервлета.

4

@WebListener

Чтобы объявить WebListener

5

@HandlesTypes

Чтобы объявить типы классов, которые может обрабатывать ServletContainerInitializer.

6

@HttpConstraint

Эта аннотация используется в аннотации ServletSecurity для представления ограничений безопасности, которые должны применяться ко всем методам протокола HTTP, для которых соответствующий элемент HttpMethodConstraint НЕ встречается в аннотации ServletSecurity.

7

@HttpMethodConstraint

Эта аннотация используется в аннотации ServletSecurity для представления ограничений безопасности для определенных сообщений протокола HTTP.

8

@MultipartConfig

Аннотация, которая может быть указана в классе сервлета, указывая, что экземпляры сервлета ожидают запросы, соответствующие типу MIME multipart / form-data.

9

@ServletSecurity

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

@WebServlet

Объявить сервлет.

@WebInitParam

Чтобы указать параметр инициализации.

@WebFilter

Чтобы объявить фильтр сервлета.

@WebListener

Чтобы объявить WebListener

@HandlesTypes

Чтобы объявить типы классов, которые может обрабатывать ServletContainerInitializer.

@HttpConstraint

Эта аннотация используется в аннотации ServletSecurity для представления ограничений безопасности, которые должны применяться ко всем методам протокола HTTP, для которых соответствующий элемент HttpMethodConstraint НЕ встречается в аннотации ServletSecurity.

@HttpMethodConstraint

Эта аннотация используется в аннотации ServletSecurity для представления ограничений безопасности для определенных сообщений протокола HTTP.

@MultipartConfig

Аннотация, которая может быть указана в классе сервлета, указывая, что экземпляры сервлета ожидают запросы, соответствующие типу MIME multipart / form-data.

@ServletSecurity

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

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

@WebServlet

@WebServlet используется для объявления конфигурации сервлета с контейнером. В следующей таблице приведен список атрибутов, используемых для аннотации WebServlet.

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

Имя строки

Имя сервлета

2

Строковое значение

Массив шаблонов URL

3

String [] urlPatterns

Массив шаблонов URL, к которым применяется этот фильтр

4

Int loadOnStartup

Целочисленное значение дает подсказку при запуске

5

WebInitParam [] initParams

Массив параметров инициализации для этого сервлета

6

Boolean asyncSupported

Асинхронная операция, поддерживаемая этим сервлетом

7

Строка smallIcon

Маленькая иконка для этого сервлета, если есть

8

Строка LargeIcon

Большой значок для этого сервлета, если есть

9

Описание строки

Описание этого сервлета, если есть

10

Строка displayName

Отображаемое имя этого сервлета, если есть

Имя строки

Имя сервлета

Строковое значение

Массив шаблонов URL

String [] urlPatterns

Массив шаблонов URL, к которым применяется этот фильтр

Int loadOnStartup

Целочисленное значение дает подсказку при запуске

WebInitParam [] initParams

Массив параметров инициализации для этого сервлета

Boolean asyncSupported

Асинхронная операция, поддерживаемая этим сервлетом

Строка smallIcon

Маленькая иконка для этого сервлета, если есть

Строка LargeIcon

Большой значок для этого сервлета, если есть

Описание строки

Описание этого сервлета, если есть

Строка displayName

Отображаемое имя этого сервлета, если есть

По крайней мере, один шаблон URL ДОЛЖЕН быть объявлен в атрибуте value или urlPattern аннотации, но не в обоих.

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

пример

В следующем примере описано, как использовать аннотацию @WebServlet. Это простой сервлет, который отображает текст Hello Servlet .

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
@WebServlet(value = "/Simple") 
public class Simple extends HttpServlet {

   private static final long serialVersionUID = 1L; 

   protected void doGet(HttpServletRequest request, HttpServletResponse response)  
      throws ServletException, IOException { 
   
      response.setContentType("text/html");   
      PrintWriter out = response.getWriter();   
      out.print("<html><body>");   
      out.print("<h3>Hello Servlet</h3>");   
      out.print("</body></html>");         
   }   
}

Скомпилируйте Simple.java обычным способом и поместите ваш файл классов в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes.

Теперь попробуйте вызвать любой сервлет, просто запустив http: // localhost: 8080 / Simple . Вы увидите следующий вывод на веб-странице.

Hello servlet

@WebInitParam

Аннотация @WebInitParam используется для указания параметра инициализации для сервлета или фильтра. Он используется в аннотациях WebFilter или WebSevlet. Следующая таблица содержит список атрибутов, используемых для аннотации WebInitParam.

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

Имя строки

Имя параметра инициализации

2

Строковое значение

Значение параметра инициализации

3

Описание строки

Описание параметра инициализации

Имя строки

Имя параметра инициализации

Строковое значение

Значение параметра инициализации

Описание строки

Описание параметра инициализации

пример

В следующем примере описано, как использовать аннотацию @WeInitParam вместе с аннотацией @WebServlet. Это простой сервлет, который отображает текст Hello Servlet и строковое значение Hello World! которые взяты из параметров инициализации .

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse;

@WebServlet(value = "/Simple", initParams = { 
   @WebInitParam(name = "foo", value = "Hello "), 
   @WebInitParam(name = "bar", value = " World!") 
}) 
public class Simple extends HttpServlet {

   private static final long serialVersionUID = 1L; 

   protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {   
      
      response.setContentType("text/html");   
      PrintWriter out = response.getWriter();   
      out.print("<html><body>");   
      out.print("<h3>Hello Servlet</h3>");   
      out.println(getInitParameter("foo")); 
      out.println(getInitParameter("bar")); 
      out.print("</body></html>");         
   }   
}

Скомпилируйте Simple.java обычным способом и поместите ваш файл классов в <Tomcat-installationdirectory>; / webapps / ROOT / WEB-INF / classes.

Теперь попробуйте вызвать любой сервлет, просто запустив http: // localhost: 8080 / Simple . Вы увидите следующий вывод на веб-странице.

Hello Servlet

Hello World! 

@Webfilter

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

Аннотация @WebFilter определяет фильтр в веб-приложении. Эта аннотация указана для класса и содержит метаданные об объявленном фильтре. Аннотированный фильтр должен указывать хотя бы один шаблон URL. В следующей таблице перечислены атрибуты, используемые для аннотации WebFilter.

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

Строка filterName

Наименование фильтра

2

String [] urlPatterns

Предоставляет массив значений или urlPatterns, к которым применяется фильтр

3

DispatcherType [] dispatcherTypes

Указывает типы диспетчера (Запрос / Ответ), к которым применяется фильтр

4

String [] servletNames

Предоставляет массив имен сервлетов

5

Строка displayName

Наименование фильтра

6

Описание строки

Описание фильтра

7

WebInitParam [] initParams

Массив параметров инициализации для этого фильтра

8

Boolean asyncSupported

Асинхронная операция, поддерживаемая этим фильтром

9

Строка smallIcon

Маленькая иконка для этого фильтра, если есть

10

Строка LargeIcon

Большой значок для этого фильтра, если присутствует

Строка filterName

Наименование фильтра

String [] urlPatterns

Предоставляет массив значений или urlPatterns, к которым применяется фильтр

DispatcherType [] dispatcherTypes

Указывает типы диспетчера (Запрос / Ответ), к которым применяется фильтр

String [] servletNames

Предоставляет массив имен сервлетов

Строка displayName

Наименование фильтра

Описание строки

Описание фильтра

WebInitParam [] initParams

Массив параметров инициализации для этого фильтра

Boolean asyncSupported

Асинхронная операция, поддерживаемая этим фильтром

Строка smallIcon

Маленькая иконка для этого фильтра, если есть

Строка LargeIcon

Большой значок для этого фильтра, если присутствует

пример

В следующем примере описано, как использовать аннотацию @WebFilter. Это простой LogFilter, который отображает значение Init-param test-param и текущее время на консоли. Это означает, что фильтр работает как интерфейсный уровень между запросом и ответом. Здесь мы используем «/ *» для urlPattern. Это означает, что этот фильтр применим ко всем сервлетам.

import java.io.IOException; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.annotation.WebInitParam; 
import javax.servlet.*; 
import java.util.*;  

// Implements Filter class

@WebFilter(urlPatterns = {"/*"}, initParams = { 
   @WebInitParam(name = "test-param", value = "Initialization Paramter")}) 
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 IOException, ServletException { 
	  
      // Log the current timestamp. 
      System.out.println("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*/ 
   } 
}

Скомпилируйте Simple.java обычным способом и поместите ваш файл классов в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes.

Теперь попробуйте вызвать любой сервлет, просто запустив http: // localhost: 8080 / Simple . Вы увидите следующий вывод на веб-странице.

Hello Servlet
  
Hello World!

Теперь откройте консоль сервлета. Там вы найдете значение параметра initpara testparam и текущую временную метку вместе с уведомлениями сервлета.