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

Что такое сервлеты?

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

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

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

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

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

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

  • Менеджер безопасности Java на сервере применяет набор ограничений для защиты ресурсов на сервере. Итак, сервлетам доверяют.

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

Архитектура сервлетов

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

Сервлеты Задачи

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

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

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

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

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

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

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

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

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

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

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

В 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 можно запустить, выполнив следующие команды на компьютере с 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 - 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 и нажмите кнопку OK.

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

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

NOTE - Предполагая, что ваш каталог разработки - C: \ ServletDevel (Windows) или / usr / ServletDevel (Unix), вам нужно будет добавить эти каталоги также в CLASSPATH таким же образом, как вы добавили выше.

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

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

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

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

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

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

Метод init ()

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

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

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

Определение метода инициализации выглядит так -

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

Метод service ()

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

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

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

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

Метод 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 () одного экземпляра сервлета.

Сервлеты - это классы 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 (JDK). Чтобы эта команда работала правильно, вы должны указать расположение используемого вами Java SDK в переменной среды PATH.

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

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

По умолчанию приложение сервлета находится по пути <каталог-установки-Tomcat> / webapps / ROOT, а файл класса будет находиться в <каталог-установки-Tomcat> / 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 метод

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

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

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

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

Метод POST

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

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

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

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

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

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

Пример метода GET с использованием 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 и кнопки отправки. Мы собираемся использовать тот же сервлет 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 для получения дополнительной информации об этом.

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

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

Accept

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

2

Accept-Charset

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

3

Accept-Encoding

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

4

Accept-Language

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

5

Authorization

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

6

Connection

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

7

Content-Length

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

8

Cookie

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

9

Host

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

10

If-Modified-Since

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

11

If-Unmodified-Since

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

12

Referer

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

13

User-Agent

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

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

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

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

Cookie[] getCookies()

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

2

Enumeration getAttributeNames()

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

3

Enumeration getHeaderNames()

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

4

Enumeration getParameterNames()

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

5

HttpSession getSession()

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

6

HttpSession getSession(boolean create)

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

7

Locale getLocale()

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

8

Object getAttribute(String name)

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

9

ServletInputStream getInputStream()

Извлекает тело запроса в виде двоичных данных с помощью ServletInputStream.

10

String getAuthType()

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

11

String getCharacterEncoding()

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

12

String getContentType()

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

13

String getContextPath()

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

14

String getHeader(String name)

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

15

String getMethod()

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

16

String getParameter(String name)

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

17

String getPathInfo()

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

18

String getProtocol()

Возвращает имя и версию протокола запроса.

19

String getQueryString()

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

20

String getRemoteAddr()

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

21 год

String getRemoteHost()

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

22

String getRemoteUser()

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

23

String getRequestURI()

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

24

String getRequestedSessionId()

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

25

String getServletPath()

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

26

String[] getParameterValues(String name)

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

27

boolean isSecure()

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

28

int getContentLength()

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

29

int getIntHeader(String name)

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

30

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

Allow

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

2

Cache-Control

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

3

Connection

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

4

Content-Disposition

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

5

Content-Encoding

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

6

Content-Language

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

7

Content-Length

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

8

Content-Type

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

9

Expires

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

10

Last-Modified

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

11

Location

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

12

Refresh

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

13

Retry-After

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

14

Set-Cookie

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

Способы установки заголовка HTTP-ответа

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

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

String encodeRedirectURL(String url)

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

2

String encodeURL(String url)

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

3

boolean containsHeader(String name)

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

4

boolean isCommitted()

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

5

void addCookie(Cookie cookie)

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

6

void addDateHeader(String name, long date)

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

7

void addHeader(String name, String value)

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

8

void addIntHeader(String name, int value)

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

9

void flushBuffer()

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

10

void reset()

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

11

void resetBuffer()

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

12

void sendError(int sc)

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

13

void sendError(int sc, String msg)

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

14

void sendRedirect(String location)

Отправляет клиенту ответ временного перенаправления, используя указанный 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 type)

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

19

void setDateHeader(String name, long date)

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

20

void setHeader(String name, String value)

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

21 год

void setIntHeader(String name, int value)

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

22

void setLocale(Locale loc)

Устанавливает языковой стандарт ответа, если ответ еще не зафиксирован.

23

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

Формат сообщений HTTP-запроса и HTTP-ответа аналогичен и будет иметь следующую структуру:

  • Начальная строка состояния + 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 Требуемая длина "Content-Length" не определено. Без него сервер не примет запрос.
412 Предварительное условие не выполнено Предварительное условие, указанное в запросе, оценивается сервером как ложное.
413 Слишком большой объект запроса Сервер не примет запрос, потому что объект запроса слишком велик.
414 Запрос-url слишком длинный Сервер не примет запрос, потому что URL-адрес слишком длинный. Происходит при преобразовании запроса «post» в запрос «get» с длинной информацией запроса.
415 Неподдерживаемый тип носителя Сервер не примет запрос, потому что этот тип носителя не поддерживается.
417 Ожидание не удалось  
500 Внутренняя ошибка сервера Запрос не был выполнен. Сервер обнаружил непредвиденное состояние.
501 Не реализованы Запрос не был выполнен. Сервер не поддерживает требуемые функции.
502 Плохой шлюз Запрос не был выполнен. Сервер получил недопустимый ответ от вышестоящего сервера.
503 Сервис недоступен Запрос не был выполнен. Сервер временно перегружен или не работает.
504 Тайм-аут шлюза Истекло время ожидания шлюза.
505 Версия HTTP не поддерживается Сервер не поддерживает версию «http-протокол».

Способы установки кода состояния 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-документа и отправляется клиенту.

Пример кода состояния 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

messageNeed authentication!!!

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

Apache Tomcat/5.5.29

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

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

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

В спецификациях предлагаются различные типы фильтров -

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

public 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, чтобы указать вызов сервлетов в ответ на определенные exceptions или HTTP status codes.

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.

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

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

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

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.

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

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

// 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-адрес, это приведет к вызову веб-контейнера ErrorHandlerсервлет и отобразить соответствующее сообщение, как запрограммировано. Например, если вы введете неправильный URL-адрес, он отобразит следующий результат:

The status code : 404

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

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

Идентификация вернувшихся пользователей состоит из трех этапов:

  • Сценарий сервера отправляет в браузер набор файлов 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. Поле истекает - это инструкция браузеру «забыть» файл 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.getCookies (), который возвращает массив объектов Cookie .

Методы файлов cookie сервлета

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

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

public void setDomain(String pattern)

Этот метод устанавливает домен, к которому применяется файл 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()

Этот метод возвращает имя файла cookie. Имя не может быть изменено после создания.

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(boolean flag)

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

11

public void setComment(String purpose)

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

12

public String getComment()

Этот метод возвращает комментарий, описывающий назначение этого файла cookie, или null, если файл cookie не имеет комментария.

Установка файлов cookie с помощью сервлета

Установка файлов cookie с помощью сервлета включает три шага:

(1) Creating a Cookie object - Вы вызываете конструктор cookie с именем cookie и значением cookie, оба из которых являются строками.

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

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

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

(2) Setting the maximum age- Вы используете setMaxAge, чтобы указать, как долго (в секундах) файл cookie должен быть действительным. После этого будет создан файл cookie на 24 часа.

cookie.setMaxAge(60 * 60 * 24);

(3) Sending the Cookie into the HTTP response headers - Вы используете 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 , вот фактический результат вышеуказанной формы.

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

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

Чтение файлов cookie с помощью сервлета

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

пример

Давайте прочитаем файлы 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 как «Джон» и файл 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 и сохраните его в объекте 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

Теперь попробуйте запустить http: // localhost: 8080 / ReadCookies, и он отобразит только один файл cookie следующим образом:

Found Cookies Name and Value

Name : last_name, Value: Player

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

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

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

Печенье

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

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

Скрытые поля формы

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

<input type = "hidden" name = "sessionid" value = "12345">

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

Это может быть эффективным способом отслеживания сеанса, но нажатие на обычную (<A HREF...>) гипертекстовую ссылку не приводит к отправке формы, поэтому скрытые поля формы также не могут поддерживать общее отслеживание сеанса.

Перезапись URL

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

Например, при http://tutorialspoint.com/file.htm;sessionid = 12345 идентификатор сеанса присоединяется как sessionid = 12345, к которому можно получить доступ на веб-сервере для идентификации клиента.

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

Объект HttpSession

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

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

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

HttpSession session = request.getSession();

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

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

public Object getAttribute(String name)

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

2

public Enumeration 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(

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

9

public void removeAttribute(String name)

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

10

public void setAttribute(String name, Object value)

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

11

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

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

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

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

  • Delete the whole session- Вы можете вызвать метод public void invalidate (), чтобы отменить весь сеанс.

  • Setting Session timeout- Вы можете вызвать метод public void setMaxInactiveInterval (int interval), чтобы установить тайм-аут для сеанса индивидуально.

  • Log the user out - Серверы, поддерживающие сервлеты 2.4, можно вызывать logout для выхода клиента из веб-сервера и аннулирования всех сеансов, принадлежащих всем пользователям.

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

<session-config>
   <session-timeout>15</session-timeout>
</session-config>

Тайм-аут выражается в минутах и ​​заменяет тайм-аут по умолчанию, который в Tomcat составляет 30 минут.

Метод getMaxInactiveInterval () в сервлете возвращает период ожидания для этого сеанса в секундах. Итак, если ваш сеанс настроен в web.xml на 15 минут, getMaxInactiveInterval () вернет 900.

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

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

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

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

Для создания Employees таблицу в базе данных TEST, используйте следующие шаги -

Шаг 1

Откройте Command Prompt и перейдите в каталог установки следующим образом -

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>

Создать записи данных

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

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

  • Форма method атрибут должен быть установлен на POST метод и метод GET не могут использоваться

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

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

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

<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-installation-directory> / 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, поэтому убедитесь, что у вас установлена ​​последняя версия commons-fileupload.x.x.jarфайл в вашем пути к классам. Вы можете скачать его сhttps://commons.apache.org/fileupload/.

  • FileUpload зависит от Commons IO, поэтому убедитесь, что у вас установлена ​​последняя версия commons-io-x.x.jarфайл в вашем пути к классам. Вы можете скачать его с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:


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

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

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

Date( )

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

Date(long millisec)

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

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

boolean after(Date date)

Возвращает true, если вызывающий объект Date содержит дату, более позднюю, чем указанная date, в противном случае возвращает false.

2

boolean before(Date date)

Возвращает true, если вызывающий объект Date содержит дату, более раннюю, чем указанная date, в противном случае возвращает false.

3

Object clone( )

Дублирует вызывающий объект Date.

4

int compareTo(Date date)

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

5

int compareTo(Object obj)

Работает так же, как compareTo (Date), если obj имеет класс Date. В противном случае генерируется исключение ClassCastException.

6

boolean equals(Object date)

Возвращает true, если вызывающий объект Date содержит те же время и дату, что и дата, заданная параметром date, в противном случае возвращает false.

7

long getTime( )

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

8

int hashCode( )

Возвращает хэш-код для вызывающего объекта.

9

void setTime(long time)

Устанавливает время и дату, как указано в time, которое представляет собой время в миллисекундах, прошедшее с полуночи 1 января 1970 года.

10

String toString( )

Преобразует вызывающий объект Date в строку и возвращает результат.

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

Получить текущую дату и время в Java Servlet очень просто. Вы можете использовать простой объект 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-му, например, new Date (99, 2, 12) .before (new Date (99, 2, 18)) возвращает true.

  • Вы можете использовать метод compareTo (), который определяется интерфейсом Comparable и реализуется Date.

Форматирование даты с использованием 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
E День в неделю вторник
D День в году 360
F День недели в месяце 2 (вторая среда июля)
ш Неделя в году 40
W Неделя в месяц 1
а AM / PM маркер ВЕЧЕРА
k Час в день (1 ~ 24) 24
K Час в AM / PM (0 ~ 11) 10
z Часовой пояс Восточное стандартное время
' Escape для текста Разделитель
" Одиночная цитата `

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

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

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

пример

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

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:

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

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

  • Инициализируйте глобальную переменную в методе 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

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

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

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

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

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

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

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

void addRecipients(Message.RecipientType type, Address[] addresses)
throws MessagingException

Вот описание параметров -

  • type- Это может быть TO, CC или BCC. Здесь CC представляет собой копию, а BCC представляет собой черную копию. Пример Message.RecipientType.TO

  • addresses- Это массив адресов электронной почты. Вам нужно будет использовать метод InternetAddress () при указании идентификаторов электронной почты.

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

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

Отправить вложение по электронной почте

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

// 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 (JDK). Чтобы эта команда работала правильно, вы должны указать расположение используемого вами Java SDK в переменной среды PATH.

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

Пакетное развертывание сервлетов

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

Если у вас есть полное имя класса com.myorg.MyServlet, то этот класс сервлета должен находиться в WEB-INF / classes / com / myorg / MyServlet.class, и вам нужно будет создать следующие записи в web.xml файл, расположенный в <Tomcat-installationdirectory> / 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.out.println () -

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

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

Журнал сообщений

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

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

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

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

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

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

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

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

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

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

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

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

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

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

java.util.Locale request.getLocale()

Определение локали

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

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

String getCountry()

Этот метод возвращает код страны / региона в верхнем регистре для данной локали в двухбуквенном формате ISO 3166.

2

String getDisplayCountry()

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

3

String getLanguage()

Этот метод возвращает код языка в нижнем регистре для данной локали в формате ISO 639.

4

String getDisplayLanguage()

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

5

String getISO3Country()

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

6

String 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 () для форматирования числа, например длинного или двойного типа, в валюте конкретной локали. Ниже приведен пример, который показывает, как форматировать валюту, специфичную для данной локали.

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

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

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

String name

Имя сервлета

2

String[] value

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

3

String[] urlPatterns

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

4

Int loadOnStartup

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

5

WebInitParam[] initParams

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

6

Boolean asyncSupported

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

7

String smallIcon

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

8

String largeIcon

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

9

String description

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

10

String 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> / webapps / ROOT / WEB-INF / classes.

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

Hello servlet

@WebInitParam

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

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

String name

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

2

String value

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

3

String description

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

пример

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

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>; / webapps / ROOT / WEB-INF / classes.

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

Hello Servlet

Hello World!

@Webfilter

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

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

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

String filterName

Название фильтра

2

String[] urlPatterns

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

3

DispatcherType[] dispatcherTypes

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

4

String[] servletNames

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

5

String displayName

Название фильтра

6

String description

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

7

WebInitParam[] initParams

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

8

Boolean asyncSupported

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

9

String smallIcon

Маленький значок этого фильтра, если он есть

10

String 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> / webapps / ROOT / WEB-INF / classes.

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

Hello Servlet
  
Hello World!

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