Слайд 2
СЕРВЛЕТЫ
Сервлеты – компоненты приложений Java 2 Platform Enterprise Edition, выполняющиеся
на стороне сервера, способные обрабатывать клиентские запросы и динамически генерировать ответы на них.
Наибольшее распространение получили сервлеты, обрабатывающие клиентские запросы по протоколу HTTP.
В настоящее время сервлеты поддерживаются большинством Web-серверов и являются частью платформы J2EE.
Слайд 3Все сервлеты реализуют общий интерфейс Servlet.
Для обработки HTTP-запросов можно воспользоваться
в качестве базового класса абстрактным классом HttpServlet.
Классы относящиеся к технологии сервлетов находятся в пакете javax.servlet.
Жизненный цикл сервлета начинается с его загрузки в память контейнером сервлетов при старте либо в ответ на первый запрос.
Далее происходят инициализация, обслуживание запросов и завершение существования.
Прежде всего вызывается конструктор сервлета(если он есть), а затем вызывается метод init().
Он дает сервлету возможность инициализировать данные и подготовиться для обработки запросов.
Данные задаются в файле web.xml в виде
имя_параметра
значение_парам
Слайд 4После этого сервлет можно считать запущенным, он находится в ожидании запросов
от клиентов.
Появившийся запрос обслуживается методом service() сервлета, а все параметры запроса упаковываются в объект ServletRequest, который передается в качестве первого параметра методу service().
Второй параметр метода – объект ServletResponse.
В этот объект упаковываются выходные данные в процессе формирования ответа клиенту.
Каждый новый запрос приводит к новому вызову метода service().
Метод service() должен уметь обрабатывать сразу несколько запросов, т.е. быть синхронизирован для выполнения в многопоточных средах.
Если же нужно избежать множественных запросов, сервлет должен реализовать интерфейс SingleThreadModel, который не содержит ни одного метода и только указывает серверу об однопоточной природе сервлета.
Слайд 5После завершения выполнения сервлета контейнер сервлетов вызывает метод destroy(), в теле
которого следует помещать код освобождения занятых сервлетом ресурсов.
Интерфейсом Servlet предусмотрена реализация еще двух методов: getServletConfig() и getServletInfo().
Первый возвращает объект типа ServletConfig, содержащий параметры конфигурации сервлета,
а второй – строку, описывающую назначение сервлета.
При разработке сервлетов в качестве базового класса в большинстве случаев используют не интерфейс Servlet, а класс HttpServlet, отвечающий за обработку запросов HTTP.
Слайд 7Класс HttpServlet имеет реализованный метод service(), служащий диспетчером для других методов,
каждый из которых обрабатывает методы доступа к ресурсам.
В спецификации HTTP определены следующие методы: GET, HEAD, POST, PUT, DELETE, OPTIONS и TRACE.
Наиболее часто употребляются методы GET и POST, с помощью которых на сервер передаются запросы, а также параметры для их выполнения.
При использовании метода GET (по умолчанию) параметры передаются как часть URL, значения могут выбираться из полей формы или передаваться непосредственно через URL.
При этом запросы кэшируются и имеют ограничения на размер.
При использовании метода POST (method=POST) параметры (поля формы) передаются в содержимом HTTP-запроса и упакованы согласно полю заголовка Content-Type.
По умолчанию в формате: <имя>=<значение>&<имя>=<значение>&...
Слайд 8В задачу метода service() класса HttpServlet входит анализ полученного через запрос
метода доступа к ресурсам и вызов метода, имя которого сходно с названием метода доступа к ресурсам, но перед именем добавляется префикс do: doGet() или doPost().
Кроме этих методов могут использоваться методы: doHead(), doPut(), doDelete(), doOptions() и doTrace().
Очевидно, разработчик должен переопределить нужный метод, разместив в нем функциональную логику.
Слайд 9Рассмотрим пример:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends
HttpServlet {
public MyServlet() {
super();
...........................................................
}
public void init() throws ServletException {
.......................................................................................
}
Слайд 10public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("This is ");
out.print(this.getClass().getName());
out.print(", using the GET method");}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("This is ");
out.print(this.getClass().getName());
out.print(", using the POST method");}
Слайд 11public void destroy() {
super.destroy();
.............................................................}}
Интерфейсы ServletRequest и HttpServletRequest
Поток данных
поступает от клиента в виде закодированного и упакованного запроса.
Вызывая методы интерфейса ServletRequest, можно получать определенный набор данных, посланных клиентом.
Метод getCharacterEncoding() определяет символьную кодировку запроса.
Методы getContentType() и getProtocol() – MIME-тип пришедшего запроса, а также название и версию протокола соответственно.
Слайд 12Информацию об имени сервера, принявшего запрос, и порт, на котором запрос
был “услышан” сервером, выдают методы getServerName() и getServerPort().
Можно также узнать данные и о клиенте, от имени которого пришел запрос.
Его IP-адрес возвращается методом getRemoteAddr(), а его имя – методом getRemoteHost().
Если необходим прямой доступ к содержимому полученного запроса,то можно вызвать метод getInputStream() или getReader().
Первый возвращает ссылку на объект класса ServletInputStream, а второй – на BufferedReader.
После этого можно читать любой байт из полученного запроса, используя технику работы с потоками Java.
Слайд 13Если, обращаясь к серверу, клиент помимо универсального адреса задал параметры сервлету
то их можно узнать посредством следующих методов.
getParameter(String name) возвращает значение параметра по его имени или null, если параметра с таким именем нет.
getParameterValues(String name) возвращает массив строк, а именно все значения параметра по его имени, причем параметр может иметь несколько значений.
getParameterNames() возвращает объект типа Enumeration, позволяющий узнать имена всех присланных параметров.
Интерфейс HttpServletRequest является производным от интерфейса ServletRequest и используется для получения информации в HTTP-сервлетах.
Слайд 14В интерфейсе HttpServletRequest имеются дополнительные методы:
getCookies() возвращает массив cookies.
getQueryString() возвращает строку
запроса HTTP
getRemoteUser() используется для получения имени пользователя, выполнившего запрос(если пользователь авторизировался или null) при использовании container-based authentication(устанавливается в настройках Tomcat в server.xml)
Рассмотрим пример:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestClass extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws IOException, ServletException{
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
Слайд 15 out.println("");
out.println("Request Information ");
out.println("");
out.println("Request Information ");
out.println("
Method: "
+ req.getMethod());
out.println("
Request URI: " +
req.getRequestURI());
out.println("
Protocol: " + req.getProtocol());
out.println("
PathInfo: " + req.getPathInfo());
out.println("
Remote Address: " +
req.getRemoteAddr());
out.println("