[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)  XML
Forum Index -> F.A.Q.
Author Message
IceW0lf


[Avatar]

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
IceW0lf


[Avatar]

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
IceW0lf


[Avatar]

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
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.]
IceW0lf


[Avatar]

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
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.]
bbetto



Joined: 19/12/2007 04:20:46
Messages: 1
Offline

Funciona com Java 1.4?
IceW0lf


[Avatar]

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
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.
IceW0lf


[Avatar]

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
IceW0lf


[Avatar]

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
 
Forum Index -> F.A.Q.
Go to:   
Powered by JForum 2.1.6 © JForum Team