Skip to content

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], яка відображає список клієнтів. Сторінка має такий вигляд:

Тип
Назва
Роль
1
MultiView
Види
Контейнер переглядів
2
Вигляд
VueClients
погляд, що містить список клієнтів
3
Повторювач
RepeaterClients
відображає список клієнтів у вигляді списку з маркованими пунктами
4
Перегляд
VueErreurs
погляд, що відображає можливу помилку
5
Мітка
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], яка відображає список клієнтів. Сторінка має такий вигляд:

Тип
Назва
Роль
1
MultiView
Види
Контейнер переглядів
2
Вигляд
VueClients
погляд, що містить список клієнтів
3
Повторювач
RepeaterClients
відображає список клієнтів у вигляді списку з маркованими пунктами
4
Перегляд
VueErreurs
погляд, що відображає можливу помилку
5
Мітка
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();
    }
  }
}

Цей код аналогічний коду попередньої версії. Виконання веб-проєкту дає такий результат:

Image