Создаём веб-приложение с Java Servlets

171

12

Самое большое отличие в Java- это многогранность. Разработка десктопных и мобильных приложений возможно и хорошо, но если вам хочется чего-нибудь более экзотического как например разработка web приложений на Java? Вы будете рады узнать, что в комплекте с языком идёт полноценнный Servlet API с помощью которого Вы без особых усилий сможете разработать надёжное веб-приложение (статья предназначена уже для более продвинутых).

                                                         СОЗДАНИЕ ПРИЛОЖЕНИЙ НА JAVA С ПОМОЩЬЮ SERVLETS.

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

Помимо всего остального, сервлет может брать данные от клиента, как известно через GET и POST- запросы, взаимодействовать с cookie и настройками сеанса. Также позволяет обрабатывать данные со вспомогательных уровней приложений и передаёт выходящие данные клиенту и в бионарном и в текстовом форматах (HTML? XML? PDF? JPG? GIF и.т.д.) в основном используя Java Server Pages (JSP) файлы. 

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

                                                                               КОНФИГУРАЦИОННЫЕ ФАЙЛЫ

Ниже мы хотим показать вам наглядный пример дальнейшего приложения:


Приступая к разработке приложения необходимо выбрать дескриптор развёртывания. Дескриптор показывает, как приложение должно быть развёрнуто в конкретной сфере. Дескриптор развёртывания представляет из себя обычный XML- файл, именуемый web.xml и является элементом стандартной классификации Java EE.

Ниже демонстрируем наглядный пример:

<?xml version="1.0" encoding="UTF-8"?>

 

<web-app version="3.1"

             xmlns="http://xmlns.jcp.org/xml/ns/javaee"

             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

             metadata-complete="false">

 

</web-app>

На примере видно, что web.xml только назначает версию Java Servlet Specification (3.1), которую мы применим в приложении. Следовательно он может включать в себя намного больше содержимого включая директивы сопоставления сервлетовпараметры инициализациисписок приветственных файлов, однако дабы не затрудняться сохраним всё так как есть. 

ВНЕШНИЙ ВИД

По двум JSP-файлам будет устанавливаться внешний вид и в контексте MVC они именуются «Представлениями». Первый реагирует за отображение формы регистрации и вероятных ошибок, после контроля внедренных сведений.  Второй реагирует за страницу приветствия где показаны данные заполненные клиентом, после завершения регистрации.  

1-ый JSP-файл:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Регистрация</title>

</head>

<body>

    <h1>Регистрация</h1>

 

    <c:if test="${violations != null}">

        <c:forEach items="${violations}" var="violation">

            <p>${violation}.</p>

        </c:forEach>

    </c:if>

 

    <form action="${pageContext.request.contextPath}/processcustomer" method="post">

        <label for="firstname">Имя : </label>

        <input type="text" name="firstname" id="firstname" value="${firstname}">

        <label for="lastname">Фамилия:

        <input type="text" name="lastname" id="lastname" value="${lastname}">

        <label for="email">Email: </label>

        <input type="text" name="email" id="email" value="${email}">

        <input type="submit" name="signup" value="Sign Up">

    </form>

</body>

</html>

URL: ${pageContext.request.contextPath}/processcustomer показывает на атрибут формы регистрации action. То есть всегда когда клиент хочет пройти регистрацию, данные автоматически передаются в  processcustomer вне зависимости от URL где доступна форма.

Рассмотрим JSP- файл отвечающий за страницу приветствия:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Данные клиента</title>

</head>

<body>

    <h1>Спасибо за регистрацию!</h1>

    <h2>Ваши введённые данные:</h2>

    <p><strong>Имя:</strong> ${firstname}</p>

    <p><strong>Фамилия:</strong> ${lastname}</p>

    <p><strong>Email: </strong>${email}</p>

</body>

</html>

 

Пишем контроллёр

Сервлет который будет принимать данные из формы регистрации можно написать очень легко. Для этого необходимо- написать подкласс для класса HttpServlet и привести его методы к исполнению doGet() или doPost() (или сразу два если понадобится)

Вот так он выглядит:

@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer")

public class CustomerController extends HttpServlet {

 

    @Override

    protected void doPost(

            HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        RequestCustomer customer = RequestCustomer.fromRequestParameters(request);

        customer.setAsRequestAttributes(request);

        List violations = customer.validate();

 

        if (!violations.isEmpty()) {

            request.setAttribute("violations", violations);

        }

 

        String url = determineUrl(violations);

        request.getRequestDispatcher(url).forward(request, response);

    }

 

    private String determineUrl(List violations) {

        if (!violations.isEmpty()) {

            return "/";

        } else {

            return "/WEB-INF/views/customerinfo.jsp";

        }

    }

 

    private static class RequestCustomer {

 

        private final String firstName;

        private final String lastName;

        private final String email;

 

        private RequestCustomer(String firstName, String lastName, String email) {

            this.firstName = firstName;

            this.lastName = lastName;

            this.email = email;

        }

 

        public static RequestCustomer fromRequestParameters(

            HttpServletRequest request) {

            return new RequestCustomer(

                    request.getParameter("firstname"),

                    request.getParameter("lastname"),

                    request.getParameter("email"));

        }

 

        public void setAsRequestAttributes(HttpServletRequest request) {

            request.setAttribute("firstname", firstName);

            request.setAttribute("lastname", lastName);

            request.setAttribute("email", email);

        }

 

        public List validate() {

            List violations = new ArrayList<>();

            if (!StringValidator.validate(firstName)) {

                    violations.add("Имя является обязательным полем");

            }

            if (!StringValidator.validate(lastName)) {

                    violations.add("Фамилия является обязательным полем");

            }

            if (!EmailValidator.validate(email)) {

                    violations.add("Email должен быть правильно сформирован");

            }

            return violations;

        }

 

    }

 

}

Применение аннотации @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer") – это первое на что собственно стоит направить своё внимание, так как ее задача это сказать контейнеру сервлета применить класс CustomerController для переработки HTTP-запросов по адресу /processcustomer.

В практике применение имени класса сервлета в качестве обозначения атрибута name аннотации @WebServlet считается не плохим решением, вследствие чего мы прозвали сервлет CustomerController, иначе многим контейнерам не удастся выполнить сопоставление, что создаст ошибку 404. Класс CustomerController исполняет обычные команды такие как, сборка данных введённых в форму, применяя реализацию интерфейса HttpServletRequest, содержащий значения согласно полям firstname, lastname и email формы. Далее он вводит эти значения в качестве атрибутов запроса и вследствие чего есть возможность вторично отражать на страничке с результатами, либо в форме. В конце валидаторы выполняют проверку на корректность введённых данных.

Если данные не валидны, клиент перенаправляется через объект RequestDispatcher на страницу регистрации где отражаются ошибки. Если проблем нет, то отражается страничка приветствия.

Таким образом мы разработали полноценное веб-приложение на Java, теперь переходим на его запуск!

 

ЗАПУСКАЕМ ПРИЛОЖЕНИЕ

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

  1. Во первых потребуется Git (удостоверьтесь, что загрузили соответствующую версию), Maven и контейнер сервлета (такие как: Apache Tomcat, Jetty, или JBoss Wildfly). Вы можете применять встроенный вариант, если что-то из этого уже встроено в вашу IDE.
  2. Для того чтобы клонировать репозиторий приложения примените Git и импортируйте в вашу IDE, как проект Maven.
  3. Разверните проект в контейнере сервлета и запустите его. Имеется в виду создайте WAR-файл или exploded WAR и вставьте в папку развёртывания контейнера по умолчанию. После того как вы развернёте проект и запуститесь, должен запускаться браузер по умолчанию с окном регистрации.
  4. Вы увидите, как отобразятся ошибки если не заполнять все поля в форме, в случае заполнения всех полей как надо, вас перенесет на страницу пользователя.

 

ЗАКЛЮЧЕНИЕ

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

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


Комментарии(2):
Тимур Габдуллин

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vitae purus faucibus ornare suspendisse.

Асылай Оспанова

Nisl condimentum id venenatis a condimentum vitae. Consequat ac felis donec et odio pellentesque diam.

Узнать стоимость сайта

Оставить заявку

Менеджер перезвонит вам в ближайшее время

Оставить заявку

Менеджер перезвонит вам в ближайшее время