Невозможно отобразить презентацию
Категория: ПрограммированиеПрограммирование

Servlets

Servlets Servlet (Сервлет) – это тип приложений Java, предназначенный для динамического формирования содержимого ответа на запрос клиента по сети.

Сервлеты расширяют функциональные возможности web-сервера.

Сервлеты часто называют web-компонентами, они выполняются в специальной среде исполнения, создаваемой контейнером сервлетов или web-контейнером (web-сервером).

Сервлеты инсталлируются в web-контейнерах, как часть web- приложений.

Web-приложения – набор ресурсов – html-страниц, изображений, мультимедиа, сервлетов, XML-файлов конфигурации, классов и библиотек поддержки Java и т.д.

Преимущества сервлетов.

Высокая производительность.

Сервлеты выполняются внутри адресного пространства web-сервера;

Работа сервлетов не зависит от платформы;

Диспетчер безопасности Java на сервере реализует серию ограничений для защиты ресурсов;

Сервлету доступны абсолютно все функциональные возможности библиотек классов Java.

Жизненный цикл сервлета.

Жизненный цикл сервлета определяют три основных метода: init(), service()и destroy() .

Они реализуются каждым сервлетом и вызывается сервером в определенное время.

1.Пользователь вводит в окне браузера URL-адрес.

Браузер генерирует HTTP-запрос и отправляет его на сервер.

2.Web-сервер принимает HTTP-запрос.

Сервер находит соответствие между запросом и конкретным сервлетом.

Если сервлет отсутствует в контейнере , то он динамически принимается и загружается в адресное пространство сервера (создается экземпляр класса сервлета), затем сервер вызывает метод init() сервлета.

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

За весь жизненный цикл метод init() вызывается только однажды.

3.Сервер вызывает метод service() сервлета.

Этот метод вызывается для обработки HTTP-запроса и формирования HTTP-отклика.

Сервлет остается в адресном пространстве и является доступным для обработки любых других HTTP-запросов.

Каждый запрос обрабатывается в своем отдельном потоке.

Метод service() вызывается для каждого запроса.

4.В случае если контейнеру необходимо удалить сервлет, он вызывает метод destroy() , который снимает сервлет из эксплуатации.

Подобно методу init() , этот метод тоже вызывается единожды за весь цикл сервлета.

Простой сервлет.

import java.io.*;

import javax.servlet.*;

public class SimpleServlet extends GenericServlet { public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException{ response.setContentType("text/html");

PrintWriter pw = response.getWriter();

pw.println("<h2>Hello!</h2>");

pw.close();

}} import javax.servlet.*;

Данный пакет содержит классы и интерфейсы, необходимые для создания сервлетов.

GenericServlet Данный класс обладает функциональными возможностями, упрощающими создание сервлета – необходимо переопределить только метод service().

public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException Метод service() имеет два аргумента.

Первым аргументом является объект ServletRequest , благодаря которому сервлет считывает данные, предоставленные в запросе клиента.

Вторым аргументом является объект ServletResponse .

С его помощью сервлет сможет сформировать отклик клиенту.

response.setContentType("text/html");

Метод setContentType() определяет тип MIME для HTTP-отклика.

Здесь типом MIME является text/html .

Он показывает, что браузеру необходимо интерпретировать содержимое в качестве исходного HTML- кода.

PrintWriter pw = response.getWriter();

Метод getWriter() получает PrintWriter .

Все, что будет передаваться в поток, будет посылаться клиенту как часть HTTP-отклика.

Метод println() используется для записи некоторого простого исходного HTML-кода в качестве HTTP-отклика.

Примечание.

По умолчанию кодировкой отклика является utf-8.

Метод setCharacterEncoding() позволит определить кодировку HTTP- отклика.

Для того, чтобы использовать в исходном HTML-коде кириллицу, достаточно вызвать response.setCharacterEncoding("Cp1251").

Компиляция сервлета.

Для того, чтобы скомпилировать исходный код сервлета в класс, необходим установленный на сервере комплект Java Development Kit.

http://java.sun.com/javaee/ http://tomcat.apache.org/download-55.cgi Также необходима среда разработки и исполнения сервлетов – контейнер сервлетов.

Например, сервер Apache Tomcat.

Стандартное размещение сервера Tomcat в Windows – C:\Program Files\Apache Software Foundation\Tomcat 5.5\ В каталоге C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\ хранится файл servlet-api.jar .

В этом файле содержатся классы и интерфейсы, необходимые для создания сервлетов.

Чтобы сделать этот файл доступным, необходимо определить переменную среды CLASSPATH следующим значением - C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar Также этот файл классов можно определить во время компиляции сервлетов.

Для примера простого сервлета это будет выглядеть следующим образом: javac SimpleServlet.java –classpath “C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar” Запуск сервлета.

После компиляции необходимо зарегистрировать полученный класс сервлета для сервера Tomcat.

Для удобства можно воспользоваться стандартными каталогами и файлами, которые Tomcat использует для своих собственных образцов сервлетов.

1.

Необходимо скопировать файл класса сервлета SimpleServlet.class в каталог C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\servlets-examples\WEB-INF\classes\ 2.

Необходимо добавить имя сервлета и отображение в дескриптор развертывания web.xml , который находится в каталоге C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\servlets- examples\WEB-INF\ В раздел, описывающий сервлеты, добавляются строки В раздел, определяющий преобразование сервлетов, добавляются строки <servlet> <servlet-name>SimpleServlet</servlet-name> <servlet-class>SimpleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SimpleServlet</servlet-name> <url-pattern>/servlet/SimpleServlet</url-pattern> </servlet-mapping> 3.

Для выполнения сервлета сервер Tomcat должен быть запущен.

В адресную строку web-браузера вводится следующий URL - http://localhost:8080/servlets- examples/servlet/SimpleServlet Обработка HTTP-запросов.

Класс HttpServlet предлагает специализированные методы, обрабатывающие различные типы HTTP-запросов.

<html> <head><title>html example</title></head> <body> <form action="http://localhost:8080/servlets- examples/servlet/ExGetServlet" method="get"> Ваше имя:<br/> <input type="text" name="name" size="20" value=""/><br/> Ваша фамилия:<br/> <input type="text" name="surname" size="20" value=""/><br/> <input type="submit" value="Отправить данные."/> </form> </body> </html> Html-страница import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class ExGetServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ String requestEnc = request.getCharacterEncoding();

if(requestEnc==null) requestEnc="ISO-8859-1";

String name = new String(request.getParameter("name").getBytes(requestEnc),"Cp12 51");

String surname = new String(request.getParameter("surname").getBytes(requestEnc),"C p1251");

response.setContentType("text/html");

response.setCharacterEncoding("Cp1251");

PrintWriter pw = response.getWriter();

pw.println("<b>Здравствуйте, "+name+" "+surname+"! Очень рады Вас видеть.</b>");

pw.close();

}} import javax.servlet.http.*;

Данный пакет содержит класс HttpServlet.

request.getCharacterEncoding();

Данный метод возвращает кодировку полученного HTTP-запроса.

getBytes(requestEnc) Данный метод преобразует строку в массив байт.

request.getParameter("name") Данный метод получает параметр из HTTP-запроса.

<html> <head><title>html example</title></head> <body> <form action="http://localhost:8080/servlets- examples/servlet/ExPostServlet" method="post"> Матрица:<br/> <input type="text" name="a11" size="5" value=""/> <input type="text" name="a12" size="5" value=""/> <input type="text" name="a13" size="5" value=""/><br/> <input type="text" name="a21" size="5" value=""/> <input type="text" name="a22" size="5" value=""/> <input type="text" name="a23" size="5" value=""/><br/> <input type="text" name="a31" size="5" value=""/> <input type="text" name="a32" size="5" value=""/> <input type="text" name="a33" size="5" value=""/><br/> <input type="submit" value="Посчитать определитель."/> </form> </body> </html> Html-страница import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class ExPostServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ int a11 = Integer.parseInt(request.getParameter("a11"));

int a12 = Integer.parseInt(request.getParameter("a12"));

int a13 = Integer.parseInt(request.getParameter("a13"));

int a21 = Integer.parseInt(request.getParameter("a21"));

int a22 = Integer.parseInt(request.getParameter("a22"));

int a23 = Integer.parseInt(request.getParameter("a23"));

int a31 = Integer.parseInt(request.getParameter("a31"));

int a32 = Integer.parseInt(request.getParameter("a32"));

int a33 = Integer.parseInt(request.getParameter("a33"));

response.setContentType("text/html");

response.setCharacterEncoding("Cp1251");

PrintWriter pw = response.getWriter();

int opred = a11*a22*a33-a11*a23*a32- a12*a21*a33+a12*a23*a31+a13*a21*a32-a13*a22*a31;

pw.println("<b>Определитель матрицы: "+opred+"</b>");

pw.close();

}} Массивы и файлы в Java на примере.

<html> <head><title>html month example</title></head> <body> <form action="http://localhost:8080/servlets- examples/servlet/MonthServlet" method="get"> Введите номер месяца (1-12):<br/> <input type="text" name="month" size="20" value=""/><br/> <input type="submit" value="Определить месяц."/> </form> </body> </html> import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class MonthServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ String name;

int i, days;

String mnames_in[] = {"Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август ","Сентябрь","Октябрь","Ноябрь","Декабрь"};

int mdays_in[] = {31,28,31,30,31,30,31,31,30,31,30,31};

OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream("month.txt"),"Cp1251");

PrintWriter out = new PrintWriter(fw);

for (i=0;i<12;i++) out.println(mnames_in[i]);

for (i=0;i<12;i++) out.println(mdays_in[i]);

out.close();

String mnames_out[] = new String[12];

int mdays_out[] = new int[12];

InputStreamReader fr = new InputStreamReader(new FileInputStream("month.txt"),"Cp1251");

BufferedReader in = new BufferedReader(fr);

String s;

for (i=0;i<12;i++) {s=in.readLine();mnames_out[i]=s;} for (i=0;i<12;i++) {s=in.readLine();mdays_out[i]=Integer.parseInt(s);} in.close();

int month = Integer.parseInt(request.getParameter("month"))-1;

name = mnames_out[month];

days = mdays_out[month];

response.setContentType("text/html");

response.setCharacterEncoding("Cp1251");

PrintWriter pw = response.getWriter();

pw.println("<h2>Месяц - "+name+".

Количество дней - "+days+".</h2>");
English     Русский Правила