Cheque aki! Exemplo de Velocity + Struts :)

15 respostas
Elvis.The.Pelvis

Este pequeno exemplo mostra como é possível usar o Velocity junto com o Struts, usando inclusive a API de validação do Struts.
Você pode baixar o .war em:
http://www.recjug.com.br/velocitystruts.war
O fonte do projeto pode ser encontrado em:
http://www.recjug.com.br/velocitystruts.zip

Algumas considerações:
1 - Configurem o velocity.properties (%TOMCAT_HOME%webapps/velocitystruts/WEB-INF) para apontar para o diretório onde se encontra seus templates (%TOMCAT_HOME%webapps/velocitystruts/vtemplates).

2 - Configurem o basehref no application.properties para que as imagens e os links funcionem.

3 - No netscape, foi impresso o conteúdo do html sem ter sido interpretado, acho que tem algo a ver com o content type (no i.e. funciona filet).

4 - Essa aplicação sempre vai gerar erros de validação. Ela não chega a realmente cadastrar em banco os dados. Esse exemplo mostra como construir um servlet para interpretar seus *.vm e acessar a API de validation do struts.

Adorei implementar isso :smiley: :smiley: :smiley:

Edited
(cantarolando)… Estou esperando meu prêmiooooooooo… :wink: :smiley:
Edited

15 Respostas

Paulo_Silveira

muito legal!

estava indo fazer um projeto em JSP com struts porcausa da documentacao soh dar os exmeplos com JSP em 99% dos casos, mas vi que ta bem elgal de usar ja com velocity

o premio sao os meus parabens! :slight_smile: olhe a homepage

nao quer escrever um tutorial pra gente nao?

ps: a conexao do recjug parece ser mto baixa
ps2: voce podia ter deixado os libs de fora do source! esse download aqui nao acaba!
ps3: seguem perguntas relativas ao codigo, ja q nao posso testar daqui do trampo

Paulo_Silveira

bem, pelo que vi no codigo, voce mesmo que esta fazendo a integracao velocity + strutrs. Tipo, parte do Controller voce que esta fazendo.

Tem um mini projeto dentro do Velocity, que teoricamente ja deve fazer isso. Quero ver qual eh a deles.

Paulo_Silveira

http://cvs.apache.org/viewcvs/jakarta-velocity-tools/examples/struts/WEB-INF/
sua aplicacao ta bem parecida com o que o pessoal do velocity usa de exemplo neh?

assim como a VelocityServlet sua
http://cvs.apache.org/viewcvs/jakarta-velocity-tools/src/java/org/apache/velocity/tools/view/servlet/VelocityViewServlet.java?rev=1.6&content-type=text/vnd.viewcvs-markup

eu nao gosto muito desse estilo de Controller, onde nao tem um FrontController, ja que a entrada pode vir por dois lados bem diferentes

que que voces acham?

Elvis.The.Pelvis

Bem, não tive contato com o VelocityServlet do pessoal da Velocity (juro), veio da minha cabeça mesmo, por isso não sei se é a melhor forma de implementar.

Implementei o servlet por que é mais divertido mesmo. Fiquei divagando um tempo em como fazer para passar os atributos do request para o VelocityContext. Foi no que deu.

Mas se você parar para pensar, o VelocityServlet não é bem um Controller. Ele só renderiza output. Quem decide o fluxo da aplicação ainda é o ActionServlet, então…

Por exemplo, o ActionServlet pega a requisição “algo.do”, faz alguma operação e repaça PUTS - repassa seu burro a requisição para “novocaminho.vm”. O VelocityServlet captura através do servlet-mapping e processa o output. Ele faz o mesmo papel dos servlets gerados a partir das JSP. Você tem vários servlets mas apenas 1 controla o fluxo.

O VelocityServlet não tem poder de decisão.

Edited
A idéia de usar um servlet para interpretar os .vm realmente veio de lá. Mas pensando bem, existe alguma maneira melhor de se fazer???
Edited

Paulo_Silveira

verdade. parece um viewhelper

verdade, mas ta muito direito no pipeline da requisicao neh?

“Elvis.The.Pelvis”:

Edited
A idéia de usar um servlet para interpretar os .vm realmente veio de lá. Mas pensando bem, existe alguma maneira melhor de se fazer???
Edited

Um negocio que seria legal, era ao inves de ter um VelocityServlet, era um ViewHelperServlet, e ai ele delegava para a VelocityServlet ou apra um JSP, dependendo do caso. Assim voce poderia usar JSP, Velocity ou qquer outra coisa sem ter de alterar nada.

Bem, melhor ideia eu nao tenho.
Queria criar um forum apra discussoes desse tipo. Tipo, um nivel bem alto de discussao, design e arquitetura.

R

Elvis/Paulo…

nao sei o q fiz de errado, mas nao consegui rodar esse exemplo de struts + velocity…

configurei tudo q o Elvis disse no topico, mas mesmo assim nao executa…

o q pode ser??

falow

Elvis.The.Pelvis

O que é que ta dando de errado? Da uma olhada no output do tomcat. imprimo algumas coisas lá.

R

Elvis…

aparece esse erro no browser…no console do tomcat nao aparece nada de erro…

java.lang.NoSuchMethodError

at br.org.recjug.velocitystruts.servlet.VelocityServlet.service(Unknown Source)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)

at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)

at java.lang.Thread.run(Unknown Source)

o q pode ser??

valew

Rafael_Steil

Ta dizendo que o metodo que voce esta chamando nao existe :slight_smile:

Isso geralmente acontece quando voce marca o contexto como reloadable e altera alguma coisa na estrutura da classe ou na assinatura do metodo… Nesses casos, voce precisa restarta o tomcat ( de um rebuild geral no projeto e reinicie ele)… deve funcionar…

Rafael

R

Rafael.

nem mexi em nada na estrutura de classes do exemplo…apenas baixei e rodei…

como dar rebuild no projeto?? tentei jogar no eclipse, mas nao deu mto certo…

falow

Elvis.The.Pelvis

O arquivo .zip contém o fonte do projeto. Edita o build.xml, configurando os parâmetros iniciais para as suas pastas no seu disco. Rode o ant. Deve ser gerado um .war na sua pasta webapps do tomcat. daí é so rodar o Tomcat. Agora to viajando em pq tá dando erro. Deveria rodar legal. Testei em várias máquians aki no trampo e rolou legal.

Rafael, esse problema que você falou é do velocity ou do Tomcat???

R

caro Elvis…

nao encontrei o build.xml do exemplo…

Elvis.The.Pelvis

tem certeza que não está no zip. mandei dois arquivos. um .war e um .zip

Guilherme_Silveira

confere a versao de servlet api e jdk utilizado, o metodo que nao esta sendo encontrado pode soh existir em uma versao mais recente (q foi usada pra programar)…

R

deve ser isso mesmo, Guilherme…

aki tenho a versao 4.0.3 do tomcat…vou dar um update nele e ver se funciona…

falow

Criado 20 de março de 2003
Ultima resposta 27 de mar. de 2003
Respostas 15
Participantes 5