Problema de navegabilidade JSF (IDE Studio Creator)

Temos uma aplicação com a seguinte estrutura:

  • Intranet (aplicação)
    |
  • resources (pasta)
    |__ stylesheet.css (arquivo de estilo dentro de resources)
    |__ image1.gif (imagem dentro de resources)
    |
    |index.jsp (jsp na raiz)
    |changepasswd.jsp (jsp na raiz)
    |error.jsp (jsp na raiz)
    |
  • baan (pasta)
    |___ os.jsp (jsp dentro de baan)

Todas as imagens e arquivos de estilo estão na pasta “resources”.
A error.jsp é a nossa página de erro padrão, e nela utilizamos alguns itens da pasta resources, como as figuras.
Estes itens são carregados utilizando-se do caminho lógico da aplicação, por exemplo: para as páginas da raíz usamos “resorces/image1.gif”, e para as páginas que estão fora da raiz usamos “…/resources/image1.gif”.
Quando um erro ocorre, todas as demais páginas jsp requisitam a error.jsp.
Toda esta navegabilidade está definida no arquivo de navegação.

O problema é o seguinte:

Quando ocorre um erro em uma página que não está na mesma pasta da error.jsp, a imagem e o arquivo de estilo não são encontrados e o browser não monta a página corretamente.

Isto só ocorre quando a página error.jsp é requisitada através de um erro gerado por uma página que não está no mesmo diretório dela.

Por exemplo, se um erro é gerado pela changepasswd.jsp, a página error.jsp é carregada corretamente.

O que percebemos é o seguinte:

Utilizando nossa estrutura como exemplo, se no processamento da página os.jsp, que está na pasta Baan, um erro é gerado, o sistema redireciona para a página error.jsp, que está na raiz.
No entanto, ao montar a página error.jsp, os objetos que estão na pasta resources estão sendo procurados na pasta baan e não na raiz como deveria acontecer, aí a página é carregada sem esses objetos.

O JSF não está controlando a saída de um diretório quando navega-se entre páginas de diretórios diferentes.

Por acaso alguém já sofreu esse problema??
Como podemos resolvê-lo??

Obrigado

Nem sempre o caminho reconhecido no ambiente JSP é igual ao caminho físico. Umas das alternativas é vc usar: ${pageContext.request.realPath}/error.jsp

Acho que vc. não conseguiu entender meu problema…

A aplicação chega até a página error.jsp, mas a página é mostrada com erros. Os objetos como: figuras e folha de estilos não são carregados.

O conteúdo textual da página está correto, mas sem a formatação desejada…

O código da error.jsp é assim:

<?xml version="1.0" encoding="UTF-8"?>
<jsp:root version="1.2" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:jsp="http://java.sun.com/JSP/Page">
    <jsp:directive.page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"/>
    <f:view>
        <html lang="pt-BR" xml:lang="pt-BR">
            <head>
                <meta content="no-cache" http-equiv="Cache-Control"/>
                <meta content="no-cache" http-equiv="Pragma"/>
                <title>Intranet - Cestari Industrial e Comercia S/A.</title>
                <link href="resources/stylesheet.css" rel="stylesheet" type="text/css"/>
                <f:loadBundle basename="intranet.messages" var="msg"/>
            </head>
            <body alink="#000000" link="#000000" style="-rave-layout: grid" vlink="#000000">
                <hr style="color: darkblue; position: absolute; height: 1px; top: 10px; left: 10px;"/>
                <hr style="color: darkblue; position: absolute; height: 2px; top: 60px; left: 10px;"/>
                <h:form binding="#{Mensageiro.form1}" id="form1">
                    <h:outputText binding="#{Mensageiro.outputText1}" id="outputText1"
                        style="height: 19px; left: 20px; top: 24px; position: absolute; width: 436px" styleClass="labelCabecalhoPaginas" value="#{msg.cabecalho_mensageiro}"/>
                    <h:outputText binding="#{Mensageiro.outputText2}" id="outputText2"
                        style="height: 19px; left: 120px; top: 96px; position: absolute; width: 504px" styleClass="labelMensageiro" value="#{SessionBean.msgsucesso}"/>
                    <h:outputLink binding="#{Mensageiro.hyperlink1}" id="hyperlink1" style="left: 20px; top: 100px; position: absolute; width: 50px"
                        styleClass="label8bi" value="#{SessionBean.urlretorno}">
                        <h:outputText binding="#{Mensageiro.hyperlink1Text}" id="hyperlink1Text" value="#{msg.label_voltar}"/>
                    </h:outputLink>
                </h:form>
            </body>
        </html>
    </f:view>
</jsp:root>

Meu problema está na linha:

<link href="resources/stylesheet.css" rel="stylesheet" type="text/css"/>

Quando a error.jsp é chamada por outro jsp que está no mesmo diretório tudo certo, funciona beleza…

Mas, quando a error.jsp é chamada por um jsp que está em outro diretório, a error.jsp é mostrada mas sem os objetos.
O que aparenta é que o sistema está tentando encontrar “resources/stylesheet.css” no diretório da página anterior e não da error.jsp.

Entendido??

Barrilari,
ao invés de &lt;link href="resources/stylesheet.css" rel="stylesheet" type="text/css"/&gt;
tenta usar &lt;link rel="stylesheet" type="text/css" href='&lt;%= request.getContextPath() + "/stylesheet.css" %&gt;'&gt;
e ver se funciona! na minha aplicação deu certo :slight_smile:

beijos

Lilita,

Você também está usando JSF??
Qual a IDE você usa??

Pois eu já tinha tentado fazer isso.
No meu caso tentei assim:

<link href='<%=request.getContextPath()%>+"/faces/resources/stylesheet.css"' rel="stylesheet" type="text/css"/>

Entretanto dá a seguinte exceção em tempo de execução:

Exception Handler 

Description: An unhandled exception occurred during the execution of the web application. Please review the following stack trace for more information regarding the error. 

Exception Details: org.apache.jasper.JasperException 
/Mensageiro.jsp(10,29) The value of attribute "href" must not contain the '<' character.

Possible Source of Error: 
Class Name: org.apache.jasper.compiler.DefaultErrorHandler 
File Name: DefaultErrorHandler.java 
Method Name: jspError 
Line Number: 43 

Source not available. Information regarding the location of the exception can be identified using the exception stack trace below.  	

Ele não está deixando eu utilizar a tag “<%” no JSF.

Ainda não consegui encontrar uma solução que não seja o caminho absoluto da aplicação, o que pra mim é inviável.

Obrigado,

OPA! Não sei se vc já conseguiu resolver esse problema mas vai aí uma dica.
Eu costumo usar o seguinte:

&lt;link href="&lt;jsp:getProperty name="req" property="contextPath"/&gt;/includes/page.css" rel="stylesheet" type="text/css">

Vê se isso ajuda… :idea:

Então migoux,

Tinha tentado fazer isso, mas a IDE que estou utilizando gera um erro…
(veja respostas anteriores).

Consegui resolver os problemas da seguinte maneira:

para as imagens basta colocar uma “/” antes da pasta:
por ex: “/resources/imagem.gif”, assim ele sempre vai procurar o resources dentro da raiz.

Isso não se aplica a folha de estilos. Não sei o porque.
Resolvi o problema da seguinte maneira:

Eliminei a linha:

E estou inserindo o arquivo da seguinte maneira:

Aí boa…

Obrigado

Barrilari

Pô cara, foda isso né… mas pelo menos vc conseguiu resolver.
Isso tem cara de bug…
Se tiver interesse, reporta isso lá na Sun.

Té++

Já reportei…