ЛАБОРАТОРНАЯ РАБОТА 4 ПРОГРАММИРОВАНИЕ И

advertisement
ЛАБОРАТОРНАЯ РАБОТА 4
ПРОГРАММИРОВАНИЕ И ИСПОЛЬЗОВАНИЕ
XML WEB-СЕРВИСОВ
1. Цель работы
Целью работы является изучение программирования поставщиков и клиентов Webсервисов.
2. Задачи
Задачами лабораторной работы являются овладение навыками программирования
Web-сервисов на различных платформах, построения WSDL-описаний сервисов в
автоматизированном режиме, разработки приложений, использующих веб-сервисы в
качестве поставщиков данных.
3. Теоретическая часть
Веб-сервисы. Наиболее просто веб-сервис представить как интерфейс в глобальную
сеть для некоторого абстрактного программного обеспечения. Этот интерфейс позволяет
фактически абсолютно прозрачно выполнять какие-то функции, возложенные на это
программное обеспечение на удаленном компьютере. Например, на удаленном
компьютере находится база данных, например, аэрофлота, и веб-сервис по запросу может
позволить получить данные обо всех изменениях в расписании полетов.
Веб-сервисы, как таковые, предназначались быть программными, а не визуальными
интерактивными решениями (т. е. они предназначались для применения в рамках
концепции программа–программа, а не человек–программа). Поэтому они не имеют
специального пользовательского интерфейса. Однако благодаря наличию веб-методов они
могут в реальном времени предоставлять информацию о чем угодно. Одним словом, вебсервис предоставляет услуги другим приложениям, причем последние могут быть любого
типа, как веб-приложениями, так и обычными приложениями с графическим
интерфейсом.
Иными словами, каждый Web-сервис – это удаленная функция, к которой можно
обратиться через Web, передав некоторый набор входных параметров и получив в ответ
выходные значения. То есть если Web-приложение предназначено для организации
пользовательского интерфейса к системе через Web-браузер, то Web-сервис нужен для
программного доступа со стороны других приложений с использованием Интернетпротоколов.
Технология веб-сервисов стандартизована, для нее разработана соответствующая
спецификация корпорации W3C. Согласно приведенному в ней определению, вебсервисом называется программная система, идентифицируемая строкой URI, чьи
публичные интерфейсы и привязки определены и описаны посредством XML.
В целом разработка Web-сервиса гораздо проще, чем Web-приложения, как раз
потому, что у него нет пользовательского интерфейса, а есть одна или несколько входных
точек внешнего доступа. На практике мы часто используем термин «сервисориентированное приложение», имея при этом в виду взаимосвязанный набор Webфункций, позволяющий внешней системе реализовать выполнение на их основе
достаточно сложных прикладных задач.
Структура веб-сервисов. Веб-сервисы базируются на применении открытых,
утверждаемых консорциумом IT-сообщества стандартах и протоколах, ключевыми из
которых являются следующие:
– SOAP (Simple Object Access Protocol) — протокол доступа к простым объектам, т. е.
механизм для передачи информации между уделенными объектами на базе протокола
HTTP и некоторых других Интернет-протоколов;
1
– WSDL (Web Services Description Language) — язык описания веб-сервисов;
– UDDI (Universal Description, Discovery and Integration) — универсальное описание,
обнаружение и интеграция, упрощенного говоря, протокол поиска ресурсов в Интернет.
SOAP. Базовым протоколом, обеспечивающим взаимодействие в среде веб-сервисов,
является протокол SOAP (Simple Object Access Protocol). Он позволяет приложениям
взаимодействовать между собой через Internet, используя для этого XML-документы,
называемые сообщениями SOAP.
Сообщение SOAP содержит конверт, который описывает содержимое,
предполагаемого получателя сообщения и требования к обработке сообщения. SOAPсообщения представляет собой иерархическую структуру вложенных XML-элементов
(или узлов): SOAPMessage, SOAPPart, SOAPEnvelope, SOAPHeader, SOAPBody и
содержимое передаваемого сообщения в формате XML (XML content).
UDDI. Спецификация UDDI (UDDI (Universal Description, Discovery and Integration –
универсальное описание, расположение и интеграция)) описывает базирующийся на
протоколе SOAP веб-сервис, в задачи которого входит определение местоположения и
описание протокола взаимодействия любого веб-сервиса. По сути, это каталог доступных
веб-сервисов.
WSDL. После того как нужный веб-сервис найден в одном из каталогов UDDI, нужна
информация о том, как собственно обратиться к веб-сервису и какие конкретно условия
или правила необходимо соблюсти, чтобы сделать это правильно. Для этого используется
WSDL (Web Service Description Language – язык описания веб-сервиса), который
предназначен, как и следует из его названия, для описания веб-сервисом своих
возможностей, своего интерфейса и некоторых метаданных предназначенных для
использования теми, кто будет использовать этот веб-сервис.
Описание веб-сервиса на языке WSDL содержит описание функций этого сервиса,
кому этот сервис принадлежит (компания, адрес и другие данные), формальное описание
процесса вызова функций. Это описание полностью самодостаточно и позволяет
использовать веб-сервис, пользуясь только этой информацией.
Схема работы веб-сервиса. В общем виде схему взаимодействия клиента с вебсервисом можно представить следующим образом (рис. 1).
Запрос
WSDL-интерфейс
Поставщик сервиса
SOAP
Ответ
WSDL-интерфейс
Получатель сервиса
Рисунок 1 – Схема работы веб-сервиса
Под «запросом» подразумевается вызов метода (процедуры, функции), под «ответом» –
результат выполнения вызванного метода.
Веб-сервисы в ASP.NET. Создание веб-службы ASP.NET похоже на создание вебстраницы. Платформа .NET предоставляет оболочку WebMethods, которая позволяет
преобразовывать SOAP-сообщения в классы .NET. В результате веб-методы, объявляемые
в веб-сервисе, почти не отличаются от функций, которые программируются при
разработке веб-форм.
Однако есть ряд требований, которыми следует руководствоваться при разработке
ASP.NET веб-сервисов. Во-первых, файл веб-сервиса должен иметь расширение asmx. Вовторых, файл веб-сервиса должен начинаться с директивы WebService. В-третьих, метод,
вызываемый через веб, должен иметь атрибут WebMethod. Это делается путем
2
аннотирования методов атрибутом [WebMethod], находящемся в пространстве имен
System.Web.Services.
Среда Microsoft Visual Studio, в которой традиционно создаются как веб-приложения, так
и веб-сервисы, позволяет максимально автоматизировать процесс разработки веб-сервиса.
Достаточно создать новое веб-приложение и выбрать его тип (ASP.NET Web Services).
Кроме того, Visual Studio позволяет протестировать веб-сервис. Для его отображения
используется файл DefaultWsdlHelpGenerator.aspx, размещенный в системной папке
CONFIG.
Использование Visual Studio также упрощает разработку клиентов веб-сервисов. Для этого
к Windows- или веб-приложению нужно добавить веб-ссылку на сервис. При этом
необязательно знать точный URL-адрес сервиса – Visual Studio предоставляет UDDIинтерфейс для поиска доступных веб-сервисов.
Веб-сервисы в PHP. Наиболее распространенными способами создания и использования
веб-сервисов в PHP являются библиотека NuSOAP и PHP-расширение SOAP Extension. В
лабораторной работе предлагается использовать первый из них.
NuSOAP – представляет из себя набор PHP-классов, позволяющих разработчикам
создавать и использовать веб-сервисы на SOAP. NuSOAP может также генерировать
WSDL-описание веб-сервиса и использовать его., поддерживает различные виды сервисов
(rpc/encoded и document/literal). В то же время необходимо учитывать, что поддержка
SOAP и WSDL в NuSOAP реализована не полностью по сравнению с другими
реализациями, например, .NET или Apache Axis.
Для использования NuSOAP достаточно скачать его (например, с официального сайта
SourceForge), а потом разместить копию файла nusoap.php в дерево своей программы,
чтобы можно было подключать ее в PHP-код.
Ключевым классом, который используется при создании веб-сервиса, является
soap_server. Методы сервиса представляют собой обычные PHP-функции, которые с
помощью метода register преобразуются в веб-методы веб-сервиса.
NuSOAP предоставляет несколько возможностей, полезных для отладки веб-сервиса. В
NuSOAP при отладке можно просмотреть посланный запрос и ответ сервера. Класс
soapclient содержит атрибуты request и response, которые позволяют отобразить
соответственно запрос и ответ.
Кроме того, NuSOAP позволяет автоматически генерировать WSDL для сервиса,
используя дополнительные аттрибуты и методы класса soap_server. Информация о сервисе
указывается при помощи метода configureWSDL. Информация о каждом методе
определяется указанием дополнительных параметров методу register.
Для создания клиента веб-сервиса используется класс soapclient, в качестве параметра
которому передается URL-адрес сервиса. Вызов веб-метода выполняется с помощью
метода call того же класса soapclient.
Веб-сервисы в JSP. Разработка Web-сервисов в JSP основана на создании Java-классов,
реализующих ту функциональность, которая должен предоставлять веб-сервис. Каждая
функция, определенная в составе Java-класса представляет собой веб-метод веб-службы.
В лабораторной работе программирование JSP-приложений выполняется с помощью
визуальной среды Eclipse Europe. Для программирования веб-сервисов эта среда
предоставляет полезный инструментарий – мастер Web Service. Он позволяет оформить
Java-класс в виде веб-службы, в частности, автоматически генерирует ее WSDL-описание.
При разработке JSP-клиента Web-сервиса достаточно разместить WSDL-файл вебслужбы в каталоге с приложением. Файлы клиента сервиса нужно представить в форме
объектов Web Service Client. В результате будет сгенерирован прокси-класс,
соответствующий веб-сервису, и переносящий его функциональность в клиентское
приложение.
3
Вариант А. Технология ASP.NET и СУБД Microsoft SQL Server
1. Программирование Web-сервиса
1. Создать новый Web-сервис:
Пуск | Microsoft Visual Studio 2005 | Microsoft Visual Studio 2005
ф. Microsoft Visual Studio | File → New → Web Site… → ф. New Web Site → Visual Studio Installed
Templates → выбр. ASP.NET Web Service →
Location → выбр. HTTP → http://имя_сервера(например, localhost)/WebService
Language → выбр. Visual C#
2. Открыть вкладку (если она не открылась автоматически) App_Code/Service.cs. Установить
курсов в программный код, отображенный на экране.
3. Добавить подключение библиотек для работы с базами данных (System.Data,
System.Data.SqlTypes и System.Data.SqlClient) и обработки XML-данных (System.Xml):
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using System.Xml;
4. Создать новый Web-метод GetFaculty, возвращающий в XML-формате список факультетов,
полученный в результате запроса к базе данных:
[WebMethod]
public DataSet GetFaculty()
{
}
Весь последующий код из этого пункта вводить между открывающей и закрывающей угловыми
скобками.
4.1 Создать строковую переменную sql и занести в нее SQL-код запроса к базе данных:
string sql = "select '0' as id, 'Выбор факультета...' as name from Faculty union select * from Faculty";
4.2 Установить соединение с базой данных. Для этого создать экземпляр класса SqlConnection, а
конструктору этого класса в качестве параметра передать параметры соединения с базой данных
University:
SqlConnection conn = new SqlConnection("Data Source=имя_сервера;Initial
Catalog=University;Integrated Security=True");
4.3 Открыть соединение с помощью метода Open:
conn.Open();
4.4 Создать новый набор данных (экземпляр класса DataSet). Присвоить набору данных название
Faculty:
DataSet ds = new DataSet("Faculty");
4.5 Создать экземпляр класса SqlDataAdapter для извлечения информации из базы данных. В
качестве параметров конструктору класса передать текст запроса (переменная sql и объект
соединения conn:
SqlDataAdapter adapt = new SqlDataAdapter(sql, conn);
4.6 Создать в объекте DataSet (с именем Faculty) новую таблицу данных (DataTable) под именем f
и заполнить ее результатом запроса к базе данных:
adapt.Fill(ds, "f");
4.7 В качестве возвращаемого методом значения указать объект ds:
return ds;
4
5. Аналогичным образом создать Web-методы GetSpec и GetGr, возвращающие в формате XML
списки специальностей и групп соответственно.
6. Создать Web-метод University_DataSet, который на основании кодов факультета, специальности
и группы возвращает данные об успеваемости студентов. Входные параметры указать при
объявлении метода после его имени:
public DataSet University_DataSet(string faculty, string spec, int gr)
Текст запроса задать в виде:
string sql = "select rtrim(fio) as fio, rtrim(subject) as subject, rtrim(ocenka) as ocenka,
CONVERT(CHAR(25),data,104) as data from Faculty inner join Speciality on
Faculty.id=Speciality.faculty inner join Groups on Speciality.id=Groups.spec inner join Student on
Groups.id=Student.gr inner join Uspev on Student.zk=Uspev.student where Faculty.id='"+faculty+"' and
Speciality.id='"+spec+"' and Groups.id="+gr;
2. Использование Web-сервиса
1 Создать новый Web-сайт:
Пуск | Microsoft Visual Studio 2005 | Microsoft Visual Studio 2005
ф. Microsoft Visual Studio | File → New → Web Site… → ф. New Web Site → Visual Studio Installed
Templates → выбр. ASP.NET Web Site →
Location → выбр. HTTP → http://имя_сервера(например, localhost)/Lab4_ASP
Language → выбр. Visual C#
2 Перейти на страницу ввода программного кода:
ф. Lab1_ASP → Default.aspx → Source | удалить весь код, расположенный между открывающим и
закрывающим тегами элемента BODY
3 Скопировать элемент BODY вместе со всеми вложенными элементами из файла Default.aspx
первой лабораторной работы.
4 Подключить к Web-приложению Web-сервис WebService:
ф. Solution Explorer | пр. кн. мыши на Lab4_ASP → выбр. Add Web Reference…
ф. Add Web Reference | стр. URL ← ввести "http://localhost/WebService/Service.asmx" | нажать на кн.
Add Reference.
5 Импортировать в Web-приложение подключенный Web-сервис как библиотеку классов и
методов. Для этого после описания библиотек, подключаемых по умолчанию, ввести следующий
код:
<%@ Import Namespace="localhost" %>
6 Ввести обработчик события загрузки страницы:
<script language="C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
}
</script>
7 Создать экземпляр сервиса (класс Service) для использования методов Web-сервиса:
Service s = new Service();
8 Создать экземпляр класса DataSet и заполнить его с помощью метода GetFaculty Web-сервиса:
DataSet ds_f = s.GetFaculty();
9 Заполнить раскрывающийся список факультетов (элемент с ID="faculty") данными из DataSet:
faculty.DataSource = ds_f.Tables["f"].DefaultView;
faculty.DataTextField = "name";
5
faculty.DataValueField = "id";
faculty.DataBind();
10 Аналогичным образом заполнить списки групп и специальностей.
11 Создать файл Browse.aspx (см. п. 2). Заменить весь код созданной страницы на код
одноименного файла из первой лабораторной работы.
12 В соответствии с пп. 5–10 заполнить таблицу на странице Browse.aspx с помощью метода
University_DataSet Web-сервиса.
13 Проверить работоспособность созданного Web-приложения. Для этого перейти на страницу
Lab3_ASP - Microsoft Visual Studio | Default.aspx и нажать сочетание клавиш [Ctrl+F5].
Вариант Б. Технология PHP и СУБД MySQL
1. Программирование Web-сервиса
1. Создать папку, в которой будут размещены все файлы Web-приложения, и назвать
ее, к примеру, Lab4_PHP.
2. Создать папку, в которой будут размещены файлы Web-сервиса, и назвать ее, к
примеру, server.
3. Скопировать в папку server файл nusoap.php (размещен на диске D в папке Student) –
библиотеку для работы с сообщениями SOAP.
4. В папке server создать новый файл и назвать его, к примеру, index.php. Открыть файл
с помощью любого редактора.
5. Ввести открывающий тег сценария <?php
6. Подключить код сценария nusoap.php:
require_once('nusoap.php');
7. Установить соединение с базой данных MySQL University
7.1 Задать объект link соединения с базой данных
$link = @mysql_connect("localhost", "root") or die("Невозможно соединиться с сервером");
7.2 Выбрать базу данных University
$db=@mysql_select_db("university") or die("Нет такой базы данных");
7.3 Установить кириллическую кодировку (cp-1251) для корректной передачи и
получения данных из базы данных. Для этого в сценарий PHP из предыдущего пункта
ввести следующий код:
@mysql_query("SET SESSION character_set_results = cp1251;");
@mysql_query("SET SESSION Character_set_client = cp1251;");
@mysql_query("SET SESSION Character_set_results = cp1251;");
@mysql_query("SET SESSION Collation_connection = cp1251_general_ci;");
@mysql_query("SET SESSION Character_set_connection = cp1251;");
8. Создать экземпляр SOAP-сервера:
$server = new soap_server;
9. Зарегистрировать метод faculty (извлечения информации о факультетах)
9.1 Вызвать метод register объекта server
$server->register(
9.2 Задать название метода – faculty:
'faculty',
9.3 Указать выходные параметры метода:
6
array('return' => 'xsd:string'),
9.4 Задать используемое пространство имен:
'uri:facultyquery',
9.5 Задать заголовок SOAPAction
'uri:facultyquery/faculty',
9.6 Задать вид сервиса rpc/encoded
'rpc',
'encoded'
);
10. Определить метод faculty как функцию PHP.
10.1 Задать имя функции (faculty) и открывающую фигурную скобку:
function faculty() {
10.2 Создать переменную f_query для хранения текста запроса к базе данных для
извлечения информации о специальностях факультета
$f_query="select * from `faculty`";
10.3 Выполнить запрос к базе данных:
$f=mysql_query($f_query);
10.4 Создать строковую переменную facOptions для хранения XML-представления
информации о факультетах. Записать в нее открывающий тег корневого элемента faculties
10.5 Сформировать цикл while по всем строкам результирующего набора f:
while ( $fac = mysql_fetch_array( $f ) )
{
}
10.6 Сформировать XML-элемент faculty, соответствующий одной записи из таблицы
Faculty. В элементе задать атрибуты ID и name, которые соответствуют одноименным
полям в таблице базы данных. Для этого между открывающей и закрывающей фигурными
скобками цикла ввести следующий код:
$facOptions = $facOptions."<faculty ID='".$fac['ID']."' name='".$fac['name']."'/>";
10.7 В качестве значения, возвращаемого функцией faculty, указать текстовую
переменную facOptions, дополненную закрывающим тегом элемента faculties:
return $facOptions.'</faculties>';
}
11. Аналогичным образом (см. п. 9) зарегистрировать метод spec, формирующий XMLсписок специальностей.
12. Определить метод spec как функцию PHP (см. п. 10).
13. Зарегистрировать метод gr, формирующий XML-список групп и определить его как
функцию PHP.
14. Зарегистрировать метод usp (успеваемость) с входным параметром name (номер
группы). Для этого ввести следующий код:
$server->register(
'usp',
array('group' => 'xsd:string'),
array('return' => 'xsd:string'),
'uri:uspquery',
'uri:uspquery/usp',
'rpc',
'encoded'
7
);
15. Определить метод usp как функцию PHP:
function usp($group){
$usp_query="SELECT `fio`, `subject`, `ocenka`, `data`
FROM `uspev`, `student`
WHERE `uspev`.`student`= `student`.`zk` AND `gr`=".$group;
$usp=mysql_query($usp_query);
$usp_count = mysql_num_rows($usp);
$usOptions = '<uspev>';
while ( $u = mysql_fetch_array( $usp ) )
{
$usOptions = $usOptions."<usp fio='".$u['fio']."' subject='".$u['subject']."' ocenka='".$u['ocenka']."'
data='".$u['data']."'/>";
}
return $usOptions.'</uspev>';
}
16. Вызвать сервис с помощью HTTP-запроса
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
17. Ввести закрывающий тег сценария ?>.
2. Использование Web-сервиса
1. В папку Lab4_PHP скопировать файл nuSOAP (из предыдущего пункта) и файлы
Index.php и Browse.php из первой лабораторной работы.
2. Открыть в любом редакторе файл Index.php.
3. Ввести открывающий тег сценария <?php
4. Подключить код сценария nusoap.php:
require_once('nusoap.php');
5. Создать экземпляр SOAP-клиента.
5.1 Создать переменную client
5.2 Инициализировать конструктор класса soapclient и передать ему в качестве
параметра URL SOAP-сервера (из предыдущего пункта):
$client = new soapclient('http://localhost/denwer/Lab4_PHP/server/index.php');
6. Вызвать SOAP-метод faculty:
$faculty = $client->call('faculty');
7. Аналогичным образом вызвать SOAP-методы spec и gr:
$spec = $client->call('spec');
$gr = $client->call('gr');
8. Записать результаты в экземпляры DOM-объектов
8.1 Создать экземпляр DOM-объекта и записать его в переменную fac_dom:
$fac_dom = new DOMDocument();
8.2 Задать кириллическую кодировку DOM-объекта:
8
$fac_dom -> encoding = "windows-1251";
8.3 Загрузить в DOM-объект XML-данные о факультетах, полученные в результате
вызова SOAP-метода faculty:
$fac_dom->loadXml(iconv("windows-1251", "utf-8", $faculty));
8.4 Аналогичным образом создать DOM-объекты spec_dom (для XML-данных о
специальностях) и gr_dom (для XML-данных о группах).
9. Ввести закрывающий тег сценария ?>
10. В раскрывающийся список факультетов (HTML-элемент select с атрибутом name =
"faculty") добавить данные из XML-списка факультетов. Для этого после строки
<option value="0">Выберите факультет</option>
10.1 Ввести открывающий тег сценария:
<?php
10.2 Построить цикл по элементам DOM-объекта fac_dom:
foreach ($fac_dom->documentElement->childNodes as $item) {
10.3 Создать строковую переменную value и занести в нее значение XML-атрибута ID:
$value = iconv("utf-8", "windows-1251", $item->getAttribute('ID'));
10.4 Создать строковую переменную text и занести в нее значение XML-атрибута name:
$text = iconv("utf-8", "windows-1251", $item->getAttribute('name'));
10.5 Вывести HTML-код элемента списка option со значением из переменной value и
отображаемым текстом из переменной text.
echo "<option value='".$value."'>".$text."</option>";
}
10.6. Ввести закрывающий тег сценария ?>
11. Аналогичным образом заполнить раскрывающиеся списки специальностей (из
DOM-объекта spec_dom) и групп (из DOM-объекта gr_dom).
12. Открыть в любом редакторе файл Browse.php.
13. Подключить код сценария nusoap.php:
require_once('nusoap.php');
14. Создать строковую переменную gr и занести в нее значение параметра gr,
переданного методом POST со страницы Index.php:
$gr = $_POST['gr'];
15. Создать экземпляр SOAP-клиента (см. п. 5) client.
16. Вызвать метод usp и в качестве входного параметра передать ему значение
строковой переменной gr:
$result = $client->call('usp', array('group' => $gr));
17. Записать результаты в экземпляр DOM-объекта usp_dom:
$usp_dom = new DOMDocument();
$usp_dom -> encoding = "windows-1251";
9
$usp_dom->loadXml(iconv("windows-1251", "utf-8", $result));
18. Заполнить таблицу TABLE со стилем textborder данными из XML-набора записей
об успеваемости студентов
18.1 Ввести открывающий тег сценария:
<?php
18.2 Построить цикл по элементам DOM-объекта usp_dom:
foreach ($usp_dom->documentElement->childNodes as $item)
{
18.3 Занести в переменные fio, subject, ocenka и data значения одноименных XMLатрибутов:
$fio= iconv("utf-8", "windows-1251", $item->getAttribute('fio'));
$subject = iconv("utf-8", "windows-1251", $item->getAttribute('subject'));
$ocenka = iconv("utf-8", "windows-1251", $item->getAttribute('ocenka'));
$data = iconv("utf-8", "windows-1251", $item->getAttribute('data'));
18.4 Ввести закрывающий тег сценария ?>
18.5 Ввести открывающий тег элемента TR:
<TR>
18.6. Ввести открывающий тег первого столбца (шириной 30% от общей ширины
таблицы). Задать стиль представления текста в столбце tabletext:
<TD width="30%"><SPAN class="tabletext">
18.7 Вывести значение переменной fio
<?php
echo $fio;
?>
18.8 Закрыть элементы SPAN и TD:
</SPAN></TD>
18.9 Аналогичным образом построить столбцы для представления данных из
переменных subject, data и ocenka соответственно.
19. Протестировать полученное Web-приложение (см. лабораторную работу 1).
Вариант В. Технология JSP и СУБД MySQL
1. Программирование Web-сервиса
1. Запустить визуальную среду Eclipse Europe
Пуск | Программы | Eclipse
2. Создать новый Web-проект:
File → New → Project
Выбр. Web → Dynamic Web Project → кн. OK при запросе разрешения возможности Web
Development
Ввести soap_server в качестве названия проекта
3. Создать Java-класс, работающий на сервере как Web-служба:
10
Ф. Package Explorer | развернуть soap_server | пр. кн. мыши на Java Resources → New → Class
Ввести University в качестве имени файла | кн. Finish → откроется окно для ввода кода с уже
введенными строками
public class University {
}
4. Подключить библиотеки для работы с базами данных и обработки данных. Для этого до
описания класса ввести следующий код:
import java.sql.*;
import java.io.*;
import java.util.*;
5. Создать функцию установки соединения с базой данных University
5.1 Ввести название функции con
public Connection con()
{
}
Весь последующий код этого пункта вводить между открывающей и закрывающей фигурными
скобками.
5.2 Создать пустой объект соединения (Connection)
Connection conn = null;
5.3 Создать экземпляр класса драйвера взаимодействия с СУБД MySQL
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
5.4 Задать текстовую переменную для хранения параметров соединения с базой данных
String connectionURL = "jdbc:mysql:/виртуальный путь к базе
данных?user=пользователь;password=пароль";
5.5 Создать пустой объект запроса (Statement):
Statement statement = null;
5.6 Установить соединение с базой данных MySQL:
conn = DriverManager.getConnection(connectionURL, "root", "");
5.7 Создать и настроить объект запроса:
statement = conn.createStatement();
conn.setReadOnly(true);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
5.8 Указать в качестве возвращаемого функцией значения объект соединения:
return conn;
}
6. Создать функцию faculties, формирующую строку XML-набора данных о факультетах,
полученных по запросу к базе данных
6.1 Задать имя функции:
public String faculties(){
}
Весь последующий код этого пункта вводить между открывающей и закрывающей фигурными
скобками.
6.2 Создать строковую переменную res и занести в нее открывающий тег корневого элемента
faculties:
String res = "<faculties>";
11
6.3 Создать объект соединения с помощью функции con():
try {
Connection conn = con();
6.4 . Выполнить запрос к таблице Faculty (Факультет) для получения данных о факультетах из базы
данных. Для этого ввести в сценарий PHP следующий код:
ResultSet rs =
conn.createStatement().executeQuery("SELECT * FROM faculty");
6.5 Для каждой строки результата запроса сформировать XML-элемент faculty с атрибутами ID и
name:
while (rs.next())
{
res = res + "<faculty ID='"+rs.getString("id")+"' name='"+rs.getString("name")+"'/>";
}
}
catch (Exception e) {
System.out.println(e.getMessage());
}
6.6 Дополнить полученное содержимое переменной res закрывающим тегом элемента faculties:
res = res + "</faculties>";
6.7 В качестве возвращаемого функцией значения указать переменную res
return res;
}
7. Аналогичным образом создать функции specialities, groups (без входных параметров) и uspev (с
входным параметров gr – группа), возвращающие соответственно XML-наборы данных о
специальностях, группах и успеваемости студентов.
8. Создать Java Web-службу UniversityService:
пр. кн. мыши на University.class → New → Other
ф. New Wizard → разв. Web Services → выбр. Web Service → кн. Next
выбр. Тип Web-службы ← Java Bean Web → кн. OK
9. Просмотреть сгенерированное WSDL-описание созданной Web-службы UniversityService.wsdl.
2. Использование Web-сервиса
1. Создать Web-проект для клиентского приложения.
File → New → Web → Dynamic Web Project
name → Lab4_JSP
2. Добавить в проект новую JSP-страницу
ф. Project Explorer | Lab4_JSP | кл. пр. кн. мыши → выбр. New → JSP |
ф. New JavaServer Page | File name ← Default | удалить весь код элемента HTML
3. Скопировать в полученный файл весь код из файла Index.jsp из первой лабораторной работы.
4. Скопировать WSDL-файл из soap_server в папку Lab4_JSP / WebContent
5. Сгенерировать клиента Web-службы из скопированного WSDL-файла.
пр. кн. мыши на UniversityService.wsdl → New → Other
ф. New Wizard | разв. Web Services | выбр. Web Service Client → кн. Next → кн. OK
в появившемся окне уст. флажок Java proxy → кн. Finish.
Будет создан Java-прокси, который является Java-классом, способным вызывать Web-службу.
6. Открыть код файла Index.jsp
7. Подключить библиотеки для работы с базами данных и обработки XML-данных:
12
<%@page import="java.sql.*"%>
<%@page import="java.io.*"%>
<%@page import="java.util.*"%>
<%@ page import="javax.xml.parsers.DocumentBuilderFactory"%>
<%@ page import="javax.xml.parsers.DocumentBuilder"%>
<%@ page import="org.w3c.dom.*"%>
<%@ page import="javax.xml.parsers.*"%>
<%@ page import="javax.xml.transform.*"%>
<%@ page import="javax.xml.transform.dom.*"%>
<%@ page import="javax.xml.transform.stream.*"%>
8. Импортировать Java-прокси (UniversityProxy в папке uni), созданный для взаимодействия с
Web-службой:
<%@page import="uni.UniversityProxy"%>
9. Создать экземпляр класса UniversityProxy для получения доступа к методам Web-службы:
UniversityProxy proxy = new UniversityProxy();
10. Создать экземпляр класса DocumentBuilderFactory:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
11. На основе класса DocumentBuilderFactory создать новый DOM-парсер:
DocumentBuilder db = dbf.newDocumentBuilder();
12. Создать экземпляр класса Reader и загрузить в него результат выполнения Web-метода
faculties, преобразованный в массив данных:
Reader reader=new CharArrayReader(proxy.faculties().toCharArray());
13. Создать экземпляр класса Document – новый DOM-объект – и загрузить в него данные из
Reader:
Document faculty = db.parse(new org.xml.sax.InputSource(reader));
14. Создать XML-элемент, соответствующий корневому элементу DOM-объекта faculty со всеми
его дочерними элементами:
Element fac = faculty.getDocumentElement();
15. Аналогичным образом создать DOM-объекты, соответствующие данным о специальностях и
группах, и создать XML-элементы, соответствующие их корневым элементам.
16. Заполнить раскрывающийся список факультетов данными из XML-элемента fac:
16.1 Задать цикл по дочерним элементам XML-элемента fac:
<%
NodeList childNodes = fac.getChildNodes();
if (childNodes != null)
{
for (int x=0; x<childNodes.getLength(); x++)
{
16.2 В строковые переменные id и name занести значения одноименных XML-атрибутов:
NamedNodeMap facs = childNodes.item(x) .getAttributes();
13
String id = facs.item(0).getNodeValue();
String name = facs.item(1).getNodeValue();
%>
16.3 Определить значение переменной id как значение элемента раскрывающегося списка:
<option value="
<%
out.println(id);
%>
">
16.4 Определить значение переменной name как отображаемый текст элемента раскрывающегося
списка:
<%
out.println(name);
%>
</option>
<%
}
}
%>
17. Аналогичным образом заполнить раскрывающиеся списки специальностей и групп.
18. Скопировать в проект файл Browse.jsp из первой лабораторной работы. Настроить файл на
использование Web-службы soap_server и ее метода uspev для заполнения таблицы об
успеваемости студентов выбранной группы (по аналогии с предыдущими пунктами).
19. Проверить работоспособность созданного Web-приложения. Для этого в окне визуальной
среды Eclipse выбрать пункт меню
Project → Run as… → Run on Server
5. Контрольные вопросы
1. Что такое веб-сервис?
2. Из чего состоит веб-сервис?
3. Для чего используются SOAP-сообщения?
4. Что такое UDDI?
5. Как описать свойства и методы веб-сервиса?
6. Содержание и оформление отчета
Отчет должен содержать:
– титульный лист, название и цель работы;
– вариант задания;
– листинг программного кода;
– скриншоты результатов работы Web-приложения с различными вариантами запросов;
– выводы по работе.
14
15
Download