1125
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, теперь переходим на его запуск!
ЗАПУСКАЕМ ПРИЛОЖЕНИЕ
Необходимо сделать несколько шагов для запуска приложения такие как:
ЗАКЛЮЧЕНИЕ
Как ведь хорошо когда вы приобрели все навыки для разработки собственного веб-приложения на Java используя встроенные на Java средства, Servlet API и технологию JSP для отражения. Замечательно не так ли?
Заметьте, что реализация класса CustomerController кратко демонстрирует легкость обработки параметров запроса и передаёт клиенту ответы в различных форматах. Однако за эту функцию приходится платить по-своему. Реализация интерфейсов HttpServletResponse и HttpServletResponse являются простыми локаторами служб которые просто содержат данные, но эти реализации всегда буду привязаны к сервлету.