5. Clientes .NET do serviço J2EE de compromissos
5.1. Um cliente C# 2008
Partimos 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 console em C# para exibir a lista de médicos.
![]() |
Vamos começar criando o projeto em C#:
![]() |
Criamos um aplicativo de console [1] chamado [ListeDesMedecins] [2]. No [3], criamos uma referência a um serviço web. Essa ferramenta é semelhante à utilizada no NetBeans: ela cria um proxy local do serviço web remoto.
![]() |
- No [1], indica-se a URI do arquivo WSDL do serviço web (ver parágrafo 4.10.2).
- no [2], solicita-se ao assistente que identifique os serviços web expostos nessa URI
- em [3], o serviço web encontrado e, em [4], os métodos que ele expõe.
- em [5], especifica-se em qual espaço de nomes as classes do proxy C devem ser geradas
- em [6], gera-se o proxy C.
![]() |
- no [1], a referência da web que acabamos de criar. Clique duas vezes nela.
- em [2], o explorador de objetos aberto pelo clique duplo.
- em [3], selecionamos o namespace [ListeDesMedecins.Ws.RdvMedecins], que é o namespace do proxy C gerado. O primeiro termo, [ListeDesMedecins], é o namespace padrão do aplicativo C# criado (que chamamos de ListeDesMedecins). O segundo termo, [Ws.Rdvmedecins], é o namespace que atribuímos ao proxy C no assistente. Por fim, 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]. Nela encontramos os métodos do serviço web remoto, como, por exemplo, o método getAllClients em [7].
Vamos examinar o código das entidades geradas:
![]() |
No [1] acima, solicitamos a exibiçã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 nossa análise.
- linha 2: a classe [client] deriva da classe [personne], assim como no serviço web.
- linha 8: uma propriedade pública da classe [personne]
O que se observa é que o código gerado não segue as normas habituais de codificação do C#. Os nomes das classes e das propriedades públicas deveriam começar com letra maiúscula.
Voltemos ao nosso aplicativo em C#:
![]() |
[Program.cs] [1] é a classe de teste. 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, a classe [Client] do proxy C é utilizada, embora tenhamos acabado de ver que, na verdade, ela se chamava [client]. É a declaração da linha 3 que nos permite usar [Client] em vez de [client]. Isso nos permite respeitar a norma de codificação dos nomes de classe. Ainda na linha 12, o método [getAllClients] é utilizado porque é assim que ele se chama no proxy C. A norma de codificação do C# exigiria que ele se chamasse [GetAllClients].
A execução do programa [1] anterior produz os resultados mostrados em [2].
5.2. Um primeiro cliente ASP.NET 2008
Agora, vamos escrever um primeiro cliente ASP.NET / C# para exibir a lista de clientes.
![]() |
Nesta arquitetura, há 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 a seguir mostra como criar o mesmo projeto caso não se tenha a versão SP1 do Visual Web Express 2008.
![]() |
Cria-se um aplicativo web [1, 2, 3] chamado [ListeDesClients1] [4,5,6]. O projeto assim criado pode ser visualizado em [7].
![]() |
- No [5], clicando com o botão direito do mouse no nome do projeto, adiciona-se uma referência ao serviço web.
- No [6], indique-se a URI do arquivo 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], o serviço web encontrado e, em [9], os métodos que ele expõe são exibidos.
- em [10], especifica-se em qual namespace as classes do proxy C devem ser geradas
- em [11], a referência do serviço web gerada
Um clique duplo na referência [Ws.Rdvmedecins] [12] exibe 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 namespace [ListeDesClients1.Ws.RdvMedecins], que é o namespace do proxy C gerado. O primeiro termo, [ListeDesClients1], é o namespace padrão do aplicativo ASP.NET criado (nós o chamamos de ListeDesClients1). O segundo termo, [Ws.Rdvmedecins], é o namespace que atribuímos ao proxy C no assistente. Por fim, 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]. Nela encontramos os métodos do serviço web remoto, como, por exemplo, o método getAllClients em [6].
Vamos examinar o código das entidades geradas:
![]() |
No [1] acima, solicitamos a exibiçã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 nossa análise.
- linha 1: a classe [client] deriva da classe [personne], assim como no serviço web.
- linha 5: a classe [personne]
- linha 7: uma propriedade pública da classe [personne]
Encontramos um código semelhante ao já comentado para o cliente C# no parágrafo 5.1.
- O namespace do proxy C gerado é aquele definido em seu assistente de criação, prefixado 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 das propriedades começam com 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 | Contêiner de visualizações | |
Visão | VueClients | a visualização que contém a lista de clientes | |
Repetidor | RepeaterClients | exibe a lista de clientes na forma de uma lista com marcadores | |
Visualizar | VueErreurs | a visualização que exibe um possível 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%>
</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>
Observe, 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 controle [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 do proxy local da camada [dao] remota
WsDaoJpaService dao = new WsDaoJpaService();
// visão do cliente
Vues.ActiveViewIndex = 0;
// inicialização da visualização do cliente
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// visualização de erros
Vues.ActiveViewIndex = 1;
//inicialização da visualização de erros
LabelErreur.Text = ex.ToString();
}
}
}
}
- linha 8: o método Page_Load é executado no carregamento inicial da página. Esse carregamento ocorre a cada solicitação de um cliente que pede a página.
- linha 13: instanciamos o proxy local C. Esse proxy C implementa a interface do serviço web remoto. O aplicativo irá se comunicar com esse proxy C.
- linha 15: se não houver exceção durante a instanciação do proxy local C, a vista denominada “VueClients” deve ser exibida, c.a.d. a visualização nº 0 na seção “Visualizações” 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 exibida a visualização denominada “VueErreurs”, c.a.d. a visualização nº 1 na seção “Visualizações” da página MultiView.
- linha 25: a exceção é exibida no label “LabelErreur”.
A execução do projeto web produz o seguinte resultado:
![]() |
5.3. Um segundo cliente ASP.NET 2008
Agora, vamos 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 chamado web [1, 2], denominado [ListeDesClients] [3].
![]() |
- no [4], o projeto web
- em [5]; ao clicar com o botão direito do mouse no nome do projeto, adiciona-se uma referência de serviço, conforme 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 há acesso aos objetos do cliente do serviço web por meio do explorador de objetos.
O que é preciso saber:
- o espaço de nomes do proxy C gerado é aquele definido em 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 com 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 | Contêiner de visualizações | |
Visão | VueClients | a visualização que contém a lista de clientes | |
Repetidor | RepeaterClients | exibe a lista de clientes na forma de uma lista com marcadores | |
Exibir | VueErreurs | a visualização que exibe um possível 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).sobrenome%>, <%#(Container.DataItem como 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>
Observe, 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 controle [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();
// visão do cliente
Vues.ActiveViewIndex = 0;
// inicialização da visualização do cliente
RepeaterClients.DataSource = dao.getAllClients();
RepeaterClients.DataBind();
}
catch (Exception ex)
{
// visualização de erros
Vues.ActiveViewIndex = 1;
//inicialização da visualização de erros
LabelErreur.Text = ex.ToString();
}
}
}
Esse código é análogo ao da versão anterior. A execução do projeto web produz o seguinte resultado:




















