[Resolvido] Padrões de projeto com VRaptor 3

Oi pessoal! o/
A minha aplicação está crescendo, e ai começam a aparecer aqueles problemas de código duplicado, e como quero evitar isso, queria saber como posso resolver esta questão.
Tenho um método para visualizar a galeria de fotos, está em FotoController, o método se chama “view”, então ele chama uma JSP view lá na pasta foto. Esta JSP está com CSS para que os usuários logados visualizem, menú personalizado e CSS personalizado.
Acontece que preciso outro método view na INDEX, onde o CSS e o menu é outro, para clientes que visitam a página, ai pensei, se for nadando junto com a maré, era só fazer um método “view” igualzinho na IndexController e chamar uma JSP view na pasta index. Ou seja, código duplicado, dois métodos iguais nos dois Controllers e duas JSPs cuja diferença seria apenas o CSS e o menú.
Como poderia resolver essse tipo de problema no VRaptor??
Abraço!!!

tem vários jeitos…

se vc tá usando algum gerenciador de templates, tipo o sitemesh, vc faria o mesmo jsp pras duas lógicas e page decorators diferentes…

vc pode extrair a parte de conteúdo da jsp em um outro jsp (ou jspf) e incluir nas duas jsp das view usando <%@ include file="…" %>

vc pode usar ifs nas jsps (meio gambi)

se for só em poucas lógicas, a tática da extração do conteudo da jsp é a mais simples e elegante

se for em muitas, talvez usar sitemesh (ou coisa do tipo) seja melhor, daí vc separa as suas jsps do layout e design da página

Pelo título pensei que encontraria algo sobre delegate, command, observer… :lol:

Opa!
Segui a sua dica Lucas, adicionei o jar do sitemesh na /lib, segui o manual do sitemesh, criando o sitemesh.xml:

<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml" />
    <excludes file="${decorators-file}" />

    <page-parsers>
        <parser content-type="text/html"
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
        <parser content-type="text/html;charset=ISO-8859-1"
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    </page-parsers>

    <decorator-mappers>
    
        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}" />
        </mapper>
        
    </decorator-mappers>
</sitemesh>

E na WEB-INF/web.xml adicionei o conteúdo:

<!-- SiteMesh -->
	<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
	</filter>

	<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
	</filter-mapping>

Criei a pasta decorators em WebContent, e adicionei um pedaço do site que é o header:

<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>Imobili&aacute;ria</title>
<decorator:head />
</head>
<body>
<div id="tudo">
<div id="topo">
<div id="borda_topo"></div>
<a href="/imobiliaria/"><img src="${pageContext.request.contextPath}/imagens/aplication/logo.png" alt="Volta para página inicial" /></a>
<div id="img_topo"></div>
</div> 
<decorator:body />
</div>
</body>
</html>

Coloquei a tag para chamar na index.jsp:

<decorator:head></decorator:head>

Ao chamar a aplicação está dando erro 404 sem nenhuma saida no console., sabe o que pode ser?
Abraço!!

Talvez a ordem dos filtros. O Lucas pode te dizer melhor a ordem correta deles, se não me engano vraptor deve estar antes.

Oi Garcia! \o/
Eu tinha colocado o sitemesh em último lá na web.xml, o legal é que não acontece nada, o bicho morreu! :smiley:
Será que precisa de alguma configuração específica pra trabalhar com o VRaptor? Achei uma dica pra VRaptor2 e é td código antigo, não serve pra VRaptor 3.

Sinceramente eu não sei o que fazer quando há dois filter a serem usados. O Lucas sabe melhor disso.

Há um tópico, que você pode pesquisar, onde o Lucas dá uma sugestão sobre o Spring Security com Vraptor3. Nesse post ele cita a ordem correta, se é vraptor primeiro ou Spring Security.

Acabei de achar a dica do Lucas no calopsita:


Ele colocou os filters do sitemesh antes do VRaptor, foi o que eu fiz aqui e não deu boa não.

cadê o seu decorators.xml?

dá uma olhada no calopsita, e veja os arquivos necessários…
a única coisa de diferente que tem é uma customização dele pra tratar diferentes os metodos http, mas o resto é igual…

o decorators.xml é o que fala qual decorator vai decorar qual url

[]'s

Cheguei da faculdade, liguei a máquina rodei a aplicação e agora deu sinal de vida! Não sei o motivo, mas td bem. =)
Tô lendo a doicumentação e pelo que entendi, além de uma index.jsp na pasta jsp que terá os dados, eu terei uma outra index.jsp dentro de /decorators que servirá como esqueleto da index, estou certo?? Ai migro todo o css (divs com id’s e outras tags com “class”) pra index.jsp que está na pasta /decorators, correto?

Abraço!

algo assim =)

Valeu Lucas! o/
Tá funcionando aqui, agora é questão de aprender a usá-lo.
Abraço!