Руководство по Servlets. Запрос клиента.

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

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

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

Заголовок Описание
Accept Определяет MIME типы, которые могут быть обработаны браузером.
Accept-Charset Определяет, кодировки, который могут быть отображены в браузере.
Accept-Encoding Указывает тип кодировки, которые могут быть обработаны.
Accept-Language Указывает предпочитаемый клиентом язык.
Authorization Используется для самоидентификации при доступе к странице, которые защищены паролем.
Connection Указывает, может ли клиент работать с HTTP соединениями.
Content-Length Применяется только для POST заголовков и определяет размер передаваемых данных в байтах.
Cookie Возвращает cookie серверу, которые были предварительно отправлены в браузер.
Host Определяет хост и порт, которые указаны в URL.
If-Modified-Since Указывает, что клиент хочет получить данные о странице только, если она была изменена с момента крайнего посещения. Если она не была изменена, от сервера приходит код ответа 304.
If-Unmodified-Since Указывает, что операция должна быть выполнена, только если  документ старше, чем указано.
Referer Указывает URL страницы, с которой  мы обращаемся к следующей странице.
User-Agent Определяет браузер или клиента, который выполняет запрос (Firefox, Chrome и т.д.)

Работая с сервлетами мы можем получить доступ к заголовкам HTTP документа.
Для этого мы можем использовать методы класса HttpServletRequest.
Базовые методы указаны ниже:

Метод и его описание
1 Cookie[] getCookies()

Возвращает массив Cookie, который хранится в заголовке.

2 Enumeration getAttributeNames()является

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

3 Enumeration getHeaderNames()

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

4 HttpSession getSession()

Возвращает сессию, связанную с данным запросом. Если сессия не создана – создаёт новую сессию.

5 Object getAttribute(String name)
Возвращает значение указанного аттрибута заголовка.
6 String getProtocol()

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

7 boolean isSecure()

Возвращает, является ли запрос безопасным или нет (HTTPS).

8 int getServerPort()

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

Рассмотрим простой пример создания клиентского запроса.
В качестве основы возьмём приложение из данной статьи.

Класс ServletRequestDemo


package net.proselyte.servletstutorial;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

/**
 * Simple servlet that demonstrates {@link HttpServletRequest} in action.
 *
 * @author Eugene Suleimanov
 */

public class ServletRequestDemo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        String title = "HTTP Request Example";

        String contentType = "<!DOCTYPE html>\n";

        writer.println(contentType + "<html>\n" +
                "<head><title>" + title + "</title></head>" +
                "<body>" +
                "<h1>HTTP Servlet Request Example </h1>"
        );
        Enumeration headers = request.getHeaderNames();

        while (headers.hasMoreElements()) {
            String parameterName = (String) headers.nextElement();
            String parameterValue = request.getHeader(parameterName);
            writer.println("<h3>" + parameterName + ": " + parameterValue + "</h3>" + "\n");
        }

        writer.println("</body>");

    }

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

Файл web.xml


<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Servlets Tutorial</display-name>

    <servlet>
        <servlet-name>SimpleServlet</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.SimpleServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>StatusCodeDemo</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.StatusCodeDemo</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>ServletRequestDemo</servlet-name>
        <servlet-class>net.proselyte.servletstutorial.ServletRequestDemo</servlet-class>
    </servlet>

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

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

    <servlet-mapping>
        <servlet-name>ServletRequestDemo</servlet-name>
        <url-pattern>/ServletRequestDemo</url-pattern>
    </servlet-mapping>
</web-app>

Выполним в консоли следующую команду:


mvn tomcat7:run

И перейдём по ссылке:


http://localhost:8088/ServletRequestDemo

В результате мы получим следующую страницу:

servletRequestDemo

На этом мы заканчиваем изучение клиентского запроса.

В следующей статье мы рассмотрим ответ сервера при работе с сервлетами.