ЛАБОРАТОРНАЯ РАБОТА 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