segunda-feira, 22 de setembro de 2008

Java para Web no Netbeans 6 – Servlet, JSP & CSS

Java é uma linguagem de programação. Entretanto, quando nos referimos a Java como uma tecnologia estamos tratando de um grande conjunto composto por elementos distintos. Esses elementos de forma generalizada são: Padrões, frameworks e tecnologias. Esses três elementos combinados definem um outro elemento que são as arquiteturas.

Objetivo

Vamos construir um exemplo de aplicação Web onde experimentaremos de perto a complexidade de construir conteúdo dinâmico para Web. Conseqüentemente esbarraremos em algumas questões arquiteturais envolvendo tecnologia do lado cliente, e servidor. Veremos uma das soluções Java para este cenário.
Temos o arquivo Index.jsp, ele define a participação da tecnologia JSP na nossa arquitetura. Neste arquivo definiremos um formulário (objeto http form) que enviará dados para uma classe servlet a qual processará esses dados.

A tecnologia Java tem uma abordagem própria para desenvolvimento Web. Basicamente, quando você ouve falar em Java para Web invariavelmente escutará associado a esta idéia duas tecnologias: Servlet e JSP. Digo basicamente, porque as duas não são absolutas neste contexto. Existem outras, as quais vermos mais adiante, que cujo a utilização, quando feita adequadamente, pode oferecer para o desenvolver um ganho satisfatório.
A tecnologia Servlet desempenha um papel muito importante neste cenário, vamos neste artigo desenvolver um pequeno exemplo de uma aplicação Web em Java usando explicitamente a tecnologia Servlet. Meu principal objetivo e experimentar o Netbeans 6 para esse fim, durante esse processo pretendo tocar em pontos de importância básica pertinentes ou tema que escolhi inicialmente. Portanto, prossigamos:

Inicie um novo projeto Web no Netbeans 6 (Veja em “Um novo Projeto no Netbeans 6.”).




Entendendo um projeto Web Java

Veja na janela “Projects” (Project explorer vou chamar assim ...) , os diversos elementos que compõem o nosso projeto. Eles ficam organizados e dispostos numa estrutura hierarquizada de diretórios que são representados por uma Tree View a qual fornece acesso aos arquivos contidos por cada diretório.



O Diretório “Web Pages” é o principal, a raiz, de uma aplicação Java Web convencional. Contidos nele temos um arquivo index.jsp (que define a home page do site, por exemplo), além do diretório “WEB-INF” o qual contém o arquivo descritor de deploy (deployment descriptor), web.xml.

“Configuration Files”, é o diretório onde ficam todos os arquivos referentes a configurações da aplicação web.

“Source Packages”, velho conhecido, onde devem ficar todos os pacotes, classes Java e Servlets (obviamente, que serão criados durante o desenvolvimento da aplicação web).

“Test Package”, para testes unitários.

As bibliotecas ficam em “Libraries”, exceto as que forem necessárias aos testes que devem ficar em “Tests Libraries” (por default as bibliotecas do Junit 3.8.2 e 4.1 já serão adicionadas nesta pasta).



Usando CSS

Vou criar um arquivo CSS o qual usarei neste exemplo. Para armazená-lo, vou criar um novo diretório dentro de “Web Pages”, a este chamarei de “ZnCss”. Com o botão direito do mouse, na treeview do project explorer, sobre a pasta “Web Pages” selecione New ► Folder, conforme ilustração abaixo:




O Netbeans, através do assistente vai auxiliar este trabalho. Em “Folder Name” digite o nome desejado para o novo diretório. Note que, você pode também definir a hierarquia desse novo diretório em “Parent Folder”. Para completar a criação do diretório click em “Finish”.



Para criar o arquivo CSS, selecione, com o botão direito do mouse no novo diretório, a opção New ►Other, para acessar o assistente. Em seguida, dentre as opções listadas, na categoria “Web”, selecione “Cascading Style Sheet”. Click em “Next” para continuar a criação do arquivo CSS.



Em “CSS File Name” digite o nome do arquivo: “ZnCSSlandjah”. Veja que “Location” e “Folder” já estão definidos em decorrência de termos selecionado o diretório “ZnCss”.



Click em “Finish” e seu arquivo será criado. Esse foi meu primeiro contato com o editor de CSS do Netbeans 6, gostei! Basta você digitar a classe, ou tag que deseja redefinir, e intuitivamente é possível usar os recursos da IDE para edição de CSS.
O Preview lhe permite em tempo de design ver o efeito do css que você está editando.

A seguir o código do meu css

/*
Document : ZnCSSlandjah
Created on : 22/09/2008, 10:59:57
Author : Gmotta Zn
Description:
Purpose of the stylesheet follows.
*/

div{
font-family: Cosmic Sans, Veranda,Tahoma;
font-size: 14px;
background-color: #330099;
color: #ccff99;
font-weight: bolder;
text-align: center;

}


Editando o arquivo Index.jsp

Quando iniciamos um projeto Web no Netbeans ele define no deployment descriptor qual o arquivo será executado quando o Glass Fish atender uma requisição cliente chamando a URL do seu serviço. Esse arquivo, por default é o Index.jsp. Você pode alterar isso no o arquivo “web.xml” (basta um duplo click sobre o arquivo, ou com o botão direito selecione “Open”), pela IDE na aba “Pages”.



Na tag “head” do arquivo “Index.jsp” vou linkar o CSS “ZnCSSlandjah.css”.


<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF- 8">
<title>Estação ZN - Nova JSP Page</title>
<link href="ZnCss/ZnCSSlandjah.css" rel="stylesheet" type="text/css">


O próximo passo será adicionar um “form” para postar dados para efetuarmos um processamento qualquer no servidor. Na janela “Palhette” (provavelmente ela deve estar no lado direito da IDE), selecione em “HML Forms” um objeto “Form”, click sobre ele e arraste para um local, entre a abertura e o fechamento da tag “body”. Em seguida prossiga com o assistente.



Em “Action” vou digitar “ZnLandjha” (esse vai ser o nome do Servlet que criarei posteriormente), o “method” selecione "POST".



O Editor no Netbeans é sensacional, veja um code insigth para HTML muito bom.



Agora, o “body” da minha página jsp está assim: (indexJSP.txt)

<body>
<h2> Estação ZN - Servlets </h2>
<h3> GlassFish <h3>
<div>
www.estacaozn.blogspot.com
</div>
<br>

<form name="form1" action="ZnLandjha" method="POST">

</form>
</body>


OBS: Na tag "div" pretendo aplicar o efeito do CSS ...

Vou adicionar um objeto HTML “Table” na minha página aonde pretendo colocar os “inputs”. Depois de editar o código, digite conforme ilustrado abaixo:


<%--
Document : index
Created on : 18/09/2008, 03:25:39
Author : GMotta Zn
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Estação ZN - Nova JSP Page</title>
<link href="ZnCss/ZnCSSlandjah.css" rel="stylesheet"
type="text/css">

</head>
<body>
<h2> Estação ZN - Servlets </h2>
<h3> GlassFish <h3>
<div>
www.estacaozn.blogspot.com
</div>
<br>

<form name="form1" action="ZnLandjha" method="POST">
<div>
<table border="0" cellpadding="1">
<tbody>
<tr>
<td>
Digite o Nome:
</td>
<td>
<input type="text" name="znBla" value="Bla!"
size="32" />
</td>
</tr>
<tr>
<td>
<input type="submit" value="Ok Zn" name="btnEnviar"
/>
</td>
<td>
Netbeans 6 - Servlet, JSP & CSS
</td>
</tr>
</tbody>
</table>
</div>
</form>
</body>
</html>



Criando o Servlet

Com o botão direito do mouse no que eu chamo de “Project Explore”, selecione a opção: New ►Servlet




O Nome da Classe servlet vai ser “ZnLandjha”. Note que o assistente já define pra você o projeto (Project: AppWebServletsZN, não editável) e o diretório (Location: Source Pakcages) onde será criado o arquivo onde está defina a classe que vamos codificar. Ainda não definimos uma package para nosso projeto, isso deverá ser feito neste momento. Digite “ZnWebLandjahPkg” em Pakcage. Veja ilustração abaixo:



Clicando em “Next” você pode configurar a URL de chamada ao seu servlet mediante ao valor digitado em “URL Pattern(s):”. Todas as informações definidas precisam ser persistidas no “Deployment Descriptor”, o arquivo “web.xml”. Portanto, a opção “Add information to deployment descriptor” deve ficar selecionada. Logo, vou deixar tudo como está neste diálogo e finalizar aqui. Click em “Finish”.



Codificando o Servlet “ZnLandjha”

package ZnWebLandjahPkg;

import java.io.*;
import java.net.*;
import java.util.Iterator;
import javax.servlet.*;
import javax.servlet.http.*;

/**
* @author GMottaZn
*/
public class ZnLandjha extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String znBla = request.getParameter("znBla");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ZnLandjha</title>");
out.println("<link href=ZnCss/ZnCSSlandjah.css rel=stylesheet type=text/css>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet ZnLandjha at " + request.getContextPath
() + "</h1> <br>");
out.println("<h4> Você Digitou: " + znBla + "</h4> <br>");
out.println("<div> Ivertendo temos: " + inverterZn(znBla)+ "</div>");
out.println("</body>");
out.println("</html>");

} finally {
out.close();
}
}

protected String inverterZn(String znValue){
StringBuffer znAux = new StringBuffer(znValue);
znAux.reverse();
return znAux.toString();
};

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

/**
* Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}


Até que em fim um pouco de código Java. Analisado o código acima:

Linha 1: referência ao pacote (package).

Linha 3 – 7: importação de bibliotecas.

Linha 9-11: Comentário para documentação.

Linha 12- 71: Codificação da classe “ZnLandjha”, que estende de “HttpServlet” (Superclasse para Servlet). A classe “HttpServlet” estende a classe javax.servlet.GenericServlet. Ela acrescenta os métodos “doXXXX” que são executados mediante as requisições “http”. “doGet”, “doPost”, “doPut”, “doDelete”, “doOption” e “doTrave”. Cada um desses métodos são chamados em resposta a um método http evocado. Exemplo: O método “doGet” é executado quando o Servlet recebe uma requisição (de uma página que submeteu um “form”) que foi enviada ao servidor web (por exemplo, o Glass Fish) usando o método http “GET”.




Linha 16: Recebendo do “Form” postado (do lado cliente) o valor do objeto “input” cujo nome é "znBla" (O qual foi definido no arquivo “Index.jsp”).

Linha 19-34: Dentro de um bloco protegido (try...), monta a página para saída dos valores processados pelo Servlet “ZnLandjha”.

Linha 28: Saída do valor processado pelo método protegido que codificamos “inverterZn”.

Linha 37-41: Método protected “inverterZn”, responsável pela inversão da string digitada pelo cliente. A inversão está sendo efetuada na linha 39, pela execução do método “reverse”. Na linha 40 uso o método “toString” para poder atribuir o valor de “znAux”, que é do tipo “StringBuffer”, para String e dessa forma posso retornar o valor invertido no método em questão.

Agora vamos fazer o deploy da nossa aplicação, com o botão direito sobre a raiz do projeto no “project explorer”, selecione “Undeploy and Deploy”.




Testando aplicação criada

Para testar basta pressionar F6, ou na barra de ferramentas click sobre o triângulo verde.



O browser vai ser executado ...



Digite alguma coisa na caixa de texto e submeta ...



O Servlet processou a requisição ...




Fontes deste artigo

Artigo completo (View Full Post)

Um novo Projeto no Netbeans 6

Um novo Projeto no Netbeans 6

Existem algumas opções para iniciarmos um novo projeto no Netbeans .... Vejamos:

Opções:

1)      No Menu File ►new Project (Ctrl+Shift+N)





2) Com o botão direto do mouse sobre a janela “Projects”(Tipo um Project Explorer, no lado direito da IDE)



No diálogo seguinte, no primeiro passo, devemos escolher que tipo de projeto vamos iniciar. Observe em “Categories” vários tipos diferentes para projetos Java no Netbeans.




No segundo passo, definiremos o nome do projeto o diretório onde ficarão os arquivos fontes criados para o projeto em questão.



Propriedades do seu projeto

Em “Project Name”, digite um nome adequado que você vai criar para seu projeto: Exemplo: “MeuExemploZnServlets”.



Em, “Project Location” o botão “browse” disponibiliza um janela, tipo API do Windows, para você definir um diretório onde ficarão os arquivos do seu projeto.

Outros detalhes específicos do tipo do projeto também devem ser definidos ainda neste diálogo. Por exemplo, no caso de um projeto Web você pode definir o servidor web (GlassFish, por exemplo) em Server, a versão Java EE. O “Context Path” é o nome de contexto de acesso ao seu projeto.

Click em Finish para concluir a criação do seu novo projeto. Em alguns casos poderiam existir outras definições sobre o projeto. Como por exemplo, em aplicações web haveria um terceiro passo, no botão “Next”, para seleção opcional de um Framework.




A opção “Set as Main Project” indica para IDE qual o prjeto será compliado toda vez que os comandos de “Build” (F11 – Build Main Project) e “Run” (F6 – Run Main Project) forem, por você na IDE, executados.







Artigo completo (View Full Post)

quarta-feira, 10 de setembro de 2008

Jobim e Vinicius

Eu tive o privilégio de conhecer e conviver com personagens de extrema importância dentro do cenário da música popular brasileira. Ouvi as histórias, famosas, da bossa nova por seus próprios protagonistas.
A sabedoria do Gato, grande mestre, saudoso, Durval Ferreira. A genialidade bem humorada do cordial João Donato. Carlos Lyra, o Shakespeare da MPB. Roberto Menescal, o mentor, dentre outros gigantes. Pelos quais tenho profunda admiração.
Embora não tenha sido possível conhecer o Tom nem o Vinicius pessoalmente, pude conhecê-los um pouco, de uma forma que considero especial, oque também entendo como privilégio, pois posso olhar dentro de sua obra.



Através dos olhos desses amigos, professores. Neste artigo, trago minha leitura de um momento, de um acontecimento: Tom e Vinicius

O Que Tinha de Ser




OBS: Na partitura acima, eu não transcrevi a interpretação da Elis.




Artigo completo (View Full Post)

Usando Sibelius - Editor de Partitura ... Aos Nossos Filhos (Ivan Lins)

Perdoem a cara amarrada,
Perdoem a falta de abraço .... 




Apara adicionar uma cifra no Sibelius pressione Ctrl + K, o cursor vai ficar ativado (Azul), então basta clickcar sobre o compasso o qual receberá a cifra. Agora digite normalmente a cifra. Pronto!

Para deletar, excluir, um compasso: Com o Ctrl pressionado, click sobre o compasso a ser excluido. Ele vai ficar selecionado com uma dupla borda, agora basta pressionar “Delete”. 

Para deletar vários compassos de uma só vez: Com o Ctrl pressionado, click sobre um dos compassos a serem excluidos. Ele vai ficar selecionado com uma dupla borda, em seguida pressione o Shift, o mantendo pressionado, para selecionar os demais compassos.

Para determinar a quantidade de compassos numa linha: Click sobre a barra de compasso final do último compasso que você deseja que fique na linha, em seguida pressione “Enter”.
Veja a ilustração abaixo:



Na imagem seguinte, clickei sobre a barra de compasso final do último compasso que você eu quero que fique na linha, no meu caso o quarto compasso da primeira linha. Em seguida, pressione “Enter”.



Perdoem a falta de espaço,
Os dias eram assim...



Perdoem por tantos perigos,
Perdoem a falta de abrigo,
Perdoem a falta de amigos,
Os dias eram assim...


Como ilustração das funcionalidades vistas no Sibelius



Segue partitura com a cifragem da minha interpretação dessa obra prima do Ivan e do Vitor. Mudei um pouco a harmonia em alguns trechos (pra variar um pouco). Alterei também o andamento, na versão que linkei com o MP3 tube o Ivan gravou um rubato em 6/8 (me parece ...). Escrevi em 4/4 ...

Aos Nossos Filhos – (Ivan Lins e Vitor Martins)



Para quem não conhece .... segue versão com o próprio

 Ivan Lins - Aos Nossos Filhos

Artigo completo (View Full Post)

terça-feira, 9 de setembro de 2008

Cliente WebService – Delphi7 & Servidor Webservice BDS2006

Continuando, sobre WebServices, construiremos o cliente que consumirá o serviço que criamos no artigo “Webservice no BDS2006”.
No Delphi 7 inicie um novo projeto: Menu File ► New ► Application. Em seguida vou adicionar um TButton, um TlistBox no Form1.



Importando a WSDL

Próximo passo, importar a interface do serviço. Para isso, no browser digite a url para acessarmos o WebService. Usaremos o serviço contruido no artigo anterior, portanto digite na barra de endereços do browser: http://localhost/wsshowmethemoneyzn/
Click no link “IZnShowMeTheMoney [WSDL]”, a página que será exibida é o XML que define as especificações da interface do serviso “ZnShowMeTheMoney”. Salve esta página.





Voltando ao Delphi, no menu Menu File ► New ► Other, na aba WebServices selecione “WSDL Importer”.


Selecione o arquivo que acabamos de salvar, o arquivo XML que especifica a interface do serviço: “IZnShowMeTheMoney.xml”.



Em seguida click em “Next”, Tchan ... Tchan ... Tchammm ..!!!! Você acabou de importar a WSDL para sua aplicação cliente. Pode ficar emocionado amigo, agora você faz parte de um seleto grupo de indivíduos que ultrapassaram a fronteira do B2C (Businesses to Consumer) para o B2B (Businesses to Businesses). Parabéns! Em seguida, ao clicar em “Finish”, prosseguiremos salvando a nova unit, resultante da importação que acabamos de fazer, IZnShowMeTheMoney1.pas. Então, codificaremos a funcionalidade que evocará o serviço “IznShowMeTheMoney”.



Na unit1 farei uses da unit “IZnShowMeTheMoney1.pas”, Alt + F11. Falta ainda adicionar um THTTPRio (Palheta WebServices)





Na propriedade URL do HTTPRIO1 digite a url da interface, WSDL, do serviço “IznShowMeTheMoney” trocando o “/wsdl” para “/soap”. Exemplo: http://localhost/wsshowmethemoneyzn/PrjZNShowMoney.dll/soap/IZnShowMeTheMoney

No evento “OnClick” do Button1 digite conforme iluistrado abaixo:


procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add((HTTPRIO1 as IZnShowMeTheMoney).ZnShowMeTheMoney);
end;


Asseguir código completo da Unit1:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, InvokeRegistry, Rio, SOAPHTTPClient;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
HTTPRIO1: THTTPRIO;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses IZnShowMeTheMoney1, Math;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add((HTTPRIO1 as IZnShowMeTheMoney).ZnShowMeTheMoney);
end;

end.




Conclusões
Para consumir um WebService é preciso importar a interface so serviço para o programa cliente.
O Fato de usar um WebService não garante a interoperabilidade entre dois sistemas. É muito importante garantir que o tipo de dado da saída do seu serviço seja suportado pela tecnologia usada pelo cliente.
No nosso exemplo pudemos observar que um servidor Werbservice construido em BDS2006 pode ser consumido por um cliente desenvolvido em Delphi 7. O que já era de se esperar, contudo este pequeno exemplo não pode garantir que isso é válido para qualquer outro caso.

Artigo completo (View Full Post)

Deploy de uma DLL ISAPI no ISS 5

Primeiro precisamos, no IIS criar um diretório: Criando um diretório virtual ...

No Internet Information Service (da MS), selecione na treeview a direita o nó “Site da Web padrão” (“Default Web Site”).



No menu popup da treeview (botão direito do mouse) selecione: Novo ►Diretório Virtual. Em seguida faremos amgulas configurações dos diálogos seguintes:



No primeiro diálogo, simplesmente click em avançar.



No segundo definiremos o nome do diretório virtual. Um alias, nome pelo qual evocaremos o serviço via browser: Exemplo: http://localhost/MeuDiretorioVirtual_BlaBla.



Para este exemplo vou definir como alias “WsShowMeTheMoneyZn”. Após digitar o alias click “Avançar”.



Agora aponte o diretório virtual que estamos criando para uma diretório físico, real, existente na sua máquina.






No diálogo seguinte, “Permissões de acesso”, obrigatóriamente precisamos permitir a execução de script ISAPI (no servidor, obiviamente). Marque a opção conforme ilustrado na imagem abaixo:



Pronto! Ao concluirmos terminamos a primeira etapa que a criação do diretório virtual. Click em “Concluir” para passarmos a segunda etapa.



Veja nosso novo diretório virtual, o qual proverá acesso ao nosso serviço via http;


Configurações finais para o IIS executar a DLL ISAPI

Com o botão direito do mouse sobre “WsShowMeTheMoneyZn”, o diretório virtual que acabamos de criar, selecione “Propriedades”



Precisamos definir qual arquivo vai ser executado pelo IIS quando um cliente via browser requisitar a url cujo endereço é o nosso diretório virtual.



Na aba documentos, conforme ilustrado anteriormente, click em “Adicionar ...” e digite o nome completo, com a extensão e tudo, da dll ISAP. Neste caso particular, considerando que este artigo e complemento de “Webservice no BDS2006” digitarei o nome da “DLL” gerada no referido artigo: “PrjZNShowMoney.dll”



Click em “Ok” para terminar a configuração. Para testar, no browser digite:
http://localhost/wsshowmethemoneyzn/


Artigo completo (View Full Post)

segunda-feira, 8 de setembro de 2008

Webservice no BDS2006

Observamos que o assunto "WebService em Delphi" tem tido muita procura aqui no blog. Por isso, pretendo produzir mais material sobre este tema. Contudo, o assunto é abrange um escopo bastante vasto, principalmente no que tange as questões práticas do desenvolvimento de serviços baseados em XML/SOAP. Podemos citar para exemplificar alguns temas sobre “WebService e Delphi”: Testar as versões mais recentes (inclusive o Tiburon – Delphi 2009), verificar incompatibilidades (se existirem), ou diferenças. Uma coisa interessante seria a integração com outras tecnologias (Java, C# e PHP, por exemplo). Outro ponto importante: Acesso e disponibilização de dados (um CRUD, talvez, usando como camada intermediária um aplicação servidora WS). Em fim, há bastante terreno para ser trabalhado.
Neste sentido, podemos eventualmente atender alguma questão pontual demandada pelos leitores. Coloque em forma de comentários sua demanda que na medida do possível teremos prazer em atendê-la. Algumas pessoas já solicitam nosso suporte, informalmente, via e-mail. Porém, seria melhor que além do e-mail o comentário sobre a demanda fosse registrado. Pois, dessa forma aproveitamos a resolução do seu problema para conteúdo do blog. Assim, outros que por ventura vierem até nós com problemas semelhantes possam compartilhar da solução sem gerar retrabalho para nós. Conseqüentemente, imagino que nosso conteúdo será mais aderente. Isso é o que de fato nos importa.

Iniciando um novo projeto

No BDS2006 no menu File ►New ► Other ► Delphi Projects ►WebServices, selecione “SOAP Server Application”. Em seguida uma série de configurações prévias serão feitas mediante alguns diálogos.



No diálogo seguinte selecione ISAPI/NSAPI Dynamic Link Library, e click em “OK”.



Click “Yes” para criar a interface do serviço (WSDL). Veja imagem abaixo:



No próximo diálogo definiremos o nome do serviço que estamos criando: “ZnShowMeTheMoney”, conforme ilustrado abaixo.



Pronto, temos um novo projeto! Estamos desenvolvendo uma aplicação servidora. Um WebService, veja as units que foram cridas na inicialização do nosso projeto:



A lógica sobre declarações nas units, num projeto WebService: Existe uma unit para declarações de interface e uma unit para as implementarmos o que declararemos na unit interface (neste caso temos: “ZnShowMeTheMoneyIntf”, interface. “ZnShowMeTheMoneyImpl”, implementação).

Na interface declararemos uma função. Digite conforme ilustrado abaixo:


(* Declarando uma funcionalidade no serviço que estamos criando *)
function ZnShowMeTheMoney: WideString; stdcall;

A seguir, veja como ficou a unit “ZnShowMeTheMoneyIntf”.

{ Invokable interface IZnShowMeTheMoney }

unit ZnShowMeTheMoneyIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type

{ Invokable interfaces must derive from IInvokable }
IZnShowMeTheMoney = interface(IInvokable)
['{F002F904-9FD7-401D-80E2-037DFFAA4590}']

{ Methods of Invokable interface must not use the default }
{ calling convention; stdcall is recommended }
(* Declarando uma funcionalidade no serviço que estamos criando *)
function ZnShowMeTheMoney: WideString; stdcall;
end;

implementation

initialization
{ Invokable interfaces must be registered }
InvRegistry.RegisterInterface(TypeInfo(IZnShowMeTheMoney));

end.


Agora para implementarmos iremos fazê-lo na unit “ZnShowMeTheMoneyImpl”. Digite conforme ilustrado no trecho de código asseguir:

type

{ TZnShowMeTheMoney }
TZnShowMeTheMoney = class(TInvokableClass, IZnShowMeTheMoney)
public
(* Na unit de implementação precisamos digitar novamente a assinatura do
método que declaramos na interface "ZnShowMeTheMoneyIntf" *)
function ZnShowMeTheMoney: WideString; stdcall;
end;

implementation


Declare uma seção “uses” após a palavra reservada “implementation” e declare as bibliotecas: Math e SysUtils.

OBS: No BDS temos code insight para declaração de bibliotecas!!!



Vamos implementar o método declarado na seção public de “TZnShowMeTheMoney”.

function TZnShowMeTheMoney.ZnShowMeTheMoney: WideString;
const
ZnMsgConst = 'Here is your Money, U$ %f! Do you can see him? look at the message ... ';
var
RandomValue: Double;
RandomDiv: Integer;
begin
RandomValue := RandomRange(1, 10000);
RandomDiv := RandomRange(1, 7);
RandomValue := (RandomValue / RandomDiv);

Result := Format(ZnMsgConst, [RandomValue]);
end


A função que acabamos de codificar, “ZnShowMeTheMoney”, é simplesmente um processamento dummy que retorna aleatoriamente dois valores, os quais são usados como operandos numa divisão cujo o resultado é formatado numa string e retornado na função.
Agora vamos salvar a aplicação, veja ilustração abaixo:




Para o nome do projeto vamos usar “PrjZNShowMoney.bdsproj”. A imagem seguinte mostra, o meu “Project Manager”, para que você possa compara a estrutura do seu projeto com o andamento do nosso exemplo.



Agora vamos publicar nosso serviço: Compile o projeto, em seguida faça o deploy da DLL, “PrjZNShowMoney.dll”, no IIS.

Criei um diretório virtual com alias de “WsShowMeTheMoneyZn”. Para testar, no browser digite: http://localhost/wsshowmethemoneyzn/

Click no link WSDL e você acessará a interface do serviço “IZnShowMeTheMoneyservice”, isso que você esta vendo é mais que uma página web comum.




Neste primeiro exemplo podemos concluir que o desenvolvimento em WS no BDS2006 é semelhante ao do Delphi 7.
É Muito rápido, intuitivo e amigável desenvolver serviços RPC baseados em SOAP/XML no DBS2006, desde que você conheça bem três conceitos:

1 - A estrutura de declarações no Delphi.

2 - Calling Conventions: Convenções de chamadas (traduziremos assim)- Quando declaramos procedimentos ou funções podemos definir, neste momento, a convenção de chamada através das diretivas: register, pascal, cdecl, stdcall, and safecall.
Por exemplo:

function ZNFuncao(const Xzn, Yzn: Double): Double; cdecl;

function ZNProcedimento(const Xzn, Yzn: Double; var AoutZn: Double); stdcall;

3- Sistemas distribuídos: Também chamado na literatura de objetos distribuídos.

Outros artigos sobre Webservice e Delphi

Artigo completo (View Full Post)

segunda-feira, 1 de setembro de 2008

Começaram os eventos de divulgação da mais nova versão do Delphi

A CodeGear irá realizar uma série de eventos gratuitos onde serão apresentadas as novas features incorporadas ao Delphi, versão intitulada de Delphi 2009.

Yes, temos Generics!!! Isso é muito bom, já devia estar na Delphi language faz empo. Antes tarde do que nunca.
Evolução do DataSnap!!! Ufa, chegou! O Malta estave falando sobre isso .... veja em.

Temos DER!!! Bem testaremos antes de emitir qualquer opinião. Contudo fico otimista e confiante em virtude dos seguintes pontos:
Primeiro, a agilidade e, a princípio, a economia de você ter na IDE uma boa ferramenta de modelagem. Mas tem que ser boa, tanto em termos de usabilidade, quanto de funcionalidade. Por exemplo: um “Complete compare” é sempre bom e etc
Segundo, o buraco gigante que as ferramentas de modelagem, como o Erwin (em virtude do preço e de deficiências de usabilidade), o MS Visio (Pela deficiência na padronização e ausência de funcionalidades importantes), o EA (Também com usabilidade pouco amigável e falha de padronização), deixam no mercado.

O Estação Zn esta torcendo, e estaremos presentes nos eventos!
Faça sua inscrição no site da CodeGear.
No Rio de Janeiro o evento esta previsto para o dia 11/09 no auditório do Jockey Clube, Av. Presidente Antônio Carlos, 501, décimo andar, Centro(Inscreva-se).

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br