Migrando um sistema de PHP para VRaptor

22 respostas
thiagobaptista

Olá a todos!

Estou considerando seriamente migrar um sistema que fiz em PHP para Java. E andei fazendo umas experiências com o VRaptor e tenho ficado muito feliz com o que vejo.

Já tinha experimentado algumas coisa de Rails e sou um entusiasta de metodologias ágeis. Fiquei muito feliz em saber que o VRaptor permite esse tipo de desenvolvimento em Java.

Porém, eu tenho ainda algumas dúvidas que me impedem de tomar a decisão definitiva. Estou entre VRaptor e JSF, porque se trata de um sistema que acabou de entrar em produção e eu não posso demorar muito pra colocar a versão Java no ar - e eu já tenho uma maior vivência com JSF.

Queria perguntar então algumas coisas sobre o VRaptor.

A primeira delas, como montar uma página através de templates com o VRaptor?

Explico: a página em questão tem uma série de segmentos como topo, menu lateral etc, fora o conteúdo principal, que recebe dados recuperados do banco de dados através das lógicas de negócio. A questão é que as ações de controladores do VRaptor retornam apenas um objeto…

Por exemplo: o menu lateral recebe uma lista de “Marcas de Veículos” e, para cada ítem dessa lista, o total de veículos cadastrados no sistema de cada marca. Já o conteúdo principal da home apresenta uma lista com todos os modelos de uma determinada marca de veículo.

Como eu posso “montar” essa página? Eu teria que mandar uma lista de listas como retorno do método de ação, criando uma espécie de “form bean” à la Struts 1?

Agradeço a ajuda!

22 Respostas

Lucas_Cavalcanti

Você pode usar qualquer biblioteca baseada em servlets, como Sitemesh, Velocity, Tiles, JSP puro

Vc pode receber um Result no construtor do seu Controller e chamar result.include(“nome”, objeto); quantas vezes você quiser

basicamente é: inclua a lista (ou o objeto) no result, e mostre na tela do jeito usual em jsp, usando o c:forEach para iterar nas listas

Tenkara_Kiddo

eu comecei no VRaptor tb, e achei mto bacana o recurso de Results.
além das injeções de dependencias que são demais.

thiagobaptista

Valeu pela resposta, Lucas!

Eu já estava mesmo pensando em usar o Apache Tiles.

No VRaptor existiria alguma coisa semelhante ao render :partials do Rails?

Lucas_Cavalcanti

o Tiles talvez tenha… a parte da view é desacoplada do VRaptor

Guevara

Sem contar que vc pode fazer includes das páginas JSP como o footer, header e menús laterais numa pagina index por exemplo e cada parte poderá ter um result.include com a lista de objetos que precisar.
É o que existe em PHP, porém usando Java e 100% OO. =)

thiagobaptista

Como assim? É possível criar uma ação no controle pra cada parte? Isso pra mim seria o ideal.

Por isso que ainda estou em dúvida entre VRaptor e JSF, porque no JSF o acesso às propriedades de um bean é direto…

Lucas_Cavalcanti

sim, vc pode criar um controller para cada parte…
ou criar só um interceptor que alimenta os dados dessas partes, e cria cada parte separada num jsp, usando o tiles ou o sitemesh por exemplo…

http://vraptor.caelum.com.br/cookbook/usando-tiles-com-vraptor3/

thiagobaptista

Lucas, muito obrigado mesmo pela sua disposição em me ajudar! :wink:

Supondo então que eu não vá usar um framework de templates como o Tiles, como eu poderia fazer isso de criar um controller ou ação para cada uma das partes? Você poderia me dar um exemplo?

Lucas_Cavalcanti

você consegue fazer isso só com jsp fazendo:

<jsp:include page="/caminho/da/acao" />

mas a questão é: pq vc precisaria executar uma ação para cada parte? é para montar dados pra mostrar na tela? vai ser comum a várias lógicas do seu sistema?

thiagobaptista

Sim. É uma aplicação de e-commerce de venda de veículos. Bom, é melhor eu cantar a bola de uma vez, porque aí você terá uma visão melhor do que eu quero: www.baixadaveiculos.com.br. Atualmente o site está em PHP.

Em várias partes, como por exemplo no menu lateral que apresenta uma lista de marcas de automóveis e a quantidade respectiva de veículos anunciados, dados precisarão ser recuperados do banco pela lógica e mostrados na tela independentemente. O que muda é o “miolo”.

Por exemplo, na página que lista os resultados de uma pesquisa por anúncio (uma lógica), que será o “miolo”, esse menu lateral (outra lógica) também estará presente.

G

Em meus sistemas uso JSPX, e com ele eu crio os templates como se fossem tags. No miolo do site, onde irá o conteúdo você coloca um jsp:doBody e todo o conteúdo é incluso lá dentro. Não é semelhante ao include nem fragment porque nesses dois você tem dois arquivos que são incluidos no principal, e nessa tag você tem o inverso, o conteudo que é incluído na tag.

<?xml version="1.0" encoding="utf-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
          xmlns:html="http://www.w3.org/1999/xhtml"
          xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
          xmlns:c="http://java.sun.com/jsp/jstl/core"
          version="2.0">

	<jsp:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
				doctype-root-element="html" 
				omit-xml-declaration="no" 
				doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />

	<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
		<head profile="http://gmpg.org/xfn/11">
			<title>Meu título</title>

			<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
			<meta http-equiv="Content-Language" content="pt-br" />
		</head>
		<body>
			<div id="header">
				Meu header
			</div>
			
			<div class="content">
				<jsp:doBody /> <!-- AQUI INCLUI O CONTEUDO DAS PÁGINAS -->
			</div>
		</body>
	</html>
</jsp:root>

E nas suas páginas basta fazer isso:

<?xml version="1.0" encoding="utf-8"?>
<tags:default xmlns:tags="urn:jsptagdir:/WEB-INF/tags"
			xmlns:jsp="http://java.sun.com/JSP/Page"
			xmlns:html="http://www.w3.org/1999/xhtml"
			xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
			xmlns:c="http://java.sun.com/jsp/jstl/core">
	Aqui vai o conteúdo da página
</tags:default>

O resultado é muito semelhante ao tiles. A vantagem é não precisar usar um framework externo, você usa apenas o padrão do JSP.

thiagobaptista

Interessante isso, garcia-jj. Esse conceito se assemelha muito às “master pages” do ASP.NET. Mas confesso a você que é a primeira vez que ouço falar desse tal jspx… :oops:

Se trata de um framework? Ou alguma convenção “nativa” da JEE?

G

Isso é nativo desde o J2EE 5.

Basicamente você pode ter muitos arquivos tagx, por exemplo, um default.tagx com um template, um blank.tagx com outro e um admin.tagx com outro. Então para decidir qual layout você coloca no corpo da página segundária lá no inicio da tag qual o layout.

No que no exemplo que te passei eu usei um tags:default, que é o nome exato do arquivo .tagx que eu tenho um layout default Posso criar um blank.tagx e usar essa tag, que ele então herda tudo dessa blank.tagx.

No J2EE tutorial há uma documentação sobre isso. Dê uma olhada e vamos conversando sobre suas dúvidas que posso te ajudar nisso.

L

Garcia,

Então, to perdidão também nesse assunto, fiquei com duvida esse JSPX permite apenas um include, por exemplo vc usou o body, mas e se eu precisar ter 2 conteudos, por exemplo, conteudo e coluna direita com conteudos variaveis? tem como?

Eu estou tentando utilizar o Sitemesh, no .NET eu já utilizei o NVelocity, para Java será que segue a mesma idéia? O Problema é que não estou conseguindo trazer a idéia, por que eu tenho uma grande impressão que a facilidade de utilizar masterpage no NVelocity era por causa do CastleMonorail, eu só marcava a action com a masterpage.vm apropriada e pronto, era só seguir o esqueleto no .vm da action, com o VRaptor tu sabe se tem algo parecido ?

E para finalizar Sitemesh é uma boa ??

Obrigado

Att
Leonardo Lima

thiagobaptista

Valeu pela dica, Garcia. Vou dar uma olhada nessa documentação e qualquer dúvida te pergunto mesmo! :wink:

Só para constar, para quem “pegar o bonde andando” ou vir até aqui pelo Google, encontrei um bom material sobre o jspx no Java EE 5 Tutorial, como o Garcia indicou.

Lucas_Cavalcanti

@leolimas,

em java existe o Velocity (de onde o NVelocity foi inspirado, creio eu), e o VRaptor se integra com ele sem nenhum problema…

para usá-lo vc só precisa mudar o padrão do VRaptor para ao invés de procurar uma jsp, procurar um .vm

http://vraptor.caelum.com.br/documentacao/configuracoes-avancadas-sobrescrevendo-as-convencoes-e-comportamento-do-vraptor/

no CustomPathResolver você pode sobrescrever o getPrefix para retornar algo como “/WEB-INF/velocity” e o getExtension para “vm”… e pode chamá-lo de VelocityPathResolver tb… o importante é anotá-lo com o @Component do VRaptor

L

@lucas

E ae Lucas, então sobre usar o Velocity eu já tinha visto na apostila da Caelum, e no cookbook, então o que eu estava com duvida ontem a noite era sobre como fazer para aplicar o layout como eu faço no C#, mas eu vi que a forma que eu faço é uma peculiaridade do framework CastleMonorail, lá eu faço da seguinte forma em uma controller

[Layout("MasterPage")]
        public void Index(){}

este MasterPage é um arquivo .vm localizado dentro da pasta Views\Layouts, então ai a duvida nova é possível fazer algo parecido usando o VRaptor ? rsrs se não será que não seria interessante ter algo deste tipo no VRaptor também ? Ou será que isso é feito pelo Sitemesh?

Abraços!!

E obrigado como sempre!

Att.
Leonardo Lima

Lucas_Cavalcanti

o sitemesh, que pode ser integrado ao velocity, tem um xml (decorators.xml) que deixa você fazer isso:

<decorator name="masterpage" page="masterpage.jsp">
      <pattern>/*</pattern>
</decorator>
<decorator name="admin" page="admin.jsp">
      <pattern>/admin/*</pattern>
</decorator>

em todo caso não é muito difícil fazer isso mais integrado ao VRaptor, usando anotações parecidas com as desse framework que você mencionou…

se você conseguir descrever a usabilidade disso, a gente implementa…

Abra uma issue aqui, por favor:

se possível em inglês

G

Sim, pode. Posso procurar alguns exemplos na internet ou também fazer alguma coisa para você.

Não conheço nada de .net, mas pelo nome o velocity parece ser a mesma coisa (o Lucas já falou isso). Embora o velocity é um framework relativamente bom eu não uso com cautela esses projetos da Apache, ainda mais que o velocity para esses casos de montar layout de telas apenas reinventa a roda. Ele é bem útil como quanto você precisa gerar um txt com dados ou até mesmo formatar um email para envio, mas não vejo ele como um bom template para páginas.

No caso do JSPX você pode usar a sintaxe do JSP normal porém voltado a XML. O JSPX herda todas as funcionalidades do JSP e adiciona essas funcionalidades extras. Você pode, como no caso simples que eu mandei, usar esses templates. E se precisar, como você sugeriu, usar um menu pode usar o jsp:include tranquilamente.

G

Lucas, uma funcionalidade que eu quero sugerir (estou há tempos para abrir uma issue) é de você poder declarar um componente único ao invés de apenas package como é atualmente. Assim podemos ter, por exemplo, PathResolver para velocity, jsp, blah-blah-blah, sendo o JSP padrão. Quando o fulano declarar no web.xml para carregar aquela classe, semelhante ao que é feito com o packages, ele carrega esse componente.

Como de praxe, é uma sugestão bem crua. Dá para pensar em alguma coisa legal com base nisso.

<context-param> <param-name>br.com.caelum.vraptor.components</param-name> <param-value>br.com.caelum.vraptor.views.VelocityPathResolver</param-value> </context-param>

Lucas_Cavalcanti

garcia, cria uma issue, plz?

G

Lucas Cavalcanti:
garcia, cria uma issue, plz?
http://github.com/caelum/vraptor/issues

Issue 232

Criado 13 de julho de 2010
Ultima resposta 14 de jul. de 2010
Respostas 22
Participantes 6