VRaptor 3.1 com Tiles 2.2

30 respostas
Lucas_Cavalcanti

eu não sei como o tiles 2.2 funciona, mas tudo o que vc tem que fazer é redirecionar para uma url que faça com que o tiles rode… tome cuidado que se os arquivos estiverem dentro do WEB-INF, vc provavelmente tem que começar seu path com /WEB-INF

quanto ao construtor do DefaultPathResolver, é só criar um delegate constructor, não tem mto mistério. Se vc usa Eclipse, o próprio Ctrl+1 no erro cria esse construtor

30 Respostas

G

Eu fiz um cookbook há algum tempo integrando tiles com vraptor, e está no site do vraptor3. Ele funciona exatamente como você falou, Lucas. Apenas sobrescrevi o PathResolver colocando a convenção para redirecionar para um url *.tiles e configurei o filtro do tiles para aceitar requisições assim. O mais importante é colocar sempre o filter do tiles antes do filter do vraptor.

G

Xii, estou atrasado, hahahaha. Na verdade o projeto que usei isso está em produção e só terei atualizações dele em março. De qualquer forma foi analisar as mudanças do tiles 2.2 e vou fazer uma nova receita.

Abraços

Lucas_Cavalcanti

os parâmetros vc tb recebe no construtor da sua classe e repassa para o construtor da super…

fidelis_felipe

Então, Tem como utilizar o tiles com o vraptor ou algum impecílio? Estava estudando sobre carregar templates em minha aplicação com o tiles e tropecei nesse poste…
Alguém sabe se posso continuar a busca… rs

abcs

Lucas_Cavalcanti

pode continuar a busca sim, tem como usar =)

aqui:
http://vraptor.caelum.com.br/comunidade.jsp

e aqui: http://vraptor.caelum.com.br/cookbook

fidelis_felipe

Pessoal, estou implementando tiles na minha aplicação:

o seguinte erro é lançado…

alguem sabe o que possa ser?

GRAVE: Servlet /meuprojetotiles threw load() exception
java.lang.ClassNotFoundException: org.apache.tiles.startup.TilesInitializer

Onde tenho,
VRaptor 3.0
Tiles 2.2.2

com as .JAR
tiles-api-2.2.2.jar
tiles-jsp-2.2.2.jar
tiles-servlet-2.2.2.jar
tiles-template-2.2.2.jar

tenho meu web.xml mapeado

<!-- tiles configuration -->
	<servlet>
		<servlet-name>TilesServlet</servlet-name>
		<servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>
		<init-param>
			<param-name>org.apache.tiles.factory.TilesContainerFactory.MUTABLE</param-name>
			<param-value>true</param-value>
		</init-param>
		<load-on-startup>2</load-on-startup>
	</servlet>
	<!-- /tiles configuration -->

<!-- config vraptor !-->
...
<!-- config vraptor !-->

Meu Template é este:

Ja Conferi direto pelo crtl+cursor na IDE sobre a string abaixo e ele aponta certinho para os akivos na pasta jsp onde estao

teste.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>  
<html>  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
        <title>template</title> 
        <!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>

    </head>  
    <body>  
        <div id="divHeader">

/*Aki ocorre o erro para o compilador */
//Ja Conferi direto pelo crtl+cursor na IDE sobre a string abaixo e ele aponta certinho para os akivos na pasta jsp onde estao
            <tiles:insertTemplate template="/WEB-INF/jsp/headerPortal.jsp"/>  
        </div>  
        <div id="divContent">  
            <tiles:insertAttribute name="body"/>  
        </div>  
        <div id="divFooter">  
            <tiles:insertTemplate template="/WEB-INF/jsp/footer.jsp"/>  
        </div>  
    </body>  
</html>
Lucas_Cavalcanti

classNotFound é sempre falta de jars, ou jar com a versão errada…

entra nesse site:

http://www.jarfinder.com

e procura por essa classe que deu o erro, ele vai te mostrar os jars que a contém

fidelis_felipe

O Erro é esse:

java.lang.ClassNotFoundException: org.apache.tiles.startup.TilesInitializer
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)

Então no site http://www.jarfinder.com/index.php/ busquei por :

WebappClassLoader

que troxe …

org.apache.catalina.loader.WebappClassLoader
org.apache.catalina.loader.WebappClassLoader.DummyLogFactory
org.apache.catalina.loader.WebappClassLoader.PrivilegedFindResource
org.apache.catalina.loader.WebappClassLoader.PrivilegedGetClassLoader
org.apache.catalina.loader.WebappClassLoader.ResourceEntry

Então será que alguma dessas libs do meu projeto dão conflito com as do repositorio tomcat ?

to usando essas jar no meu bulid path

antlr-2.7.6.jar
aopalliance.jar
aspectjrt.jar
c3p0-0.9.1.1.jar
cglib-nodep-2.1_3.jar
commons-collections-3.2.1.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-logging.jar
dom4j-1.6.1.jar
ejb3-persistence.jar
google-collect-1.0.jar
guava-r07.jar
hamcrest-all-1.2RC3.jar
hibernate-3.3.2.jar
hibernate-annotations-3.4.0.jar
hibernate-commons-annotations-3.4.0.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
imageinfo-1.9.jar
java-core-2.6.jar
javassist-3.9.0.GA.jar
jstl-api-1.2.jar
jstl-impl-1.2.jar
jta-1.1.jar
log4j-1.2.15.jar
mail.jar
mirror-1.5.1.jar
mockito-all-1.8.5.jar
objenesis-1.1.jar
ognl-2.7.3.jar
org.springframework.aop-3.0.0.RELEASE.jar
org.springframework.asm-3.0.0.RELEASE.jar
org.springframework.aspects-3.0.0.RELEASE.jar
org.springframework.beans-3.0.0.RELEASE.jar
org.springframework.context-3.0.0.RELEASE.jar
org.springframework.core-3.0.0.RELEASE.jar
org.springframework.expression-3.0.0.RELEASE.jar
org.springframework.web-3.0.0.RELEASE.jar
paranamer-2.2.jar
postgresql-8.2-505.jdbc3.jar
servlet-api-2.4.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
slf4j-simple-1.5.8.jar
tiles-api-2.2.2.jar
tiles-el-2.2.2.jar
tiles-jsp-2.2.2.jar
tiles-servlet-2.2.2.jar
vraptor-3.2.0.jar
xstream-1.3.1.jar

Do tomcat pelo build path tbm:

C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\lib…

annotations-api.jar
catalina-ant.jar
catalina-ha.jar
catalina-tribes.jar
catalina.jar
el-api.jar
jasper-el.jar
jasper-jdt.jar
jasper.jar
jsp-api.jar
servlet-api.jar
tomcat-coyote.jar
tomcat-dbcp.jar
C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\lib\tomcat-i18n-es.jar
C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\lib\tomcat-i18n-fr.jar
C:\Program Files (x86)\Apache Software Foundation\Tomcat 6.0\lib\tomcat-i18n-ja.jar

Lucas_Cavalcanti

o ClassNotFound foi nessa classe:

org.apache.tiles.startup.TilesInitializer

o que aparece embaixo é a stacktrace

fidelis_felipe

Ótimo, passei o dia todo mechendo e não achei, agora a noite fui ao site novamente e fui vendo class por class e achei as libs que estavam faltando, vi posts que diziam que eu só precisava por a tiles-jsp, mas não consegui assim.

As depedencias obrigatória que vi foram:

tiles-api-2.2.2.jar
tiles-compat-2.2.2.jar
tiles-core-2.2.2.jar
tiles-el-2.2.2.jar
tiles-jsp-2.2.2.jar
tiles-servlet-2.2.2.jar
tiles-template-2.2.2.jar

commons-beanutils-1.8.0.jar
commons-digester-2.0.jar

Agora parou de dar erro e creio que esta iniciando legal, ainda não funcionando dando erro seguinte:

Attribute 'body' not found.

Mas já da pra desenrolar agora… vou continuar buscando, obrigado lucas mais uma vez dando a luz pra comunidade.

fidelis_felipe

segui o cookbook do tiles e funfou a questao do atributo, na verdade preciso agora me adequar as usabilidades do framework mas creio que para montagem de paginas ele me resolva bem…

mas não usei pathresolver, nem outra definição no web.xml além da org.apache.tiles.web.startup.TilesServlet.:wink:

agradeço muuuito se me indicassem um material rico de tiles sem muita complicação, preciso passar um projeto todo para essa view e vou precisar de todo material específico possivel…

vle

abcs…

fidelis_felipe

Só posso extender DefaultPathResolver uma unica vez ou ha um jeito correto de fazer isso?

Quero que tudo de que for chamado em /sistema/* vá para jsp/sistema

Tipo:

Funcao1Controller mandar para abrir seu conteudo de jsp/sistema/funcao1/minha.jsp

Para isso fiz:

@Component
public class Funcao1PathResolver  extends DefaultPathResolver{

	public Funcao1PathResolver(FormatResolver resolver) {
		super(resolver);
	}
	@Override
	protected String getPrefix() {
		return "/WEB-INF/jsp/sistema/";
	}
	@Override
	protected String getExtension() {
		return "jsp";
	}

}

Se eu precisar que tudo de ContatoController mandar para abrir seu conteudo de jsp/portal/contato/minha.jsp

e

Se eu precisar que tudo de PrincipalController mandar para abrir seu conteudo de jsp/portal/minha.jsp

Teria de criar varias ClassePathResolve extends DefaultPatResolver???

Fiz um teste criando duas( depois vi que ficaria muito inconveniente criar uma classe de pathresolver pra cada função), mas mesmo assim me retorna erro no console dizendo que não posso criar mais de um extends para DefaultPathResolver…

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'defaultLogicResult': Unsatisfied dependency expressed through constructor argument with index 5 of type [br.com.caelum.vraptor.view.PathResolver]: : No unique bean of type [br.com.caelum.vraptor.view.PathResolver] is defined: more than one 'primary' bean found among candidates: [defaultPathResolver, bannersPathResolver, portalPathResolver]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [br.com.caelum.vraptor.view.PathResolver] is defined: more than one 'primary' bean found among candidates: [defaultPathResolver, bannersPathResolver, portalPathResolver]
Lucas_Cavalcanti

só pode estender uma vez…

pq vc vai ter vários? como vc sabe qual deles usar? como vc está pensando em diferenciá-los?

fidelis_felipe

Quero separar minhas view por “funçao do sistema jsp/view/sistema” e “funcao do portal jsp/view/portal”.
Onde todo controle FuncaoController que tiver um path("/sistema/") abra sua jsp da pasta jsp/view/sistema/funcao.

Lucas_Cavalcanti

crie um path resolver só, receba o HttpServletRequest no construtor, e veja se o request.getRequestURI() contém o /sistema, e retorne o “/WEB-INF/jsp/sistema/” no método getPrefix(), e assim por diante…

que acha?

Lucas_Cavalcanti

crie um path resolver só, receba o HttpServletRequest no construtor, e veja se o request.getRequestURI() contém o /sistema, e retorne o “/WEB-INF/jsp/sistema/” no método getPrefix(), e assim por diante…

que acha?

fidelis_felipe

Deu certo… valeu!!!

Tava tendando fazer uma organização de template para meu sistema um para o portal e outro para o gerenciador.

Deu Certo… To fazendo o controle pelo meu CustomPathResolver.java e verificando pela requisição.
Ele manda pra dois diretórios, um jsp/sistema e outro jsp/portal

Fiz isso pq não gostava dos imports de jspf pra header e pra footer em cada pagina.
Usei o tiles em templates dentro de jsp/templates/template.jsp para padronizao.

Na verdade ele faz é montagem de paginas né?
Ha outra abordagem melhor para essa solução de template.
Achei que ficou bom, até mesmo se o sistema crescer, pode crescer bem independente de layout, podendo ter layouts de teste tbm.

renanpto

Lucas Cavalcanti:
só pode estender uma vez…

pq vc vai ter vários? como vc sabe qual deles usar? como vc está pensando em diferenciá-los?


Aproveitando o tópico, é possivel utilizar esse recurso com meus proprios componentes ?
Situacao onde preciso utilizar herança para sobreescrever um comportamento por exemplo.

Sei que o Spring lança excecao caso tenha mais de um componente com o mesmo nome, dai o que fazer ?
Existe algo no VRaptor que faça o papel do @Qualifier do Spring ?

Lucas_Cavalcanti

o VRaptor não tem qualifiers, mas vc pode usar o do Spring que vai funcionar, ou o @Named.

renanpto

Certo.

Mas há possibilidade de sobrescrever o comportamento dos componentes do VRaptor com o uso de herança, pode ser também oferecido para meus próprios componentes ?

Seria interessante e bem útil se possível.

G

Estamos desfocando o assunto do tópico, que é sobre tiles.

De qualquer forma, você vai ter um componente na tua aplicação, e logo depois vai sobrescrever. Mas porque você iria querer sobrescrever teu próprio componente? Se é para sobrescrever não faz sentido você ter o componente principal.

A única luz que vejo para isso é no caso dos plugins, porque realmente não faz o mínimo sentido sobrescrever seus próprios componentes.

renanpto

garcia-jj:
Estamos desfocando o assunto do tópico, que é sobre tiles.

De qualquer forma, você vai ter um componente na tua aplicação, e logo depois vai sobrescrever. Mas porque você iria querer sobrescrever teu próprio componente? Se é para sobrescrever não faz sentido você ter o componente principal.

A única luz que vejo para isso é no caso dos plugins, porque realmente não faz o mínimo sentido sobrescrever seus próprios componentes.


Desculpe, se o topico saiu um pouco do assunto. É que o autor teve problemas por existir mais de um componente com o mesmo nome e conseguiu resolver.

Lendo os posts, acabei ficando com a dúvida. Sendo que é um comportamento que pode acontecer, tanto que os componentes do VRaptor oferecem esse recurso.
Tem uma issue sobre https://github.com/caelum/vraptor/issues/193 .
Não fazendo o uso somente com herança, pode acontecer de ter diferentes implementações para uma determinada interface, como resolveria ? Teria que criar uma factory que conhece as implementações e que seria responsavel por retornar a implementação correta ?

Lucas_Cavalcanti

bom, hoje só usando uma factory, ou usando recursos do provider (@Named ou @Qualifier) mesmo

renanpto

Certo. Uma dica pra quem precise fazer o uso através de herança, será ter pacotes diferentes para o componente.
Por exemplo classes: ex.impl.ClassePai (possui todos metodos de negocio) ex.connect.ClassePaiConnect (classe que possui anotação @Component que herda da ClassePai) ex.impl.heranca.HerdaDeClassePai (possui anotação @Component, herda da ClassePai e sobreescreve metodos que precisar)
Para ter um unico componente conhecido pelo Spring, será a configuracao no web.xml que indica quais pacotes tem os componentes do vraptor.
Nesse exemplo ficando mapeado o pacote “ex.impl”, é uma alternativa =D.
Valeu

ThiagoInGuj

Lucas Cavalcanti:
pode continuar a busca sim, tem como usar =)

aqui:
http://vraptor.caelum.com.br/comunidade.jsp

e aqui: http://vraptor.caelum.com.br/cookbook

Só para informar:

Estava dando uma olhada na página http://vraptor.caelum.com.br/comunidade.jsp , e alguns links estão fora do ar.

Tipo esses: Manipulando Dados JSon Via Ajax Com VRaptor 3, Carregando combo de Estado e Municípios utilizando Ajax com jQuery, JSON e VRaptor 3.1.2

Pode ser que haja outros…

Abraço!

seufagner

Pessoal

Existe suporte do VRaptor 3.1 ao Tiles 2.2 ?

A forma como configura este mudou:

http://tiles.apache.org/framework/tutorial/configuration.html

Agora é feita através de um servlet ou listener, sem o ‘mapping’. O VRaptor suporta o mesmo através, justamente, de sua extensão (ex: .tiles) configurada no PathResolver.

Por enquanto estou utilizando a versão 2.1, que segue à moda antiga. E está me satisfazendo.

Fica a curiosidade

Valeu

seufagner

Lembrando que o VRaptor 3.1 pede para sobrescrever DefaultPathResolver, porem esta classe pede um construtor

public TilesPathResolver(HttpServletRequest request, AcceptHeaderToFormat acceptHeaderToFormat) {
..
}

No arquivo PDF de referência do VRaptor não cita este detalhe.

Ps. Já ia esquecendo: Implementando PathResolver ele também não intercepta a chamada.

@Component
public class TilesPathResolver implements PathResolver {

	private static final String VIEW_SUFIX = ".tiles";

	private static final String CLASS_SUFIX = "Controller";

	public String pathFor(ResourceMethod method) {

		final Class<?> clazz = method.getResource().getType();
		final StringBuilder s = new StringBuilder();
		s.append("/");

		// TODO quando o pacote for admin, implementar situacao, colocando um if aqui
		// s.append(StringUtils.substringAfterLast(clazz.getPackage().getName(), "."));
		// s.append(".");

		// remove o sufixo controller
		s.append(StringUtils.substringBefore(clazz.getSimpleName(), CLASS_SUFIX));
		s.append(".");
		s.append(method.getMethod().getName());
		s.append(VIEW_SUFIX);

		// vai procurar no tiles.xml pela definicao [controller.metodo], pois todos os controllers estao no mesmo
		// pacote

		return s.toString().toLowerCase();
	}
}
seufagner

Lucas Cavalcanti:
eu não sei como o tiles 2.2 funciona, mas tudo o que vc tem que fazer é redirecionar para uma url que faça com que o tiles rode… tome cuidado que se os arquivos estiverem dentro do WEB-INF, vc provavelmente tem que começar seu path com /WEB-INF

quanto ao construtor do DefaultPathResolver, é só criar um delegate constructor, não tem mto mistério. Se vc usa Eclipse, o próprio Ctrl+1 no erro cria esse construtor

É, eu percebi. Minha dúvida no construtor era de onde viriam os parâmetros. Porém, ainda não funcionou. Simplesmente não detecta o PathResolver ou DefaultPathResolver, ou seja, o engine do Tiles, não sei por que, não é acionado.

seufagner

Eu tinha lido ja. Aquela forma de configurar o Tiles foi deprecated.

seufagner

Spring não suporta Tiles 2.2

http://jira.springframework.org/browse/SPR-5609

Criado 28 de janeiro de 2010
Ultima resposta 29 de jan. de 2010
Respostas 30
Participantes 6