2011-09-11 9 views
5

En mi aplicación JSF 2.0 Facelets tengo una plantilla gloriosa que quiero que utilicen todas las páginas. Está en el directorio raíz de la aplicación web disfrazada con el nombre template.xhtml. Por lo tanto, se hace referencia a lo que cabría esperar:Nombre de ruta absoluta en mi plantilla para obtener recursos

<ui:composition template="./template.xhtml"> 

Sin embargo, navego de vez en cuando a los archivos del cliente en los subdirectorios. Es útil organizarlos de esta manera debido a los diferentes niveles de privilegios. Los facelets de esos directorios tendrían una referencia a la misma plantilla de la siguiente manera:

<ui:composition template="../template.xhtml"> 

Hasta aquí todo bien. Sin embargo, en la cabecera de la plantilla me tire en el css de esta manera:

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

La razón de las referencias redundantes es que no he encontrado ninguna otra manera de conseguir la plantilla para trabajar desde el contexto de la raíz directorio o el subdirectorio. Un nombre de ruta que comienza con un/no funciona a menos que poner el nombre de la aplicación en ella como esta

/TheApp-Ver1_0/resources/css/default.css 

El problema con esto es que el nombre de ruta absoluta comienza con una variable, no una constante. La variable depende de cómo se implementa la aplicación en el contenedor. ¿Hay alguna manera limpia de resolver esto?

Hice algunas búsquedas para encontrar esta pregunta. Honesto. Sin embargo, sospecho que esto es otro uno de esos en los que BalusC presenta un enlace a la solución obvia y obvia ampliamente discutida en algún lugar que eché de menos.

Respuesta

14

La ruta template en <ui:composition> es relativa a la propia estructura de carpetas de la aplicación web, no a la raíz del dominio (¡porque no representa una URL!). Por lo tanto, si lo inicia con /, solo se resuelve en relación con la raíz de contexto.

<ui:composition template="/WEB-INF/inc/template.xhtml"> 

(poniendo en /WEB-INF tiene la ventaja de que el usuario final no puede abrirlo directamente adivinando la URL)

El camino name de <h:outputStylesheet>, <h:outputScript> y <h:graphicImage> es siempre relativa a /resources carpeta raíz, sin tener en cuenta de si lo comienzas con / o no.

<h:outputStylesheet name="css/default.css" /> 
<h:outputScript name="js/default.js" /> 
<h:graphicImage name="img/logo.png" /> 

Si desea utilizar HTML plano en lugar de componentes JSF para incluir CSS/JS/imágenes por alguna razón, entonces lo mejor es anteponer la ruta con #{request.contextPath} a sí mismo, por lo que puede que sea un dominio relativo URL, para que no tenga que jugar con las URL relativas al contexto. Vea también: How get the base URL?

+0

Lo hizo de nuevo. Observé que estas etiquetas aún no se han incluido en algunas de las referencias en línea mencionadas aquí: http://stackoverflow.com/questions/539041/whats-the-best-online-reference-for-jsf-tags – AlanObject

+1

Mucho cambiado en JSF 2.x (introducido en el segundo semestre de 2009). El enlace que mencionó es de febrero de 2009 y solo se refiere a la documentación de JSF 1.x. Para todas las etiquetas JSF 2.x, consulte la documentación de JSF 2.x: http://download.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/ Cuando utiliza JSF 2.x, asegúrese de que estás leyendo tutoriales/libros/documentación/respuestas específicos de JSF 2.x. – BalusC

+0

¿Entonces no hay ninguna posibilidad de consultar el archivo css o js que no está en la carpeta de recursos?¿No es posible acceder al recurso js/css desde un navegador como este myhost/resources/partials/my.css? – ses

Cuestiones relacionadas