5. Клієнти .NET сервісу J2EE для зустрічей
5.1. Клієнт на C# 2008
Відтепер ми припускаємо, що попередній веб-сервіс доступний і активний. Веб-сервіс можуть використовувати клієнти, написані на різних мовах програмування. Тут ми пропонуємо написати консольний клієнт на C# для відображення списку лікарів.
![]() |
Почнемо зі створення проекту на C#:
![]() |
Створюємо консольний додаток [1] під назвою [ListeDesMedecins] [2]. У [3] створюємо посилання на веб-сервіс. Цей інструмент подібний до того, що використовується в NetBeans: він створює локальний проксі віддаленого веб-сервісу.
![]() |
- у файлі [1] вказується URI файлу WSDL веб-сервісу (див. розділ 4.10.2).
- у [2] потрібно попросити майстра виявити веб-сервіси, доступні за цим URI
- у [3] — знайдений веб-сервіс, а в [4] — методи, які він надає.
- у [5] вказується, у якому просторі імен мають бути згенеровані класи проксі C
- у [6] генерується проксі-сервер на мові C.
![]() |
- У [1] — веб-посилання, яке ми щойно створили. Двічі клацніть по ньому.
- у [2] — об’єктний оглядач, відкритий подвійним клацанням.
- у [3] вибираємо простір імен [ListeDesMedecins.Ws.RdvMedecins], який є простором імен згенерованого проксі-сервера на C. Перший термін [ListeDesMedecins] — це простір імен за замовчуванням створеного додатка на C# (ми назвали його ListeDesMedecins). Другий термін [Ws.Rdvmedecins] — це простір імен, який ми присвоїли проксі-класу на C у майстрі. У підсумку об’єкти проксі-класу на C знаходяться в просторі імен [ListeDesMedecins.Ws.RdvMedecins].
- У [4] об’єкти згенерованого проксі-коду на C
![]() |
- у [5], [WsDaoJpaClient] — це клас, що локально реалізує методи віддаленого веб-сервісу.
- у [6] — методи класу [WsDaoJpaClient]. Тут містяться методи віддаленого веб-сервісу, наприклад, метод getAllClients у [7].
Розглянемо код згенерованих об’єктів:
![]() |
У наведеному вище [1] ми запитуємо код класу [client]:
...
public partial class client : personne {
}
....
public partial class personne : object, System.ComponentModel.INotifyPropertyChanged {
...
public long id {
...
}
...
}
Вище ми залишили лише той код, який необхідний для нашого дослідження.
- рядок 2: клас [client] походить від класу [personne], як і у веб-сервісі.
- рядок 8: публічна властивість класу [personne]
Можна помітити, що згенерований код не відповідає загальноприйнятим стандартам кодування в C#. Імена класів та загальнодоступних властивостей повинні починатися з великої літери.
Повернемося до нашого додатка на C#:
![]() |
[Program.cs] [1] — це тестовий клас. Його код такий:
using System;
using ListeDesMedecins.Ws.RdvMedecins;
using Client = ListeDesMedecins.Ws.RdvMedecins.client;
namespace ListeDesMedecins {
class Program {
static void Main(string[] args) {
try {
// інстанціювання клієнтського шару [dao]
WsDaoJpaClient dao = new WsDaoJpaClient();
// список лікарів
foreach (Client client in dao.getAllClients()) {
Console.WriteLine(String.Format("{0} {1} {2}", client.titre, client.prenom, client.nom));
}
} catch (Exception e) {
Console.WriteLine(e);
}
}
}
}
У рядку 12 використовується клас [Client] проксі-класу C, хоча ми щойно бачили, що насправді він називався [client]. Саме оголошення в рядку 3 дозволяє нам використовувати [Client] замість [client]. Це дозволяє нам дотримуватися стандарту кодування імен класів. У тому ж рядку 12 використовується метод [getAllClients], оскільки саме так він називається у проксі-коді на C. Згідно зі стандартом кодування C#, він мав би називатися [GetAllClients].
Виконання попередньої програми [1] дає результати, показані в [2].
5.2. Перший клієнт ASP.NET 2008
Тепер ми напишемо перший клієнт ASP.NET / C# для відображення списку клієнтів.
![]() |
У цій архітектурі є два веб-сервери:
- той, що виконує віддалений веб-сервіс
- той, що виконує клієнт ASP.NET віддаленого веб-сервісу
Ми створимо веб-проект клієнта ASP.NET за допомогою Visual Web Express 2008 версії SP1. У наступному абзаці показано, як створити такий самий проект, якщо у вас немає версії SP1 Visual Web Express 2008.
![]() |
Створюємо додаток web [1, 2, 3] під назвою [ListeDesClients1] [4,5,6]. Створений таким чином проєкт можна переглянути в [7].
![]() |
- У [5], клацнувши правою кнопкою миші на назві проєкту, додають посилання на веб-сервіс.
- У [6] вкажіть URI файлу WSDL веб-сервісу (див. розділ 4.10.2).
- У [7] потрібно попросити майстра виявити веб-сервіси, доступні за цим URI
![]() |
- у [8] відображається знайдений веб-сервіс, а в [9] — методи, які він надає.
- у [10] вказується, у якому просторі імен мають бути згенеровані класи проксі C
- у [11] — згенероване посилання на веб-сервіс
Подвійне клацання на посилання [Ws.Rdvmedecins] [12] відображає класи та інтерфейси, згенеровані для проксі-сервера C:
![]() |
- у [1] — об’єктний оглядач, відкритий подвійним клацанням.
- у [2] вибираємо простір імен [ListeDesClients1.Ws.RdvMedecins], який є простором імен згенерованого проксі-сервера C. Перший термін [ListeDesClients1] — це простір імен за замовчуванням створеного додатка ASP.NET (ми назвали його ListeDesClients1). Другий термін [Ws.Rdvmedecins] — це простір імен, який ми присвоїли проксі-C у майстрі. У підсумку об’єкти проксі-C мають простір імен [ListeDesClients1.Ws.RdvMedecins].
- У [3] об’єкти проксі-сервера C, що було згенеровано
![]() |
- у [4], [WsDaoJpaService] — це клас, що локально реалізує методи віддаленого веб-сервісу.
- у [5] — методи класу [WsDaoJpaService]. Тут містяться методи віддаленого веб-сервісу, наприклад, метод getAllClients у [6].
Розглянемо код згенерованих об’єктів:
![]() |
У наведеному вище [1] ми запитуємо код класу [client]:
public partial class client : personne {
}
...
public partial class personne {
...
public long id {
...
}
Вище ми залишили лише той код, який необхідний для нашого дослідження.
- рядок 1: клас [client] походить від класу [personne], як і у веб-сервісі.
- рядок 5: клас [personne]
- рядок 7: публічна властивість класу [personne]
Ми бачимо код, аналогічний тому, що вже коментувався для клієнта C# у розділі 5.1.
- простір імен згенерованого проксі-коду на C відповідає тому, що визначено в майстрі створення, з префіксом простору імен самого веб-проєкту: ListeDesClients1.Ws.RdvMedecins
- клас-проксі, який локально реалізує методи віддаленого веб-сервісу, називається WsDaoJpaService.
- імена класів та властивостей починаються з малої літери
Ми можемо написати сторінку [Default.aspx], яка відображає список клієнтів. Сторінка має такий вигляд:
![]() |
№ | Тип | Назва | Роль |
MultiView | Види | Контейнер переглядів | |
Вигляд | VueClients | погляд, що містить список клієнтів | |
Повторювач | RepeaterClients | відображає список клієнтів у вигляді списку з маркованими пунктами | |
Перегляд | VueErreurs | погляд, що відображає можливу помилку | |
Мітка | LabelErreur | Текст помилки |
Код відображення цієї сторінки такий:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ListeDesClients1._Default" %>
<%@ Import Namespace="ListeDesClients1.Ws.RdvMedecins" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Liste des clients</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:MultiView ID="Vues" runat="server">
<asp:View ID="VueClients" runat="server">
Liste des clients :<br />
<br />
<ul>
<asp:Repeater ID="RepeaterClients" runat="server">
<ItemTemplate>
<li>
<%#(Container.DataItem як клієнт).прізвище%>,
<%#(Container.DataItem як клієнт).ім'я%>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</asp:View>
<asp:View ID="VuesErreurs" runat="server">
L'erreur suivante s'est produite :<br />
<br />
<asp:Label ID="LabelErreur" runat="server"></asp:Label></asp:View>
</asp:MultiView><br />
</div>
</form>
</body>
</html>
Зверніть увагу, що в рядку 3 необхідно імпортувати простір імен [ListeDesClients1.Ws.RdvMedecins] проксі-сервера C веб-служби, щоб забезпечити доступ до класу [client] у рядках 20 і 21.
Код контролю [Default.aspx.cs], пов’язаний зі сторінкою представлення [Default.aspx], має такий вигляд:
using System;
using ListeDesClients1.Ws.RdvMedecins;
namespace ListeDesClients1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
// локальна інстанція проксі віддаленого рівня [dao]
WsDaoJpaService dao = new WsDaoJpaService();
// клієнтський вигляд
Vues.ActiveViewIndex = 0;
// ініціалізація клієнтського представлення
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// вигляд помилок
Vues.ActiveViewIndex = 1;
//ініціалізація вікна помилок
LabelErreur.Text = ex.ToString();
}
}
}
}
- рядок 8: метод Page_Load виконується під час початкового завантаження сторінки. Це завантаження відбувається при кожному запиті клієнта, який запитує цю сторінку.
- рядок 13: створюється екземпляр локального проксі-сервера C. Цей проксі-сервер C реалізує інтерфейс віддаленого веб-сервісу. Додаток буде взаємодіяти з цим проксі-сервером C.
- рядок 15: якщо під час створення екземпляра локального проксі-сервера C не виникло винятків, має відобразитися вид із назвою «VueClients», c.a.d. Вигляд № 0 у розділі «Види» сторінки MultiView.
- рядок 17: джерелом даних для répéteur є список клієнтів, наданий методом getAllClients проксі-сервера C.
- рядок 23: у разі виникнення винятку під час інстанціювання локального проксі-сервера C має відображатися вигляд із назвою «VueErreurs», c.a.d. Вигляд № 1 у розділі «Види» сторінки MultiView.
- рядок 25: виняток відображається в label «LabelErreur».
Виконання веб-проекту дає такий результат:
![]() |
5.3. Другий клієнт ASP.NET 2008
Тепер ми пишемо другий клієнт ASP.NET / C#, цього разу використовуючи версію Visual Web Developer Express 2008, яка передувала версії SP1.
![]() |
Створимо веб-проект клієнта .NET:
![]() |
Створюємо сайт web [1, 2] під назвою [ListeDesClients] [3].
![]() |
- у [4], веб-проект
- у [5], клацнувши правою кнопкою миші на назві проекту, додаємо посилання на службу, як це було зроблено раніше.
- у [6], проект після додавання посилання на віддалений веб-сервіс
На відміну від розглянутого раніше веб-проекту SP1, доступ до об’єктів клієнта веб-сервісу через об’єктний оглядач відсутній.
Що потрібно знати:
- простір імен згенерованого проксі-класу C відповідає тому, що визначено в майстрі його створення: Ws.RdvMedecins
- клас-проксі, який локально реалізує методи віддаленого веб-сервісу, називається WsDaoJpaClient.
- імена класів та властивостей починаються з малої літери
Ми можемо написати сторінку [Default.aspx], яка відображає список клієнтів. Сторінка має такий вигляд:
![]() |
№ | Тип | Назва | Роль |
MultiView | Види | Контейнер переглядів | |
Вигляд | VueClients | погляд, що містить список клієнтів | |
Повторювач | RepeaterClients | відображає список клієнтів у вигляді списку з маркованими пунктами | |
Перегляд | VueErreurs | погляд, що відображає можливу помилку | |
Мітка | LabelErreur | Текст помилки |
Код відображення цієї сторінки такий:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="Ws.RdvMedecins" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Liste des clients</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:MultiView ID="Vues" runat="server">
<asp:View ID="VueClients" runat="server">
Liste des clients :<br />
<br />
<ul>
<asp:Repeater ID="RepeaterClients" runat="server">
<ItemTemplate>
<li>
<%#(Container.DataItem як клієнт).прізвище%>, <%#(Container.DataItem як клієнт).ім'я%>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</asp:View>
<asp:View ID="VuesErreurs" runat="server">
L'erreur suivante s'est produite :<br />
<br />
<asp:Label ID="LabelErreur" runat="server"></asp:Label></asp:View>
</asp:MultiView><br />
</div>
</form>
</body>
</html>
Зверніть увагу, що в рядку 2 необхідно імпортувати простір імен [Ws.RdvMedecins] проксі-сервера C веб-служби, щоб забезпечити доступ до класу [client] у рядку 19.
Код контролю [Default.aspx.cs], пов’язаний зі сторінкою відображення [Default.aspx], має такий вигляд:
using System;
using Ws.RdvMedecins;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
// локальна інстанція проксі віддаленого рівня [dao]
WsDaoJpaClient dao = new WsDaoJpaClient();
// клієнтський вигляд
Vues.ActiveViewIndex = 0;
// ініціалізація клієнтського представлення
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// вигляд помилок
Vues.ActiveViewIndex = 1;
//ініціалізація вікна помилок
LabelErreur.Text = ex.ToString();
}
}
}
Цей код аналогічний коду попередньої версії. Виконання веб-проєкту дає такий результат:




















