Введение в сервлеты Java

Введение в сервлеты Java

1. обзор

В этой статье мы рассмотрим ключевой аспект веб-разработки на Java - сервлеты.

2. Сервлет и контейнер

Проще говоря, сервлет - это класс, который обрабатывает запросы, обрабатывает их и отвечает ответом.

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

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

3. Maven Зависимости

Чтобы добавить поддержку сервлетов в наше веб-приложение, требуется зависимостьjavax.servlet-api:


    javax.servlet
    javax.servlet-api
    3.1.0

Последнюю зависимость maven можно найти вhere.

Конечно, нам также потребуется настроить контейнер сервлетов для развертывания нашего приложения; this is a good place to start on how to deploy a WAR on Tomcat.

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

Давайте рассмотрим набор методов, которые определяют жизненный цикл сервлета.

4.1. init()с

Методinit предназначен для однократного вызова. Если экземпляр сервлета не существует, веб-контейнер:

  1. Загружает класс сервлетов

  2. Создает экземпляр класса сервлета

  3. Инициализирует его, вызывая методinit

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

public void init() throws ServletException {
    // Initialization code like set up database etc....
}

4.2. service()с

Этот метод вызывается только после успешного завершения метода сервлетаinit().

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

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

4.3. destroy()с

Вызывается контейнером сервлетов, чтобы вывести сервлет из строя.

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

public void destroy() {
    //
}

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

Let’s now setup a full example обработки информации с помощью формы.

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

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet")
public class FormServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {

        String height = request.getParameter("height");
        String weight = request.getParameter("weight");

        try {
            double bmi = calculateBMI(
              Double.parseDouble(weight),
              Double.parseDouble(height));

            request.setAttribute("bmi", bmi);
            response.setHeader("Test", "Success");
            response.setHeader("BMI", String.valueOf(bmi));

            RequestDispatcher dispatcher
              = request.getRequestDispatcher("index.jsp");
            dispatcher.forward(request, response);
        } catch (Exception e) {
            response.sendRedirect("index.jsp");
        }
    }

    private Double calculateBMI(Double weight, Double height) {
        return weight / (height * height);
    }
}

Как показано выше, классы, помеченные@WebServlet, должны расширять классjavax.servlet.http.HttpServlet. Важно отметить, что аннотация@WebServlet доступна только начиная с Java EE 6 и далее.

Аннотация@WebServlet обрабатывается контейнером во время развертывания, и соответствующий сервлет становится доступным по указанным шаблонам URL. Стоит заметить, что, используя аннотацию для определения шаблонов URL, мы можем избежать использования XML-дескриптора развертывания с именемweb.xml для нашего сопоставления сервлетов.

Если мы хотим отобразить сервлет без аннотации, мы можем вместо этого использовать традиционныйweb.xml:



    
       FormServlet
       com.root.FormServlet
    
    
        FormServlet
        /calculateServlet
    

Затем давайте создадим базовый HTMLform:

Your Weight (kg) :
Your Height (m) :

${bmi}

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

public class FormServletLiveTest {

    @Test
    public void whenPostRequestUsingHttpClient_thenCorrect()
      throws Exception {

        HttpClient client = new DefaultHttpClient();
        HttpPost method = new HttpPost(
          "http://localhost:8080/calculateServlet");

        List nvps = new ArrayList<>();
        nvps.add(new BasicNameValuePair("height", String.valueOf(2)));
        nvps.add(new BasicNameValuePair("weight", String.valueOf(80)));

        method.setEntity(new UrlEncodedFormEntity(nvps));
        HttpResponse httpResponse = client.execute(method);

        assertEquals("Success", httpResponse
          .getHeaders("Test")[0].getValue());
        assertEquals("20.0", httpResponse
          .getHeaders("BMI")[0].getValue());
    }
}

6. Сервлет, HttpServlet и JSP

Важно понимать, чтоthe Servlet technology is not limited to the HTTP protocol.

На практике это почти всегда так, ноServlet - это общий интерфейс, аHttpServlet - это расширение этого интерфейса, добавляющее специфическую поддержку HTTP, такую ​​какdoGet иdoPost, и т.п.

Наконец, технология сервлетов также является основным драйвером ряда других веб-технологий, таких какJSP – JavaServer Pages, Spring MVC и т. Д.

7. Заключение

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

Пример проекта можно загрузить и запустить какa GitHub project.