Remote Scripting – Uma introdução

Publicado originalmente em 21-mai-2001
Comecei a fazer este artigo tendo como objectivo explicar como ter 2 combos ligadas entre si sem ter necessidade de actualizar a página de cada vez que se seleccionar uma opção (ver artigo de João Vieira “Uso de 2 Combos Ligadas Entre Si“). Como o remote scripting se trata de uma tecnologia que é um pouco complicada de utilizar sem perceber minimamente o que está a acontecer tive que dividir essa explicação em 2 artigos. Assim, neste irei explicar o que é o remote scripting e como o por a funcionar e no próximo irei então demonstrar como ligar 2 combos.
Tanto refresh para nada
O meu trabalho normalmente não é desenvolver sites, mas sim aplicações para intranets que são utilizadas exaustivamente durante um dia inteiro de trabalho por várias pessoas. Neste tipo de ambiente, onde a rapidez de introdução de dados é importantíssima, não podemos pensar em obrigar as pessoas a esperar por um refresh só porque em vez de utilizar a selecção por defeito quiseram/tiveram que seleccionar outra opção. Eu precisava portanto de ter um mecanismo que me permitisse actualizar o conteúdo de uma página sem que nesse processo o utilizador perdesse o controlo da aplicação. A solução apareceu já há algum tempo (a primeira vez que a vi e experimentei foi com o aparecimento do Visual InterDev 6.0) e chama-se remote scripting. De uma forma muito sucinta o que esta tecnologia permite é que uma página possa sem ter que ser recarregada executar uma função que está noutra página e devolver os resultados à página inicial. Como certamente perceberão esta facilidade de comunicar com outras páginas abre imensas possibilidades mas deixo isso para outro eventual artigo – entretanto recomendo que vejam os links que estão no fim desta página para outros sites que falam sobre este tema.

Como por a funcionar
Depois de fazer o download dos ficheiros necessários e correr esse executável irá ficar com um conjunto de três ficheiros, o rs.asp, rs.htm e rsproxy.class e duas pastas que aconselho vivamente a dar uma vista de olhos docs e samples.Nos vossos projectos só irão precisar dos três ficheiros que referi, ou seja para poderem começar a utilizar o remote scripting basta simplesmente copiar esses ficheiros para dentro do vosso site. Como se tratam de ficheiros ASP e HTML poderão obviamente customizar o código origem de forma a criar novas funcionalidades. Para além disso o remote scripting é uma tecnologia cross-plataform já que funciona quer em Netscape quer em IE.Uma das vantagens do remote scripting é que não obriga a que a página que o utilizador está a ver (que pode ser uma página HTML) tenha que ser recarregada quando queremos actualizar o seu conteúdo. Isto acontece porque nessa página vamos passar a incluir um applet (rsproxy.class) cuja função é receber os pedidos da página que estamos a ver e reencaminhar esse pedido para a página ASP que está no servidor. Para conseguirmos uma comunicação efectiva entre as páginas HTML e ASP temos ainda que incluir na página HTML uma referência a uma biblioteca de funções que está em rs.htm, e na página ASP uma referência a rs.asp.

Imagem retirada do artigo “Remote Scripting

Exemplo página ASP

<%@ LANGUAGE=VBSCRIPT %>

<% RSDispatch %>
<!--#INCLUDE FILE="_ScriptLibrary/rs.asp"-->

<SCRIPT RUNAT=SERVER Language=javascript>

function Description()
{
this.calcularSoma= calcularSoma;
}

public_description = new Description();

function calcularSoma(a, b)
{
return (Number(a)+Number(b))
}

function enviarErro()
{
var erro=new Error(1,"mensagem de erro")
return erro
}
</SCRIPT>

Tal como tinha referido temos que incluir na nossa página ASP o ficheiro rs.asp. Ele pode estar localizado em qualquer part do seu site, é preciso é ter em atenção qual o directório em que está para que o ficheiro seja realmente incluído na sua página.É necessário incluir a chamada a RSDispacth que é uma função que está definida em rs.asp e que procede quer à recepção dos pedidos por parte de outras páginas e sua tradução para as funções internas quer ao retorno dos resultados.A componente essencial será a definição de quais as funções que esta página irá disponibilizar. No exemplo que tenho em cima, embora a página tenha duas funções (enviarErro e calcularSoma) somente a função calcularSoma é acessível por outras páginas já que só esta está definida na função Description().

Exemplo página HTML

<HTML>

<HEAD>

<TITLE>Teste</TITLE>

<SCRIPT LANGUAGE="javascript">
function funcao1()
{
var aspObject = RSGetASPObject("remote.asp");
var a=aspObject.calcularSoma(1,2)
alert(a.return_value)
}
function funcao2()
{
var aspObject = RSGetASPObject("remote.asp");
var a=aspObject.enviarErro()
alert(a.data)
alert(a.return_value)
}
</SCRIPT>
</HEAD>


<BODY>
<script language="JavaScript" src="_ScriptLibrary/rs.htm"></script>
<script language="JavaScript">RSEnableRemoteScripting("_ScriptLibrary/");</script>

Na página HTML, para inicializar a ligação entre as duas páginas, é necessário incluir o ficheiro rs.htm. Se tiverem curiosidade e forem inspeccionar o interior desse ficheiro poderão ver que ele por sua vez chama o applet que tinha referido rsproxy.class.Depois é necessário chamar a função RSEnableRemoteScripting que recebe como parâmetro o directório onde está localizado o applet.A questão dos directórios, quer aqui quer no ficheiro ASP, é uma fonte de alguns problemas nos primeiros projectos já que normalmente esquecemo-nos ou enganamo-nos na path.E pronto está montada toda a estrutura para começar a utilizar o remote scripting. Parece um bocado complicado (eu também tentei esmiuçar ao máximo todos os pontos que poderão oferecer algumas dúvidas) mas, depois de utilizar uma ou duas vezes, esta parte deixa de oferecer qualquer problema.
Chamar funções remotas
Como se lembram temos um applet na nossa página que vai servir de intermediário entre a página HTML e a página ASP. A linha var aspObject = RSGetASPObject(“remote.asp”); da função funcao1 não faz mais do que criar uma referência à página ASP que queremos utilizar como “fornecedora” de funções remotas. A partir daí podemos passar a chamar todas as funções que estão na página ASP através desse objecto (aspObject). Na linha var a=aspObject.calcularSoma(1,2) estamos a chamar a função calcularSoma(a,b) que estava na página ASP e a guardar o resultado dessa função numa outra variável (a)O resultado que aspObject retorna é uma simples string que contém XML. O facto de o resultado vir encapsulado em XML permite que strings, números e alguns objectos possam passar entre as páginas sem nenhum tipo de problema.Como já estarão a adivinhar para determinar o resultado basta aceder à propriedade return_value (a.return_value).No entanto em alguns casos é importante ter mais informação do que aquela que nos é fornecida por return_value, como por exemplo quando ocorre algum erro e portanto o resultado enviado é o objecto Error. Neste caso return_value iria entregar-nos algo como [Object] [object] o que não nos diz nada. Nestas alturas nada como recorrer à propriedade data (no nosso caso a.data) para tentar perceber o que aconteceu.
Outras possibilidades
Neste artigo pretendi dar a conhecer o básico do remote scripting. Se tiverem curiosidade e pesquisarem a documentação da Microsoft podem ver que há mais algumas coisas que se podem fazer (como chamadas assíncronas), bem como formas diferentes de fazer os exemplos que dei. Nos próximos artigos tentarei ir demonstrando mais algumas potencialidades desta tecnologia entretanto a minha sugestão é que experimentem o exemplo que apresentei neste artigo.
Newsgroups

microsoft.public.scripting.remote

Artigos

Putting Remote Scripting to Work
Remote scripting using a servlet : How to give Web applications interactivity and dynamism that you’d expect from desktop apps

Bridge the gap between client and server with remote scripting
Tecnologias relacionadas

RSO POST and Object Transfer Library
Bugs

Q284280 -INFO: Netscape 6 and Remote Scripting
HOWTO: Display Error Messages From the Server When Remote Scripting
PRB: The Data Property of a Remote Scripting Object Is Empty with IIS 5.0 Server
PRB: ASP 0234 Error “Server side include directives may not be present in script blocks” with PageObject DTC

por Vitor Silva



Leave a Reply