- •По курсу «Интернет-программирование»
- •Принципы построения интернет-приложений на Java
- •Сервлеты (Servlet) и jsp
- •Сервлеты
- •Синтаксис jsp-страницы
- •Комментарии
- •Директивы
- •Объявления
- •Выражения
- •Скриплеты
- •Объекты request, response, cookie, session
- •Загрузка файлов на сервер
- •Объект request
- •Объект response
- •Объект cookie
- •Объект session
- •Приложение 2
Сервлеты
С точки зрения языка Java сервлет это класс Java содержащий импорт пакетов javax.servlet и javax.servlet.http и методы doGet и doPost для взаимодействия с сервлет-контейнером веб-сервера. Метод doGet автоматически вызывается в сервлете при обращении к нему без данных, передаваемых в теле запроса (т.е. все данные запроса передаются в его заголовке), а метод doPost в случае передачи данных в теле запроса (как правило это передача данных из формы). Код простейшего сервлета «Привет! МИЭТ:)» приведен в листинге 1.
IDE NetBeance позволяет создавать приложения типа “Веб-приложение” и тестировать его с помощью встроенного сервера Apache Tomcat. При создании классов сервлетов в среде NetBeance необходимые базовые пакеты (servlet.*) и методы (doGet, doPost) подключаются в создаваемый сервлет-класс автоматически. Также среда NetBeance автоматизирует компиляцию и перемещение классов сервлетов из папок исходных кодов в папки обслуживаемые веб-сервером, а также создание war-архива и xml-файла описания проекта.
Листинг 1. Сервлет “Привет! МИЭТ:)” (HelloMiet.java)
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloMiet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Привет! МИЭТ:)");
}
}
Как видно из листинга 1 метод doGet получает объекты request и response. Затем из объекта response создается объект out типа PrintWriter, метод println которого отправляет строку в браузер клиента.
Класс HelloMiet помещается в пакет (папку) servlets. Имя пакета может быть любым удобным для программиста. Также пакет может отсутствовать (пакет по умолчанию). Важно, что имя пакета используется в пути обращения к файлу сервлета. Поэтому к сервлету можно обратиться так: http://Имя_хоста:порт/Имя_приложения/Имя_пакета/Имя_класса. Имя приложения соответствует имени проекта. Путь вида Имя_пакета/Имя_класса, если это необходимо, может быть переопределен. Например, можно указать, что HelloMiet будет вызываться по пути /miet/hello.php. Это указание делается в настроечном файле приложения web.xml.
Для разработки сервлетов (и JSP) в среде NetBeans сначала нужно создать проект типа Web-приложение открыв меню создания проектов (Ctrl+Shift+N) и выбрав тип проекта Web-приложение см. рис.2. Затем проекту нужно дать имя и определить папку расположения проекта см. рис.3. На следующем шаге выбирается веб-сервер под управлением которого будет работать проект и виртуальная папка относительно корня сервера, которая будет связана с папкой проекта из которой будет исполняться сервлет(ы) см. рис. 4. Четвертый шаг по выбору платформы для данной лабораторной работы можно пропустить без изменений.

Рис. 2. Выбор типа проекта

Рис. 3. Выбор имени и расположения проекта

Рис. 4. Выбор сервера проекта и виртуальной папки запуска проекта (контекстный путь)
Среда NetBeans создаст необходимое окружение (папки) проекта и заполнит их данными для развертывания проекта (файлы META-INF/context.xml и WEB-INF/web.xml). Файлы сервлетов следует размещать в папке «Пакеты исходных кодов». В этой папке уже находится «пакет по умолчанию». Рекомендуется заменить его определенным пакетом, например servlets и уже в этом пакете создавать java файлы сервлетов.
Для создания сервлета в пакете необходимо став на папку пакета создать в ней файл типа сервлет (см. рис.5). Если такого типа файла нет в списке нужно выбрать пункт «Другое» в низу выпадающего меню (см. рис.5.) и откроется расширенное меню типов файлов в котором надо выбрать Категорию «Веб» и тип файла «Сервлет» (см. рис. 6), а затем имя, пакет и расположение файла сервлета (см. рис. 7). На третьем шаге создания сервлета предлагается добавить его описание в файл web.xml и определить шаблоны адресов по которым сервлет может быть вызван (см. рис. 8).
Добавление описания сервлета в файл web.xml позволяет изменять при необходимости параметры сервлета, например добавить новые шаблоны адресов (см. рис. 9). Определение нескольких шаблонов адресов может быть полезным, например, для случая, когда нужно вызвать сервлет с поведением зависимым от параметров в URL. Например, шаблон адреса /TestServlet.php?Year=2017 позволяет в сервлете получить параметр Year равный 2017. Созданный сервлет является классом Java с автоматически созданными методами получения данных doGet и doPost и методом обработки processRequest (см. рис. 10). Данные, переданные через форму или в адресе доступны в объекте request с помощью метода getParameter(имя_поля_формы)
Для тестирования работы сервлета нужно собрать архив war, скопировать его на сервер, распаковать. Поскольку в NetBeanse сервер встроен достаточно в контекстном меню нажать «Очистить и собрать», а затем «Разернуть». Сервер при этом будет запущен автоматически (см. рис. 11). В результате сервлет можно запустить по обоим адресам шаблонов: http://localhost:8084/WebApp/NewServlet и http://localhost:8084/WebApp/NewServlet?Year=2017 (см. рис. 12)

Рис. 5. Создание сервлета из всплывающего меню

Рис. 6. Создание сервлета из модального окна

Рис. 7. Определение имени и пакета сервлета

Рис. 8. Определение шаблонов адресов для вызова сервлета

Рис. 9. Описание сервлета NewServlet в файле web.xml

Рис. 10. Код созданного сервлета

Рис. 11. Запуск сервера Apache Tomcat

Рис. 12. Вызов сервлета
Поскольку сервлет это класс Java то его функциональность можно расширять подключением других (в.т.ч. пользовательских) классов через директиву import также как это делается для обычных классов Java.
Java Server Pages – JSP
Работа с файлами *.jsp подобна работе с другими скриптовыми языками. Файлы JSP компилируются при первом вызове, поэтому изменения в данных файлах вступают в силу немедленно. Для высоконагруженных проектов часто применяют гибридный подход, когда сервлеты и JSP используются совместно. Сервлеты отвечают за ресрсоемкие задачи обработки данных, а JSP страницы за их визуальное представление.
В отличие от PHP JSP имеют не один (<? … ?>), а несколько тегов для размещения кода Java. Кроме того в JSP определен механизм расширения тегов, который позволяет подключать к JSP расширения на базе классов-сервлетов и обычных классов Java. В листинге 2 показан пример файла JSP. Как видно из Листинга 2 в JSP объекты request и session доступны сразу в коде без вызова каких-то дополнительных методов, а объект response не требуется т.к. код вывода составляет статическая часть файла.
Листинг 2. Демонстрация jsp-файла
<%--
Document : response
Created on : 05.05.2017, 15:19:39
Author : Андрей
--%>
<%@page session="true" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Получены данные</h1>
<%
for (Enumeration<String> e = request.getParameterNames(); e.hasMoreElements();) {
String name = e.nextElement();
out.println(name+"="+request.getParameter(name)+"<br>");
}
%>
<hr>
Получено из сессии: userID = <%= session.getAttribute("userID") %>
<hr>
<%
ServletContext context = pageContext.getServletContext();
String filePath = context.getInitParameter("file-upload");
%>
Путь, где хранятся временные файлы <%= filePath%>
</body>
</html>
