WebWork: validação

31 respostas
ricardolecheta

Comecei a estudar o webwork, e achei fantástico a maneira como ele integra o velocity!

Você apenas diz que sua view é um template de velocity e pronto! :slight_smile:

bem, mas fiquei com uma dúvida sobre validações. É possível realizar a validação no lado do cliente com Java Script?

thanks!

31 Respostas

cv1

Ainda nao, a menos que vc crie os seus proprios UI components (WebWork2) que fazem a validacao dependendo do campo.

Uma boa ideia seria criar (ou substituir) o TextField por um que aceite um atributo ‘regex’ e um ‘optional’ :smiley:

cariocathi

tipo tudo a ver com o assunto, MAS aí vai

aki no guj só vejo webwork e velocity, será q ninguém usa struts e tiles ???
ou o negócio é tão fácil q ninguém tem dúvidas sobre ??? :wink:

cv1

A questao nao eh webwork + velocity + sitemesh versus struts + jsp + tiles… mas, ja que vc entrou nesse assunto, pra que alguem usaria struts, se a gente tem webwork, e pra que alguem usaria tiles, se existe o sitemesh? :smiley:

(eu ateh via alguns usos pra JSP antes do pessoal do WebWork adicionar suporte a taglibs pro Velocity… então eu nem entro mais nessa questão ;))

ricardolecheta

eu uso Struts e Tiles :slight_smile:

sou viciado em velocity, mas ainda nao pude colocar em prática em nenhum projeto! mas como eu disse fiquei surpreso como o webwork facilita o uso de velocity, no struts é mais chato, é um pacote a parte.

eu uso e aprovo o Struts! :smiley:

comecei a estudar o webwork hoje, fiz um helloworld :slight_smile:

gostei de alguns pontos, outros nao, mas vou deixar para criticar somente quando eu aprender bem.

daqui a 1 mes eu solto a minha opiniao ! Struts vc WebWord :smiley:

cv1

Pô, fala logo do que vc não gostou, as vezes tem um jeito mais fácil de fazer :wink:

urubatan

na minha opinião, ja que a thread caiu neste assunto,
tanto o Struts como o WebWork são muito bons,

utilizo quase sempre Struts+Tiles+JSP+JSTL

Ja o tiles esta anos luz a frente do sitemesh na minha opinião,
o tiles te da muito mais flexibilidade,
a herança de tiles facilita muito o trabalho, e se altera qualquer parte do tile por herança, o que é muito mais complicado de fazer com o sitemesh
a possibilidade de se utilizar um controller (classe que vai preparar os dados para o tile em questão) por tile mata a pau, coisa que nem existe no sitemesh
e poder aninhar tiles cada um com o seu controller também mata a pau :slight_smile:
uma coisa que muitos veem como problema, e para sites pequenos realmente é, ter o formbean separado da action, em coisas grandes promove uma reusabilidade de codigos muito maior

uma coisa que bastante gente reclama, que é a action ter de ser thread safe, eu até acho uma vantagem, assim, você cria metodos que encapsulam toda a lógica daquela action, ou então passa o controlle do que deve ser feito para algum outro POJO e só se preocupa com o resultado

Utilizando os controllers do Tiles para preparar os dados para exibição por uma JSP ou um template velocity como queiram, e as actions apenas para trabalhos de processamento facilita muito a organização do codigo e das responsabilidades de cada classe

o que sinto falta no struts??

o IoC do WebWork, é muito bom, os formBeans poderiam ter algum tipo de IoC

a Independencia do ambiente WEB que o WebWork tem, faz falta no struts e deixa o desenvolvimento muito mais agil e facil

o ambiente ideal para mim, seria :slight_smile:

WebWork+Tiles+JSP+JSTL

o WebWork é muito mais facil de trabalhar do que o Struts,
mas o Tiles mesmo sendo um pouco mais complicado de trabalhar, da de relho no sitemesh quando se trata de flexibilidade e funcionalidade

os controllers do Tiles poderiam ser substituidos no WW facilmente utilizando as facilidades do command pattern utilizado pelo WW, mas a herança ainda faz uma falta muito grande e infelizmente não suprida pelo sitemesh

e como é um saco de integrar o tiles com o WW, ainda fico com o Struts por causa do Tiles até descobrir uma maneira facil de integrar tiles+WW
ou alguem me doutrinar a utilizar velocity em vez de JSP

e principalmente até o XDoclet começar a gerar os arquivos de configuração do WW2

bom, a minha opinião é esta, ninguem é obrigado a concordar com ela, mas acho que isto vai trazer ainda alguns comentarios para esta thread :slight_smile:

cariocathi

valeu pela força urubatan, já tava achando que era só eu que gostava do struts… :lol:

cv1

Urubatan, faltou só mencionar que uma Action do Struts é beeem mais difícil de testar (num JUnit, sem nenhum web container por perto) do que uma Action do WebWork. Pra mim, que uso TDD, isso faz uma diferença enorme! :smiley:

ricardolecheta

Quanto aquele assunto do Tiles, concordo com o urubatan, o seu sistema de herança é sensacional :slight_smile: Ele lhe fornece uma reutilização de código muito boa.

isto é verdade! percebi que vc consegue testar apenas um método da Action e sem fazer request http, isto é muito bom :slight_smile:

  • na validação do webwork eu não vi nada de mais… :wink:

aproveitando, perguntas :?: :

  • no struts quando se define uma action no struts-config.xml, vc pode colocar o atributo “roles” que indica quem tem permissão para acessar a action. Caso a segurança no web.xml esteja habiltada o Struts faz a autentificação automaticamente, verificando se o usuário está logado com aquela role e toma as providências necessárias.
    Como se faz isto com webwork? ele controla automaticamente ou eu preciso criar um interceptor e fazer manualmente?
cv1

Voce pode usar um interceptor que fala com o OSUser e/ou OSAccess pra fazer isso. Provavelmente essa funcionalidade vai vir no Conductor, um super-projeto (super no sentido contrário a sub, aqui) do pessoal da OpenSymphony que planeja integrar todos os componentes em um frameworkzão base :slight_smile:

R

Eu trabalho com Struts+jsp+tiles tb e estou feliz com eles, Urubatan congordo em 100% com vc em relação ao Tiles que na minha opinião é um dos pontos fortes do Struts. Como o Struts tem uma arquitetura que permite usar plugins vc tb pode colocar um plugin de IoC como o Struts Action Invocation Framework (SAIF)
( http://struts.sourceforge.net/saif/index.html).

Ainda não usei WebWork2, pelo que vi ele realmente da um show em arquitetura e o lance de separar a Action da WEB é legal, mas eu nunca tive problema com isso pois não uso regra de negócios na action e o pessoal da Struts sempre alertou sobre isso. A action ( no Struts ) deve ser um elo de ligação entre o controller e seu modelo, e não o modelo. Acho que muita gente que reclama que a action deve ser thread safe é pq deve estar usando a action como o modelo. Costumo trabalhar criando uma Façade onde a action chama o Façade do sistema e todo meu modelo fica livre o ambiente web. Temos um sistema aqui na empresa que roda em web e swing e estão usando as mesmas camadas de negócios sem mudar nenhuma linha. E acredito que mesmo que eu venha usar o webwork (adoro aprender novos Framewoks) não crerio que colocarei minhas regras na action. Eu nunca chamaria um DAO do Hibernate na action por exemplo, colocaria sempre um FAÇADE antes.

Eu ja mostrei aqui no guj um exemplo de como trabalho, para projetos pequenos ele não é muito produtivo, e ja criamos nosso gerador de código para adiantar o processo de construção das camadas+views. Para projetos grandes vc tem uma arquitetura bem robusta e a parte do projeto de cartão nacional de saúde que o C.E.S.A.R fez usa uma arquitetura muito semelhante a essa (que é difundida pela UFPE). Explico melhor essa arquitetura no tópico : http://www.guj.com.br/forum/viewtopic.php?p=11425&highlight=#11425

cv1

O caso eh que quando vc esta usando Struts, a Action eh praticamente um Servlet empacotadinho.

Já o XWork (base do WebWork2) permite que as suas Actions contenham regras de negócio sem prejudicar a arquitetura e nem tirar a flexibilidade do seu sistema. Dá pra usar XWork dentro de um EJB, ou numa app Swing, sem problemas… :wink:

Já que é assim, e já que as Actions não precisam fazer nada especial a não ser implementar a interface de marcação Action, não vejo pq não tornar a Action parte do seu modelo - coisa que, no Struts, seria prejudicial, no WebWork2/XWork é até uma boa prática. Usando Actions Model-Driven, ainda, fica mais fácil :smiley:

Eu estou fazendo alguns experimentos com os interceptors do XWork aqui, e se der certo, vai ser possível usar as Actions como Transactions do Prevayler… ou seja, persistência totalmente transparente! :wink:

R

Concordo 100%, no Struts a Action faz parte do Controller e por isso ela trabalha ( ou pelo menos deve trabalhar) como um elo entre o controle e o modelo. Já pelo que entendi aqui no WebWork2/XWork a Action faz parte do modelo (é isso mesmo?). Relamente se ela não tem ligação nehuma com a view nada impede de se colocar as regras nela tb :smiley: , falei que não colocaria pq uso uma filosofia de fachada do sistema.

Pelo pouco que vi o WebWork realmente é muito legal, o lance der interceptors é show de bola, assim que dei uma olhada de leve pensei em muita coisa legal que poderia se fazer com isso. Dei uma olhada no plugin de IoC para Struts que é bem legal. Mas o suporte do WW2 parece ser mais rico. Tb é possível usar o IoC do Spring com o Struts, mais esse eu não olhei ainda.

Tenho visto muito no GUJ se falar em WebWork e vcs são bons em atrair adeptos (passei a usar Eclipse depois que conheci o GUJ e contaminamos nossos amigos de trabalho tb :twisted: ), então sei que provavelmente o primeiro projeto fora do trabalho que fizer que for para web deve ser em WW2/XW. :smiley:

Como ja estou curioso e a documentação do WW2 fica a desejar, cv quebra um galho aí e fala o que são essas tais Actions Model-Driven :?:

M

onde vejo sobre esses Tiles ?
valeu.

urubatan

isto é verdade, por isto sempre que possivel, procuro utilizar a action apenas para chamar um metodo de alguma classe, caso cotnrario, fica inviavel testar.

cv1
"Richardson":
Relamente se ela não tem ligação nehuma com a view nada impede de se colocar as regras nela tb :D , falei que não colocaria pq uso uma filosofia de fachada do sistema.

Pois eh... o caso aqui eh que, usando o XWork, a sua fachada pro sistema passa a ser o proprio conjunto de Actions ;)

"Richardson":
Dei uma olhada no plugin de IoC para Struts que é bem legal. Mas o suporte do WW2 parece ser mais rico. Tb é possível usar o IoC do Spring com o Struts, mais esse eu não olhei ainda.

No WebWork da pra usar Spring, PicoContainer ou o XWork como container de IoC. Se nao me engano, teve um pessoal que escreveu um wrapper pro Avalon, tambem. Eu tou usando o Pico aqui, e tem caido como uma luva :D

"Richardson":
Como ja estou curioso e a documentação do WW2 fica a desejar, cv quebra um galho aí e fala o que são essas tais Actions Model-Driven :?:

Exemplo pratico, pq eu tou sem saco pra explicar: :D

public class AlterarUsuarioAction extends ActionSupport implements ModelDriven, DaoAware {

  private Usuario usuario;
  private Dao dao;

  public Object getModel() {
    return usuario;
  }

  public void setDao(Dao dao) {
    this.dao = dao;
  }

  public String execute() {
    try {
      dao.save(usuario);
      return SUCCESS;
    } catch(DaoException e) {
      addActionError(e);
      return ERROR;
    }
  }
}
#tag(TextField "name='nome'" "label='Nome'" "value=nome")
#tag(TextField "name='senha'" "label='Senha'" "value=senha")
#tag(Submit "value='Alterar'")

;)

urubatan

bahh, com um truço destes ja é gozação,
nem o tiles vale o esforço de utilizar outra coisa se o WW2 vai fazer isto ai para mim.

só duas perguntinhas :slight_smile:
tenho que ter todas as propriedades do objeto sendo alterado no post ou posso ter só algumas??
como isto funciona para uma hierarquia de objetos??

valeus :slight_smile:

cv1

So as que vc marcar como obrigatorias no seu xxx-validation.xml, ou a sua Action nao vai passar do erro nunca :smiley:

Melhorando o exemplo:

public class Usuario implements Serializable { private String nome; private String senha; private Contato contato; ... }

public class Contato implements Serializable { private String email; private String yahoo; private String msn; private String icq; private String aim; ... }

#tag(TextField "name='nome'" "label='Nome'" "value=nome") #tag(TextField "name='senha'" "label='Senha'" "value=senha") #tag(TextField "name='contato.email'" "label='E-mail'" "value=contato.email") #tag(Submit "value='Alterar'")

:wink:

smota

“urubatan”:
só duas perguntinhas :slight_smile:
tenho que ter todas as propriedades do objeto sendo alterado no post ou posso ter só algumas??
como isto funciona para uma hierarquia de objetos??

  1. Pode ter apenas algumas sem problema. Inclusive pode ter a mesma action gerenciando vários passos de um form (ou seja, cada passo seta apenas uma parte das propriedades) … rolou um exemplo de um wizard na lista beeeeem facil mas nao to com ele por aqui …

  2. Totalmente transparente. No exemplo se no usuario houver um objeto Projeto na tela vc faria:
    #tag(TextField “name=‘Projeto.Status’” “label=‘Projeto Corrente’” “value=Projeto.Status”)

erra essa a duvida?

cv1

…detalhe que eu soh percebi agora: esses templates do Velocity que eu usei de exemplo chamam taglibs JSP! Entao, se vc tinha algum motivo pra usar JSP, ele se foi… :smiley:

urubatan

vou dar uma testada nestas Model Driven Actions
na teoria ta parecendo a 8a maravilha do mundo :slight_smile:

valeu a dica :slight_smile:

urubatan

ahh, só mais uma perguntinha que lembrei agora :slight_smile:

por exemplo:

public class Usuario{
private String nome;
private Collection direitos;
.... gets e sets ...
}

public class Direito{
 private int id;
  ......
}

utilizando o WW2 + ModelDriven Actions ele suporta a edição de atributos dos objetos contidos na collection direitos da classe Usuario??

tipo, no struts para fazer algo parecido com isto (edição de tabelas) utilizo mapped properties, existe como fazer no WW2 ou teria que editar objeto por objeto??

valeu, e desculpem estar enchendo o saco, mas fiquei bastante interessado no WW2 depois desta :slight_smile:

cv1

#foreach($direito in $stack.findValue('direitos')) #tag(TextField "label='Direito'" "name='direitos[$velocityCount].id'" "value=direitos[$velocityCount].id") #end

Tah bom ou quer mais? :smiley:

urubatan

perfeito :slight_smile:

thanks :slight_smile:

<editado>
se eu soubesse disto antes, teria levado pelo menos um terço a menos do tempo que estou levando para desenvolver este projeto que estou entregando hoje :slight_smile:

WW2 + Model Driven Actions + IoC - rulez

quando testei o WW1 não tinha tudo isto, ainda valia bem mais a pena trabalhar com o Struts+Tiles :slight_smile:
</editado>

cv1

Pronto, um Struteiro a menos aqui no GUJ :smiley:

[cv olha pra fila de gente esperando ser catequizada…]

…próximo!

ricardolecheta

sobre IoC, alguem me explica qual a mágica neste exemplo? o que ele faz? :D

PetStoreAware.java:

public interface PetStoreAware &#123;
	public void setPetStore&#40;PetStore store&#41;; 
&#125;
PetStore.java:
public interface PetStore &#123;
	void savePet&#40;Pet pet&#41;; 
	void removePet&#40;Pet pet&#41;; 
	List getPets&#40;&#41;; 
	Pet getPet&#40; long id&#41;;
&#125;
public class AddToCart implements Action, PetStoreAware, ShoppingCartAware &#123; 
	. . .
	public void setPetStore&#40;PetStore ps&#41; &#123; this.petStore = ps; &#125; 

	public void setShoppingCart&#40;ShoppingCart c&#41; &#123; this.cart = c; &#125; 

	public String execute&#40;&#41; throws Exception &#123; 
		if &#40;cart == null || petId == 0&#41;
			return ERROR; 
      
	    Pet pet = petStore.getPet&#40;petId&#41;; 

		cart.addPet&#40;pet&#41;; 
		return SUCCESS;     
	&#125;  
&#125;
ricardolecheta

tb estou interessado no WW2, entao deixa eu aproveitar para fazer mais perguntas, desculpa ai :wink:

public class AlterarUsuarioAction extends ActionSupport implements ModelDriven, DaoAware &#123; 

  private Usuario usuario;

e neste caso, já percebi que se consegue acessar o usuario.nome no view, mas caso eu passe as informações por um formulário como nome, email do Usuario, estes campos serão preenchidos no Usuario?

[EDITADO]já descobri qual era o problema, faltava um getUsuario() :-)[/EDITADO]

cv1

Ricardo, no caso desse ultimo exemplo que vc passou, vc nao precisa escrever um getUsuario() caso vc esteja implementando ModelDriven. Basta implementar o getModel() - e nesse metodo retornar a instancia do usuario.

A diferenca eh que, usando ModelDriven, o usuario vai ser colocado no topo da ValueStack, e a sua Action fica em 2o lugar. Na pratica, da pra fazer assim:

#tag&#40;TextField &quot;name='nome'&quot; &quot;label='Nome'&quot; &quot;value=nome&quot;&#41; #tag&#40;TextField &quot;name='senha'&quot; &quot;label='Senha'&quot; &quot;value=senha&quot;&#41; #tag&#40;TextField &quot;name='contato.email'&quot; &quot;label='E-mail'&quot; &quot;value=contato.email&quot;&#41; #tag&#40;Submit &quot;value='Alterar'&quot;&#41;

Ao inves de assim:

#tag&#40;TextField &quot;name='usuario.nome'&quot; &quot;label='Nome'&quot; &quot;value=usuario.nome&quot;&#41; #tag&#40;TextField &quot;name='usuario.senha'&quot; &quot;label='Senha'&quot; &quot;value=usuario.senha&quot;&#41; #tag&#40;TextField &quot;name='usuario.contato.email'&quot; &quot;label='E-mail'&quot; &quot;value=usuario.contato.email&quot;&#41; #tag&#40;Submit &quot;value='Alterar'&quot;&#41;

ricardolecheta

humm, entendi.

Mas eu vou ter que me acostumar com a idéia de expor a camada de Model deste jeito :wink:

Mas realmente, agora estou começando a pensar se as FormBeans do Struts nao duplicam código, uma vez que depois vou obter um ValueObject a partir de uma form.

vamos ver no que vai dar :slight_smile:

W

Pessoal,
estou comecando a utilizar o webwork2 e gostaria da ajuda de voces para esclarecer o seguinte:

  1. Pelo que vi ate agora eh possivel utilizar o ww2 para o “controler” e jsp com jstl para o “view”. O uso do jstl eh uma boa pratica qdo se esta usando o webwork2?

  2. De qualquer forma estou tentando usar o jstl com ww2 e nao estou conseguindo… Alguem pode me dar uma dica de como utilizar os objetos da minha action no jsp utilizando tags do jstl?

Abracos,
Wilton

smota

A View fica por conta do freguês … eu uso o Velocity mesmo porque é a base, o JSTL parece que tem mais futuro … mas não sei, é só escolher.

Você leu tudinho no Wiki? http://wiki.opensymphony.com/space/Using+JSTL+seamlessly+with+WebWork

E o Exemplo? http://wiki.opensymphony.com/space/Example%2C+exposing+webwork+objects+to+JSTL%2C+with+a+JSTL+and+DisplayTag+Example

Criado 7 de novembro de 2003
Ultima resposta 20 de fev. de 2004
Respostas 31
Participantes 8