Skip to content

5. Klienci .NET usługi J2EE dotyczącej spotkań

5.1. Klient w języku C# 2008

Zakładamy teraz, że poprzednia usługa internetowa jest dostępna i aktywna. Z usługi internetowej mogą korzystać klienci napisani w różnych językach programowania. W tym miejscu zamierzamy napisać klienta konsolowego w języku C# w celu wyświetlenia listy lekarzy.

Zacznijmy od utworzenia projektu w języku C#:

Tworzymy aplikację konsolową o nazwie [1], nazwaną [ListeDesMedecins] [2]. W pliku [3] tworzymy odwołanie do serwisu internetowego. Narzędzie to działa podobnie jak to używane w NetBeans: tworzy lokalny serwer proxy dla zdalnego serwisu internetowego.

  • W pliku [1] podaje się adres URI pliku WSDL usługi internetowej (patrz punkt 4.10.2).
  • W pliku [2] prosi się asystenta o wykrycie usług internetowych udostępnionych pod tym adresem URI
  • w pliku [3] podano znalezioną usługę internetową, a w pliku [4] metody, które udostępnia.
  • w [5] określa się, w której przestrzeni nazw mają zostać wygenerowane klasy proxy C
  • w [6] generowany jest proxy C.
  • w [1] znajduje się właśnie utworzone przez nas odnośnik internetowy. Kliknijmy na niego dwukrotnie.
  • w [2] – eksplorator obiektów otwarty po dwukrotnym kliknięciu.
  • w [3] wybieramy przestrzeń nazw [ListeDesMedecins.Ws.RdvMedecins], która jest przestrzenią nazw wygenerowanego proxy C. Pierwszy element [ListeDesMedecins] to domyślna przestrzeń nazw utworzonej aplikacji C# (nazwaliśmy ją ListeDesMedecins). Drugi element, [Ws.Rdvmedecins], to przestrzeń nazw, którą nadaliśmy proxy C w kreatorze. Ostatecznie obiekty proxy C znajdują się w przestrzeni nazw [ListeDesMedecins.Ws.RdvMedecins].
  • W [4] obiekty wygenerowanego proxy C
  • w [5], [WsDaoJpaClient] to klasa lokalnie implementująca metody zdalnej usługi internetowej.
  • w pliku [6] znajdują się metody klasy [WsDaoJpaClient]. Znajdują się tam metody zdalnej usługi internetowej, na przykład metoda getAllClients w pliku [7].

Przyjrzyjmy się kodowi wygenerowanych elementów:

W powyższym [1] wywołujemy kod klasy [client]:


...
    public partial class client : personne {
    }
    
....
    public partial class personne : object, System.ComponentModel.INotifyPropertyChanged {
    ...
        public long id {
       ...
        }
        
...
}

Powyżej zachowaliśmy tylko kod niezbędny do naszej analizy.

  • wiersz 2: klasa [client] wywodzi się z klasy [personne], tak jak w usłudze internetowej.
  • wiersz 8: publiczna właściwość klasy [personne]

Zauważamy, że wygenerowany kod nie jest zgodny ze standardowymi konwencjami kodowania w języku C#. Nazwy klas i właściwości publicznych powinny zaczynać się wielką literą.

Wróćmy do naszej aplikacji w języku C#:

[Program.cs] [1] to klasa testowa. Jej kod wygląda następująco:


using System;
using ListeDesMedecins.Ws.RdvMedecins;
using Client = ListeDesMedecins.Ws.RdvMedecins.client;

namespace ListeDesMedecins {
    class Program {
        static void Main(string[] args) {
            try {
                // utworzenie instancji warstwy klienta [dao]
                WsDaoJpaClient dao = new WsDaoJpaClient();
                // lista lekarzy
                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);
            }
        }
    }
}

W wierszu 12 wykorzystywana jest klasa [Client] z proxy C, podczas gdy przed chwilą widzieliśmy, że w rzeczywistości nazywała się ona [client]. To właśnie deklaracja w wierszu 3 pozwala nam używać klasy [Client] zamiast [client]. Dzięki temu zachowujemy zgodność z normą nazewnictwa klas. Wciąż w wierszu 12 wykorzystywana jest metoda [getAllClients], ponieważ tak nazywa się ona w proxy C. Zgodnie z konwencją nazewniczą języka C# powinna ona nosić nazwę [GetAllClients].

Uruchomienie poprzedniego programu [1] daje wyniki pokazane w [2].

5.2. Pierwszy klient ASP.NET 2008

Teraz piszemy pierwszego klienta ASP.NET / C#, aby wyświetlić listę klientów.

W tej architekturze występują dwa serwery WWW:

  • serwer, na którym działa zdalna usługa internetowa
  • serwer, na którym działa klient ASP.NET zdalnej usługi internetowej

Utworzymy projekt internetowy klienta ASP.NET przy użyciu programu Visual Web Express 2008 w wersji SP1. Poniższy akapit pokazuje, jak utworzyć ten sam projekt, jeśli nie dysponujemy wersją SP1 programu Visual Web Express 2008.

Tworzymy aplikację o nazwie web [1, 2, 3]. Tak utworzony projekt jest widoczny w [7].

  • W pliku [5], klikając prawym przyciskiem myszy nazwę projektu, dodaje się odwołanie do usługi internetowej.
  • W pliku [6] należy podać adres URI pliku WSDL usługi internetowej (patrz punkt 4.10.2).
  • W pliku [7] należy poprosić kreatora o wykrycie usług internetowych udostępnionych pod tym adresem URI.
  • w pliku [8] wyświetlana jest znaleziona usługa internetowa, a w pliku [9] metody, które udostępnia.
  • W [10] określa się, w której przestrzeni nazw mają być generowane klasy proxy C
  • w [11] wyświetlany jest wygenerowany identyfikator usługi internetowej

Podwójne kliknięcie na odwołanie [Ws.Rdvmedecins] [12] powoduje wyświetlenie klas i interfejsów wygenerowanych dla proxy C:

  • w pliku [1], eksplorator obiektów otwarty po dwukrotnym kliknięciu.
  • W pliku [2] należy wybrać przestrzeń nazw [ListeDesClients1.Ws.RdvMedecins], która jest przestrzenią nazw wygenerowanego proxy C. Pierwszy termin [ListeDesClients1] to domyślna przestrzeń nazw utworzonej aplikacji ASP.NET (nazwaliśmy ją ListeDesClients1). Drugi element, [Ws.Rdvmedecins], to przestrzeń nazw, którą nadaliśmy proxy C w kreatorze. Ostatecznie obiekty proxy C znajdują się w przestrzeni nazw [ListeDesClients1.Ws.RdvMedecins].
  • W [3] obiekty wygenerowanego proxy C
  • w [4], [WsDaoJpaService] to klasa lokalnie implementująca metody zdalnej usługi internetowej.
  • w [5], metody klasy [WsDaoJpaService]. Znajdują się tam metody zdalnej usługi internetowej, takie jak na przykład metoda getAllClients w [6].

Przyjrzyjmy się kodowi wygenerowanych elementów:

W powyższym przykładzie [1] wywołujemy kod klasy [client]:


public partial class client : personne {
    }
    
...
    public partial class personne {
  ...
        public long id {
...
        }

Powyżej zachowaliśmy jedynie kod niezbędny do naszej analizy.

  • wiersz 1: klasa [client] wywodzi się z klasy [personne], tak jak w usłudze internetowej.
  • wiersz 5: klasa [personne]
  • wiersz 7: publiczna właściwość klasy [personne]

Kod jest analogiczny do tego, który omówiono już w odniesieniu do klienta C# w punkcie 5.1.

  • przestrzeń nazw wygenerowanego proxy w języku C jest zgodna z tą zdefiniowaną w asystencie tworzenia, z prefiksem przestrzeni nazw samego projektu internetowego: ListeDesClients1.Ws.RdvMedecins
  • Klasa proxy, która lokalnie implementuje metody zdalnej usługi internetowej, nosi nazwę WsDaoJpaService.
  • Nazwy klas i właściwości zaczynają się od małej litery

Możemy napisać stronę o nazwie [Default.aspx] wyświetlającą listę klientów. Strona wygląda następująco:

Nr
Typ
Nazwa
Rola
1
MultiView
Widoki
Kontener widoków
2
Widok
VueClients
widok zawierający listę klientów
3
Repeater
RepeaterClients
wyświetla listę klientów w formie listy punktowanej
4
Widok
VueErreurs
widok, w którym wyświetlany jest ewentualny błąd
5
Etykieta
LabelErreur
tekst błędu

Kod wyświetlania tej strony jest następujący:


<%@ 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 jako klient).nazwisko%>,
                <%#(Container.DataItem jako klient).imię%>
              </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>

Warto zwrócić uwagę, że w wierszu 3 konieczne jest zaimportowanie przestrzeni nazw [ListeDesClients1.Ws.RdvMedecins] z proxy C serwisu internetowego, aby zapewnić dostęp do klasy [client] z wierszy 20 i 21.

Kod kontrolny [Default.aspx.cs] powiązany ze stroną prezentacyjną [Default.aspx] wygląda następująco:


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
      {
        // lokalna instancja proxy zdalnej warstwy [dao]
        WsDaoJpaService dao = new WsDaoJpaService();
        // widok klienta
        Vues.ActiveViewIndex = 0;
        // inicjalizacja widoku klienta
        RepeaterClients.DataSource = dao.getAllClients();
        RepeaterClients.DataBind();
      }
      catch (Exception ex)
      {
        // widok błędów
        Vues.ActiveViewIndex = 1;
        //inicjalizacja widoku błędów
        LabelErreur.Text = ex.ToString();
      }
    }
  }
}
  • wiersz 8: metoda Page_Load jest wykonywana podczas początkowego ładowania strony. Ładowanie to ma miejsce przy każdym żądaniu klienta dotyczącym tej strony.
  • wiersz 13: tworzona jest instancja lokalnego proxy C. To proxy C implementuje interfejs zdalnej usługi internetowej. Aplikacja będzie komunikować się z tym proxy C.
  • wiersz 15: jeśli podczas instancjonowania lokalnego serwera proxy C nie wystąpi wyjątek, należy wyświetlić widok o nazwie „VueClients”, c.a.d. widok nr 0 w sekcji „Widoki” strony MultiView.
  • wiersz 17: źródłem danych dla widoku répéteur jest lista klientów dostarczona przez metodę getAllClients serwera proxy C.
  • wiersz 23: w przypadku wystąpienia wyjątku podczas instancjonowania lokalnego proxy C należy wyświetlić widok o nazwie „VueErreurs”, c.a.d. widok nr 1 w sekcji „Widoki” strony MultiView.
  • wiersz 25: wyjątek jest wyświetlany w label „LabelErreur”.

Wykonanie projektu internetowego daje następujący wynik:

5.3. Drugi klient ASP.NET 2008

Teraz piszemy drugiego klienta ASP.NET / C#, tym razem korzystając z wersji Visual Web Developer Express 2008, która poprzedzała wersję SP1.

Utwórzmy projekt internetowy klienta .NET:

Tworzymy stronę o nazwie web [1, 2], nazwaną [ListeDesClients] [3].

  • w [4], projekt internetowy
  • w [5], klikając prawym przyciskiem myszy nazwę projektu, dodajemy odwołanie do usługi tak, jak to zrobiono wcześniej.
  • w [6], projekt po dodaniu odwołania do zdalnej usługi internetowej

W przeciwieństwie do omówionego wcześniej projektu internetowego SP1 nie ma dostępu do obiektów klienta serwisu internetowego za pośrednictwem eksploratora obiektów.

Warto wiedzieć:

  • przestrzeń nazw wygenerowanego proxy C jest zgodna z tą zdefiniowaną w kreatorze: Ws.RdvMedecins
  • klasa proxy, która lokalnie implementuje metody zdalnej usługi internetowej, nosi nazwę WsDaoJpaClient.
  • nazwy klas i właściwości zaczynają się od małej litery

Możemy napisać stronę [Default.aspx] wyświetlającą listę klientów. Strona wygląda następująco:

Nr
Typ
Nazwa
Rola
1
MultiView
Widoki
Kontener widoków
2
Widok
VueClients
widok zawierający listę klientów
3
Repeater
RepeaterClients
wyświetla listę klientów w formie listy punktowanej
4
Widok
VueErreurs
widok, w którym wyświetlany jest ewentualny błąd
5
Etykieta
LabelErreur
tekst błędu

Kod wyświetlania tej strony jest następujący:


<%@ 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 jako klient).nazwisko%>, <%#(Container.DataItem jako klient).imię%>
                                </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>

Warto zwrócić uwagę, że w wierszu 2 konieczne jest zaimportowanie przestrzeni nazw [Ws.RdvMedecins] z serwera proxy C usługi internetowej, aby zapewnić dostęp do klasy [client] z wiersza 19.

Kod kontrolny [Default.aspx.cs] powiązany ze stroną prezentacyjną [Default.aspx] jest następujący:


using System;
using Ws.RdvMedecins;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    try
    {
      // lokalna instancja proxy zdalnej warstwy [dao]
      WsDaoJpaClient dao = new WsDaoJpaClient();
      // widok klienta
      Vues.ActiveViewIndex = 0;
      // inicjalizacja widoku klienta
      RepeaterClients.DataSource = dao.getAllClients();
      RepeaterClients.DataBind();
    }
    catch (Exception ex)
    {
      // widok błędów
      Vues.ActiveViewIndex = 1;
      //inicjalizacja widoku błędów
      LabelErreur.Text = ex.ToString();
    }
  }
}

Kod ten jest analogiczny do kodu z poprzedniej wersji. Wykonanie projektu internetowego daje następujący wynik:

Image