2011-09-11 10 views
5

W mojej aplikacji JSF 2.0 Facelets mam jeden wspaniały szablon, który chcę używać wszystkich stron. Znajduje się on w katalogu głównym aplikacji internetowej ukrytej pod nazwą template.xhtml. Tak więc jest to odniesienie, jakiego można się spodziewać:Bezwzględna nazwa ścieżki w moim szablonie, aby uzyskać zasoby

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

Jednak nawiguję teraz, a następnie do plików klienta w podkatalogach. Warto je organizować w ten sposób z powodu różnych poziomów uprawnień. Elementy w tych podkatalogach będą miały odniesienie do tego samego szablonu:

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

Jak dotąd tak dobrze. Jednak w nagłówku szablonu I ciągnąć w css tak:

<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" /> 

Powodem zwolnionych odniesienia jest to, że nie znalazłem żadnego innego sposobu na zdobycie szablon do pracy z kontekstu korzenia katalog lub podkatalog. Ścieżka, która rozpoczyna się od/nie działa, chyba że można umieścić nazwę aplikacji w tym tak

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

Problem z tym jest to, że bezwzględna ścieżka zaczyna się od zmiennej, a nie stały. Zmienna zależy od sposobu wdrożenia aplikacji w kontenerze. Czy istnieje jakiś czysty sposób rozwiązania tego problemu?

Zrobiłem kilka wyszukiwania, aby znaleźć to pytanie. Szczery. Podejrzewam jednak, że jest to jedna z tych, w których BalusC rzuca się w link zapewniający oślepiająco oczywiste rozwiązanie, szeroko dyskutowane gdzieś, gdzie nie trafiłem.

Odpowiedz

14

Ścieżka template w <ui:composition> odnosi się do struktury folderów własnych aplikacji, a nie do katalogu głównego domeny (ponieważ nie reprezentuje adresu URL!). Więc jeśli uruchomisz go z /, to jest po prostu rozwiązany względem kontekstowego katalogu głównego.

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

(wprowadzenie /WEB-INF ma tę zaletę, że Użytkownik końcowy nie może otworzyć go bezpośrednio zgadywania URL)

Ścieżka <h:outputStylesheet>, <h:outputScript> i <h:graphicImage>name jest zawsze w stosunku do /resources folderu głównego, niezależnie jeśli uruchomisz go z / lub nie.

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

Jeśli chcesz używać zwykłego HTML zamiast komponentów JSF zawierać CSS/JS/obrazy z jakiegoś powodu, wtedy najlepiej jest dołączana ścieżkę z #{request.contextPath} siebie, tak, że można zrobić to domena względne URL, dzięki czemu nie trzeba ćwiczyć z adresowymi adresami URL. Zobacz także: How get the base URL?

+0

Zrobiłeś to ponownie. Zauważam, że te znaczniki nie zostały jeszcze uwzględnione w niektórych wymienionych tutaj referencjach online: http://stackoverflow.com/questions/539041/whats-the-best-online-reference-for-jsf-tags – AlanObject

+1

Wiele ma zmieniono w JSF 2.x (wprowadzono w drugiej połowie 2009 r.). Wspomniany link pochodzi z lutego 2009 r. I dotyczy wyłącznie dokumentacji JSF 1.x. Dla wszystkich tagów JSF 2.x sprawdź dokumentację JSF 2.x: http://download.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/ Gdy używasz JSF 2.x, upewnij się, że czytasz samouczki ukierunkowane na JSF 2.x/książki/dokumentację/odpowiedzi. – BalusC

+0

Więc nie ma żadnej szansy na odniesienie się do pliku css lub js, który nie znajduje się w folderze zasobów?Nie można uzyskać dostępu do zasobu js/css z przeglądarki takiej jak ta myhost/resources/partials/my.css? – ses

Powiązane problemy