Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/09/2007 12:49:29
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
[EDITADO]
LEIA O ULTIMO POST.
Uma vez surgiu uma dúvida de como que eu poderia controlar a quantidade de usuários logados para sistemas que assim exigem, e em conversa com o Robert e Sérgio corri atrás de uma solução junto com o Diego (Desenvolvedor Web Standards da empresa que trabalho).
Baseado nesse problema de controlar sessões de usuários eu (Leiber) e Diego fizemos um controle de usuários logados, utilizando JavaScript, MentaAjax, e HttpSessionAttributeListener, e o diego escreveu esse FAQ muito bem explicado por sinal.
1 - Qual a necessidade de se controlar usuários logados do sistema?
Isso sempre vai depender da real necessidade de você controlar isto, lembre-se ? Não faça bem feito o que não é pra ser feito?, ou seja, não preciso de uma Ferrari pra ir a padaria, posso ir a pé mesmo, é mais econômico e faz bem .
Mas imagine um sistema que você tenha que controlar o número simultâneo de usuários logados no sistema (licença por usuário), então este FAQ te oferece uma solução para controlar isto em sua aplicação.
2 - Mas qual é o problema?
Bom, o problema é o seguinte: Seu usuário efetua o login no sistema, após ele efetuar algum trabalho no sistema ele deseja sair. Se ele clicar no botão sair tudo funciona corretamente a sessão será removida pelo Logout do mentawai, mas se por força do hábito, ele simplesmente aperta o botão fechar do navegador? Quando o usuário faz isto, não há tempo de se executar a função LOGOUT e a sessão continuará existindo até expirar normalmente. Se você pensar em "licença por usuário" isto com certeza seria um belo problema, pois teríamos 1 (um) usuário logado inativo.
2.1 - Um exemplo prático: Um sistema que permite até 3 (três) usuários conectados simultaneamente.
a - Digamos que temos nesse sistema 2 (dois) usuários (A e B) logados.
b - Um terceiro (C) usuário efetua seu login. Completamos a lista máxima de usuários logados 3 (três) correto?
c - O usuário B fechou o browser sem clicar em logout, logoff, whatever. A sessão conforme explicado acima ainda existe correto?
d - Um outro usuário (D) tenta efetuar seu login e recebe uma mensagem informando que o número máximo de usuários no sistema foi atingido e que não poderá utilizar o sistema. Sendo que usuários utilizando o sistema realmente existem 2 (dois) A, C, então teoricamente o D deveria ter acessado o sistema.
3 - Como contornar este problema?
Para fugir desse problema a idéia é monitorar a sessão do servidor utilizando o HttpSessionAttributeListener, e o navegador utilizando o JavaScript.
Concentre-se no item 2.1 item c.
O que irá acontecer se o usuário simplesmente fechar o browser, ou seja, "sair incorretamente do sistema"? Teoricamente sempre que o usuário executasse uma ação na aplicação ou simplesmente recarregasse a página a sessão teria que ser atualizada. No caso de se fechar a janela do navegador, é necessário informar ao servidor que o usuário está deixando a aplicação, para que o servidor possa derrubar sua respectiva sessão. Como fazer isto? Vamos entender como funciona o JavaScript neste momento.
4 - Como o navegador se comporta?
Sempre que a janela do navegador é atualizada, ou quando o usuário muda de página (viajando pelo histórico do navegador ou digitando um novo endereço na barra de endereços), ou quando fecha a janela, é disparado um evento chamado beforeunload ("antes de descarregar"). Sempre que há uma mudança na página este evento é disparado. Após este evento é disparado logo em seguida o evento unload("descarregar") responsável pelo momento em que o navegador é fechado. Oque temos que fazer é associar um event listener ao evento beforeunload, para que antes que o navegador seja fechado (seja por CTRL+F4, ALT+F4, botão fechar...) o servidor saiba que o usuário está deixando a aplicação e derrube sua sessão. Tendo isto em mente já sabemos oque fazer. Mas e como fazer?
5 - Verificando eventos do browser
Infelizmente como tantas outras coisas em nosso meio não existe um padrão universal para todos os navegadores. Cada um criou o seu próprio método (até porque o IE usa o JScript e os demais o JavaScript). Então vamos lá, sem mais papo furado vamos ao que interessa. Para se escrever algo compatível com os padrões web standards utilizaremos duas funções javascript para captura de eventos: attachEvent (IE), addEventListener (FF, Mozilla...). Teremos como algo dois objetos da árvore DOM: o document, e o window. Explicarei como funcionam estas funções, pois caso alguém não saiba, já servirá como base de aprendizado. A sintaxe é a seguinte:
5.1 - IE
objectElement.attachEvent("onEvent", function);
Onde:
- objectElement é o objeto que vai receber o listener;
- onEvent é o evento que vai ser "rastreado". No caso do beforeunload ficaria onbeforeunload (leia "quando for antes de descarregar" para entender a lógica);
- function é a função que vai ser executada quando o evento for disparado.
5.2 - FF e outros
objectElement.addEventListener("event", function, [boolean true, false]);
Onde:
- objectElement é o objeto que vai receber o listener;
- event é o evento que vai ser "rastreado". No caso do beforeunload ficaria beforeunload mesmo. Diferentemente do attachEvent não é recessário colocar o "on" antes do evento;
- function é a função que vai ser executada quando o evento for disparado.
- [boolean true, false] é um valor que pode ser true ou false. Define a propriedade bubble do evento. Não se preocupe muito com este item, não é necessária sua explicação para este caso.
Sabendo como utilizar as funções vamos ao código JavaScript.
Aplicando na prática
O JSP.
Na sua página JSP, insira o código javascript abaixo (para um melhor entendimento o código segue todo comentado).
Code:
<script type="text/javascript">
<!--
//Código ajax do mentawai responsável por efetuar o logout antes de fechar o browser.
//Para maiores esclarecimentos sobre esta função leia: FAQ: Ajax Fácil com Mentawai (MentaAjax)
function doRequest() {
var req = new mtw.request();
req.setUrl("/MinhaApp/Logout.do");
req.onSuccess(true);
req.send();
}
// Iniciamos setando uma variável que será responsável em dizer se a página está sendo
// recarregada ou não. Note que a variável inicia com valor false. Isto é muito importante.
var reloaded = false;
// Esta função verifica se está sendo dado algum comando através do teclado para
// recarregar a página (F5, CTRL + R). Ela retorna true ou false
function checkReload(evt) {
if(evt.keyCode == 116 || (evt.altKey && evt.keyCode == 82))
return true;
else
return false;
}
// Aqui nós verificamos quais as teclas o usuário está pressionando.
// Neste momento só nos interessa saber duas coisas: se o usuário está fechando o browser ou se
// ele está apenas recarregando. No nosso caso nós só queremos executar algo se o usuário sair
// indevidamente do sistema, então se ele recarregar a página nada deverá ser executado.
// Este é o ponto crucial do script.
// Se o usuário estiver tentando fechar o navegador (ALT + F4 ou CTRL + F4) a variável reloaded
//será setada como false, ou seja, o usuário não está recarregando a página. Portanto nós podemos
// executar nossa função de LOGOUT. Agora se o usuário está tentando recarregar a página (F5,
// CTRL + R...) a variável será setada como true e nada irá acontecer.
function verify(evt) {
// CTRL + F4
if(evt.ctrlKey && evt.keyCode == 115) {
reloaded = false;
}
// ALT + F4
if(evt.altKey && evt.keyCode == 115) {
return reloaded = false;
}
// F5 e CTRL + R
if(checkReload(evt)) {
return reloaded = true;
}
}
// Esta função faz o trabalho crucial. Ela recebe uma variável: a browserFlag que indica qual
// navegador está sendo utilizado. Esta variável foi mantida apenas no caso de você querer fazer
// algo diferente para cada navegador. No caso nós chamamos a mesma função para todos os
// navegadores, então não seria necessária esta verificação. Mas fica aí como exemplo :)
// Ao chamar a função, esta mesma verifica qual o valor da variável global reloaded. Se esta for
// false (o navegador não está sendo recarregado) ela envia uma requisição ao servidor através
// de uma função ajax solicitando que a sessão seja derrubada. Se for true, nenhuma requisição
// é enviada e nada acontece. Lembrando que neste ponto você pode fazer oque quiser, basta
// mudar o código da função para incrementá-la.
function closeWindow(browserFlag) {
if(!reloaded) {
if(browserFlag == 'ie') {
doRequest();
} else {
doRequest();
}
}
}
// Aqui é realmente a parte mais importante do código, pode-se dizer. Verificamos com um simples
// "if" qual o browser está sendo utilizado. if(!document.addEventListener &&
//document.attachEvent) quer dizer se não existir o método addEventListener e existir o método
// attachEvent então estamos trabalhando com o IE ou algum browser que suporte este método
// e utilizaremos o attachEvent. Caso contrário, o browser não suporta o attachEvent mas
// suporta o addEventListener, então o utilizaremos.
// Lembrando que todos os browsers modernos e atuais suportarão ou um ou outro.
if(!document.addEventListener && document.attachEvent) {
// Aqui nós fazemos com que o evento keydown (que é disparado sempre que uma tecla for
// pressionada) seja ouvido pelo objeto document da árvore DOM. Então sempre que o
// usuário apertar algum botão na tela a função verify será chamada e será verificado
// o que ele está fazendo.
document.attachEvent("onkeydown", function(){verify(event)});
// Esta é realmente a chave do código. A função closeWindow é chamada apenas aqui.
// Nós adicionamos o evento beforeunload no objeto window. Sempre que este evento
// for disparado a função closeWindow será chamada e fará as verificações necessárias.
// Isto ocorrerá sempre antes de a página mudar, for recarregada, for fechada... seja
// através de algum botão do navegador, ou algum comando do teclado. Ou seja, seja lá
// o que for acontecer na janela esta função será chamada :)
window.attachEvent("onbeforeunload", function(){closeWindow('ie')});
} else {
// No FF em específico quando o evento beforeunload é disparado se a página não estiver
// totalmente carregada ele atropela tudo e dispara a função encerrando a função.
// Como alternativa, nós deixamos a variável setada inicialmente como true, oque
// não deixará a funão closeWindow enviar a requisição ao servidor. Essa variável
// somente irá passar para false quando a página for carregada, e quando o usuário mover
// o mouse sobre a tela. Este é um contorno para um pequeno bug.
reloaded = true;
// Mesma coisa do IE
document.addEventListener('keydown',function(event){verify(event);},false);
window.addEventListener('beforeunload',function(event){closeWindow('ff');},false);
// Ao mover o mouse a variável reloaded receberá o valor padrão correto, false
document.addEventListener('mousemove',function(){reloaded=false;},false);
}
//-->
</script>
LoginAction
Abaixo temos como deverá estar o seu LoginAction que continuará a extender BaseLoginAction, mas deverá implementar também o HttpSessionAttributeListener que será o responsável por "monitorar" a quantidade de usuários.
Code:
public class LoginAction extends BaseLoginAction implements HttpSessionAttributeListener {
private static final String MAX_LOGIN_ERROR = "Desculpe o número máximo de usuários logados foi atingido :-(";
public String execute() throws Exception {
Usuario user = model.isOk();
if (user != null) {
//Imprimindo os valores
System.out.println("Quantidade de usuários logados = "+application.getAttribute("quantidade_de_logados"));
System.out.println("Quantidade máxima de usuários = "+application.getAttribute("maximo_de_logados"));
/*
* Vamos validar a quantidade de usuários logados. Se a quantidade de
* logados for inferior ao máximo permitido retorna success e dispara o
* usuário para a tela do sistema
*/
if ((Integer)application.getAttribute("quantidade_de_logados ") < (Integer) application.getAttribute("maximo_de_logados")) {
setUserSession(user);
return SUCCESS;
/*
* Caso o número limite de usuários logados foi atingido o usuário será
* reencaminhado a tela de login com uma mensagem de erro, informando que
* o limite de usuários foi atingido.
*/
}else{
addError(MAX_LOGIN_ERROR);
return ERROR;
}
}
addError(LOGIN_ERROR);
return ERROR;
}
public void attributeAdded(HttpSessionBindingEvent e) {
ServletContext c = e.getSession().getServletContext();
synchronized (c) {
//Verificamos se o objeto inserido no session é uma instancia do nosso
//bean Usuario
if (e.getValue() instanceof Usuario && e.getName().equalsIgnoreCase("user")) {
Integer logUsers = (Integer) c.getAttribute("quantidade_de_logados");
//Contador
logUsers++;
c.setAttribute("quantidade_de_logados", logUsers);
System.out.println("Novo usuário logado");
}
}
}
public void attributeRemoved(HttpSessionBindingEvent e) {
ServletContext c = e.getSession().getServletContext();
synchronized (c) {
//Verificamos se o objeto inserido no session é uma instancia do nosso
//bean Usuario
if (e.getValue() instanceof Usuario && e.getName().equalsIgnoreCase("user")) {
Usuario u = (Usuario) e.getValue();
System.out.println("O usuário "+u.getNome()+" deslogou corretamente!");
Integer logUsers = (Integer) c.getAttribute("quantidade_de_logados");
logUsers--;
c.setAttribute("quantidade_de_logados", logUsers);
}
}
}
public void attributeReplaced(HttpSessionBindingEvent e) {}
}
Aquivo web.xml
No arquivo do web.xml você deve informar qual sua ?action? deverá ser monitorada pelo Listener.
Code:
<listener>
<listener-class>
meuspacotes.LoginAction
</listener-class>
</listener>
No ApplicationManager.
Criamos a variável que mantem o total de usuários logados.
Code:
public class ApplicationManager extends org.mentawai.core.ApplicationManager {
private Integer maximo_de_logados = 0;
public void init(Context application) {
//Setando o valor máximo de usuários logados ? default 0, ao se rodar o aplicação o valor começará a partir do zero.
application.setAttribute("maximo_de_logados", maximo_de_logados);
}
}
Pronto, utilizando desta forma você poderá restringir sem muitos riscos a quantidade de usuários logados no sistema.
6 - Posso controlar outras informações?
Teoricamente, sim. Você pode utilizar o conceito de controle sobre eventos, para efetuar determinadas tarefas no sistema ao se apertar, por exemplo, uma tecla F1 que dispara um evento chamando uma página de Ajuda, e assim por diante.
Bom dúvidas ou sugestões, Utilizem o Forum.
Abraço a todos e bom proveito.
Diego Andrade
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/09/2007 08:25:30
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
Conforme sugerido pelo Robert.
Segue outra forma de você capturar os eventos do navegador.
Substitua o código:
Code:
if(!document.addEventListener && document.attachEvent) {
document.attachEvent("onkeydown",function(){verify(event)});
window.attachEvent("onbeforeunload",function(){closeWindow('ie')});
} else {
reloaded = true;
document.addEventListener('keydown',function(event){verify(event);},false);
window.addEventListener('beforeunload',function(event){closeWindow('ff');},false);
document.addEventListener('mousemove',function(){reloaded=false;},false);
}
Por:
Code:
if(document.addEventListener) {
reloaded = true;
Event.observe(document, 'mousemove', function(){reloaded=false;}, false);
}
Event.observe(document, 'keydown', verify, false);
Event.observe(window, 'beforeunload', closeWindow, false);
As vantagens dessa nova forma, é que você não precisa validar o navegados bem como seus eventos. A única necessidade desse if é porque ele serve como uma trava para a função quando o reloaded for igual a false, para o firefox apenas.
Se você quizer verificar o keyCode com expressões regulares, provavelmente terá dois ou três ifs em todo o JS necessário para efetuar as tarefas.
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/09/2007 10:37:49
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
Outo código ainda mais reduzido.
Exemplo de uma Página JSP com o script.
Code:
<%@ taglib uri="/WEB-INF/lib/mentawai.jar" prefix="mtw"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Teste logoff </title>
<mtw:ajaxConfig />
<script>
var reloaded = false;
function verify(event) {
// CTRL + F4 ou ALT + F4
if((event.ctrlKey || event.altKey) && event.keyCode == 115) return reloaded = false;
// F5 e CTRL + R
if(event.keyCode == 116 || (event.altKey && event.keyCode == 82)) return reloaded = true;
}
function closeWindow() {
if(!reloaded) {
var req = new mtw.request();
req.setUrl("<mtw:contextPath/>/Logout.do");
req.onSuccess(true);
req.send();
}
}
//
// Event listeners
//
if(document.addEventListener) {
reloaded = true;
Event.observe(document, 'mousemove', function(){reloaded=false;}, false);
}
Event.observe(document, 'keydown', verify, false);
Event.observe(window, 'beforeunload', closeWindow, false);
</script>
</head>
<body>
Clique para fechar o browser, ou ALT+F4, CTRL+F4, se vc estiver utilizando o LISTENER
repare que será informado que o usuário X efetuou o logoff corretamente.
</body>
</html>
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 11:48:14
|
leonardo.pinho
Joined: 24/03/2007 12:35:19
Messages: 25
Offline
|
Leiber,
Esse trecho não deveira ser assim?
// F5 e CTRL + R
if(event.keyCode == 116 || (event.altKey && event.keyCode == 82)) return reloaded = true;
Para:
// F5 e CTRL + R
if(event.keyCode == 116 || (event.ctrlKey && event.keyCode == 82)) return reloaded = true;
E tb poderia ser adicionado a combinação CTRL + F5, que pelo que eu sei (senso comun...rs), o browser recarrega todo o cache para a página.
Code:
// F5 , CTRL + R e CTRL + F5
if(event.keyCode == 116 ||
(event.ctrlKey && (event.keyCode == 82 || event.keyCode == 116))) return reloaded = true;
Vlw parabens pelo FAQ
|
"Ao escrever seu código, faça de conta que o próximo cara* a mantê-lo é um maníaco homicida que sabe onde você mora.
[*Nota ao RH: ao usarmos "cara" não especificamos gênero.] |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 12:11:06
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
E ai blz,
Primeiramente, valeu o elogio!!!! Caso vc tenha ideias/conhecimentos que deseje compartilhar com nossa comunidade sinta-se a vontade em sugerir a nossa equipe.
Cara o lance do event.altKey foi erro meu mesmo. Sabe como é, tu pega faz a parada, a parada roda ai começa a inventar dá merda faltou teste ali.
Com relação ao CTRL + F5 você vai concordar que "teoricamente" terá que funcionar, já que temos um "OR" (event.keyCode == 116 || ...) e que nesse caso se algo vier acompanhado da tecla "F5" returna true, mantendo a sessão.
Você não concorda ?
Repare nesse trecho a idéia é a mesma.
if((event.ctrlKey || event.altKey) && event.keyCode == 115) return reloaded = false;
Ou seja o F4 veio acompanhado de ctrl ou alt... é sair mesmo!
Vlw a participação!!!!!!!!!!
Uma abraço.
Ps. Atenção aos que desejam utilizar pois com ajax me parece que teremos problemas, exceto vc ao executar o seu ajax e junto deixar setado reloaded = true. (acho que isso já deve ajeitar as coisas)
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/11/2007 15:53:32
|
leonardo.pinho
Joined: 24/03/2007 12:35:19
Messages: 25
Offline
|
Com relação ao CTRL + F5 você vai concordar que "teoricamente" terá que funcionar, já que temos um "OR" (event.keyCode == 116 || ...) e que nesse caso se algo vier acompanhado da tecla "F5" returna true, mantendo a sessão.
Você não concorda ?
Repare nesse trecho a idéia é a mesma.
if((event.ctrlKey || event.altKey) && event.keyCode == 115) return reloaded = false;
Ou seja o F4 veio acompanhado de ctrl ou alt... é sair mesmo!
Opss falha minha...vc ta certo...
vlw
|
"Ao escrever seu código, faça de conta que o próximo cara* a mantê-lo é um maníaco homicida que sabe onde você mora.
[*Nota ao RH: ao usarmos "cara" não especificamos gênero.] |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 04:27:23
|
bbetto
Joined: 19/12/2007 04:20:46
Messages: 1
Offline
|
Funciona com Java 1.4?
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 05:11:42
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
Cara se não estou eu fiz isso no 1.4
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 13:59:10
|
aorocha
Joined: 06/07/2006 15:13:00
Messages: 254
Offline
|
Pessoal coloquei este codigo no meu jsp, mas agora tudo que é link que eu clico dar Logout, oque pode ser?
Tenho os meus a hef com a action ai dar logout oque pode ser?
segue codigoCode:
var reloaded = false;
function verify(event) {
alert("event.ctrlKey " + event.ctrlKey);
alert("event.altKey " + event.altKey);
alert("event.keyCode " + event.keyCode);
// CTRL + F4 ou ALT + F4
if((event.ctrlKey || event.altKey) && event.keyCode == 115){
reloaded = false;
alert(reloaded);
return reloaded;
}
// F5 e CTRL + R
if(event.keyCode == 116 || (event.ctrlKey && event.keyCode == 82)){
reloaded = true;
alert(reloaded);
return reloaded;
}
}
function closeWindow() {
if(!reloaded) {
alert("Close " + reloaded);
var req = new mtw.request();
req.setUrl("<mtw:contextPath/>/Logout.mtw");
req.onSuccess(true);
req.send();
}
}
//
// Event listeners
//
if(document.addEventListener) {
alert("document.addEventListener");
reloaded = true;
Event.observe(document, 'mousemove', function(){reloaded=false;}, false);
}
Event.observe(document, 'keydown', verify, false);
Event.observe(window, 'beforeunload', closeWindow, false);
|
Alexandre Ortiz da Rocha.
Dar soluções simples a grandes problemas e não dar soluções complexas a pequenos problemas. |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/02/2008 11:10:50
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
Aos que estão acompanhando este "caso de uso".
Devido a grande procura, duvidas, sugestões e problemas encontrados com relação à este script em geral.
Eu e o Diego estamos tentando corrigir os problemas e ele está finalizando um framework JS (desenvolvido por ele) que será responsável, entre outras coisas, manter este "caso de uso".
Assim que o framework estiver pronto estaremos disponibilizando exemplos, os arquivos para download, e sites para dúvidas, etc.
Abraço a todos.
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/04/2008 14:35:21
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
A TODOS QUE ESPERAM ANCIOSAMENTE A SOLUÇÃO DESTE PROBLEMA, SEGUE O LINK DO WST.
Um framework JavaScript que reúne métodos que visam o aperfeiçoamento e a padronização de outros métodos webstandards de modo simples.
Dentre suas ferramentas, podemos destacar 3 classes principais:
- wst.Browser --> Responsável por nos passar as principais informações sobre a plataforma do usuário (IE, FF, ETC);
- wst.formValidator --> O validador de formulários;
- wst.windowControl --> Uma classe para controle de janela e sessões.
Para conhecer o framework segue os links:
Site oficial: http://www.wstframework.org/
SourceForge: http://www.sourceforge.net/projects/wstframework
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
 |
|
|
|