2011-09-11 1 views
5

Nella mia applicazione Facelets JSF 2.0 ho un modello glorioso che desidero utilizzare tutte le pagine. Si trova nella directory radice dell'app Web mascherata con il nome template.xhtml. Quindi si fa riferimento come ci si aspetterebbe:Nome percorso assoluto nel mio modello per ottenere risorse

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

Tuttavia, navigo ora e poi nei file client nelle sottodirectory. È utile organizzarli in questo modo a causa dei diversi livelli di privilegio. I facelets a quelle che si trovano avrebbero un riferimento allo stesso modello come questo:

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

Fin qui tutto bene. Tuttavia nell'intestazione del modello tiro nel css come questo:

<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 ragione per i riferimenti ridondanti è che non ho trovato nessun altro modo per ottenere il modello di lavorare dal contesto della radice directory o sottodirectory. Un percorso che inizia con un/non funziona a meno che non si mette il nome dell'applicazione in esso come questo

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

Il problema di questo è che il percorso assoluto inizia con una variabile, non è una costante. La variabile dipende da come viene distribuita l'app nel contenitore. C'è un modo pulito per risolvere questo?

Ho effettuato alcune ricerche per trovare questa domanda. Onesto. Tuttavia, sospetto che questo sia un altro uno di quelli in cui BalusC piomba in un punto fornisce un collegamento alla soluzione apparentemente ovvia ampiamente discussa da qualche parte mi mancava.

risposta

14

Il percorso template in <ui:composition> è relativo alla struttura della cartella Webapp e non alla radice del dominio (perché non rappresenta un URL!). Quindi, se lo avvii con /, è solo risolto relativamente alla root di contesto.

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

(mettendo in /WEB-INF ha il vantaggio che l'utente finale non può aprire direttamente indovinando l'URL)

La name percorso di <h:outputStylesheet>, <h:outputScript> e <h:graphicImage> è sempre relativa alla cartella principale /resources, indipendentemente di se lo si avvia con / oppure no.

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

Se si desidera utilizzare il codice HTML semplice invece di componenti JSF per includere CSS/JS/immagini per qualche ragione, quindi migliore è quella di anteporre il percorso con #{request.contextPath} te stesso, in modo che si può rendere un dominio relativo URL, in modo che non sia necessario trafficare con URL relativi al contesto. Vedi anche: How get the base URL?

+0

L'hai fatto di nuovo. Ho notato che questi tag non sono ancora stati inclusi in alcuni dei riferimenti online menzionati qui: http://stackoverflow.com/questions/539041/whats-the-best-online-reference-for-jsf-tags – AlanObject

+1

Un sacco ha stato modificato in JSF 2.x (introdotto nella seconda metà del 2009). Il link che hai menzionato è di febbraio 2009 e fa riferimento solo alla documentazione JSF 1.x. Per tutti i tag JSF 2.x, controllare la documentazione di JSF 2.x: http://download.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/ Quando si utilizza JSF 2.x, assicurarsi che stai leggendo tutorial mirati su JSF 2.x/libri/documentazione/risposte. – BalusC

+0

Quindi non c'è alcuna possibilità di fare riferimento al file css o js che non si trova nella cartella delle risorse?Né è possibile raggiungere la risorsa js/css dal browser come questo myhost/resources/partials/my.css? – ses