5. Client .NET del servizio di appuntamenti J2EE
5.1. Un client C# 2008
Partiamo dal presupposto che il servizio web precedente sia disponibile e attivo. Un servizio web può essere utilizzato da client scritti in vari linguaggi. In questo caso, scriveremo un client console in C# per visualizzare l'elenco dei medici.
![]() |
Iniziamo creando il progetto C#:
![]() |
Creiamo un'applicazione da console [1] denominata [ListeDesMedecins] [2]. In [3], creiamo un riferimento a un servizio web. Questo strumento è simile a quello utilizzato in NetBeans: crea un proxy locale per il servizio web remoto.
![]() |
- In [1], specificare l'URI del file WSDL del servizio web (vedere la Sezione 4.10.2).
- In [2], chiediamo alla procedura guidata di individuare i servizi web esposti a questo URI
- In [3] viene visualizzato il servizio web trovato, mentre in [4] vengono visualizzati i metodi che espone.
- In [5], specificare lo spazio dei nomi in cui devono essere generate le classi proxy C
- In [6], viene generato il proxy C.
![]() |
- In [1], il riferimento Web appena creato. Fare doppio clic su di esso.
- In [2], l'Object Explorer aperto con il doppio clic.
- In [3], seleziona lo spazio dei nomi [ListeDesMedecins.Ws.RdvMedecins], che è lo spazio dei nomi del proxy C generato. Il primo termine [ListeDesMedecins] è lo spazio dei nomi predefinito dell'applicazione C# creata (l'abbiamo chiamata ListeDesMedecins). Il secondo termine [Ws.RdvMedecins] è lo spazio dei nomi che abbiamo assegnato al proxy C nella procedura guidata. In definitiva, gli oggetti del proxy C appartengono allo spazio dei nomi [ListeDesMedecins.Ws.RdvMedecins].
- In [4], gli oggetti del proxy C generato
![]() |
- in [5], [WsDaoJpaClient] è la classe che implementa localmente i metodi del servizio web remoto.
- In [6], i metodi della classe [WsDaoJpaClient]. Qui troviamo i metodi del servizio web remoto, come il metodo getAllClients in [7].
Esaminiamo il codice delle entità generate:
![]() |
Nel punto [1] sopra, richiediamo di visualizzare il codice della classe [client]:
...
public partial class client : personne {
}
....
public partial class personne : object, System.ComponentModel.INotifyPropertyChanged {
...
public long id {
...
}
...
}
Sopra abbiamo incluso solo il codice necessario per il nostro studio.
- riga 2: la classe [customer] deriva dalla classe [person], proprio come nel servizio web.
- riga 8: una proprietà pubblica della classe [person]
Quello che notiamo è che il codice generato non segue le convenzioni di codifica standard di C#. I nomi delle classi e delle proprietà pubbliche dovrebbero iniziare con una lettera maiuscola.
Torniamo alla nostra applicazione C#:
![]() |
[Program.cs] [1] è la classe di test. Il suo codice è il seguente:
using System;
using ListeDesMedecins.Ws.RdvMedecins;
using Client = ListeDesMedecins.Ws.RdvMedecins.client;
namespace ListeDesMedecins {
class Program {
static void Main(string[] args) {
try {
// client [dao] layer instantiation
WsDaoJpaClient dao = new WsDaoJpaClient();
// list of doctors
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);
}
}
}
}
Alla riga 12 viene utilizzata la classe [Client] del proxy C, anche se abbiamo appena visto che in realtà si chiama [client]. È la dichiarazione alla riga 3 che ci permette di usare [Client] invece di [client]. Questo ci permette di rispettare la convenzione di denominazione delle classi. Sempre alla riga 12, viene utilizzato il metodo [getAllClients] perché è così che viene chiamato nel proxy C. Lo standard di codifica C# richiederebbe che fosse chiamato [GetAllClients].
L'esecuzione del programma precedente [1] produce i risultati mostrati in [2].
5.2. Un primo client ASP.NET 2008
Ora scriveremo un primo client ASP.NET / C# per visualizzare l'elenco dei client.
![]() |
In questa architettura sono presenti due server web:
- quello che esegue il servizio web remoto
- quello che esegue il client ASP.NET per il servizio web remoto
Creeremo il progetto Web client ASP.NET utilizzando Visual Web Express 2008 SP1. La sezione seguente illustra come creare lo stesso progetto se non si dispone di Visual Web Express 2008 SP1.
![]() |
Creiamo un'applicazione web [1, 2, 3] denominata [ClientList1] [4, 5, 6]. Il progetto così creato è visibile in [7].
![]() |
- In [5], fare clic con il tasto destro del mouse sul nome del progetto per aggiungere un riferimento al servizio web.
- In [6], specificare l'URI del file WSDL del servizio web (vedere la sezione 4.10.2).
- In [7], chiedere alla procedura guidata di individuare i servizi Web esposti a questo URI
![]() |
- In [8] viene visualizzato il servizio web trovato, mentre in [9] vengono mostrati i metodi che espone.
- In [10], specificare lo spazio dei nomi in cui devono essere generate le classi proxy C
- In [11], il riferimento del servizio web generato
Facendo doppio clic sul riferimento [Ws.Rdvmedecins] [12] vengono visualizzate le classi e le interfacce generate per il proxy C:
![]() |
- In [1], l'Object Explorer aperto con un doppio clic.
- In [2], selezionare lo spazio dei nomi [ListeDesClients1.Ws.RdvMedecins], che è lo spazio dei nomi del proxy C generato. Il primo termine [ListeDesClients1] è lo spazio dei nomi predefinito dell'applicazione ASP.NET creata (l'abbiamo chiamata ListeDesClients1). Il secondo termine [Ws.RdvMedecins] è lo spazio dei nomi che abbiamo assegnato al proxy C nella procedura guidata. In definitiva, gli oggetti del proxy C appartengono allo spazio dei nomi [ListeDesClients1.Ws.RdvMedecins].
- In [3], gli oggetti del proxy C generato
![]() |
- In [4], [WsDaoJpaService] è la classe che implementa localmente i metodi del servizio web remoto.
- In [5], i metodi della classe [WsDaoJpaService]. Qui troviamo i metodi del servizio web remoto, come il metodo getAllClients in [6].
Esaminiamo il codice delle entità generate:
![]() |
Nel punto [1] sopra, richiediamo di visualizzare il codice della classe [client]:
public partial class client : personne {
}
...
public partial class personne {
...
public long id {
...
}
Sopra abbiamo incluso solo il codice necessario per il nostro studio.
- Riga 1: la classe [client] deriva dalla classe [person], proprio come nel servizio web.
- Riga 5: la classe [person]
- riga 7: una proprietà pubblica della classe [person]
Questo codice è simile a quello già discusso per il client C# nella Sezione 5.1.
- Lo spazio dei nomi del proxy C generato è quello definito nella procedura guidata di creazione, preceduto dallo spazio dei nomi del progetto web stesso: ListeDesClients1.Ws.RdvMedecins
- La classe proxy che implementa localmente i metodi del servizio web remoto si chiama WsDaoJpaService.
- I nomi delle classi e delle proprietà iniziano con una lettera minuscola
Possiamo scrivere una pagina [Default.aspx] che visualizzi l'elenco dei clienti. La pagina è la seguente:
![]() |
N. | Tipo | Nome | Ruolo |
MultiView | Viste | Contenitore delle viste | |
Visualizza | CustomerView | la vista contenente l'elenco dei clienti | |
Ripetitore | RepeaterClients | visualizza l'elenco dei clienti sotto forma di elenco puntato | |
Visualizza | VisualizzazioneErrori | la vista che mostra eventuali errori | |
Etichetta | EtichettaErrore | il testo dell'errore |
Il codice di questa pagina è il seguente:
<%@ 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 as client).nom%>,
<%#(Container.DataItem as client).prenom%>
</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>
Si noti, alla riga 3, la necessità di importare lo spazio dei nomi [ListeDesClients1.Ws.RdvMedecins] dal proxy C del servizio web in modo che la classe [client] alle righe 20 e 21 sia accessibile.
Il codice di controllo [Default.aspx.cs] associato alla pagina di presentazione [Default.aspx] è il seguente:
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
{
// local proxy instantiation of remote [dao] layer
WsDaoJpaService dao = new WsDaoJpaService();
// customer view
Vues.ActiveViewIndex = 0;
// client view initialization
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// error view
Vues.ActiveViewIndex = 1;
//initialization error view
LabelErreur.Text = ex.ToString();
}
}
}
}
- Riga 8: il metodo Page_Load viene eseguito quando la pagina viene caricata inizialmente. Questo caricamento avviene ogni volta che un client richiede la pagina.
- riga 13: viene istanziato il proxy C locale. Questo proxy C implementa l'interfaccia del servizio web remoto. L'applicazione comunicherà con questo proxy C.
- Riga 15: se non si verifica alcuna eccezione durante l'istanziazione del proxy C locale, deve essere visualizzata la vista denominata "VueClients", ovvero la vista n. 0 nel MultiView "Vues" della pagina.
- Riga 17: l'origine dati del ripetitore è l'elenco dei client fornito dal metodo getAllClients del proxy C.
- riga 23: se si verifica un'eccezione durante l'istanziazione del proxy C locale, deve essere visualizzata la vista denominata "VueErreurs", ovvero la vista n. 1 nel MultiView "Vues" della pagina.
- Riga 25: L'eccezione viene visualizzata nell'etichetta "LabelErreur".
L'esecuzione del progetto web produce il seguente risultato:
![]() |
5.3. Un secondo client ASP.NET 2008
Ora scriveremo un secondo client ASP.NET / C#, questa volta utilizzando la versione di Visual Web Developer Express 2008 precedente all'SP1.
![]() |
Creiamo il progetto web client .NET:
![]() |
Creiamo un sito web [1, 2] denominato [ClientList] [3].
![]() |
- In [4], il progetto web
- in [5], facendo clic con il tasto destro del mouse sul nome del progetto, aggiungiamo un riferimento al servizio come abbiamo fatto in precedenza.
- In [6], il progetto una volta aggiunto il riferimento al servizio web remoto
A differenza del progetto web SP1 discusso in precedenza, non abbiamo accesso agli oggetti client del servizio web tramite Esplora oggetti.
Importante da notare:
- Lo spazio dei nomi del proxy C generato è quello definito nella procedura guidata di creazione: Ws.RdvMedecins
- La classe proxy che implementa localmente i metodi del servizio Web remoto si chiama WsDaoJpaClient.
- I nomi delle classi e delle proprietà iniziano con una lettera minuscola
Possiamo scrivere una pagina [Default.aspx] che visualizzi l'elenco dei client. La pagina è la seguente:
![]() |
N. | Tipo | Nome | Ruolo |
MultiView | Viste | Contenitore delle viste | |
Vista | VisualizzazioneCliente | la vista contenente l'elenco dei clienti | |
Ripetitore | RepeaterClients | visualizza l'elenco dei clienti sotto forma di elenco puntato | |
Visualizza | VisualizzazioneErrori | la vista che mostra eventuali errori | |
Etichetta | EtichettaErrore | il testo dell'errore |
Il codice di questa pagina è il seguente:
<%@ 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 as client).nom%>, <%#(Container.DataItem as client).prenom%>
</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>
Si noti, alla riga 2, la necessità di importare lo spazio dei nomi [Ws.RdvMedecins] dal proxy C del servizio web in modo che la classe [client] alla riga 19 sia accessibile.
Il codice di controllo [Default.aspx.cs] associato alla pagina di presentazione [Default.aspx] è il seguente:
using System;
using Ws.RdvMedecins;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
// local proxy instantiation of remote [dao] layer
WsDaoJpaClient dao = new WsDaoJpaClient();
// customer view
Vues.ActiveViewIndex = 0;
// client view initialization
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// error view
Vues.ActiveViewIndex = 1;
//initialization error view
LabelErreur.Text = ex.ToString();
}
}
}
Questo codice è simile a quello della versione precedente. L'esecuzione del progetto web produce il seguente risultato:




















