Web Framework + VRaptor 3

46 respostas
softwork

Bom dia amigos.

Estou para iniciar um novo projeto e gostaria de algumas sugestões quanto a algum framework web, semelhante ao Waffle Taglib, porém, se possível, com validações do lado Cliente (Javascript).

Venho desenvolvendo com VRaptor por volta de uns 5 anos e até o momento só utilizei JSTL/EL + Javascript + AJAX, porém gostaria de “agilizar” esta parte do processo de desenvolvimento com algum web framework bom e inteligente (não desmerecendo o Waffle, que por sinal é muito bom).

Já vi um, chamado “Next Framework”, sendo ele bem interessante, principalmente na parte de anotações para validações “client side”, mas infelizmente ele não é acoplável/desacoplável, ou seja, não dá para pegar somente esta parte do projeto e utilizá-lo com o VRaptor, pois este framework também é um Controller.

Como não tenho intensão de trocar o VRaptor por JSF, Flex, JavaFX, entre outros, ficarei no aguardo de qualquer dica ou orientações…

Muito obrigado a todos.

46 Respostas

Lucas_Cavalcanti

o que a gente costuma fazer é usar bibliotecas javascript puras pra fazer isso, como o JQuery ou o ExtJS…

no caso de validação: http://docs.jquery.com/Plugins/Validation

o jquey tem plugins muito bons, pra maioria das coisas que vc precisa fazer… e como todos os plugins são javascript puro, vc pode usar tranquilamente com o vraptor… no máximo vc vai ter que fazer a integração entre eles usando json

G

Eu achava um saco aquele validations.xml do struts, mas tinha essa grande vantagem de ser client e server side validation. A wafle em sí não tem mesmo esse tipo de coisa, e pensando comigo mesmo agora não conheço nenhuma taglib que faça isso de forma independente.

Outro dia procurando por um plugin do jquery para soap achei um plugin que você coloca no CSS dos campos o tipo de validação (required, maxlength, minlength, etc) e via Jquery ele valida antes de postar seu formulário.

O único porém disso tudo que é que você terá validações separadas no cliente e no servidor. Se você alterar uma regra você precisará lembrar de mexer em dois locais. Mas se isso não é um problema para você dá para fazer sim. Dê uma olhada em plugins.jquery.com e vá na categoria forms.

Faz algum tempo que venho querendo fazer um plugin para o vraptor que permita que você defina uma validação que possa ser usada tanto no cliente como no servidor, mas com a falta de tempo ainda não rolou.

Abraços

D

softwork:

Como não tenho intensão de trocar o VRaptor por JSF, Flex, JavaFX, entre outros, ficarei no aguardo de qualquer dica ou orientações…

Muito obrigado a todos.


Pessoal,
Existe alguma possibilidade de ser criada uma Integração do VRaptor com algum framework [color=red]RIA[/color]/AJAX, como o ‘ZK’, p. ex.??!

Lucas,
A propósito, existem alguma página q contenha o RoadMap do VRaptor: o q está planejado p/ ser incluido/implementado, o q está cotado (analisado) p/ ser adicionado (ou não)??!

Ah, garcia-jj :idea:
Eu vi o Matt Raible (AppFuse) dizer q acredita q a Apache tem planos de tornar o Commons Validator uma implementação da JSR 303: Bean Validation (Será q estamos + próximos de poder settar a Validação [color=red]num mesmo lugar[/color] para q seja gerada tanto Server-side como Client-side??! :XD:

Lucas_Cavalcanti

O VRaptor tem uma integração direta com frameworks javascript como o JQuery e o ExtJS…
Você pode criar RIA usando JSP+JQuery por exemplo, integrando com o servidor (controllers do VRaptor, por exemplo) via JSON

existe essa página: http://github.com/caelum/vraptor/issues
você pode comentar e criar novas issues se vc quiser

derlon:

Ah, garcia-jj :idea:
Eu vi o Matt Raible (AppFuse) dizer q acredita q a Apache tem planos de tornar o Commons Validator uma implementação da JSR 303: Bean Validation (Será q estamos + próximos de poder settar a Validação [color=red]num mesmo lugar[/color] para q seja gerada tanto Server-side como Client-side??! :XD:

pra fazer isso precisamos criar taglibs no vraptor… e isso não existe ainda…

G

derlon:
Ah, garcia-jj :idea:
Eu vi o Matt Raible (AppFuse) dizer q acredita q a Apache tem planos de tornar o Commons Validator uma implementação da JSR 303: Bean Validation (Será q estamos + próximos de poder settar a Validação [color=red]num mesmo lugar[/color] para q seja gerada tanto Server-side como Client-side??! :XD:

A JSR303 é baseada em anotações em beans, assim será necessário você mapear qual propriedade está relacionada a qual bean, e isso dá um trabalho. O pessoal da apache é ninja (embora às vezes meio porcos) então até tem um fundamento.

Além disso espero que funcione out-of-box dos produtos da Apache, já que normalmente os projetos da Apache possuem dependencias com muitos outros projetos, resultando que você precisa, às vezes, importar muitos jars.

Você tem o link para eu ler sobre isso? Me despertou o interesse.

Com o monte de forkers que o Vraptor tem acho que é apenas uma questão de tempo :twisted: . Usar a waffle já sugou tudo que poderia da minha paciência.

D

garcia-jj:
A JSR303 é baseada em anotações em beans, assim será necessário você mapear qual propriedade está relacionada a qual bean, e isso dá um trabalho. O pessoal da apache é ninja (embora às vezes meio porcos) então até tem um fundamento.
Vou te explicar melhor a minha idéia (é aquela velha estória: não adianta ter 1 idéia na cabeça; tem q passar p/ o papel, ou melhor, postar no Forum): poderiamos (bem, estou apenas especulando) normalmente “continuar” usando o Hibernate Validator (inclusive, quem sabe, algumas anotações de Validação poderiam até ser geradas p/ Ferramentas Scafolding / de Engenharia Reversa (como a do netBeans(JPA), p/ex.), talvez c/ as novas Versões das Implementações/Ferramentas). Porém, seria q não teria um forma de fazer “uma mutreta” :lol: tentando introduzir o Commons Validator (JSR 303, é claro) e [color=red]integrá-lo com o Hibernate Validator[/color] para, assim, propagarmos as validações até a View (geração automática de JavaScript, bem ao stilo da dupla Seam/RichFaces), o q acha?? ^^

garcia-jj:

Além disso espero que funcione out-of-box dos produtos da Apache, já que normalmente os projetos da Apache possuem dependencias com muitos outros projetos, resultando que você precisa, às vezes, importar muitos jars.

A Validação do Struts foi muito bem projetada (p/ menos, p/ a época). A Apache, percebendo isto, teve a grande sakada de “tirá-la” do Struts e passá-la p/ a Biblioteca Commons. Bem, a minha esperança é a mesma q a sua: quanto menos dependência, melhor!! :thumbup:

garcia-jj:

Você tem o link para eu ler sobre isso? Me despertou o interesse.
Aê, dei 1 googlada e… tá na mão: Validation using JSR-303!!

garcia-jj:

Em vez de “criar taglibs”, :idea: não seria (+simples) poder adicionar algo como:<!-- Begin Validator Javascript Function--> <html:javascript formName="AddressForm"/> <!-- End of Validator Javascript Function--> <form action="/AddressJavascriptValidation" method="post" onsubmit="return validateAddressForm(this);"> ...para ativar a Validação Client-side??!

garcia-jj:

Com o monte de forkers que o Vraptor tem acho que é apenas uma questão de tempo :twisted: . Usar a waffle já sugou tudo que poderia da minha paciência.

@garcia-jj,
Ânimo, brother!! Renove seu entusiasmo: 1 dia a gente chega lá!! 8) Podes krer!! :wink:

G

Que vergonha, eu deveria ter pesquisado antes, hehe. :oops:

Olhei o tópico, e o comentário do mraible (não sei quem é) é bem o que eu pensei: não tem como fazer a validação no client-side, apenas no server-side, e server-side o Vraptor já faz. Pode ser que tenha mesmo como fazer a JSR303 no client-side, porém eu ainda não consegui pensar como. Afinal, quem tem as validações são os beans, e para invocar as regras do Bean Validator você precisa ir ao servidor.

Tenho tentado fugir dessa dupla há alguns anos, mas creio que logo vai chegar a minha hora de mergulhar no Seam, hahahahaha.

Quanto a taglib, durante a semana ando muito ocupado com estudos, projetos (e a patroa ainda quer um cachorro, haha). Mas no final de semana vou pensar em alguma coisa interessante, pois faz tempos que quero uma taglib que pelo menos entenda XHTML, já que o waffle não sabe fechar as tags :twisted: .

D

derlon:
garcia-jj:

Em vez de “criar taglibs”, :idea: não seria (+simples) poder adicionar algo como:<!-- Begin Validator Javascript Function--> <html:javascript formName="AddressForm"/> <!-- End of Validator Javascript Function--> <form action="/AddressJavascriptValidation" method="post" onsubmit="return validateAddressForm(this);"> ...para ativar a Validação Client-side??!

Oh, Lucas
Perdão p/ minha garfe/vacilada! :oops: Agora q eu fui perceber q esta abordagem realmente usa TLDs/TAG_LIBs!! :cry:
Bem, se não podemos nos livrar dela, primemos p/ minimizar o seu uso.
Mas, acho q o q me levou a isto é q: devemos nos balizar o máximo p/ simplicidade, não é mesmo??! :-o
Mas, foi mals…

boneazul

vixi nao sei pq o motivo de ter validações client e server side se só a server-side resolve qualquer coisa…ajax ta ai pra isso…vai pro seu servidor ve o que tem que ver depois volta pra interface…validações em ambos os casos só servem para o caso de o cara desligar o javascript…ai voce garante a validação dos dois lados…eu nao uso uma linha do validator do vraptor…tudo fica num metodo do proprio controller…

<html:form ajaxValidation="/controller/validar">

public void validar(Bean bean){
     String errors="";
     if(bean.getValor().intValue()==0) errors+="<li>Valor .. deve ser maior que zero</li>";
     result.include("errors",errors);
}

e na jsp 
um json simples 
{"content":"${errors}"}

se content do json trouxer vazio deixar dar submit caso contrario mostra o erro…é a mesma ideia do validator do vraptor so que voce economiza no minimo 2 requisições,processamento,etc…ainda garante que o formulario nao foi mechido nem uma virgula…

o que daria pra melhorar é anotar no bean as validações a serem feitas…e usar uma classe de validação nesse ponto…e descartar validações client-side…ja que só isso garante que nada ira vazar antes do submit…bom ta ai outra ideia…

Lucas_Cavalcanti

a principal vantagem da validação client-side é a experiẽncia do usuário… como funcionalidade, é suficiente ter validação só no servidor mesmo…

mas é bem melhor vc preencher um formulário que é funcional e já te mostra que vc tah fazendo coisa errada antes de vc fazer qqer requisição para o servidor… pro usuário do sistema é beeeem melhor…

a validação do lado do servidor é só por consistência mesmo

G

O Vraptor é tão rápido que a validação no servidor parece validação client-side.

O problema do client-side é você ter validações duplicadas no Javascript e também nos controllers e na camada business. E normalmente deixo no cliente apenas validações de campos not-null, numeric e afins com um plugin do jquery que não lembro o nome onde eu apenas coloco um css-class dizendo a validação. Quando vai para o servidor o Vraptor valida os DTOs com o Bean Validator e depois quando vai para o EJB valida a regra de negócio.

Pelo menos senti assim mais simples de desenvolver.

boneazul

Lucas Cavalcanti:
a principal vantagem da validação client-side é a experiẽncia do usuário… como funcionalidade, é suficiente ter validação só no servidor mesmo…

mas é bem melhor vc preencher um formulário que é funcional e já te mostra que vc tah fazendo coisa errada antes de vc fazer qqer requisição para o servidor… pro usuário do sistema é beeeem melhor…

a validação do lado do servidor é só por consistência mesmo

“mas é bem melhor vc preencher um formulário que é funcional e já te mostra que vc tah fazendo coisa errada antes de vc fazer qqer requisição para o servidor”

depende pensando em validações simples como data final deve ser maior que data inicial ou campo x deve ser maior que 0 ai é valido …mas quando voce tem que ir pra banco pra ver algo…que é o que geralmente ocorre…exemplo “ja existe um login cadastrado com esse nome” nao ha como fugir dessa requisição…o custo sempre vai ser pequeno…pq em 90% dos casos o usuario vai errar…é mais custoso ficar indo toda hora do que ir de uma vez só…na minha opinião …alem do que é melhor falar tudo que ele errou do que ir falando 1 por 1 na minha opinião…formulario avançados com n regras todo client-side é muito custoso de se fazer alem do que há necessidade de se saber uma segunda linguagem…no caso o javascript…
eu tenho uma taglib que uso juntamente com o vraptor que acabei disponibilizando com o case…bastante poderosa de formulario…com tabela filho,etc…faço telas bem complexas em muito pouco tempo…isso pq manjo bastante de jquery…bom se quiserem pensar em algo…to a disposição pra fazer os plugins jquery…

Lucas_Cavalcanti

se vc programa pra web vc tem que saber javascript… não tem desculpa… assim como tem que saber HTML e CSS, pelo menos o básico

mesmo as verificações de login, dá pra fazer via ajax, pra dar um feedback “instantâneo” para o usuário… a maioria dos sites grandes faz isso…
Eu estar digitando um campo do formulário e já saber se ele está válido ou não imediatamente é mto melhor que preencher tudo, digitar submit, e ficar caçando quais campos estão errados depois… mas de qqer forma, se vc tem regras mto complicadas é melhor ficar no servidor mesmo

qto a fazer taglibs com javascript eu sou um pouco contra, pq isso vai contra uma das boas práticas, que é colocar todo o código javascript no final da página, e todo o código CSS no head… e essas taglibs fatalmente teriam que misturar css e javascript tb…

a menos que a gente consiga fazer algo que seja separado do javascript e do css… mas daí talvez só colocar ids e classes geralmente é o suficiente…

@boneazul
se tiver algo que queira compartilhar, a gente aceita com mto gosto =)

G

Lucas, você sabe que eu não gosto da waffle, uso apenas por obrigação mesmo já que não tem nada melhor (por enquanto). Mas já estou há algum tempo fazendo um projeto de taglib que permite algumas facilidades.

Esse exemplo acima é um que noto todos fazendo aqui no fórum. Porém eu que trabalho com JSPX e sendo assim preciso ter um XML válido não posso usar tag dentro de tag (gambiarra). Então pensei em uma extensão de tags que eu pudesse fazer algo como abaixo e ele já faria o append do contexto.

Obvio que isso é apenas um exemplo mais simples. Mas um exemplo são os dados de formulário, onde a waffle peca por não gerar um XHTML válido e além do mais eu não consigo usar boolean para selected e checked, sendo assim como no JSPX não posso ficar fazendo muitas loucuras preciso fazer testes para imprimir um selected ou não.

<c:choose> <c:when test="${foo.selected}"> <option selected="selected">opt01</option> </c:when> <c:otherwise> <option>opt01</option> </c:otherwise> </c:choose>

Mas e porque uma tag não pode fazer isso? Uma tag pode sim adicionar Javascript no final da página apenas.

Eu uso normalmente validações somente no client-side, e quando retorna na tela os campos com erro possuem borda vermelha e os erros no próprio campo. Ou seja, o efeito final é o mesmo que se eu fizesse validação no client-side.

sergiotaborda

Esta conversa de validação client side é pifia. Com javascript vc consegue validar algumas coisas , mas não todas.
Digamos que ele resolve 80% das situações, e os outros 20% ? Normalmente vc simplemente não valida no javascript quando ha dependencia do estado do sistema, por exemplo validar se existe um registro igual (mesmo nome, mesmo cpf, etc…) deixando isso para o server…

A única solução que realmente funciona corretamente e vale a pena é a de validar sempre no server, mesmo através de javascript.
Ou seja, via ajax o validador do server é invocado e o resultado retornado. Esta tecnica é usada pelo google, mas implica em ter uma estrutura um pouco mais inteligente que o MVC out-of-the-box.

Qualquer discussão sobre uma solução que não passe por esta opção é inutil pois é incompleta. Nesse caso mais vale não validar client-side e apenas validar server side.

(In)felizmente não ha libs que façam isto out-of-the-box, mas a razão para isso é que nem deveria existir mesmo. Isso é responsabilidade da sua plataforma de aplicação.

D

garcia-jj:

Esse exemplo acima é um que noto todos fazendo aqui no fórum. Porém eu que trabalho com JSPX e sendo assim preciso ter um XML válido não posso usar tag dentro de tag (gambiarra). Então pensei em uma extensão…

Oh, é mesmo, Garcia!! :thumbup: Muito bem colocado: vc destacou um aspecto importante e q todo mundo está se esquecendo (inclusive eu :cry: ). :hunf:

Mas e porque uma tag não pode fazer isso? Uma tag pode sim adicionar Javascript no final da página apenas.@garcia, concordo contigo! Inclusive a tag '<html:javascript ’ faz justamente isso e [color=red]não[/color] mistura nada de JavaScript c/ CSS.
@Lucas, p/ gentileza, poderia dar 1 exemplo de uma tecnologia/abordagem q faça isso??!

Lucas_Cavalcanti

@sergiotaborda
ninguém aqui disse que vc deve fazer apenas validação client side… principalmente pq o usuário pode desabilitar javascript…
mas validações client-side aumentam a experiência do usuário, e isso é mto importante pra sua aplicação

@derlon
vc quer um exemplo de tecnologia que mistura js e css nas tags? JSF e derivados…
agora tags que tenham javascript embutido e o colocam no fim da página eu não conheço, nem sei se é mto viável fazer com jsp

D

BoneAzul:
depende pensando em validações simples como data final deve ser maior que data inicial ou campo x deve ser maior que 0 ai é valido …mas quando voce tem que ir pra banco pra ver algo…que é o que geralmente ocorre…exemplo “ja existe um login cadastrado com esse nome” …
Vc tem razão no sentido de q tanto Validação de Campo Obrigatório, como Verificação de Duplicidade (não permitida) são Regras de Negócio. Porém, um Campo Obrigatório (notNull) simplesmente pode ser configurado (ou de forma declarativa (via XML, p/ex.), ou c/ Annotations; e, o outro caso, ou vc trata a Excessão (violação de Integridade Referencial <-> BD Relacional, p/ex.), ou vc simplesmente tem q fazer um (consulta) verificação (no caso de BD Chave-Valor/XML, p/ex.) E, como vc mesmo disse, 90% das Validações são Campos Obrigatório. Vamos botar + 7% c/ Formato (ou Maskara) Específico: o q acontece se não centralizarmos a definição da Validação em 1 só ponto => a Manutenibilidade vai p/ saco, né não??! Excelência Técnica, se alguns não dão importância, ela é 1 princípios + importantes do Agil!

BoneAzul:
eu tenho uma taglib que uso juntamente com o vraptor que acabei disponibilizando com o case…bastante poderosa de formulario…com tabela filho,etc…faço telas bem complexas em muito pouco tempo…isso pq manjo bastante de jquery…bom se quiserem pensar em algo…to a disposição pra fazer os plugins jquery…
Quem sabe num rola 1 trabalho em conjunto, não só c/ o Garcia, mas c/ outros Contribuidores e Forks do VRaptor??! :mrgreen:

sergiotaborda:
Esta conversa de validação client side é pifia. …
Qualquer discussão sobre uma solução que não passe por esta opção é inutil pois é incompleta. Nesse caso mais vale não validar client-side e apenas validar server side.
Se vc não tem 1 solução melhor, não critique. :thumbdown: Críticas [color=blue]CONSTRUTIVAS[/color] SERÃO [color=green]SEMPRE BEM-VINDAS[/color]!!

quote=sergiotabordafelizmente não ha libs que façam isto out-of-the-box, mas a razão para isso é que nem deveria existir mesmo. Isso é responsabilidade da sua plataforma de aplicação.[/quote] Cabe à Comunidade provar q é possível! 8)

D

Lucas Cavalcanti:

mas validações client-side aumentam a experiência do usuário, e isso é mto importante pra sua aplicação
Lucas, vc tem toda razão: esse é 1 dos principais objetivos de 1 RIA - Rich Interface Application=> 1 App c/ 1 interface q torna a experiência do Usuário algo incomparavemente melhor! :thumbup: Na verdade, eu num tava dando muito bola p/ isso. Estava focando + na questão do gasto de recursos do Server, coisa e tals tals…

Lucas Cavalcanti:
@derlon
vc quer um exemplo de tecnologia que mistura js e css nas tags? JSF e derivados…
Ah, tinha q ser o frankstein do JSF mesmo! :hunf:

Lucas Cavalcanti:
agora tags que tenham javascript embutido e o colocam no fim da página eu não conheço, nem sei se é mto viável fazer com jsp
A tag q eu mencionei (<html:javascript do Stuts1.x / Commos-Validator) faz justamente isso. E eu considero 1 solução fenomenal, pq vc não precisa “se preocupar” c/ o JavaScript: se as Regras/Validações mudarem, é transparente, elas simplesmente (sempre) são propagadas até a View, a JSP (q neste caso, pode ser todo definido c/ HTML puro c/ EL). No +, as Maskaras é muito bom a gente implementar c/ jQuery (p/ isto, eu acho ele fantástico), o q, p/ si só, já ajuda muito na validação (já evita muito vai-e-volta).
A única solução tecnologica (q eu conheça) q supera isto é o trio Seam/RichFaces/A4JSF. :roll:

sergiotaborda

Lucas Cavalcanti:
@sergiotaborda
ninguém aqui disse que vc deve fazer apenas validação client side… principalmente pq o usuário pode desabilitar javascript…
mas validações client-side aumentam a experiência do usuário, e isso é mto importante pra sua aplicação

Nem eu disse que alguem está tentando fazer apenas validação cliente-side.
Exatamente porque influencia a experiencia do usuário que vc deve usar validação coerente para todos os campos. Se todos os campos são checados cliente side, para todas as regras, otimo. Se algum não é, ou alguma regra apenas é validada server side, então não vale a pena checar os outros campos.Está se colocando uma complexidade na interface mas ela apenas irá servir para criar duas experiencias para o usuário que descobre que, depois de apertar o botão, o sistema ainda afirma que tem coisa inválida , quando antes ele deixou vc clicar dizendo que está tudo ok. O usuário se sentirá enganado e isso denigre a experiencia dele.
um sistema que apenas valida server side pode ser mais lento, menos bonito, mas é honesto. O usuário não se sentirá enganado. Ele sentirá que precisa de mais velocidade,etc… mas a confiança no sistema não é abalada.

Esse negocio de validação client-side é um aspeto de usabilidade muito mais importante do que se imagina. uma validação client-side incompleta pode ser muito mais prejudicial que ter apenas server-side.

sergiotaborda

lol, vc leu mesmo o que eu escrevi ?

Eu dei duas soluções melhores:

  1. Não usar validação cliente-side. Pronto. Se vc não usa, vc não tem problema em encontrar uma lib que faça isso.
    A minha mensagem é : usar validação client-side parcial (apenas algumas regras são validadas) é pior que não usar cliente-side nenhum. Erode rápidamente a imagem que o usuário tem do sistema

  2. Usar validação via ajax com o google. Neste caso a validação acontece realmente no servidor, portanto trata-se apenas se aumentar a dinamica do sistema mas não a logica. não precisa replicar logica entre cliente e servidor, e atende a todas as regras que vc imaginar. Mas para usar esta tecnica vc terá que a implementar. Não existe pronto. Claro que isto não significa que seja dificil. Um plugin do jquery mais um filtro ou servlet especializado e voilá…

P.S. Por favor atente à netiqueta do GUJ. Não use cores ou palavras em “tudo-maiuscula”.

G

Sérgio, concordo com tudo que você falou. Para mim validação client-side é apenas para validações bem simples do tipo “se campo foi preenchido”, mas validações se existe ou não prefiro mil vezes submeter ao servidor.

Eu normalmente penso no lado de você poder ter sua aplicação totalmente independente de Javascript. Em um site, por exemplo, quero que todo mundo use-o sem precisar de Javascript. Porém se o fulado tem Javascript ativo, melhor ainda, ele pode então usar mascara nos campos e alertar que tal campo não foi preenchido. Mas caso ele não estiver com JS ativado, usa da mesma forma, sem essas facilidades.

Experiência com usuário não significa ter Javascript e CSS afrescalhados. Você pode muito bem fazer uma aplicação sem uma linha sequer de Javascript mas com uma boa experiência, e tenho aplicações assim. Além disso o Vraptor é tão rápido que o tempo de processamento e resposta do servidor é quase que despresível.

Derlon, acho que você ainda não conhece o Sérgio. Seus posts aqui no GUJ são um pouco aspero, porém se você ler com calma vai entender bem o que ele quer dizer.

E quem bom que todos aqui temos opiniões diferentes. :smiley:

D

garcia-jj:
Sérgio, concordo com tudo que você falou. Para mim validação client-side é apenas para validações bem simples do tipo “se campo foi preenchido”, mas validações se existe ou não prefiro mil vezes submeter ao servidor.
Nisso, vou ter q discorar de vc. Na minha concepção: client-side é o Estado da Arte :XD: (as razões já estão claras); nos casos em ela não é possível, 1 chamada Assíncrona é razoável; e se o JavaScript realmente estiver desabilitado (impedindo qq RIA), em todo caso, o Server-side tem q então segurar as pontas!:?
garcia-jj:
… se o fulado tem Javascript ativo, melhor ainda, ele pode então usar mascara nos campos e alertar que tal campo não foi preenchido…
Experiência com usuário não significa ter Javascript e CSS afrescalhados. Você pode muito bem fazer uma aplicação sem uma linha sequer de Javascript mas com uma boa experiência, e tenho aplicações assim. Além disso o Vraptor é tão rápido que o tempo de processamento e resposta do servidor é quase que despresível.
Novamente vou ter q discorar de vc. Ih, Garcia, desta vez vc até entrou em contradição: não tem como fazer 1 maskara (em Web) s/ usar JS (q eu saiba, não tem como)! :shock:

garcia-jj:
Derlon, acho que você ainda não conhece o Sérgio. Seus posts aqui no GUJ são um pouco aspero, porém se você ler com calma vai entender bem o que ele quer dizer.
E quem bom que todos aqui temos opiniões diferentes. :smiley:
Desde q essa opnião me tire do engano, ou me tire de 1 caminho errado.
Uhm… na verdade, eu já vi os posts do Taborda há algum tempo e, p/ pouco q vi, sempre eram opniões inteligentes e informações/dicas oportunas. Enfim, o conceito dele comigo caiu, caiu não: desabou… :x

G

Derlon, nesse ponto temos opinião diferente. Para mim quando menos coisas no client-side melhor, até porque eu trabalho com aplicações que podem ser acessadas de multiplos clients. Se eu faço uma regra em Javascript vou ter de fazer tudo de novo para um cliente FX, aí imagina o trabalho que dá.

Depende muito do que você quer dizer sobre o “Estado da arte”, pois para mim replicar um monte de regras no cliente e no servidor é uma perda de tempo, a menos que seu cliente não tenha pressa em ter o software. Não vejo como você ter uma aplicação que valide tudo no server-side não tenha um “Estado da arte”. Ambas podem ter o tal “Estado da arte” desde que bem feitas.

Quanto a minha contradição, o que eu quis dizer foi sobre o comentário do Lucas em dizer que Javascript dá uma experiência melhor ao usuário, o que eu não concordo. Você pode muito bem fazer uma aplicação bem bacana sem uma linha sequer de Javascript. Experiência agradável se dá com formulário bem organizado, telas semanticamente divididas, e lá vai. Penso no Javascript como um acessório que se tiver melhor, mas se eu não tiver uso igual sem perder funcionalidade. Você que no meio de tantos comentários acabou misturando tudo. Ou eu que confundi mesmo, hahahahaha.

boneazul

Bom a taglib que eu fiz e uso com o vraptor pra que quiser dar uma olhada…o uso é bem simples tanto pra formulario quanto pra exibicao…
a de formulario foi eu que fiz toda…ja a de exibicao uso a displaytag muito melhorada com recursos visuais bem mais bacanas…nao tenho uma documentação a respeito mas vo deixar aqui alguns exemplos de uso…

o link pro dowload http://www.jslsolucoes.com.br/cvlib.zip

exemplos…

uma listagem por exemplo
 <%@ taglib tagdir="/WEB-INF/tags/html" prefix="html"%>
 <html:body>
	 <display:table export="true"  pagesize="${pageSize}"  htmlId="par_bancos" partialList="true" size="${size}" id="banco" name="${bancoList}" requestURI="/banco/list" class="grid border-rounded-weight" cellpadding="0" cellspacing="0">
		<display:caption>Listagem de BANCOS</display:caption>
		<display:column class="grid-line-number" media="html">${start+banco_rowNum}</display:column>
		<display:column media="html"><input type="hidden" id="par_id" value="${banco.id}"/></display:column>
		<display:column class="align-center" property="numero" title="Numero" sortable="true"></display:column>
		<display:column class="align-center" property="titulo" title="Titulo" sortable="true"></display:column>
		<display:column class="align-center" property="site" title="Site" sortable="true"></display:column>
	 </display:table>
	 <html:appendJavascriptContent code="$('#par_bancos').grid({
	 	insertRow : ${canInsert},
	 	removeRow : ${canDelete},
	 	editRow : ${canEdit}
	 });"></html:appendJavascriptContent>
 </html:body>

formulario agora…isso é alguns exemplos básicos mais tem muita coisa pronta

<%@ taglib tagdir="/WEB-INF/tags/html" prefix="html"%>
 <html:body>
 <html:form action="/banco/saveorupdate" title="Banco">
	 <html:input type="hidden" name="banco.id" value="${banco.id}"></html:input>
	 <html:formrow label="Numero" mandatory="true">
		 <html:input name="banco.numero" value="${banco.numero}" size="70" startFocus="true"></html:input>
	 </html:formrow>
	 <html:formrow label="Titulo" mandatory="true">
		 <html:input name="banco.titulo" value="${banco.titulo}" size="70" toUpperCase="true"></html:input>
	 </html:formrow>
	 <html:formrow label="Site">
		 <html:input name="banco.site" value="${banco.site}" size="70"></html:input>
	 </html:formrow>
        <html:formrow label="Select" mandatory="true">
		 <html:select name="fornecedor.baseirpf.id" value="${fornecedor.baseirpf.id}" list="${baseIRPFList}">
			 <html:option value="${option.id}">${option.ano}</html:option>
		 </html:select>
	 </html:formrow>
 </html:form>
 </html:body>

tem mais exemplo com tabela detalhes pra formularios do tipo master-detail…

<%@include file="../general/header.jsp"%>
 <%@page import="br.com.webtia.contrato.models.Fornecedor" %>
 <html:body>
 <html:form action="/fornecedor/saveorupdate" title="Fornecedor" ajaxValidation="/fornecedor/validar">
	 <html:input type="hidden" name="fornecedor.id" value="${fornecedor.id}"></html:input>
	  <html:formrow label="Tipo">
		 <c:forEach items="<%=Fornecedor.getTipos()%>" var="tipo" >
		 	<c:choose>
		 		<c:when test="${tipo.key==fornecedor.tipo}">
		 			<c:set var="checked" value="true"/>
		 		</c:when>
		 		<c:otherwise>
		 			<c:set var="checked" value="false"/>
		 		</c:otherwise>
		 	</c:choose>
		 	
		 	<html:input type="radio" checked="${checked}" name="fornecedor.tipo" onClick="validaTipo(this.value)" id="tipo${tipo.key}" value="${tipo.key}"></html:input> ${tipo.value}
		 </c:forEach>
	 </html:formrow>
	 <html:formrow label="Base IRPF" mandatory="true">
		 <html:select name="fornecedor.baseirpf.id" value="${fornecedor.baseirpf.id}" list="${baseIRPFList}">
			 <html:option value="${option.id}">${option.ano} / R$ <fmt:formatNumber value="${option.baseinicial}" currencySymbol="" type="currency" minFractionDigits="2"/> a R$ <fmt:formatNumber value="${option.basefinal}" currencySymbol="" type="currency" minFractionDigits="2"/> - <fmt:formatNumber value="${option.aliquota}" currencySymbol="" type="currency" minFractionDigits="2"/>%</html:option>
		 </html:select>
	 </html:formrow>
	 <html:formrow label="Nome" mandatory="true">
		 <html:input startFocus="true" name="fornecedor.nome" value="${fornecedor.nome}" size="70" toUpperCase="true"></html:input>
	 </html:formrow>
	 <html:formrow label="CNPJ" mandatory="true">
		 <html:input name="fornecedor.cnpj" value="${fornecedor.cnpj}" mask="99.999.999/9999-99"></html:input>
	 </html:formrow>
	  <html:formrow label="CPF" mandatory="true">
		 <html:input name="fornecedor.cpf" value="${fornecedor.cpf}" mask="[CPF removido]"></html:input>
	 </html:formrow>
	 <html:formrow label="Representante" mandatory="true">
		 <html:input name="fornecedor.representante" value="${fornecedor.representante}" size="70" toUpperCase="true"></html:input>
	 </html:formrow>
	 <html:formrow label="Email">
		 <html:input name="fornecedor.email" value="${fornecedor.email}" size="70"></html:input>
	 </html:formrow>
	 <html:formrow label="Site">
		 <html:input name="fornecedor.site" value="${fornecedor.site}" size="70"></html:input>
	 </html:formrow>
	 <c:choose>
		 <c:when test="${empty(fornecedor.localizacoes)&&!empty(fornecedor.id)}">
			 <c:set var="remove" value="true"/>
		 </c:when>
		 <c:otherwise>
			 <c:set var="remove" value="false"/>
		 </c:otherwise>
	 </c:choose>
	 <html:detailtable id="localizacoes" title="Endereços" valueList="${fornecedor.localizacoes}" setTo="localizacoe" removeFirstRow="${remove}">		 
		 <html:detailtablecolumn>
			 <html:input type="hidden" name="fornecedor.localizacoes[].id" value="${localizacoe.id}"></html:input>
		 </html:detailtablecolumn>
		  <html:detailtablecolumn title="Estado" mandatory="true">
			<html:select onChange="listaCidades(this.value,this.id,'')" map="${estadoList}" name="estado[]">
				 <html:option value="${option.key}">${option.value}</html:option>
			 </html:select>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Cidade" mandatory="true">
			 <html:select name="fornecedor.localizacoes[].cidade.id">
				 <html:option value="">- - -</html:option>
			 </html:select>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Rua,Avenida,Praça,etc.." mandatory="true">
			 <html:input name="fornecedor.localizacoes[].endereco" value="${localizacoe.endereco}" size="40"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Numero" mandatory="true">
			 <html:input name="fornecedor.localizacoes[].numero" value="${localizacoe.numero}" size="7"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Bairro" mandatory="true">
			 <html:input name="fornecedor.localizacoes[].bairro" value="${localizacoe.bairro}" toUpperCase="true"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Complemento">
			 <html:input name="fornecedor.localizacoes[].complemento" value="${localizacoe.complemento}" toUpperCase="true"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Cep" mandatory="true">
			 <html:input name="fornecedor.localizacoes[].cep" value="${localizacoe.cep}" mask="99999-999"></html:input>
		 </html:detailtablecolumn>
	 </html:detailtable>
	 <c:choose>
		 <c:when test="${empty(fornecedor.dadosbancarios)&&!empty(fornecedor.id)}">
			 <c:set var="remove" value="true"/>
		 </c:when>
		 <c:otherwise>
			 <c:set var="remove" value="false"/>
		 </c:otherwise>
	 </c:choose>
	 <html:detailtable id="dadosbancarios" title="Dados bancarios" valueList="${fornecedor.dadosbancarios}" setTo="dadosbancario" removeFirstRow="${remove}">
		 <html:detailtablecolumn title="Banco" mandatory="true" columnPercent="33">
			 <html:select name="fornecedor.dadosbancarios[].banco.id" value="${dadosbancario.banco.id}" list="${bancoList}">
				 <html:option value="${option.id}">${option.titulo}</html:option>
			 </html:select>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Agencia" mandatory="true" columnPercent="15">
			 <html:input name="fornecedor.dadosbancarios[].agencia" value="${dadosbancario.agencia}"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Conta corrente" mandatory="true" columnPercent="10">
			 <html:input name="fornecedor.dadosbancarios[].contacorrente" value="${dadosbancario.contacorrente}"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn>
			 <html:input type="hidden" name="fornecedor.dadosbancarios[].id" value="${dadosbancario.id}"></html:input>
		 </html:detailtablecolumn>
	 </html:detailtable>
	 
	 
	  <c:choose>
		 <c:when test="${empty(fornecedor.telefones)&&!empty(fornecedor.id)}">
			 <c:set var="remove" value="true"/>
		 </c:when>
		 <c:otherwise>
			 <c:set var="remove" value="false"/>
		 </c:otherwise>
	 </c:choose>
	 <html:detailtable id="telefones" title="Telefones" valueList="${fornecedor.telefones}" setTo="telefone" removeFirstRow="${remove}">
		 <html:detailtablecolumn title="Responsavel" mandatory="true" columnPercent="25">
			 <html:input name="fornecedor.telefones[].responsavel" value="${telefone.responsavel}" size="40" toUpperCase="true"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Numero" mandatory="true" columnPercent="15">
			 <html:input name="fornecedor.telefones[].numero" value="${telefone.numero}" mask="([telefone removido]"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn>
			 <html:input type="hidden" name="fornecedor.telefones[].id" value="${telefone.id}"></html:input>
		 </html:detailtablecolumn>
	 </html:detailtable>
	 
	 
	 <c:choose>
		 <c:when test="${empty(fornecedor.naturezas)&&!empty(fornecedor.id)}">
			 <c:set var="remove" value="true"/>
		 </c:when>
		 <c:otherwise>
			 <c:set var="remove" value="false"/>
		 </c:otherwise>
	 </c:choose>
	 <html:detailtable id="naturezas" title="Naturezas" valueList="${fornecedor.naturezas}" setTo="natureza" removeFirstRow="${remove}">
		 <html:detailtablecolumn>
			 <html:input type="hidden" name="fornecedor.naturezas[].id" value="${natureza.id}"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Natureza de serviço prestado" mandatory="true">
			  <html:select name="fornecedor.naturezas[].natureza.id" value="${natureza.natureza.id}" list="${naturezaList}">
				 <html:option value="${option.id}">${option.titulo}</html:option>
			 </html:select>
		 </html:detailtablecolumn>
	 </html:detailtable>
	
	 <c:choose>
		 <c:when test="${empty(fornecedor.unidades)&&!empty(fornecedor.id)}">
			 <c:set var="remove" value="true"/>
		 </c:when>
		 <c:otherwise>
			 <c:set var="remove" value="false"/>
		 </c:otherwise>
	 </c:choose>
  
         //Aqui o uso é basicamente 1 -> N 
	 <html:detailtable id="unidades" title="Unidades que atende" valueList="${fornecedor.unidades}" setTo="unidade" removeFirstRow="${remove}">
		 <html:detailtablecolumn>
			 <html:input type="hidden" name="fornecedor.unidades[].id" value="${unidade.id}"></html:input>
		 </html:detailtablecolumn>
		 <html:detailtablecolumn title="Unidade" mandatory="true">
			  <html:select name="fornecedor.unidades[].unidade.id" value="${unidade.unidade.id}" list="${unidadeList}">
				 <html:option value="${option.id}">${option.nome}</html:option>
			 </html:select>
		 </html:detailtablecolumn>
		  <html:detailtablecolumn cleanValues="false">
		   	 <c:if test="${!empty(fornecedor.id)}">
			  <html:input type="hidden" name="fornecedor.unidades[].fornecedor.id" value="${unidade.fornecedor.id}"></html:input>
			 </c:if>
		 </html:detailtablecolumn>
		 
	 </html:detailtable>
 </html:form>
 
 <c:if test="${!empty(fornecedor.id)}">
 	<c:forEach items="${fornecedor.localizacoes}" var="localizacao" varStatus="status">
 		 <html:appendJavascriptContent code="
			 	$('#par_estado__${status.count-1}').val('${localizacao.cidade.estado}');
			 	listaCidades('${localizacao.cidade.estado}','__${status.count-1}','${localizacao.cidade.id}'); 
			 "></html:appendJavascriptContent>
 	</c:forEach>
 </c:if>
 <html:appendJavascriptContent code="
 if($(':radio:checked').size()==0){
 	 $(':radio:first').attr('checked',true);
 	 $('#par_fornecedor_cpf').parent().parent().hide();
 	 $('#par_fornecedor_baseirpf_id').parent().parent().hide();
 } else {
 	validaTipo('${fornecedor.tipo}');
 }
 
 "></html:appendJavascriptContent>
 </html:body>

qualquer duvida posta aee…

Lucas_Cavalcanti

boneazul, pq vc não colocou o código javascript dentro da tag ao invés de num atributo? atributos com mais de uma linha são bem feios…

e de qqer forma, cuidado pra não ficar mto verboso, prejudica a legibilidade do código final (parece código do JSF =S)…

mas parece bastante funcional =)

boneazul

Lucas Cavalcanti:
boneazul, pq vc não colocou o código javascript dentro da tag ao invés de num atributo? atributos com mais de uma linha são bem feios…

e de qqer forma, cuidado pra não ficar mto verboso, prejudica a legibilidade do código final (parece código do JSF =S)…

mas parece bastante funcional =)

<html:appendJavascriptContent code="  
 if($(':radio:checked').size()==0){  
      $(':radio:first').attr('checked',true);  
      $('#par_fornecedor_cpf').parent().parent().hide();  
      $('#par_fornecedor_baseirpf_id').parent().parent().hide();  
 } else {  
     validaTipo('${fornecedor.tipo}');  
 }  
   
"></html:appendJavascriptContent>

não entendi muito bem o seu questionamento sobre nao coloquei dentro da tag ao inves de no atributo…

voce queria algo do tipo

<html:appendJavascriptContent>
codigo javascript..
</html:appendJavascriptContent>

bom o atributo code serve pra ir dando append num atributo de body…como era minha primeira vez trabalhando com criacao de taglib com arquivos .tag entao nao tinha muita experiência…mais isso é facilmente modificado… pegando o <jsp:doBody var=“code”/> e setar esse code…

se entendi sua questão…

D

boneazul:
…como era minha primeira vez trabalhando com criacao de taglib com arquivos .tag entao nao tinha muita experiência…
“com arquivos .tag”??!
Então vc num tá implementando isso numa .TLD, não??! :roll:

Lucas_Cavalcanti

@boneazul, era isso mesmo =)

@derlon, dá pra criar taglibs via tld (daí vc escreve código java) ou via .tag, que vc escreve um código parecido com jsp

D

garcia-jj:
… temos opinião diferente. Para mim quando menos coisas no client-side melhor, até porque eu trabalho com aplicações que podem ser acessadas de multiplos clients. Se eu faço uma regra em Javascript vou ter de fazer tudo de novo para um cliente FX, aí imagina o trabalho que dá.
“Para mim quando menos coisas no client-side melhor” => ah, claro!! => quanto menos JavaScript codificado p/ ser humano (no caso, o programador), melhor!!

garcia-jj:

Depende muito do que você quer dizer sobre o “Estado da arte”, pois para mim replicar um monte de regras no cliente e no servidor é uma perda de tempo, a menos que seu cliente não tenha pressa em ter o software. Não vejo como você ter uma aplicação que valide tudo no server-side não tenha um “Estado da arte”. Ambas podem ter o tal “Estado da arte” desde que bem feitas.
Pow, do jeito q vc tá colocando, é realmente uma anti-prática.! (Tô começando a ser repetitivo, mas pq v6 me forçam a isso) => As Regras de Validação tem q ser definidas em 1 único local somente (se isto puder ser feito de acordo c/ especificação JSR 303, conseguimos manter todas as Regras de Negócio dentro do Domain, ou seja, na (tão falada) Camada de Negócio)! Bem, se a Comunidade conseguir criar 1 Mecanismo q propague essa Regras (p/ menos as de Dados Inválidos) até a Camada de visão, através de 1 tag de .TLD (é, sem TagLib eu estou começando a achar q isto seria impossível | dela não vamos conseguir nos livrar :shock: ), p/ ex., que, por sua vez, se encarrega de fazer a geração [color=red]automática[/color] do JS adequado.
(Desculpe: agora vou ser 1 poukinho verborrágico) a maioria dos Frameworks AJAX são Rich Internet App, porem existe 1 novo movimento para Rich [color=red]Interface[/color] Apps, no qual, as vantagens possibilitadas p/ AJAX poderiam ser geradas em qq tipo de Aplicação Cliente (FrontEnd), seja ela Web, Micro-Aparelhos etc. 1 ex. dele é o Framework ‘ZK’. E foi justamente p/ isso q eu insisti na integração do VRaptor3 c/ ele. (O jQuery é bacaninha, mas acho + utíl p/ geração de Maskaras! A vantagem do ZK é q ele tem + Componentes Visuais prontos! :wink: )

garcia-jj:

Quanto a minha contradição, o que eu quis dizer foi sobre o comentário do Lucas em dizer que Javascript dá uma experiência melhor ao usuário, o que eu não concordo. Você pode muito bem fazer uma aplicação bem bacana sem uma linha sequer de Javascript. Experiência agradável se dá com formulário bem organizado, telas semanticamente divididas, e lá vai. Penso no Javascript como um acessório que se tiver melhor, mas se eu não tiver uso igual sem perder funcionalidade. Você que no meio de tantos comentários acabou misturando tudo. Ou eu que confundi mesmo, hahahahaha.
Sobre Organização, Semantica, etc. não posso discordar de vc. Na verdade, o ideal é q TODOS os Sistemas Web fossem assim (mas, não vivemos num mundo ideal)! :shock: Maasssss…
Concordo c/ o Lucas em gênero, grau e número!!! :thumbup: Vamos comparar o seguinte: imagine 1 sistema sem JS, 1 campo Memo só pode ser 1 simples <TextArea => o Usuário só tem 1 simples Plain Text (oh, coitado!); em contra-partida, em 1 RIA poderemos ter 1 editor q oferece (nada +, nada- q) Rich Text (Formatação Rica e Tabulação, como este q a gente usa aki no Forum, ou 1 até melhor): melhorou bastante?!): e a técnica AJAX p/ implementar isto é (advinha!): JavaScritp! 8)

boneazul

derlon:
boneazul:
…como era minha primeira vez trabalhando com criacao de taglib com arquivos .tag entao nao tinha muita experiência…
“com arquivos .tag”??!
Então vc num tá implementando isso numa .TLD, não??! :roll:

entao cara tld são coisas mais antigas… arquivos .tag voce nao programa uma linha de java…é bem mais rápido… se nao me engano saiu na especificação jsp 2.0 …

G

boneazul:
derlon:
boneazul:
…como era minha primeira vez trabalhando com criacao de taglib com arquivos .tag entao nao tinha muita experiência…
“com arquivos .tag”??!
Então vc num tá implementando isso numa .TLD, não??! :roll:

entao cara tld são coisas mais antigas… arquivos .tag voce nao programa uma linha de java…é bem mais elegante… se nao me engano saiu na especificação jsp 2.0 …

Não que seja antiga no sentido de obsoleta/ultrapassada. As .TAG ou .TAGX são uma facilitade a mais, onde você pode escrever uma TLD em um arquivo estilo JSP/JSPX. E concordo, fica bem elegante já que você precisa apenas colocar dentro do WEB-INF/tags e nem mesmo precisa de um descriptor. Mas para tarefas mais complexas o código fica muito extenso e poluído, aí nesse caso acho que a TAG em Java fica mais bacana.

Elas surgiram no JSP 2.0, se não me engano em meados de 2003/2004.

boneazul

@derlon

Bom cara jquery vai muito alem do que validações bobas e mascaras…da pra se fazer qualquer coisa que um FX da vida faz tirando a parte 3D…mas isso ate o canvas do javascript ta começando a implementar ou seja daqui a pouco vai ter até os 3d da vida renderizado no browser…que esta pra ser implementado em browsers…no mais as aplicações são bem ricas basta conhecer um “pouquinho dele”…

quanto a geração automática isso já é um pouco mais complicado…voce queria um GWT da vida,pois ele faz algo parecido pega seus componentes em java e transforma para javascript…???

"As Regras de Validação tem q ser definidas em 1 único "
esse ponto realmente é o sonhado…nao vejo muito jeito de propagar isso sozinho…
pra mim validações server-side resolvem sem nenhum problema…e ta num ponto só…validate do controller…nao tenho que procurar em outro lugar…ta em java e nao esquentei a cabeça com javascript…

D

boneazul:
…da pra se fazer qualquer coisa que um FX da vida faz tirando a parte 3D…mas isso ate o canvas do javascript ta começando a implementar ou seja daqui a pouco vai ter até os 3d da vida renderizado no browser…que esta pra ser implementado em browsers…no mais as aplicações são bem ricas basta conhecer um “pouquinho dele”…
Que bom saber q o jQuery evoluiu de 1 simples PluggIn p/ 1 FrameWork de Verdade!! 8) E Revolucionou, e continua evoluindo… (mas, será q ele oferece recursos p/ ME??! :roll: )
boneazul:

pra mim validações server-side resolvem sem nenhum problema…e ta num ponto só…validate do controller…nao tenho que procurar em outro lugar…ta em java e nao esquentei a cabeça com javascript…
Se vc implementa as Lógicas de Negócio na Controller (q era +/- a filosofia do VRaptor2) faz todo o sentido! Neste caso, o Sistema não segue o padrão ‘Front Controller’ do EAA[Martin Fowler].^^

boneazul

derlon:
boneazul:
…da pra se fazer qualquer coisa que um FX da vida faz tirando a parte 3D…mas isso ate o canvas do javascript ta começando a implementar ou seja daqui a pouco vai ter até os 3d da vida renderizado no browser…que esta pra ser implementado em browsers…no mais as aplicações são bem ricas basta conhecer um “pouquinho dele”…
Que bom saber q o jQuery evoluiu de 1 simples PluggIn p/ 1 FrameWork de Verdade!! 8) E Revolucionou, e continua evoluindo… (mas, será q ele oferece recursos p/ ME??! :roll: )
boneazul:

pra mim validações server-side resolvem sem nenhum problema…e ta num ponto só…validate do controller…nao tenho que procurar em outro lugar…ta em java e nao esquentei a cabeça com javascript…
Se vc implementa as Lógicas de Negócio na Controller (q era +/- a filosofia do VRaptor2) faz todo o sentido! Neste caso, o Sistema não segue o padrão ‘Front Controller’ do EAA[Martin Fowler].^^

entao cara o jquery é um framework javascript nunca mechi com ME e nao sei o que precisa ser escrito pra esses tipo de validação na camada cliente creio que seja código java …se bem que ate os mobile tao preferindo colocar o browser dentro e rodar aplicações web…

Bom é a velha briga implementar no model ou controller…uns defendem uma coisa outras outra coisa…eu nao vejo problema validações de regra estarem no controller…usando o bom senso ve se que não é algo estranho…como o validator faz por exemplo do vraptor…voce ve seu validator funcionando no seu model??acho que é estranho pensar isso…
seria complicado eu baixar uma camada a mais…so pra validar voltar e voltar pra aplicação…

Lucas_Cavalcanti

a lógica de validação faz parte do seu modelo… teoricamente no controller vc só deveria ter uma chamada

validator.validate(modelo);

e a validação se daria via Hibernate Validator, ou a Bean Validation API… mesmo as validações mais complexas vc consegue colocar num método:

@AssertTrue(message="descrição da minha validação bizarra")
public boolean validacaoBizarra() {
    return //condições complexas
}

assim teoricamente vc garante a validade do seu modelo em qqer lugar, não só nos controllers do VRaptor…

P

boneazul:
vixi nao sei pq o motivo de ter validações client e server side se só a server-side resolve qualquer coisa…ajax ta ai pra isso…vai pro seu servidor ve o que tem que ver depois volta pra interface…validações em ambos os casos só servem para o caso de o cara desligar o javascript…ai voce garante a validação dos dois lados…eu nao uso uma linha do validator do vraptor…tudo fica num metodo do proprio controller…

<html:form ajaxValidation="/controller/validar">

public void validar(Bean bean){
     String errors="";
     if(bean.getValor().intValue()==0) errors+="<li>Valor .. deve ser maior que zero</li>";
     result.include("errors",errors);
}

e na jsp 
um json simples 
{"content":"${errors}"}

.
.
.
.

Vc poderia detalhar mais essa sua forma de validação ?

D

garcia-jj:
…A JSR303 é baseada em anotações em beans, assim será necessário você mapear qual propriedade está relacionada a qual bean, e isso dá um trabalho. O pessoal da apache é ninja (embora às vezes meio porcos) então até tem um fundamento…
@garcia, acho q vc está sendo 1 pouquinho pessimista: veja => a Implementação de Referência para JSR 303 é o Hibernate Validator. Sendo assim, invariávelmente o Commons-Validator vai ter q seguir o Standard da JSR! A propósito, lembra akele ex. q eu te pedi na thread q eu levantei: achei 1 resuminho bem bacana aki: Hibernate Validator

boneazul:
…voce ve seu validator funcionando no seu model??acho que é estranho pensar isso…
seria complicado eu baixar uma camada a mais…so pra validar voltar e voltar pra aplicação…
@boneazul Kara, eu sei q é meio difícil acreditar, mas é 1 coisa factível mesmo e, acredite, o VRaptor3 está (+/-) bem próximo disto! :XD:
“seria complicado eu baixar uma camada a mais…so pra validar voltar e voltar pra aplicação” => Não, c/ certeza, não!! Vai ser bem facinho: justamente do jeito q o Lucas explicou!! :thumbup: É muito simples: internamente eles podem usar algo como 1 chamada tipo ‘classValidator.getInvalidValues(hPhone);’ do Ex. do Test mostrado na pág. do Link q forneci logo acima! :mrgreen: Sakou!!!

G

derlon:
garcia-jj:
…A JSR303 é baseada em anotações em beans, assim será necessário você mapear qual propriedade está relacionada a qual bean, e isso dá um trabalho. O pessoal da apache é ninja (embora às vezes meio porcos) então até tem um fundamento…
@garcia, acho q vc está sendo 1 pouquinho pessimista: veja => a Implementação de Referência para JSR 303 é o Hibernate Validator. Sendo assim, invariávelmente o Commons-Validator vai ter q seguir o Standard da JSR! A propósito, lembra akele ex. q eu te pedi na thread q eu levantei: achei 1 resuminho bem bacana aki: Hibernate Validator

Pessimista? De onde você tirou que eu disse que eles não iriam implementar? Muito pelo contrário, eu disse que o pessoal da Apache é ninja. Fiquei confuso agora.

D

Vc “Pessimista?” => não na questão de a Apache criar 1 Implementação da 303, ou não. Mas, tava achando q vc estava temendo q o Commons-Validator 303 seria mal codificado, a ponto de ser complexo de se adotar e, como consequencia, codificação demasiado verborrágica. :shock:
(Mas, eu já sou + otimista com relação a isto e, como eu mesmo já afirmei, o Commons-Validator invariavelmente vai ter q seguir a especificação da JSR! 8) )

G

derlon:
Vc “Pessimista?” => não na questão de a Apache criar 1 Implementação da 303, ou não. Mas, tava achando q vc estava temendo q o Commons-Validator 303 seria mal codificado, a ponto de ser complexo de se adotar e, como consequencia, codificação demasiado verborrágica. :shock:
(Mas, eu já sou + otimista com relação a isto e, como eu mesmo já afirmei, o Commons-Validator invariávelmente vai ter q seguir a especificação da JSR! 8) )

Derlon, em nenhum momento falei isso. De qualquer forma acho que podemos encerrar o assunto por aqui, afinal, estamos fugindo do propósito do tópico.

Abraços

D

sergiotaborda:
P.S. Por favor atente à netiqueta do GUJ. Não use cores ou palavras em “tudo-maiuscula”.
A.S. Eu escrevi algumas palavras em caixa-alta intencionalmente mesmo p/ destacar algumas coisa q considero relevantes p/ a Comunidade/Forúm. Outra coisa, eu nunca vi nada aki falando sobre cores.

sergiotaborda:
derlon:

sergiotaborda:
Esta conversa de validação client side é pifia. …
Qualquer discussão sobre uma solução que não passe por esta opção é inutil pois é incompleta. Nesse caso mais vale não validar client-side e apenas validar server side.
Se vc não tem 1 solução melhor, não critique. :thumbdown: Críticas CONTRUTIVAS SERÃO SEMPRE BEM VINDAS!!
[size=24]Pifio[/size]
adj. Baixo, vil, reles, grosseiro.
Por favor, vc atente para não ser impertinente/inoportuno. Se vc não tem fé na Engenharia de Software -> ninguem vem ao forúm para ouvir (ler) isso!

sergiotaborda:

Eu dei duas soluções melhores:

  1. Não usar validação cliente-side. Pronto. Se vc não usa, vc não tem problema em encontrar uma lib que…
Isto não é 1 solução. É uma opnião [PONTO].

sergiotaborda:

2) Usar validação via ajax com o google. Neste caso a validação acontece realmente no servidor, portanto trata-se apenas se aumentar a dinamica do sistema mas não a logica. não precisa replicar logica entre cliente e servidor, …
Muito bem, vc comparou Sistemas, como 1 WebMailer p/ex., com Sistemas de Informação (centric): Ok, não é a melhor comparação, mas, como já falei, (enquanto não surgir 1 solução Tecnológica melhor, Infelizmente) validação via Chamada Assíncrona é alternativa razoável.
Só 1 coisinha: taborda, ninguem aki falou q vc deve “replicar logica entre cliente e servidor”! Vc está me fazendo repetir p/ milionésima vez: o ideal é centralizar a definição de Regras de Validação; a forma como vamos propagá-la até a cam. View, se é c/ geração automática de JS, ou através de AJAX é outros 500. Acho q vc é quem [color=red]não está lendo o conteúdo[/color] direito dos posts. \o/

Luiz_Aguiar

derlon TODOS os usuários do GUJ ficariam muito agradecidos se vc puder não escrever como se estivesse no orkut aqui, obrigado.

[]s

A

Tem coisa mais linda que validar no controller Java e depois no prórpio BD com checks e PL/SQL? E se for no Oracle ainda?

É só pra gente grande, as criancinhas aprendem Javascript e Asp.NET na pré escola. =)

softwork

Lucas Cavalcanti:
o que a gente costuma fazer é usar bibliotecas javascript puras pra fazer isso, como o JQuery ou o ExtJS…

no caso de validação: http://docs.jquery.com/Plugins/Validation

o jquey tem plugins muito bons, pra maioria das coisas que vc precisa fazer… e como todos os plugins são javascript puro, vc pode usar tranquilamente com o vraptor… no máximo vc vai ter que fazer a integração entre eles usando json

Lucas.
Eu gostei muito deste plugin do JQuery, porém gostaria de saber se você já implementou no código uma validação para nº CPF/CGC ?
Caso positivo, poderia me enviar o arquivo ?
Obrigado.

Lucas_Cavalcanti
Criado 15 de maio de 2010
Ultima resposta 2 de jun. de 2010
Respostas 46
Participantes 9