5. Clientes .NET do serviço J2EE de compromissos
5.1. Um cliente C# 2008
Partimos agora do princípio de que o serviço web anterior está disponível e ativo. Um serviço web pode ser utilizado por clientes que podem ser escritos em diferentes linguagens. Propomos aqui escrever um cliente de consola em C# para apresentar a lista de médicos.
![]() |
Comecemos por criar o projeto em C#:
![]() |
Criamos uma aplicação de consola [1] denominada [ListeDesMedecins] [2]. No [3], criamos uma referência a um serviço web. Esta ferramenta é semelhante à utilizada no NetBeans: cria um proxy local do serviço web remoto.
![]() |
- No [1], indica-se a URI do ficheiro WSDL do serviço web (ver parágrafo 4.10.2).
- no [2], solicita-se ao assistente que identifique os serviços web expostos nesta URI
- em [3], o serviço web encontrado e, em [4], os métodos que este expõe.
- em [5], especifica-se em que espaço de nomes as classes do proxy C devem ser geradas
- em [6], gera-se o proxy C.
![]() |
- no [1], a referência web que acabámos de criar. Cliquemos duas vezes nela.
- em [2], o explorador de objetos aberto pelo duplo clique.
- em [3], selecionamos o espaço de nomes [ListeDesMedecins.Ws.RdvMedecins], que é o espaço de nomes do proxy C gerado. O primeiro termo, [ListeDesMedecins], é o espaço de nomes predefinido da aplicação C# criada (a que chamámos ListeDesMedecins). O segundo termo, [Ws.Rdvmedecins], é o espaço de nomes que atribuímos ao proxy C no assistente. Por fim, os objetos do proxy C pertencem ao espaço de nomes [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 encontram-se os métodos do serviço web remoto, como, por exemplo, o método getAllClients em [7].
Analisemos o código das entidades geradas:
![]() |
No [1] acima, solicita-se 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, mantivemos apenas o código necessário para a nossa análise.
- linha 2: a classe [client] deriva da classe [personne], tal como no serviço web.
- linha 8: uma propriedade pública da classe [personne]
O que se verifica é que o código gerado não respeita as normas habituais de codificação do C#. Os nomes das classes e das propriedades públicas deveriam começar por 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 {
// instanciação da camada [dao] do cliente
WsDaoJpaClient dao = new WsDaoJpaClient();
// lista de médicos
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, quando acabámos de ver que, na realidade, se chamava [client]. É a declaração da linha 3 que nos permite utilizar [Client] em vez de [client]. Isto permite-nos respeitar a norma de codificação dos nomes das 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 [1] anterior 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 do serviço web remoto
Vamos criar o projeto web do cliente ASP.NET com a versão Visual Web Express 2008 SP1. O parágrafo seguinte mostra como criar o mesmo projeto caso não se disponha da versão SP1 do Visual Web Express 2008.
![]() |
Cria-se uma aplicação web [1, 2, 3] denominada [ListeDesClients1] [4,5,6]. O projeto assim criado pode ser visualizado em [7].
![]() |
- No [5], ao clicar com o botão direito do rato no nome do projeto, adiciona-se uma referência a um serviço web.
- No [6], indica-se a URI do ficheiro WSDL do serviço web (ver parágrafo 4.10.2).
- No [7], solicita-se ao assistente que identifique os serviços web expostos nessa URI
![]() |
- em [8], é apresentado o serviço web encontrado e, em [9], os métodos que este expõe.
- em [10], especifica-se em que espaço de nomes as classes do proxy C devem ser geradas
- em [11], a referência do serviço web gerada
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], seleciona-se o espaço de nomes [ListeDesClients1.Ws.RdvMedecins], que é o espaço de nomes do proxy C gerado. O primeiro termo, [ListeDesClients1], é o espaço de nomes predefinido da aplicação ASP.NET criada (a que chamámos ListeDesClients1). O segundo termo, [Ws.Rdvmedecins], é o espaço de nomes que atribuímos ao proxy C no assistente. Por fim, os objetos do proxy C pertencem ao espaço de nomes [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 encontram-se os métodos do serviço web remoto, como, por exemplo, o método getAllClients em [6].
Analisemos 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, mantivemos apenas o código necessário para a nossa análise.
- linha 1: a classe [client] deriva da classe [personne], tal como no serviço web.
- linha 5: a classe [personne]
- linha 7: uma propriedade pública da classe [personne]
Encontramos aqui um código semelhante ao já comentado para o cliente C# no parágrafo 5.1.
- O espaço de nomes do proxy C gerado é aquele definido no seu assistente de criação, prefixado pelo espaço de nomes 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 das propriedades começam por 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 | Contenedor de vistas | |
Vista | VueClients | a vista que contém a lista de clientes | |
Repetidor | RepeaterClients | apresenta a lista de clientes sob a forma de uma lista com marcadores | |
View | VueErreurs | a vista que apresenta um eventual erro | |
Rótulo | LabelErreur | o texto do erro |
O código de apresentação 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 como cliente).nome%>,
<%#(Container.DataItem como cliente).nome próprio%>
</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-se, na linha 3, a necessidade de importar o espaço de nomes [ListeDesClients1.Ws.RdvMedecins] do proxy C do serviço web, para que a classe [client] das 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
{
// instância proxy local da camada [dao] remota
WsDaoJpaService dao = new WsDaoJpaService();
// vista do cliente
Vues.ActiveViewIndex = 0;
// inicialização da vista do cliente
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// vista de erros
Vues.ActiveViewIndex = 1;
//inicialização da vista de erros
LabelErreur.Text = ex.ToString();
}
}
}
}
- linha 8: o método Page_Load é executado no carregamento inicial da página. Este carregamento ocorre sempre que um cliente solicita a página.
- linha 13: instanciamos o proxy local C. 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 local C, deve ser apresentada a vista denominada «VueClients», c.a.d. a vista n.º 0 na secção «Vistas» da página MultiView.
- linha 17: a fonte de dados do répéteur é a lista de clientes fornecida pelo método getAllClients do proxy C.
- linha 23: em caso de exceção durante a instanciação do proxy local C, deve ser apresentada a vista denominada «VueErreurs», c.a.d. a vista n.º 1 na secção «Vistas» da página MultiView.
- linha 25: a exceção é apresentada no label «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 Visual Web Developer Express 2008, que antecedeu a versão SP1.
![]() |
Vamos criar o projeto web do cliente .NET:
![]() |
Criamos um site web [1, 2] denominado [ListeDesClients] [3].
![]() |
- no [4], o projeto web
- em [5], clicando com o botão direito do rato no nome do projeto, adiciona-se uma referência de serviço tal como foi feito 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 analisado anteriormente, não se tem acesso aos objetos do cliente do serviço web através do explorador de objetos.
O que é preciso saber:
- o espaço de nomes 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 das propriedades começam por uma letra minúscula
Podemos escrever uma página [Default.aspx] que apresente a lista de clientes. A página é a seguinte:
![]() |
N.º | Tipo | Nome | Função |
MultiView | Visualizações | Contenedor de vistas | |
Vista | VueClients | a vista que contém a lista de clientes | |
Repetidor | RepeaterClients | apresenta a lista de clientes sob a forma de uma lista com marcadores | |
View | VueErreurs | a vista que apresenta um eventual erro | |
Rótulo | LabelErreur | o texto do erro |
O código de apresentação 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 como cliente).nome%>, <%#(Container.DataItem como cliente).nome próprio%>
</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-se, na linha 2, a necessidade de importar o espaço de nomes [Ws.RdvMedecins] do proxy C do serviço web para que a classe [client] da 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
{
// instanciação do proxy local da camada [dao] remota
WsDaoJpaClient dao = new WsDaoJpaClient();
// vista do cliente
Vues.ActiveViewIndex = 0;
// inicialização da vista do cliente
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// vista de erros
Vues.ActiveViewIndex = 1;
//inicialização da vista de erros
LabelErreur.Text = ex.ToString();
}
}
}
Este código é análogo ao da versão anterior. A execução do projeto web produz o seguinte resultado:




















