Skip to content

5. Client .NET del servizio J2EE degli appuntamenti

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 diversi linguaggi. In questa sede ci proponiamo di scrivere un client da console in C# per visualizzare l’elenco dei medici.

Iniziamo creando il progetto C#:

Creiamo un'applicazione 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 del servizio web remoto.

  • In [1], si indica l’URI del file WSDL del servizio web (cfr. paragrafo 4.10.2).
  • in [2], si chiede all’assistente di individuare i servizi web esposti a tale URI
  • in [3], il servizio web trovato e in [4] i metodi che espone.
  • in [5], si specifica in quale spazio dei nomi devono essere generate le classi del proxy C
  • in [6], si genera il proxy C.
  • in [1], il collegamento web che abbiamo appena creato. Facciamo doppio clic su di esso.
  • in [2], l’esploratore di oggetti aperto con il doppio clic.
  • in [3], selezioniamo 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 (che abbiamo chiamato ListeDesMedecins). Il secondo termine, [Ws.Rdvmedecins], è lo spazio dei nomi che abbiamo assegnato al proxy C nell’assistente. Alla fine, gli oggetti del proxy C si trovano nello 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 si trovano i metodi del servizio web remoto, come ad esempio il metodo getAllClients in [7].

Esaminiamo il codice delle entità generate:

Nel codice [1] sopra riportato, si richiede 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 mantenuto solo il codice necessario al nostro studio.

  • riga 2: la classe [client] deriva dalla classe [personne], come nel servizio web.
  • riga 8: una proprietà pubblica della classe [personne]

Si nota che il codice generato non rispetta le convenzioni di codifica standard di C#. I nomi delle classi e delle proprietà pubbliche dovrebbero iniziare con la 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 {
                // istanziazione del livello [dao] del client
                WsDaoJpaClient dao = new WsDaoJpaClient();
                // elenco dei medici
                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, mentre abbiamo appena visto che in realtà si chiama [client]. È la dichiarazione alla riga 3 che ci permette di utilizzare [Client] al posto di [client]. Questo ci permette di rispettare la convenzione di codifica dei nomi delle classi. Sempre alla riga 12, viene utilizzato il metodo [getAllClients] perché è così che si chiama nel proxy C. La convenzione di denominazione C# vorrebbe che si chiamasse [GetAllClients].

L’esecuzione del programma [1] precedente fornisce i risultati mostrati in [2].

5.2. Un primo client ASP.NET 2008

Ora scriviamo un primo client ASP.NET / C# per visualizzare l’elenco dei clienti.

In questa architettura sono presenti due server web:

  • quello che esegue il servizio web remoto
  • quello che esegue il client ASP.NET del servizio web remoto

Creeremo il progetto web del client ASP.NET con la versione Visual Web Express 2008 SP1. Il paragrafo seguente illustra come creare lo stesso progetto se non si dispone della versione SP1 di Visual Web Express 2008.

Si crea un'applicazione web [1, 2, 3] denominata [ListeDesClients1] [4,5,6]. Il progetto così creato è visibile in [7].

  • In [5], facendo clic con il tasto destro del mouse sul nome del progetto, si aggiunge un riferimento al servizio web.
  • In [6], si indica l'URI del file WSDL del servizio web (cfr. paragrafo 4.10.2).
  • In [7], si chiede all’assistente di individuare i servizi web esposti a tale URI
  • in [8] viene visualizzato il servizio web trovato e in [9] i metodi che esso espone.
  • In [10], si specifica in quale spazio dei nomi devono essere generate le classi del proxy C
  • in [11], il riferimento al servizio web generato

Un doppio clic sul riferimento [Ws.Rdvmedecins] [12] visualizza le classi e le interfacce generate per il proxy C:

  • in [1], l’esploratore di oggetti aperto con il doppio clic.
  • in [2], si seleziona 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 (che abbiamo denominato 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 si trovano i metodi del servizio web remoto, come ad esempio il metodo getAllClients in [6].

Esaminiamo il codice delle entità generate:

Nel codice [1] sopra riportato, si richiede di visualizzare il codice della classe [client]:


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

In questo caso, abbiamo mantenuto solo il codice necessario al nostro studio.

  • riga 1: la classe [client] deriva dalla classe [personne], come nel servizio web.
  • riga 5: la classe [personne]
  • riga 7: una proprietà pubblica della classe [personne]

Si riscontra un codice analogo a quello già commentato per il client C# al paragrafo 5.1.

  • Lo spazio dei nomi del proxy C generato è quello definito nel relativo assistente 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
1
MultiView
Viste
Contenitore di viste
2
Vista
VueClients
la vista che contiene l'elenco dei clienti
3
Ripetitore
RepeaterClients
visualizza l'elenco dei clienti sotto forma di elenco puntato
4
Visualizza
VueErreurs
la vista che mostra un eventuale errore
5
Etichetta
LabelErreur
il testo dell'errore

Il codice di visualizzazione 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 come client).cognome%>,
                <%#(Container.DataItem come client).nome%>
              </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] del proxy C del servizio web affinché la classe [client] delle 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
      {
        // istanza proxy locale del livello [dao] remoto
        WsDaoJpaService dao = new WsDaoJpaService();
        // vista cliente
        Vues.ActiveViewIndex = 0;
        // inizializzazione della vista client
        RepeaterClients.DataSource = dao.getAllClients();
        RepeaterClients.DataBind();
      }
      catch (Exception ex)
      {
        // vista errori
        Vues.ActiveViewIndex = 1;
        //inizializzazione della vista errori
        LabelErreur.Text = ex.ToString();
      }
    }
  }
}
  • riga 8: il metodo Page_Load viene eseguito al caricamento iniziale della pagina. Questo caricamento avviene ad ogni richiesta di un client che richiede la pagina.
  • riga 13: viene istanziato il proxy locale C. 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 locale C, deve essere visualizzata la vista denominata "VueClients", ovvero c.a.d. la vista n. 0 nella sezione «Viste» della pagina MultiView.
  • riga 17: la fonte dati di répéteur è l'elenco dei clienti fornito dal metodo getAllClients del proxy C.
  • riga 23: in caso di eccezione durante l'istanziazione del proxy locale C, deve essere visualizzata la vista denominata "VueErreurs", c.a.d. la vista n. 1 nella sezione «Viste» della pagina MultiView.
  • riga 25: l'eccezione viene visualizzata nel label "LabelErreur".

L'esecuzione del progetto web produce il seguente risultato:

5.3. Un secondo client ASP.NET 2008

Ora scriviamo un secondo client ASP.NET / C#, questa volta utilizzando la versione Visual Web Developer Express 2008, che ha preceduto la versione SP1.

Creiamo il progetto web del client .NET:

Creiamo un sito denominato web [1, 2] chiamato [ListeDesClients] [3].

  • in [4], il progetto web
  • in [5]; con un clic destro sul nome del progetto, si aggiunge un riferimento al servizio come fatto in precedenza.
  • in [6], il progetto una volta aggiunto il riferimento al servizio web remoto

A differenza del progetto web SP1 esaminato in precedenza, non è possibile accedere agli oggetti del client del servizio web tramite l’esploratore di oggetti.

Da sapere:

  • lo spazio dei nomi del proxy C generato è quello definito nella relativa 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 clienti. La pagina è la seguente:

N.
Tipo
Nome
Ruolo
1
MultiView
Viste
Contenitore di viste
2
Vista
VueClients
la vista che contiene l'elenco dei clienti
3
Ripetitore
RepeaterClients
visualizza l'elenco dei clienti sotto forma di elenco puntato
4
Visualizza
VueErreurs
la vista che mostra un eventuale errore
5
Etichetta
LabelErreur
il testo dell'errore

Il codice di visualizzazione 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 come cliente).cognome%>, <%#(Container.DataItem come cliente).nome%>
                                </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] del proxy C del servizio web affinché la classe [client] della 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
    {
      // istanza proxy locale del livello [dao] remoto
      WsDaoJpaClient dao = new WsDaoJpaClient();
      // vista cliente
      Vues.ActiveViewIndex = 0;
      // inizializzazione della vista client
      RepeaterClients.DataSource = dao.getAllClients();
      RepeaterClients.DataBind();
    }
    catch (Exception ex)
    {
      // vista errori
      Vues.ActiveViewIndex = 1;
      //inizializzazione della vista errori
      LabelErreur.Text = ex.ToString();
    }
  }
}

Questo codice è analogo a quello della versione precedente. L'esecuzione del progetto web produce il seguente risultato:

Image