Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 конспект лекций ООП Java.doc
Скачиваний:
28
Добавлен:
03.05.2015
Размер:
962.05 Кб
Скачать

2. Библиотека стандартаJava_ee

Согласно заявлению SunMicrosystems, на настоящий момент более 90% корпоративных систем поддерживают Java 2 Enterprise Edition. Эта платформа позволяет быстро и без особых издержек объединить возможности сети Интернет и корпоративных информационных систем.

Сервлеты – это компоненты приложений Java 2 Platform Enterprise Edition (J2EE), выполняющиеся на стороне сервера, способные обрабатывать клиентские запросы и динамически генерировать ответы на них. Наибольшее распространение получили сервлеты, обрабатывающие клиентские запросы по протоколу HTTP.

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

Преимуществом сервлетов перед CGI или ASP можно считать быстродействие и то, что сервлеты, являющиеся переносимыми на различные платформы, пишутся на объектно-ориентированном языке высокого уровня Java, который расширяется большим числом классов и программных интерфейсов.

В настоящее время сервлеты поддерживаются большинством Web-серверов и являются частью платформы J2EE.

Все сервлеты реализуют общий интерфейс Servlet. Для обработки HTTP-запросов можно воспользоваться в качестве базового класса абстрактным классом HttpServlet. Базовая часть классов JSDK помещена в пакет javax.servlet. Однако класс HttpServlet и все, что с ним связано, располагаются на один уровень ниже в пакете javax.servlet.http.

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

Первым вызывается метод init(). Он дает сервлету возможность инициализировать данные и подготовиться для обработки запросов. Чаще всего в этом методе программисты помещают код, кэширующий данные фазы инициализации.

После этого сервлет можно считать запущенным, он находится в ожидании запросов от клиентов. Появившийся запрос обслуживается методом service()сервлета, а все параметры запроса упаковываются в объектServletRequest, который передается в качестве первого параметра методуservice(). Второй параметр метода – объектServletResponse. В этот объект упаковываются выходные данные в процессе формирования ответа клиенту. Каждый новый запрос приводит к новому вызову методаservice(). В соответствии со спецификацией JSDK, методservice()должен уметь обрабатывать сразу несколько запросов, т.е. быть синхронизирован для выполнения в многопоточных средах. Если же нужно избежать множественных запросов, сервлет должен реализовать интерфейсSingleThreadModel, который не содержит ни одного метода и только указывает серверу об однопоточной природе сервлета. При обращении к такому сервлету каждый новый запрос будет ожидать в очереди, пока не завершится обработка предыдущего запроса.

После завершения выполнения сервлета контейнер сервлетов вызывает метод destroy(), в теле которого следует помещать код освобождения занятых сервлетом ресурсов.

Интерфейсом Servletпредусмотрена реализация еще двух методов:getServletConfig()иgetServletInfo(). Первый возвращает объект типаServletConfig, содержащий параметры конфигурации сервлета, а второй – строку, описывающую назначение сервлета.

При разработке сервлетов в качестве базового класса в большинстве случаев используют не интерфейс Servlet, а класс HttpServlet, отвечающий за обработку запросов HTTP.

Класс HttpServletимеет реализованный методservice(), служащий диспетчером для других методов, каждый из которых обрабатывает методы доступа к ресурсам. В спецификации HTTPопределены следующие методы:GET, HEAD, POST, PUT, DELETE, OPTIONSиTRACE. Наиболее часто употребляются методыGETиPOST, с помощью которых на сервер передаются запросы, а также параметры для их выполнения.

При использовании метода GET (по умолчанию) параметры передаются как часть URL, значения могут выбираться из полей формы или передаваться непосредственно через URL. При этом запросы кэшируются и имеют ограничения на размер. При использовании метода POST (method=POST) параметры(поля формы) передаются в содержимом HTTP-запроса и упакованы согласно полю заголовкаContent-Type. По умолчанию в формате:<имя>=<значение>&<имя>=<значение>&...

Однако форматы упаковки параметров могут быть самые разные, например: в случае передачи файлов с использованием формы

enctype="multipart/form-data".

В задачу метода service()классаHttpServletвходит анализ полученного через запрос метода доступа к ресурсам и вызов метода, имя которого сходно с названием метода доступа к ресурсам, но перед именем добавляется префиксdo:doGet() или doPost(). Кроме этих методов могут использоваться методы:doHead(), doPut(), doDelete(), doOptions()иdoTrace(). Разработчик должен переопределить нужный метод, разместив в нем функциональную логику.

В следующем примере приведен готовый к выполнению “шаблон” сервлета:

// пример # 1 : шаблон сервлета : MyServlet.java

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {

/**  Constructor of the object.    */

     public MyServlet() {

          super();

     }

/** Destruction of the servlet. */

     public void destroy() {

super.destroy(); // Just puts "destroy" string in log

          // Put your code here

     }

/** The doDelete method of the servlet.

 * This method is called when a HTTP delete request is received.

 * @param request the request send by the client to the erver

 * @param response the response send by the server to the client

 * @throws ServletException if an error occurred

 * @throws IOException if an error occurred */

     public void doDelete(HttpServletRequest request,

                HttpServletResponse response)

          throws ServletException, IOException {

          // Put your code here

     }

/** The doGet method of the servlet.

* This method is called when a form has its tag value method equals to get.

 * @param request the request send by the client to the server

 * @param response the response send by the server to the client

 * @throws ServletException or @throws IOException if an error occurred  */

     public void doGet(HttpServletRequest request, HttpServletRe-sponse response)

      throws ServletException, IOException {

          response.setContentType("text/html");

          this.preventCaching(request, response);

          PrintWriter out = response.getWriter();

          out.println( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

          out.println("<HTML><HEAD>");

     out.println("<TITLE>A Servlet in GET</TITLE>");

          out.println("</HEAD><BODY>");

          out.print("    This is <B>");

          out.print(this.getClass().getName());

out.println("</B>, using the <B>GET</B> method<BR>");

          out.println("</BODY></HTML>");

          out.flush();

          out.close();

     }

/** The doPost method of the servlet.

 * This method is called when a form has its tag value method equals to post.  

 * @param request the request send by the client to the server

 * @param response the response send by the server to the client

 * @throws ServletException or @throws IOException if an error occurred */

     public void doPost(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

          response.setContentType("text/html");

          this.preventCaching(request, response);

          PrintWriter out = response.getWriter();

          out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

          out.println("<HTML><HEAD>");

     out.println("<TITLE>A Servlet in POST</TITLE>");

          out.println("</HEAD><BODY>");

          out.print("This is <B>");

          out.print(this.getClass().getName());

out.println("</B>, using the <B>POST</B> method");

          out.println("</BODY></HTML>");

          out.flush();

          out.close();

     }

/** The doPut method of the servlet.

 * This method is called when a HTTP put request is received.

 * @param request the request send by the client to the server

 * @param response the response send by the server to the client

 * @throws ServletException or @throws IOException if an error occurred */

     public void doPut(HttpServletRequest request,            HttpServletResponse response)

          throws ServletException, IOException {

          // Put your code here

     }

/** Returns information about the servlet, such as

 * author, version, and copyright.

 * @return String information about this servlet */

     public String getServletInfo() {

     return "This is my default servlet created by Eclipse";

     }

/* Initilaisation of the servlet.

 * @throws ServletException if an error occure */

     public void init() throws ServletException {

          // Put your code here

     }

/** Prevents navigator from caching data.

 * @param request the request send by the client to the server

 * @param response the response send by the server to the client

 */

     protected void preventCaching(HttpServletRequest request,HttpServletResponse response) {

/* see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html */

          String protocol = request.getProtocol();

if("HTTP/1.0".equalsIgnoreCase(protocol)) {

          response.setHeader("Pragma", "no-cache");

} else if ("HTTP/1.1".equalsIgnoreCase(protocol)) {

     response.setHeader("Cache-Control", "no-cache");

                }

          response.setDateHeader("Expires", 0);

     }

}

Практика включения HTML-кода в код сервлета не считается хорошей, так как эти действия “уводят” сервлет от его основной роли – контроллера приложения. Это приводит к разрастанию размеров сервлета, которое на определенном этапе становится неконтролируемым и реализует вследствие этого анти-шаблон “Волшебный сервлет”. Даже приведенный выше маленький сервлет имеет признаки анти-шаблона, так как содержит методprint(), используемый для формирования кодаHTML. Сервлет должен использоваться только для реализации бизнес-логики приложения и обязан быть отделен как от непосредственного формирования ответа на запрос, так и от данных, необходимых для этого. Обычно для формирования ответа на запрос применяются страницыJSP. Признаки наличия анти-шаблонов все же будут встречаться ниже, но это отступление сделано только с точки зрения компактности примеров.

Веб-серверTomcatи запускweb-приложений

Сервер ApacheTomcatприменяется в качестве обработчика страницJSPи сервлетов. Последняя версия может быть загружена с сайтаjakarta.apache.org.

Ниже приведены необходимые действия по выполнению сервлета из предыдущего примера с помощью контейнера сервлетов Web-сервера Tomcat 4.1. Пусть Web-сервер установлен в каталоге /Apache Group/Tomcat4.1.В этом же каталоге разместятся следующие подкаталоги:

            /bin – содержит startup, shutdown и другие исполняемые файлы;

            /conf– содержит конфигурационные файлы, в частности конфигурационный файл контейнера сервлетовserver.xml;

            /server– помещаются классы;

            /logs– помещаютсяlog-файлы;

            /webapps – в этот каталог помещаются папки, содержащие сервлеты и другие компоненты приложения.

Пусть необходимо поместить в каталог /webapps папку /FirstProject с вложенным в нее сервлетомFirstServletиопределить, что требуется поместить в эту папку. Папка /FirstProject должна содержать каталог /WEB-INF, в котором помещаются подкаталоги:

/classes– содержит класс сервлетаFirstServlet.class;

/lib– содержит библиотеки классов (если они есть), упакованные вJAR-файлы (архивыjava);

/src– содержит исходный файл сервлетаFirstServlet.java;

а также web.xml– конфигурационный файл приложения.

В файле web.xmlнеобходимо прописать имя и путь к сервлету. Этот файл можно сконфигурировать так, что имя сервлета в браузере не будет совпадать с истинным именем сервлета. Например:

<web-app>

<servlet>

  <servlet-name>FirstServletname</servlet-name>

  <display-name>FirstServletdisplay</display-name>

  <servlet-class>test.com.FirstServlet

</servlet-class>

</servlet>

<servlet-mapping>

  <servlet-name>FirstServletname</servlet-name>

  <url-pattern>/Servtest</url-pattern>

</servlet-mapping>

</web-app>

Здесь указано имя сервлета FirstServletname, имя класса сервлета FirstServlet.class, URL-имя сервлета, по которому происходит его вызов Servtest.

Таким образом, требуется выполнить следующие действия:

1.      Компиляцию сервлета: javac FirstServlet.java;

2.      Полученный файл класса FirstServlet.class поместить в папку /FirstProject/WEB-INF/classes/test/com;

3.      В эту же папку /FirstProject/WEB-INF поместить файл конфигурации web.xml;

4.      Переместить папку /FirstProject в каталог /webapps сервера Tomcat;

5.      Стартовать Tomcat;

6.      Вызвать браузер и набрать  строку:

http://localhost:8084/FirstProject/Servtest

Обратите внимание на указание порта по которому идёт обращение, в данном случае сервер настроен на порт 8084 (по умолчанию при установке Tomcat предлагается 8080)

7.      Если вызывать сервлет из index.html, то тег FORM должен выглядеть следующим образом:

            <FORM action="Servtest" >

                        <INPUT type="submit” value="Execute">

            </FORM>

Файл index.html помещается в папку /webapps/FirstProject и в браузере набирается строка:

http://localhost:8080/FirstProject/index.html

Сервлет будет вызван из HTML-документа поURL-имениFirstServletname.

Рис XX- Форма вызова сервлета

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]