Problema com arquivos statics usando spring e tiles

8 respostas
F

Oi !

Estou com um problema usando o tiles 2.2.2 e spring 3.
Minhas jsp´s ficam apartir do diretorio jsp.

JSP > home.jsp
JSP > cliente > list.jsp

No header do meu layout eu coloquei:

Dessa forma o layout só é aplicado para o home.jsp, e pro cliente.jsp não pega.
Como posso fazer pra que o css pegue pra qqr jsp independente de diretorio ?

Tiles:

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
		<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
	</bean> 

	<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
		<property name="definitions"> 
			<list> 
				<value>/WEB-INF/layouts/layouts.xml</value> 
			</list> 
		</property> 
	</bean>

Layout.xml

<definition name="login" extends="baseLayout">
        <put-attribute name="body" value="/WEB-INF/jsp/login.jsp" />
    </definition>
    
    <definition name="cliente/show" extends="baseLayout">
        <put-attribute name="body" value="/WEB-INF/jsp/cliente/list.jsp" />
    </definition>

8 Respostas

F

Ninguem sabe me ajudar nessa ?
:cry:

drsmachado

Se está com pressa, pague pela consultoria. Lembre-se o GUJ é gratuito e ninguém tem qualquer obrigação com a tua urgência.
Sempre trabalhei com tiles usando Struts e, sempre defini o estilo no layout que o tiles pré define e nunca tive problemas.
Será que você não está fazendo algo errado aí não?

jaboot

fdiaz,

Bom, posso te ajudar dizendo como está no meu projeto. No spring-servlet.xml (/src/main/webapp/WEB-INF):

<!--Tiles 2 -->
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
	<property name="definitions">
		<!-- Qualquer tiles.xml (multiple) -->
		<list>
			<value>/WEB-INF/**/tiles.xml</value>
		</list>
	</property>
</bean>
O meu tiles.xml (o principal, tenho um principal e vários outros por assunto) - /src/main/webapp/WEB-INF/views :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>

	<definition name="base.definition" template="/WEB-INF/views/template/layout.jsp">
		<put-attribute name="title" value="" />
		<put-attribute name="header" value="/WEB-INF/views/template/header.jsp" />
		<put-attribute name="body" value="" />
		<put-attribute name="topBar" value="" />
		<put-attribute name="footer" value="/WEB-INF/views/template/footer.jsp" />
	</definition>

</tiles-definitions>
O meu layout.jsp (/src/main/webapp/WEB-INF/views/template)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>

<spring:url var="urlImagens" value="/resources/images" />
<spring:url var="urlJavascript" value="/resources/javascript" />
<spring:url var="urlCss" value="/resources/css" />

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title><tiles:insertAttribute name="title" ignore="true" /></title>

<!-- Le Style -->
<link href="${urlCss}/Estrutura.css" rel="stylesheet" type="text/css" />
// (...)

<!-- Le Javascript -->
<script language="javascript" type="text/javascript" src="${urlJavascript}/jquery-1.7.2.js"></script>
// (...)

</head>

<body>
	<div id="divEstruturaPrincipal">
		<tiles:insertAttribute name="header" />
		<tiles:insertAttribute name="body" />
		<tiles:insertAttribute name="footer" />
	</div>
</body>
</html>
E finalmente, eu deixo um tiles.xml por assunto, por exemplo, usuários (/src/main/webapp/WEB-INF/views/user/tiles.xml):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>

	<definition name="user/list" extends="base.definition">
		<put-attribute name="title" value="Title User List" />
		<put-attribute name="body" value="/WEB-INF/views/user/list.jsp" />
	</definition>
		
	<definition name="user/form" extends="base.definition">
		<put-attribute name="title" value="Title User Form" />
		<put-attribute name="body" value="/WEB-INF/views/user/form.jsp" />
	</definition>
	
	<definition name="user/details" extends="base.definition">
		<put-attribute name="title" value="Title User Form" />
		<put-attribute name="body" value="/WEB-INF/views/user/details.jsp" />
	</definition>
	
</tiles-definitions>
Entendeu? Se me lembro bem, peguei da página do krams, qualquer coisa dá uma olhada lá que tem exemplos.
jaboot

Ah, outra coisa que só lembrei agora… tem essa tag no meu applicationContext.xml:

<!-- Handles GET requests for /resources/** by efficiently serving static content in the ${webappRoot}/resources dir --> <mvc:resources mapping="/resources/**" location="/resources/" cache-period="31556926" />
Ou seja, tudo o que estiver dentro do meu resources* ele entende como conteúdo estático (css, javascript e afins)

  • /src/main/webapp/resources
F

@jaboot

Muito obrigado pela resposta.
O meu está da forma que vc disse.
Ainda não consegui achar o erro.

Eu tenho:

static
     - css
     - images
     - js

WEB-INF
     - views
          - layouts
               [b]- layouts.xml[/b]
               - default
                    - default.jsp (é o que agrega os outros jsp pra formar o layout. dentro dele tem as definições do css: [b]static/css/style.css[/b])
                    - header.jsp
                    - footer.jsp
          - cliente
               - list.jsp [b](NÃO pega o css)[/b]
               - show.jsp [b](NÃO pega o css)[/b]
          - home.jsp [b](pega o css)[/b]
          - login.jsp [b](pega o css)[/b]

layouts.xml

<tiles-definitions> 

	<definition name="baseLayout" template="/WEB-INF/views/layouts/default/default.jsp"> 
		<put-attribute name="header" value="/WEB-INF/views/layouts/default/header.jsp" /> 
		<put-attribute name="footer" value="/WEB-INF/views/layouts/default/footer.jsp" /> 
	</definition>
	
    <definition name="home" extends="baseLayout">
        <put-attribute name="body" value="/WEB-INF/views/home.jsp" />
    </definition>
    
    <definition name="login" extends="baseLayout">
        <put-attribute name="body" value="/WEB-INF/views/login.jsp" />
    </definition>
    
    <definition name="cliente/show" extends="baseLayout">
        <put-attribute name="body" value="/WEB-INF/views/cliente/show.jsp" />
    </definition>
    
</tiles-definitions>

application-context.xml

<mvc:resources mapping="/static/**" location="/static/" />

application-servlet.xml

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
		<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
	</bean> 

	<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
		<property name="definitions"> 
			<list> 
				<value>/WEB-INF/views/layouts/layouts.xml</value> 
			</list> 
		</property> 
	</bean>

Será q alguem consegue ver o erro ?
Normalmente qm está de fora ve melhor.

Obrigado !

T

Olá, estou com mesmo problema que nosso companheiro do tópico, porém o problema só surge quando entro em uma url dinâmica @RequestMapping("/respawn/{path}")

O problema é que meus arquivos estáticos não reconhecem o caminho quando faço dessa forma.

Estou usando a pasta resources para armazenar esse tipo de arquivo. Se alguém puder ajudar com os problemas contidos nesse tópico provavelmente estarão me ajudando também,

abraços.

edit: um detalhe importante.
para solucionar o problema, estou tentando colocar jstl com a url na frente dos meus links

porém sempre que eu acesso a página pela primeira vez, ela não consegue interpretar o caminho e fica dessa forma

&lt;link rel="stylesheet" type="text/css" href="/RespawnTimer/;jsessionid=03F562A8924C61527C0F46E6324A0056resources/css/style.css" /&gt;

quando dou um reflesh o link volta ao normal

&lt;link rel="stylesheet" type="text/css" href="&lt;c:url value="/resources/"/&gt;css/style.css" /&gt;

alguém saberia como resolver isso?
pode ser uma alternativa.

jaboot

Isso é coisa do Spring… principalmente quando você acessa a aplicação pela primeira vez.

Depois que você dá um refresh na página, tudo volta ao normal, não?

T

Sim, pelo que parece esse é um problema de filtro.

Resolvi o problema usando puro jstl na url, ficou assim:

&lt;link rel="stylesheet" type="text/css" href="&lt;c:url value="/resources/css/style.css"/&gt;" /&gt;

Agora eu posso limpar o cache do meu navegador e acessar a pagina pela primeira vez que ele não falha na leitura do link.

Essa foi uma alternativa não muito elegante, já que esta configurado a pasta de arquivos estativos no spring-context.xml

&lt;mvc:resources mapping="/resources/**" location="/resources/" /&gt;

Sou novo como javeiro, então essa é mais uma das coisas que eu gostaria de entender, pq mesmo configurado no spring-context.xml ele insiste em quebrar os links no jsp.

Criado 17 de setembro de 2012
Ultima resposta 11 de dez. de 2012
Respostas 8
Participantes 4