5. Clientes .NET do serviço de agendamento J2EE
5.1. Um cliente C# 2008
Vamos agora assumir que o serviço web anterior está disponível e ativo. Um serviço web pode ser utilizado por clientes escritos em várias linguagens. Aqui, vamos escrever um cliente de consola em C# para apresentar a lista de médicos.
![]() |
Vamos começar por criar o projeto em C#:
![]() |
Criamos uma aplicação de consola [1] chamada [ListeDesMedecins] [2]. Em [3], criamos uma referência a um serviço web. Esta ferramenta é semelhante à utilizada no NetBeans: cria um proxy local para o serviço web remoto.
![]() |
- Em [1], especifique o URI do ficheiro WSDL do serviço web (ver Secção 4.10.2).
- Em [2], solicitamos ao assistente que identifique os serviços web expostos neste URI
- Em [3], o serviço web encontrado é apresentado e, em [4], os métodos que este expõe.
- Em [5], especifique o namespace no qual as classes proxy C devem ser geradas
- Em [6], o proxy C é gerado.
![]() |
- Em [1], a referência Web que acabámos de criar. Clique duas vezes nela.
- Em [2], o explorador de objetos aberto ao clicar duas vezes.
- Em [3], selecione o namespace [ListeDesMedecins.Ws.RdvMedecins], que é o namespace do proxy C gerado. O primeiro termo [ListeDesMedecins] é o namespace padrão da aplicação C# criada (nomeámos-a ListeDesMedecins). O segundo termo [Ws.RdvMedecins] é o namespace que atribuímos ao proxy C no assistente. Em última análise, os objetos do proxy C pertencem ao namespace [ListeDesMedecins.Ws.RdvMedecins].
- Em [4], os objetos do proxy C gerado
![]() |
- em [5], [WsDaoJpaClient] é a classe que implementa localmente os métodos do serviço web remoto.
- Em [6], os métodos da classe [WsDaoJpaClient]. Aqui encontramos os métodos do serviço web remoto, tais como o método getAllClients em [7].
Vamos examinar o código das entidades geradas:
![]() |
No [1] acima, solicitamos a visualização do código da classe [client]:
...
public partial class client : personne {
}
....
public partial class personne : object, System.ComponentModel.INotifyPropertyChanged {
...
public long id {
...
}
...
}
Acima, incluímos apenas o código necessário para o nosso estudo.
- linha 2: a classe [customer] deriva da classe [person], tal como no serviço web.
- linha 8: uma propriedade pública da classe [pessoa]
O que notamos é que o código gerado não segue as convenções de codificação padrão do C#. Os nomes das classes e das propriedades públicas devem começar com uma letra maiúscula.
Voltemos à nossa aplicação C#:
![]() |
[Program.cs] [1] é a classe de teste. O seu código é o seguinte:
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);
}
}
}
}
Na linha 12, é utilizada a classe [Client] do proxy C, apesar de termos acabado de ver que, na realidade, se chamava [client]. É a declaração na linha 3 que nos permite utilizar [Client] em vez de [client]. Isto permite-nos cumprir a convenção de nomenclatura de classes. Ainda na linha 12, o método [getAllClients] é utilizado porque é assim que se chama no proxy C. A norma de codificação C# exigiria que se chamasse [GetAllClients].
A execução do programa anterior [1] produz os resultados apresentados em [2].
5.2. Um primeiro cliente ASP.NET 2008
Vamos agora escrever um primeiro cliente ASP.NET / C# para apresentar a lista de clientes.
![]() |
Nesta arquitetura, existem dois servidores web:
- aquele que executa o serviço web remoto
- aquele que executa o cliente ASP.NET para o serviço web remoto
Iremos criar o projeto Web do cliente ASP.NET utilizando o Visual Web Express 2008 SP1. A secção seguinte mostra como criar o mesmo projeto caso não disponha do Visual Web Express 2008 SP1.
![]() |
Criamos uma aplicação web [1, 2, 3] denominada [ClientList1] [4, 5, 6]. O projeto criado desta forma é visível em [7].
![]() |
- Em [5], clique com o botão direito do rato no nome do projeto para adicionar uma referência a um serviço web.
- Em [6], especifique o URI do ficheiro WSDL do serviço web (ver secção 4.10.2).
- Em [7], peça ao assistente para descobrir os serviços web expostos neste URI
![]() |
- Em [8], o serviço web encontrado é apresentado e, em [9], são mostrados os métodos que este expõe.
- Em [10], especifique o namespace no qual as classes proxy C devem ser geradas
- Em [11], a referência do serviço web gerado
Ao clicar duas vezes na referência [Ws.Rdvmedecins] [12], são apresentadas as classes e interfaces geradas para o proxy C:
![]() |
- Em [1], o explorador de objetos aberto ao clicar duas vezes.
- Em [2], selecione o namespace [ListeDesClients1.Ws.RdvMedecins], que é o namespace do proxy C gerado. O primeiro termo [ListeDesClients1] é o namespace padrão da aplicação ASP.NET criada (nomeámos-a ListeDesClients1). O segundo termo [Ws.RdvMedecins] é o namespace que atribuímos ao proxy C no assistente. Em última análise, os objetos do proxy C pertencem ao namespace [ListeDesClients1.Ws.RdvMedecins].
- Em [3], os objetos do proxy C gerado
![]() |
- Em [4], [WsDaoJpaService] é a classe que implementa localmente os métodos do serviço web remoto.
- Em [5], os métodos da classe [WsDaoJpaService]. Aqui encontramos os métodos do serviço web remoto, tais como o método getAllClients em [6].
Vamos examinar o código das entidades geradas:
![]() |
No [1] acima, solicitamos a visualização do código da classe [client]:
public partial class client : personne {
}
...
public partial class personne {
...
public long id {
...
}
Acima, incluímos apenas o código necessário para o nosso estudo.
- Linha 1: A classe [client] deriva da classe [person], tal como no serviço web.
- Linha 5: a classe [person]
- linha 7: uma propriedade pública da classe [person]
Este código é semelhante ao já discutido para o cliente C# na Secção 5.1.
- O namespace do proxy C gerado é aquele definido no seu assistente de criação, precedido pelo namespace do próprio projeto web: ListeDesClients1.Ws.RdvMedecins
- A classe proxy que implementa localmente os métodos do serviço web remoto chama-se WsDaoJpaService.
- Os nomes das classes e propriedades começam com uma letra minúscula
Podemos escrever uma página [Default.aspx] que exiba a lista de clientes. A página é a seguinte:
![]() |
N.º | Tipo | Nome | Função |
MultiView | Visualizações | Contentor de visualizações | |
Ver | CustomerView | a vista que contém a lista de clientes | |
Repetidor | RepetidorClientes | exibe a lista de clientes como uma lista com marcadores | |
View | ErrorView | a vista que apresenta quaisquer erros | |
Rótulo | ErrorLabel | o texto do erro |
O código desta página é o seguinte:
<%@ 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>
Note, na linha 3, a necessidade de importar o namespace [ListeDesClients1.Ws.RdvMedecins] a partir do proxy C do serviço web, para que a classe [client] nas linhas 20 e 21 fique acessível.
O código de controlo [Default.aspx.cs] associado à página de apresentação [Default.aspx] é o seguinte:
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();
}
}
}
}
- Linha 8: O método Page_Load é executado quando a página é carregada inicialmente. Este carregamento ocorre sempre que um cliente solicita a página.
- linha 13: o proxy C local é instanciado. Este proxy C implementa a interface do serviço web remoto. A aplicação irá comunicar com este proxy C.
- linha 15: se não ocorrer nenhuma exceção durante a instanciação do proxy C local, a vista denominada «VueClients» deve ser exibida, ou seja, a vista n.º 0 no MultiView «Vues» da página.
- Linha 17: A fonte de dados do repetidor é a lista de clientes fornecida pelo método getAllClients do proxy C.
- linha 23: se ocorrer uma exceção ao instanciar o proxy C local, a vista denominada «VueErreurs» deve ser apresentada, ou seja, a vista n.º 1 no MultiView «Vues» da página.
- Linha 25: A exceção é exibida no rótulo «LabelErreur».
A execução do projeto web produz o seguinte resultado:
![]() |
5.3. Um segundo cliente ASP.NET 2008
Vamos agora escrever um segundo cliente ASP.NET / C#, desta vez utilizando a versão do Visual Web Developer Express 2008 anterior ao SP1.
![]() |
Vamos criar o projeto web do cliente .NET:
![]() |
Criamos um site [1, 2] chamado [ClientList] [3].
![]() |
- Em [4], o projeto web
- em [5], clicando com o botão direito do rato no nome do projeto, adicionamos uma referência de serviço tal como fizemos anteriormente.
- Em [6], o projeto após a adição da referência ao serviço web remoto
Ao contrário do projeto Web SP1 discutido anteriormente, não temos acesso aos objetos do cliente do serviço Web através do Object Explorer.
Importante notar:
- O namespace do proxy C gerado é aquele definido no seu assistente de criação: Ws.RdvMedecins
- A classe proxy que implementa localmente os métodos do serviço Web remoto chama-se WsDaoJpaClient.
- Os nomes das classes e propriedades começam com uma letra minúscula
Podemos escrever uma página [Default.aspx] que exiba a lista de clientes. A página é a seguinte:
![]() |
N.º | Tipo | Nome | Função |
MultiView | Visualizações | Contentor de visualizações | |
Vista | CustomerView | a vista que contém a lista de clientes | |
Repetidor | RepetidorClientes | exibe a lista de clientes como uma lista com marcadores | |
View | ErrorView | a vista que apresenta quaisquer erros | |
Rótulo | ErrorLabel | o texto do erro |
O código desta página é o seguinte:
<%@ 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>
Note, na linha 2, a necessidade de importar o namespace [Ws.RdvMedecins] a partir do proxy C do serviço web, para que a classe [client] na linha 19 fique acessível.
O código de controlo [Default.aspx.cs] associado à página de apresentação [Default.aspx] é o seguinte:
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();
}
}
}
Este código é semelhante ao da versão anterior. Ao executar o projeto web, obtém-se o seguinte resultado:




















