≡ Student.Gomel.by
Контакты Порядок заказа Оплата Официально Репетитор Реклама на сайте Частые вопросы
Заказать курсовую работу в Гомеле
Без посредников
Умеренные цены
Качество и гарантии

Домашняя работа № 4

Часть 1. Введение в Servlet-Создание простых сервлетов

Сервлеты – это серверные программы, написанные на Java. В отличие от CGI-скриптов, код инициализации сервлета выполняется только один раз. Кроме того, отдельные потоки на сервере обрабатывают каждый клиентский запрос. Это предотвращает создание лишних процессов, увеличивая, таким образом, производительность сервера. При этом сервлеты наследуют все достоинства языка программирования Java. Например, подобно всем стандартным классам Java, сервлет не зависит от платформы и может использоваться в различных операционных системах. Также сервлет может пользоваться большими возможностями Java, такими как работа в сети, многопоточность, Java Database Connectivity (JDBC – Взаимодействие с базами данных на Java), и многими другими.

Итак, Servlet - это небольшая программа Java, которая работает в веб-сервере. Сервлеты получают и отвечают на запросы веб-клиентов, как правило, по протоколу HTTP, HyperText Transfer Protocol.

Сервлеты основные классы в любом веб-приложении, единственные классы, которые либо выполняют ответы на запросы или делегируют эту работу какому-либо другому элементу приложения в другой части приложения. Веб-контейнер, в котором вы запускаете ваше приложение будет иметь один или более сервлетов. Эти сервлеты управляют сервисами JavaServer Pages, показывающими списки каталогов и обеспечивая доступ к статическим ресурсам, таким как HTML-страниц и рисунки. Здесь попробуем написать и настроить пользовательские сервлеты, которые составляют приложение.

Каждый Servlet реализует интерфейс javax.servlet.Servlet, но, как правило, не напрямую. Servlet это простой интерфейс, содержащий методы для инициализации и уничтожения Servlet и обслуживания запросов. Тем не менее, метод service будет вызываться для любого запроса любого типа, даже если он не запрос HTTP (теоретически предполагается, что ваш веб-контейнер поддерживает такой запрос). Например, в будущем вполне возможно, что новые сервлеты могут быть добавлены в Java EE для поддержки файлов File Transfer Protocol (FTP). По этой причине, существуют различные классы сервлетов, которые вы можете расширять вместо этого. По состоянию на Java EE 7, только протокол Servlet поддерживается в настоящее время HTTP. Почти во всех случаях, сервлеты наследуют от javax.servlet.GenericServlet.

GenericServlet все еще независимый от протокола Servlet с одинственным абстрактный методом service, но она содержит несколько вспомогательных методы для регистрации и получения информации о приложении и configuration сервлета.

Для ответа на запросы HTTP, javax.servlet.http.HttpServlet расширяет (extends) GenericServlet и реализует метод service, чтобы принимать только запросы HTTP. Затем он обеспечивает пустые реализации для методов, соответствующих каждому типу метода HTTP.

Курсовые работы. Лабораторные работы
Обычно, ваши сервлеты всегда расширяют HttpServlet. Это обеспечивает поддержку всех средств, необходимых для приема запроса и формирования ответа на различные типы HTTP запросов, и его методы принимают аргументы javax.servlet.http.HttpServletRequest и javax.servlet.http.HttpServletResponse вместо javax.servlet.ServletRequest и javax.servlet.ServletResponse, чтобы у вас был легкий доступ к HTTP-специфическим атрибутам request. Вы должны будете начать с создания нового пустого сервлет, который расширяет HttpServlet и выглядит следующим образом:
import javax.servlet.http.HttpServlet;
public class HelloServlet extends HttpServlet
{
}

Начнем изучение с HelloWorld программы, использующей doGet метод. Прежде всего следует отметить, что все дальнейшие наши проекты будут выполняться в перспективе JavaEE и проект должен создаваться как Dynamic Web Project, для работы которого предназначен WEB - контейнер для выполнения сервлетов и JSP. Для разработки всех компонентов лабораторной работы целесообразно создать один проект Dynamic Web Project, например, Lab4, в котором будут размещаться различные элементы, начиная с сервлетов. Сервлеты размещаются в пакетах, находящихся в разделе Java Resourses/src. Точно также как и для других Java классов в src можно создавать пакеты для сервлетов. Более того, в одном пакете с сервлетами могут находиться другие классы. Итак, создаем проект, присваиваем ему имя и убеждаемся, что используется соответствующая Target Runtime.

Нажмите кнопку Next и в открывшемся окне еще раз нажмите кнопку Next, пропуская диалоговое окно Java Configure project for building a Java application, и появится окно Web Module Configure web module settings. В том окне установите флажок Generate web.xml deployment descriptor и нажмите кнопку Finish.

В результате выполненных шагов создается соответствующий проект со структурой каталогов, соответствующей Dynamic Web Project. После нажатия на расширители содержимое проекта будет выглядеть следующим образом:

Создадим пакет ifmo.ru.servlet. Для этого выделяем src и после нажатия на правую кнопку выбираем Package и вводим наименование пакета (ifmo.ru.servlet ) в поле Name открывшегося окна и нажимаем кнопку Finish.

Далее выделяем только что созданный пакет и для создания в нем сервлета после нажатия правой кнопки выбираем из конекстного меню New и Servlet, вводим в открывшемся диалоговом окне в поле Class name HelloServlet и нажимаем Next и еще раз Next. При этом открывается окно Create Servlet Specify modifiers, interfaces to implement, and method stubs to generate. В этом окне отметить заглушки для методов, как показано на рисунке ниже и нажать кнопку Finish.

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

port java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init() throws ServletException {
		System.out.println("Servlet " + this.getServletName() + " has started.");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("Servlet " + this.getServletName() + " has stopped.");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().println("Hello, World!");
	}

}
В составе метода doGet обратите внимание на команду
 response.getWriter().println("Hello, World!");

Это команда использует метод println() для объекта PrintWriter, который создается по команде response.getWriter(). Для выполнения сервлета HelloServlet выделите его и, нажав правую кнопку, выберите из контекстного меню Run As/Run on Server. В процессе запуска в диалоговом окне Run on Server Select which server to use следует выбрать соответствующий сервер (GlassFish 4) и нажать кнопку Finish для выполнения сервлета. В результате откроется встроенный браузер и будет выведено сообщение Hello, World! из сервлета HelloServlet .

Поздравляю, надеюсь, что сервлет отработал. При этом из метода init() было выведено сообщение в представление Console.

Это сообщение будет выведено лишь однажды, вне зависимости от того, сколько раз вы обращались к сервлету. Попробуйте... Метод destroy() выведет сообщение, если сервер, будет перезапущен. Попробуйте перегрузить север...(Выбрать сервер, нажать правую кнопку и Restart). Общая идея использования сервлетов состоит в том, что метод doGet и другие различные методы HTTP отображаются в методах request. Метод service класса Servlet, обслуживает все входящие запросы. В конечном счете, сервлет должен проанализировать и обработать данные входящего запроса на основе используемого протокола и затем вернуть response в соответствующем протоколе клиенту.

В частности, в протоколе HTTP, метод service должен проанализировать заголовки и параметры, которые посылает клиент, а затем вернуть правильный response HTTP, который, по крайнем мере, включает в себя минимальные заголовки HTTP (даже если само тело ответа пустое). На самом деле, реализация этой процедуры достаточно сложна, включает в себя много шагов и может отличаться от веб-контейнера к веб-контейнеру. Применение расширения HttpServlet состоит в том, что вам не придется беспокоиться о каких-либо деталях этих шагов. Хотя реальность такова, что метод service должен сделать много чего, прежде чем ответить пользователю, при том что разработчик, использующий HttpServlet, должен сделать совсем немного.

Для обработки запроса и ответа соответственно используются HttpServletRequest и HttpServletResponse. Эти аргументы в различных методах, определенных HttpServlet, позволяют вам читать параметры, передаваемые от клиента, принимать файлы, загружаемые из POST форм, читать сырые данные, содержащиеся в теле запроса (для таких работ используются запросы PUT или тело запроса JSON), читать и обрабатывать заголовки response, и писать содержимое ответа обратно клиенту. Существует много функций, которые можно выполнить во время обслуживания запроса, но в реальности обычно необходимо выполнить одну или несколько этих функций.

HttpServletRequest

Интерфейс HttpServletRequest является расширением ServletRequest, который обеспечивает дополнительную информацию по конкретному протоколу HTTP о принятом запросе. Он определяет десятки методов, которые можно использовать для получения сведений о запросе HTTP. Он также позволяет задавать атрибуты request. Получение параметров из Request

Параметры request принимаются в двух различных формах: через параметры request (также называемые параметрами URI), или в теле закодированного в application/form или multipart/form (как правило, называются post переменные или переменные form). Параметры запроса поддерживаются со всеми методами request и содержатся в первой строке данных в запросе HTTP, как показано в следующем примере:

GET /index.jsp?productId=9781118656464&category=Books HTTP/1.1
В этом примере имеется два параметра request, содержащиеся в запросе: productId, который определяет ISBN книги качестве значения и category, которые имеют значение Books. Эти же параметры также могут быть переданы в теле запроса, как POST переменные. POST переменные могут быть включены только в POST запросы. Рассмотрим следующий пример:
POST /index.jsp?returnTo=productPage HTTP/1.1
Host: www.example.com
Content-Length: 48
Content-Type: application/x-www-form-urlencoded
addToCart&productId=9781118656464&category=Books

Запрос POST выше содержит переменные POST (предписывающие сайту добавить книгу в корзину) и параметры запроса (предписывающие сайту вернуться на страницу productPage после выполнения задачи).

Хотя существует разница в доставке этих двух типов параметров, они по существу, одинаковы, и передают, в основном, ту же информацию. Servlet API не делает различий между двумя типами передачи параметров.

Метод getParameter возвращает одно значение параметра. Если параметр имеет несколько значений, getParameter возвращает первое значение, в то время как getParameterValues возвращает массив значений параметра. Если параметр имеет только одно значение, этот метод возвращает массив с одним элементом. Метод getParameterMap возвращает java.util.Map , содержащий все имена параметров с соответствующими их значениями, тогда как метод getParameterNames возвращает enumeration имен всех доступных параметров; оба являются полезными для перебора всех параметров request.

Определение информации о Request Content

Существует несколько методов, поддерживающих определение типа, длины и кодировки содержания HTTP запрос. Метод getContentType возвращает MIME тип содержимого запроса, например как application/x-www-form-urlencoded, application/json, text/plain, или application/zip. Тип содержимого MIME описывает, что данные, которые он отмечает, содержит несколько типов. Например, файлы ZIP архивов имеют тип содержимого MIME application/zip чтобы показать, что они содержат данные архива ZIP.

Методы getContentLength и getContentLengthLong возвращают количество байт в теле

запроса (длина содержимого), причем последний способ является полезным для запросов, содержание которых может превышать 2 гигабайта (необычно, но возможно). Метод getCharacterEncoding возвращает кодировку содержания запроса (например, UTF-8 или ISO-8859-1), когда запрос содержит контент символьного типа. (text/plain, application/json и application/x-www-form-urlencoded - некоторые примеры символьного типа контента MIME). Несмотря на то, эти методы могут пригодиться во многих ситуациях, ни один из них не являются обязательным, если вы получаете переменные POST в теле запроса, используя методы.

Чтение содержимого Request

Методы getInputStream, который возвращает javax.servlet.ServletInputStream, и getReader, который возвращает java.io.BufferedReader, могут быть использованы для чтения содержимого request. Какой из них лучше полностью зависит от контекста, в котором читается содержание request. Если ожидается, что содержимое - данные в символьной кодировке, такой как текст UTF-8 или ISO-8859-1, использование BufferedReader, как правило, самый простой способ, потому что он позволяет легко читать символьные данные. Если, однако, данные request в двоичной форме по природе, вы должны использовать ServletInputStream, поскольку таким образом можно получить доступ к содержимому request в байтовом формате. Никогда не следует использовать оба класса для одного request. После вызова любого метода, вызов другого приведет к исключению IllegalStateException.

Получение характеристик Request таких как URL, URI и Headers Они легко получаются из объекта request: getRequestURL: Возвращает полный URL, который клиент использовал, чтобы сделать запрос, в том числе протокол (HTTP или HTTPS), имя сервера, номер порта и путь на сервере, но не включая строку запроса.

getRequestURI: Немного отличается от getRequestURL в том, что он возвращает только часть пути URL.

getServletPath: Аналогично getRequestURI, и возвращает еще меньше чем в URL. Если request /hello-world/greeting?foo=world, приложение развертывается как /hello-world на сервере, и обращение к сервлету /greeting , то getServletPath возвращает только часть адреса, используемого для запуска сервлета: /greeting. getHeader: Возвращает значение заголовка с заданным именем. Вариант в заголовке не должен совпадать с вариантом строки, переданной в метод, так getHeader ("ContentType") может соответствовать заголовку Content-Type. Если существует несколько заголовков с тем же именем, он возвращает только первое значение. В таких случаях, лучше использовать метод getHeaderNames для возвращения enumeration всех значений.

getHeaderNames: Возвращает enumeration имен всех заголовков в запросе - отличный способ для перебора доступных заголовков. getIntHeader: Если у вас есть конкретный заголовок, который вы знаете, всегда число, его можно вызвать, чтобы возвращалось значение уже преобразованное в число. Он выбрасывает NumberFormatException, если заголовок не может быть преобразован в целое число.

getDateHeader: Вы можете вызвать его для возвращения (в миллисекундах) Unix timestampequivalent из значения заголовка, который представляет собой действительную метку. Метод выбрасывет IllegalArgumentException, если значение заголовка не распознается как тип Data.

Ниже представлен сервлет ShowRequestHeaders, демонстрирующий использование методов request для вывода клиенту некоторых заголовков. Попробуйте создатт, запустить и проанализировать вывод этого сервлета.


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ShowRequestHeaders
 */
@WebServlet("/ShowRequestHeaders")
public class ShowRequestHeaders extends HttpServlet { 
	
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException { 
		response.setContentType("text/html"); 
		PrintWriter out = response.getWriter(); 
		String title = "Servlet Example: Showing Request Headers"; 
		out.println("\n" + "

" + title +"

\n" + "Request Method: " + request.getMethod() + "
\n" + "Request URI: " + request.getRequestURI() + "
\n" + "Request Protocol: " + request.getProtocol() + "

\n" + "\n" + "\n" + "
Header NameHeader Value"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); out.println("
" + headerName); out.println(" " + request.getHeader(headerName)); } out.println("
\n"); } }

Использование HttpServletResponse

Как интерфейс HttpServletRequest расширяет ServletRequest и обеспечивает доступ к свойствам request HTTP-протокола, интерфейс HttpServletResponse расширяет ServletResponse и обеспечивает доступ к свойствам response протокола HTTP. Объект response используется, чтобы выполнить такие действия, как установку заголовков ответа, записать тело response, перенаправить request, установить код состояния HTTP, и отправить cookies сессии обратно клиенту.

Запись тела в Response

Главное, что можно сделать с объектом response, это записать содержимое в теле response. Это может быть HTML для отображения в браузере, изображение, которое браузер получает или содержимое файла, которое загружает клиент. Это может быть простой текст или двоичные данные. Это может быть просто несколько байтов, или это могут быть гигабайты данных.

Метод getOutputStream, который возвращает javax.servlet.ServletOutputStream, и метод getWriter, который возвращает java.io.PrintWriter - оба позволяют записывать данные в response. Как и его аналоги в HttpServletRequest, PrintWriter используется для возвращения HTML или какой-либо другого символьного значения в текстовой кодировке клиенту, потому что позволяет легко писать символьные строки в response. Для отправки двоичного файла данных клиенту вы должны использовать ServletOutputStream. Кроме того, также никогда не следует использовать оба getOutputStream и getWriter в для одного response. После вызова одного метода, вызов другого завершится с ошибкой IllegalStateException.

При записи в тело response, зачастую необходимо установить тип содержимого или кодировки. Вы можете сделать это методами SetContentType и setCharacterEncoding. Вы можете вызывать эти методы столько раз, сколько вам захочется, но устанавливает значение последний вызов метода. Однако, если вы планируете вызывать SetContentType и setCharacterEncoding вместе с getWriter, вы должны вызвать SetContentType и setCharacterEncoding до вызова getWriter, чтобы вернулся объект Writer, сконфигурированный с соответствующей кодировкой символов. Вызовы SetContentType и setCharacterEncoding, сделанные после метода getWriter игнорируются. Если вы не вызываете SetContentType и setCharacterEncoding перед вызовом getWriter, возвращается Writer, использующий кодировку контейнера по умолчанию.

Установка заголовков и других свойств Response

Обслуживая аналоги методов HTTPServletRequest, можно вызывать SetHeader, setIntHeader и setDateHeader для установки практически любого значения заголовка. Если существующие заголовки response уже включают в себя заголовок с указанным именем, то заголовок будет переписан. Чтобы избежать этого, вы можете использовать AddHeader, addIntHeader, или addDateHeader. Эти версии не отменяют существующие значения заголовка, но добавляют дополнительные значения для данных заголовков. Вы также можете вызвать getHeader, getHeaders, getHeaderNames и containsHeader для проверки установленных заголовков в response. Кроме того, вы можете использовать:

Еще один пример сервлета

Предположим, что необходимо создать сервлет, который принимает имя пользователя и выводит это имя пользователю.
Эту работу может вполне может выполнить сервлет следующего содержания:
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;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final String DEFAULT_USER = "Guest";      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		{
			String user = request.getParameter("user");
			if(user == null)
			user = HelloServlet.DEFAULT_USER;
			response.setContentType("text/html");
			response.setCharacterEncoding("UTF-8");
			PrintWriter writer = response.getWriter();
			writer.append("\r\n")
			.append("\r\n")
			.append(" \r\n")
			.append(" Hello User Application\r\n")
			.append(" \r\n")
			.append(" \r\n")
			.append(" Hello, ").append(user).append("!

\r\n") .append("
\r\n") .append(" Enter your name:
\r\n") .append("
\r\n") .append(" \r\n") .append("
\r\n") .append(" \r\n") .append("\r\n"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
Сервлет проверяет, входит ли параметр user в request, и, если это нет, он использует константу default_ USER вместо этого значения. Затем устанавливается тип содержимого response text/html и кодировку UTF-8. Он получает PrintWriter из response и записывает документ совместимый с HTML5 (обратите внимание на тип документа HTML5), в том числе приветствие Hello (теперь, направленное на конкретного пользователя) и форму для ввода и отправки вашего логина. Вы возможно удивитесь, как метод doGet может получить представление формы при метод типа для формы установлен POST. Это происходит с простой реализацией doPost, которая представлена ниже:
protected void doPost(HttpServletRequest request, HttpServletResponse 			response) throws ServletException, IOException {
		this.doGet(request, response);
	}
Эта реализация просто обращается к методу doGet. Мы уже обсуждали, что не важно что используется query parameter или post переменная для параметра с именем user, они изменяют приветствие. Для запуска сервлета выберите его указателем мыши, нажмите правую кнопку и из контекстного меню выберите Run As>Run on Server. Чтобы понять, что это Servlet может сделать, сначала необходимо добавить строку запроса user=Friend в URL, следующего вида http://localhost:8080/Lab4/HelloServlet?user=Friend. Экран должен измениться и вместо того, чтобы вывести “Hello, Guest!” он должен сказать “Hello, Friend!” В этом случае запрос обслуживается методом doGet, который нашел параметр user в строке запроса и выводит его к экран. Если вы введете имя в поле для ввода на странице, то аналогично отработает метод doPost и строка запроса очистится. Мы уже обсуждали, что сервер может принимать не только значение одного параметра. Вы также можете принять несколько значений параметров. Наиболее распространенным примером принятия нескольких значений параметров является набор связанных флажков (check boxes) на языке html, в котором пользователю предлагается отмечать одно или несколько значений. Такую возможность демонстрирует MultiValueParameterServlet, представленный ниже:
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;

/**
 * Servlet implementation class MultiValueParameterServlet
 */
@WebServlet("/MultiValueParameterServlet")
public class MultiValueParameterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public MultiValueParameterServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		PrintWriter writer = response.getWriter();
		writer.append("\r\n").append("\r\n").append(" \r\n")
				.append(" Hello User Application\r\n").append(" \r\n").append(" \r\n")
				.append(" 
\r\n") .append("Select the fruits you like to eat:
\r\n") .append("").append(" Banana
\r\n") .append("").append(" Apple
\r\n") .append("").append(" Orange
\r\n") .append("").append(" Guava
\r\n") .append("").append(" Kiwi
\r\n") .append("\r\n").append("
").append(" \r\n") .append("\r\n"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); String[] fruits = request.getParameterValues("fruit"); java.util.Map mass = request.getParameterMap(); java.util.Set iter = mass.keySet(); String massP[]; for (String p : iter) { writer.println(p); massP = mass.get(p); for (String i : massP) { writer.println(i); } } response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); writer.append("\r\n").append("\r\n").append(" \r\n") .append(" Hello User Application\r\n").append(" \r\n").append(" \r\n") .append("

Your Selections

\r\n"); if (fruits == null) writer.append(" You did not select any fruits.\r\n"); else { writer.append("
    \r\n"); for (String fruit : fruits) { writer.append("
  • ").append(fruit).append("
  • \r\n"); } writer.append("
\r\n"); } writer.append(" \r\n").append("\r\n"); } }
Представленный код MultiValueParameterServlet, использует набор check box. Также здесь демонстрируется фрагмент использующий метод request.getParameterMap(), который возвращает массив для каждого параметра. В данном случае единственного параметра fruit. Создайте в своем проекте такой сервлет и запустите его уже известным способом. Метод doGet в этот сервлет выводит простую форму с пятью флажками. Пользователю предлагается выбрать любое количество этих флажков и нажать кнопку Submit, которая обслуживается с помощью метода doPost. Этот метод получает все значения fruit и выводит их на экран с помощью маркированного списка. Попробуйте это путем выбора различных комбинаций флажков и нажав кнопку Submit. Следующий фрагмент кода выполняет аналогичные действия с использованием метода request.getParameterMap() и циклов, представляющих выбранные значения. Постановка следующей задачи: Используя простой сервлет разработать JavaEE приложение, которое вводит имя и пароль пользователя и выводит соответствующую информацию, в зависимости если введенные данные не соответствуют ожидаемым значениям, выводится сообщение Sorry! Invalid username and password. Если же введенные значения соответствуют ожидаемы, то выводится html-страница электронного магазина, содержащая список товаров для помещения в корзину. (Данные для формирования списка товаров могут быть получены из базы данных, но мы для простоты сформируем список в сервлете). Представляемые данные должны передаваться сервлету в строке URL с соответствующими именами, в частности: username -< Имя пользователя> password - <пароль> Эти значения могли бы быть ранее сохранены на сервере в базе данных или файле, но в нашем примере мы будем предполагать значения для имени - Michael, а для пароля - qwerty (Для простоты определены в тексте сервлета). Для решения поставленной задачи необходимо выполнить следующие шаги: 1. Создать новый проект, если еще нет 2. Разработать сервлет, который принимает данные от пользователя и выводит соответствующие сообщения. 3. Упаковать приложение и развернуть на сервере. 4. Протестировать работу приложения в браузере Создание нового проекта - выполняется аналогично Реализация сервлета 1. Для создания нового сервлета щелкните правой кнопкой мыши на проект Lab4, выберите пункт меню New/Other, укажите Web/Servlet и нажмите Next. Если в контекстном меню уже содержится пункт Servlet, то его можно сразу выбрать. 4. Укажите пакет (Java package), в котором будет размещен сервлет, пусть будет, например, ru.ifmo.javaee 5. Укажите имя класса сервлета (Class name) FirstServlet и нажмите Finish. как показано на рисунке ниже: В результате выполненных действий откроется окно редактирования, в котором будет подготовлен код сервлета, в который необходимо ввести утверждения Java, выполняющие действия, определенные в постановке задачи. Код представлен на рисунке ниже: В этом шаблоне описаны методы doPost и doGet, которые необходимо реализовать определением необходимой функциональности и будем вставлять код, например, в doPost метод, а поскольку те же самые действия необходимо выполнять при использовании метода GET протокола http, то в тексте метода doGet просто будем обращаться к методу doGet, используя утверждение doPost(request, response); Таким образом мы не ограничиваем клиента нашего сервера обращаться только по одному методу doPost(). Обратите внимание на выделенную аннотацию, которая также сгенерирована IDE Eclipse, что позволит нам в дальнейшем автоматически разворачивать сервлет на сервере GlassFish, практически, не прикладывая никаких усилий. В соответствии с постановкой задачи нам необходимо ввести из URL строки вызова значения name и password. В этой связи мы должны определить в тексте сервлета две переменных типа String, например, так: String username = request.getParameter("user"); String password = request.getParameter("password"); Здесь используется метод getParameter объекта request класса ServletRequest, который представляет запрос. Чтобы отправить символьные данные клиенту, нужно получить объект java.io.PrintWriter. Для этого можно использовать метод getWriter() интерфейса HttpServletResponse, например, следующим образом: PrintWriter out = response.getWriter(); Ввод этой команды может вызвать ошибку, поскольку не импортирован класс java.io.PrintWriter, содержащий метод getWriter. Эту ошибку можно исправить с помощью среды Eclipse следующим образом: Подведите указатель мыши к красному кресту и, нажав левую кнопку, выберите первый из предложенных вариантов исправления ошибки . В результате этой процедуры в сервлет будет помещен необходимый код для импорта класса java.io.PrintWriter и ошибка будет исправлена. Далее необходимо вывести пользователю нашего сервлета заголовок html-файла, для того, чтобы браузер был способен настроиться на интераретацию файла с соотетсвующем формате html. Код ниже выполняет необходимый вывод:
		out.println( "\n"
				 + "\n"
				 + "\n"
				 + " Online Shopping\n"
				 + "\n"
			 + "\n");
На этом предварительные действия в сервлете закончились и необходимо перейти к кодированию необходимой функциональности, связанной, как указано в постановке задачи, с проверкой имени и пароля и выдачей соответствующего сообщения в ответе (response) с использованием метода println уже использованного нами объекта out. Проверку имени и пароля можно выполнить следующими утверждениями:
int counter = 0;
if (username.equals("Michael") && password.equals("qwerty")) {
		pw.println(username + "Welcome to Online Shopping!" + "
"); counter = 0; /* Создание сеанса для пользователя и сохранение имени пользователя. */ HttpSession session = request.getSession(true); session.setAttribute("user", username); } else { pw.println("Sorry! Invalid username and password"); counter = 1; }
Смысл введенной переменной оператором int counter = 0; очевиден - в случае если входные атрибуты пользователя неверны, то для переменной counter устанавливается значение 1, и в зависимости от этого значения либо будут, либо не будут выполняться дополнительные действия в заключительном коде сервлета. Также очевидно, что дополнительные действия, связанные выводом зарегистрированному пользователю списка товаров в электронном магазине будут выполняться при правильно введенных значениях атрибутов и установленном в этом случае значении counter равным 0. Кроме того, в случае правильного задания атрибутов пользователя создается переменная с именем session объекта HttpSession с помощью метода getSession(true) объекта request. Сессия обеспечивает способ идентифицировать пользователя с более, чем одним запросом страницы или посещении веб-сайта и сохранением информации об этом пользователе. Сейчас эта установка нами не будет использована, однако будет использована в дальнейшем, и обратите внимание на простоту процедуры определения сессии, о которой мы будем говорить в дальнейшем. Для устранения возможной ошибки, связанной с отсутствием необходимых классов выполните описанные ранее действия, которые демонстрируются на рисунке ниже: Далее в сервлете необходимо реализовать код, который выводит (либо не выводит) содержимое товаров электронного магазина и необходимые элементы управления для выбора товаров в корзину. Ясно, что вывод сервлета должен представлять утверждения html, которые помещаются в ответ сервлета с помощью команд Java out.println. Код ниже выполняет необходимый вывод:
if (counter == 0) {
		/* Вывод данных пользователю. */
	out.println("
"); out.println("
"); out.println(""); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println(" "); out.println("
ITEM NO SHIRT TYPE BUY
1 PeterEngland
2 Excaliber
3 Vaun Newman
4 Wills Classic
"); out.println(""); out.println("
"); out.println(""); out.close(); }
Запишите файл на диск, нажав и на соответствующую иконку в инструментальной панели. Итак, мы завершили создание сервлета, который должен выполнять функциональность в соответствии с постановкой задачи. Код представлен ниже: Упаковка приложения и развертывание на сервере Без использования среды Eclipse нам пришлось бы заниматься этим этапом достаточное время, но у нас она есть и позволяет выполнить необходимые действия, если в меню Project установлена галочка в пункте Build Automatically. Наше приложение автоматически разворачивается (deploying) на сервере GlassFish, когда вы пытаетесь запустить его на сервере. Для запуска, установите указатель мыши на сервлет FirstServlet, нажмите правую кнопку, и из контекстного меню последовательно выберите Run As и Run on Server. Возможно вам будет предложено пройти и принять установки в некоторых диалоговых окнах, или ввести login/password администратора сервера, что приведет к запуску сервера GlassFish, развертыванию сервлета на сервере, обращению к сервлету и попытки выполнить запрос. Однако, в результате вы, скорее всего, получите окно от сервера с сообщением, которое представлено ниже: В процессе выполнения сервера произошла ошибка, связанная с попыткой обработать данные, которые по умолчанию не поступили на вход сервлета. Исправьте строку URL на http://localhost:8080/Servlet/FirstServlet?user=Michael&password=qwerty и повторите запрос к сервлету. Надеюсь, что в результате выполнения сервлета вы получите следующий экран: Обратиться к этому серверу удобнее, например, из файла html, который вводит идентификационные атрибуты и передает их для обработки сервлету на сервере GlassFish. Для того, чтобы включить в состав нашего проекта html-файл необходимо выполнить указателем мыши выделить либо проект либо WebContent в проекте, нажать правую кнопку и из контекстного меню последовательно выбрать New/HTML File, как показано на рисунке: Если в меню первого уровня не окажется пункта HTML File, то можно выбрать пункт Others... и откроется диалоговое окно, котором в разделе Web выберите HTML File. Далее согласитесь с предложенным местоположением файла WebContent, введите имя файла LoginFile.html и нажмите кнопку Finish. Откроется окно редактирования следующего вида: Добавьте в этой файл утверждения html, которые запрашивают атрибуты пользователя и вызывают наш сервлет FirstServlrt на локальном сервере localhost. Для это в тело этого файла необходимо вставить следующие утверждения:
Username:
Password:
Запишите файл на диск, нажав и на соответствующую иконку в инструментальной панели. Теперь можно выполнить этот файл на сервере, для чего выберите созданный файл LoginFile.html, нажмите правую кнопку и последовательно выберите Run As/Run on Server. В результате указанный файл оперативно разворачивается на сервере, выполняется и выводит на браузере форму для выполнения следующего вида: Введите затребованные атрибуты и нажмите кнопку Login и будет выведено соответствующее сообщение, например, такое: или такое: Дополнительные задания, демонстрирующие выгрузку и загрузку файлов на/из сервера с использованием сервлета 1. Настоящий сервлет FileDownloadServlet использует тип формы multipart/form-data для ввода указанного клиентом файла в html форме и размещает его в подкаталоге F:///glassfish4/glassfish/domains/domain1/UploadFile/ (Вы, естественно можете и должны создать или выбрать какой-либо другой подкаталог). Работает, начиная с 7-й версии JavaEE (GlassFish4) и позволяет на стороне клиента организовать процесс выбора файла из файловой системы клиента. Здесь используется метод getPart объекта request для получения ссылки на выбранный клиентом файл. Также приводится пример использования ряда методов filePart для вывода в консоль сервера данных, полученных от клиента. Попробуйте разобраться, задайте вопросы, запустить и отработать. Файл upload.html ниже:




File downloading

 

File downloading

Attachments


Файл сервлета FileDownloadServlet.java ниже:
package ifmo.ru;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet(name = "downloadServlet", urlPatterns = { "/download" })
@MultipartConfig(fileSizeThreshold = 5_242_880, // 5MB
maxFileSize = 20_971_520L, // 20MB
maxRequestSize = 41_943_040L // 40MB
)
public class FileDownloadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public FileDownloadServlet() {
		
	}

		protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Part filePart = request.getPart("file1");
		if (filePart != null) {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
			out.write("");
			this.processAttachment(filePart);
			out.write("File " + filePart.getName() + " uploaded successfully.");
			out.write("
"); } } private void processAttachment(Part fileItem) throws IOException { InputStream inputStream = fileItem.getInputStream(); System.out.println("getName " + fileItem.getName()); // file1 System.out.println("getContentType " + fileItem.getContentType()); System.out.println("getSubmittedFileName " + fileItem.getSubmittedFileName()); System.out.println("getSize " + fileItem.getSize()); System.out.println("getHeaderNames " + fileItem.getHeaderNames()); System.out.println("toString " + fileItem.toString()); String name = fileItem.getSubmittedFileName(); System.out.println("getSubmittedFileName>>>>>>>>" + name); int i = fileItem.getSubmittedFileName().lastIndexOf('\\'); String filename = name.substring(i + 1); System.out.println("Имя файла->>>>>>>>>>>>>>>>>" + filename); File file = new File( "F:///glassfish4/glassfish/domains/domain1/ UploadFile/" + filename); OutputStream to_file = new FileOutputStream(file); System.out.println("Absolute Path at server=" + file.getAbsolutePath()); int read; final byte[] bytes = new byte[1024]; while ((read = inputStream.read(bytes)) != -1) { to_file.write(bytes, 0, read); } to_file.close(); System.out.println("File uploaded from client successfully"); } }
2. Сервлет DownloadFileServlet, наоборот, предназначен для загрузки конкретного файла (здесь используется файл testing.txt, который размещается в том же подкаталоге, в который предыдущий сервлет загружал файлы). Естественно, можно использовать другой файл любого содержания. Попробуйте различные файлы размещать на сервере и загружать с помощью сервлета.
package ifmo.ru.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DownloadFileServlet
 */
@WebServlet("/DownloadFileServlet")
public class DownloadFileServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public DownloadFileServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// читаем входной файл из абсолютного пути
		String filePath = "F:/glassfish4/glassfish/domains/domain1/UploadFile/testing.txt";
		File downloadFile = new File(filePath);
		FileInputStream inStream = new FileInputStream(downloadFile);

		// если надо использовать относительный путь context root:
		String relativePath = getServletContext().getRealPath("");
		System.out.println("relativePath = " + relativePath);

		// получаем ServletContext
		ServletContext context = getServletContext();

		// получаем тип MIME файла
		String mimeType = context.getMimeType(filePath);
		if (mimeType == null) {
		// назначить двоичный тип, если отображение MIME не обнаружено
			mimeType = "application/octet-stream";
		}
		System.out.println("MIME type: " + mimeType);

		// модифицируем response
		response.setContentType(mimeType);
		response.setContentLength((int) downloadFile.length());

		// инициируем диалоговое окно для загрузки на клиерте
		String headerKey = "Content-Disposition";
		String headerValue = String.format("attachment; filename=\"%s\"",downloadFile.getName());
		System.out.println("headerKey = " + headerValue);
		response.setHeader(headerKey, headerValue);

		// получаем выходной поток для response
		OutputStream outStream = response.getOutputStream();

		byte[] buffer = new byte[4096];
		int bytesRead = -1;

		while ((bytesRead = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, bytesRead);
		}

		inStream.close();
		outStream.close();
		System.out.println("File downloaded to client successfully");
	}

}
После успешного выполнения первой части выполните вторую часть лабораторной работы, описанную ниже.

Часть 2. Разработка более сложного сервлета

Постановка задачи: Необходимо разработать веб-приложение, использующее сервлет для поиска информации о сотрудниках организации. Данные о сотрудниках хранятся в базе данных MySQLв таблице Employee. Для выполнения поиска пользователь указывает фамилию сотрудника, а сераер просматривает информацию о найденных сотрудниках (возможно существование нескольких сотрудников с одинаковыми фамилиями). Для решения поставленной задачи необходимо выполнить следующие шаги:
  1. Создать новый проект
  2. Создать таблицу employee и заполнить ее данными
  3. Разработать сервлет, который выбирает из БД записи, соответствующие запросу пользователя и отображает результат
  4. Упаковать приложение и развернуть на сервере
  5. Протестировать работу приложения в браузере

Подготовительный этап

Для реализации проекта необходимо установить и настроить Ecplise, GlassFish, (см. «Установка и настройка программного обеспечения»). Создание нового проекта с именем Lab4, если не создан. Создание таблицы employee и вставка тестовых данных Для дальнейшей работы необходимо конфигурировать проект для работы с базой данных MySQL и выполнить действия, описанные в файле Связь с MySQL, который находится по адресу http://aad.tpu.ru/Practice/Network%20Programming/%d0%a1%d0%b2%d1%8f%d0%b7%d1%8c%20%d1%81%20MySQL.doc. Проще говоря, для текущего проекта необходимо указать драйвер mysql-connector-java-5.1.26-bin.jar, что вы уже неоднократно делали, и который теперь также находится в каталоге http://aad.tpu.ru/Practice/Network%20Programming. Подключитесь к любой доступной вам БД MySQL (Вы можете использовать либо свою базу данных из практики, либо базу данных sakila, либо любую другую доступную. Я буду использовать БД business) , предварительно запустив сервер БД MySQL и выполните SQL-команды создания таблицы и введения в нее данных, которые представлены ниже: -- раскомментируйте следующую строку, если требуется пересоздать таблицу -- drop table employee; -- создание таблицы
create table employee(id integer, first_name varchar(20), last_name varchar(20), designation varchar(20), phone varchar(20));
--вставка тестовых данных
insert into employee values (1, 'Ivan', 'Ivanov', 'Manager', '211-22-33');
insert into employee values (2, 'Nikolay', 'Ivanov', 'Programmer', '233-44-55');
insert into employee values (3, 'Sergey', 'Petrov', 'System administrator', '212-34-56');
insert into employee values (4, 'Alexey', 'Petrov', 'Manager', '256-78-90');
insert into employee values (5, 'Vitaliy', 'Kuznetsov', 'Technician', '355-66-77');
-- выбрать все из таблицы для проверки select * from employee; Эти команды можно выполнить как с использованием WorkBench, так и с использованием представления Database Development IDE Eclipse. Используя IDE Eclipse, необходимо перейти в перспективу Database Development, и создать или выполнить соединение с базой данных в представлении Data Source Explorer, которая имеет примерно следующий вид: Выберите из представленных соединений, то которое вы собираетесь использовать в данной лабораторной работе и, нажав правую кнопку и из контекстного меню выберите пункт Connect. После успешного установления соединения откроется соответствующая база данных ( в моем случае business) и представление изменится следующим образом. На рисунке выше отмечен scrapbook, который следует активизировать для работы с базой данных, в результате чего откроется окно следующего вида: В данном окне последовательно необходимо из соответствующих полей со списками выбрать тип базы данных (MeSQL 5.1), имя соединения с базой данных (MySQL) и собственно базу данных (business), после чего представление примет следующий вид. В область редактирования scrapbook скопируйте SQL-команды и выполните их с использованием пункта контекстного меню, полученного после подведения указателя мыши в область редактирования и нажатия правой кнопки. При успешном выполнении в закладке Status представления SQL Result будут выведены исполненные команды. Для проверки правильности выполнения SQL команд можно еще раз исполнить команду, для чего подвести к ней указатель и из контекстного меню выбрать Execute Current Text.В закладке Result1 будет показан результат команды select. Реализация сервлета Прежде чем начать программировать сервлет, создадим обычный Java-класс Employee, который будет использоваться для представления и передачи данных о сотруднике. 1. Создайте новый Java-класс, нажав правой кнопкой мыши на проект Lab4 и выбрав пункт меню New/Class. Назовите класс Employee и разместите его в пакете ifmo.ru.data и нажмите кнопку Finish. . 2. В классе Employee создайте пять полей, соответствующих столбцам таблицы employee, добавьте конструкторы и набор get/set методов. Полный код класса Employee приведен ниже, но сделайте генерацию методов самостоятельно, используя нажатие правой кнопки в области окна редактирования и выбора из контекстного меню Source/Generate Setters/Getters:
package ifmo.ru.data;

import java.io.Serializable;

public class Employee implements Serializable {

	private Long id;
	private String firstName;
	private String lastName;
	private String designation;
	private String phone;
	
	public Employee() {}

	public Employee(Long id, String firstName, String lastName,
			String designation, String phone) {
		super();
		this.id = id;
		this.firstName = firstName;
		this.lastName = lastName;
		this.designation = designation;
		this.phone = phone;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getDesignation() {
		return designation;
	}

	public void setDesignation(String designation) {
		this.designation = designation;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}			
}
Теперь можно переходить к созданию сервлета. 3. Для создания нового сервлета щелкните правой кнопкой мыши на проект Lab4, выберите пункт меню New/Other, укажите Web/Servlet и нажмите Next. 4. Укажите пакет (Java package), в котором будет размещен сервлет, например, ru.ifmo.data 5. Укажите имя класса сервлета (Class name) EmployeeServlet и нажмите Finish. 6. Программный код сервлета приведен ниже. Основная бизнес логика сосредоточена в методе doGet(), который выполняется на сервере после того, как пользователь запустил сервлет на выполнение. Скопируйте код и сохраните сервлет, нажав Ctrl-S.
package ifmo.ru.data;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class EmployeeServlet
 */
@WebServlet("/EmployeeServlet")
public class EmployeeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public EmployeeServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    protected void doGet(HttpServletRequest request,
    		HttpServletResponse response) 
    throws ServletException, IOException {
       try {
    	response.setContentType("text/html;charset=UTF-8");
    	// Получение из http-запроса значения параметра lastname, null, если нет
    	String lastname = request.getParameter("lastname");

    	// Коллекция для хранения найденных сотрудников
    	ArrayList employees = new ArrayList();

    	// Загрузка драйвера БД Derby				
    Class.forName("com.mysql.jdbc.Driver").newInstance();

    	// Получение соединения с БД
    Connection con = DriverManager.getConnection(
    		"jdbc:mysql://localhost:3306/business", "root", "admin");

    	// Выполнение SQL-запроса
    	ResultSet rs = con.createStatement().executeQuery(
    	"Select id, first_name, last_name, designation, phone "
    	 + "From employee " + "Where last_name like '"
    	 + lastname + "'");
    	// Перечисление результатов запроса
    	while (rs.next()) {
    		// По каждой записи выборки формируется
    		// объект класса Employee.
    		// Значения свойств заполяются из полей записи
    		Employee emp = new Employee(
    rs.getLong(1), 
    rs.getString(2), 
    rs.getString(3), 
    rs.getString(4), 
    rs.getString(5));
    		// Добавление созданного объекта в коллекцию
    		employees.add(emp);
    	}
    	// Закрываем выборку и соединение с БД
    	rs.close();
    	con.close();

    	// Выводим информацию о найденных сотрудниках
    	PrintWriter out = response.getWriter();
    	out.println("Найденные сотрудники
"); for (Employee emp: employees) { out.print(emp.getFirstName() + " " + emp.getLastName() + " " + emp.getDesignation() + " " + emp.getPhone() + "
"); } } catch (Exception ex) { ex.printStackTrace(); throw new ServletException(ex); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
7. При создании сервлета с помощью мастера (как было описано выше), конфигурационный файл web.xml генерируется автоматически. Для просмотра/редактирования этого файла в окне Project Explorer дважды щелкните на элемент Lab4/Web Content/WEB-INF/web.xml и появится окно редактирования В редакторе Web XML Editor не представлена конфигурация Servlets, поскольку мы используем аннотацию для описания сервлета в частности, @WebServlet("/EmployeeServlet") конфигурирует сервлет, к которому следует обращаться по ссылке /EmployeeServlet 8. Содержимое файла web.xml также можно просмотреть в виде исходного XML-документа. Для этого следует выбрать закладку Source в нижней части окна редактора: Подготовка, сборка, развертывание и тестирование приложения 1. Перед запуском сервлета необходимо выполнить копирование драйвера MySQL в окружение сервера, который по умолчанию не поддерживает работу с базой данных MySQL. Для этого, прежде всего, следует убедиться, что сервер GlassFish остановлен. Если сервер работает, то его можно остановить из представления Servers, выделив работающий сервер, нажав на правую кнопку, и выбрав из контекстного меню пункт Stop. После остановки необходимо скопировать используемый нами драйвер mysql-connector-java-5.1.26-bin.jar в подкаталог $glassfish_install_folder\glassfish\lib - например, в C:\glassfish4\glassfish\lib. После копирования можно запустить сервер, выбрав из контекстного меню пункт Start. 2. Проверьте, чтобы в пункте меню Project|Build Automatically была установлен «флажок», означающий, что автоматически выполняется компиляция исходных файлов и упаковка приложения. Eclipse в случае успешной сборки проекта автоматически выполняет и развертывание приложения на сервере. Также помним, что сервер баз данных MySQL запущен. 3. Для проверки работоспособности выберите в проекте Lab4 файл сервлета EmployeeSerbvlet, и, нажав правую кнопку из контекстного меню последовательно выберите Run As и затем Run on Server, после чего откроется диалоговое окно выбора сервера для развертывания и проверки работы сервлета, в котором следует выбрать соответствующий сервер GlassFish и нажать кнопку Finish: 3. В зависимости от установок IDE Eclipse в меню Windows|Preferences|General|Web Browser, откроется браузер, в котором произойдет обращение к сервлету EmployeeServlet и в результате выполнения сервлета на сервера будет выведена единственная строка заголовка «Найденные сотрудники». Скорректируйте ссылку на http://localhost:8080/Lab4/EmployeeServlet?lastname=Ivanov. Обратите внимание, что в запросе выполняется обращение к сервлету и передается параметр lastname со значением Ivanov. Результат работы серверной программы изменится и вы сможете наблюдать результаты выполнения запроса.
Реклама
Тренировки по джиу-джитсу и самозащите в Гомеле
Реклама
Репетиторы по различным предметам.
Контрольные C++
Контрольные и лабораторные на С++ разнообразны и также усложняются с включением объектно-ориентированного подхода программирования.
WinAPI (ToolHelp32 API)
Общее название функций, которые встроены в Windows. Изначально они были доступна только программистам Microsoft. А теперь их описание можно взять из справки MAPI Programmer's Reference.
Контакты Порядок заказа Оплата Информатика
Официально Репетитор Реклама на сайте Частые вопросы
Новости Университеты Скачать Без посредников
Право Экономика Java Haskell

2007 - 2023 Гомель

ИП Тяжкороб Д.В. УНП 490520112

Заказать лабораторную работу на СИ в Гомеле