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