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 |
MultiView | Widoki | Kontener widoków | |
Widok | VueClients | widok zawierający listę klientów | |
Repeater | RepeaterClients | wyświetla listę klientów w formie listy punktowanej | |
Widok | VueErreurs | widok, w którym wyświetlany jest ewentualny błąd | |
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 |
MultiView | Widoki | Kontener widoków | |
Widok | VueClients | widok zawierający listę klientów | |
Repeater | RepeaterClients | wyświetla listę klientów w formie listy punktowanej | |
Widok | VueErreurs | widok, w którym wyświetlany jest ewentualny błąd | |
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:




















