JSF kaynak kütüphanesi nedir ve nasıl kullanılmalıdır?


228

JSF <h:outputStylesheet>, <h:outputScript>ve <h:graphicImage>bileşenler var libraryniteliği. Bu nedir ve bu nasıl kullanılmalıdır? Ortak içerik / dosya türü ile aşağıdaki gibi kullanmak web üzerinde bir çok örnek vardır css, jsve img(veya imagekullanılan etiketi bağlı kitaplık adı gibi):

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

Nasıl faydalı? Bu libraryörneklerdeki değer, etiket adıyla temsil edilen her şeyi tekrarlıyor gibi görünüyor. Bunun için <h:outputStylesheet>zaten bir "CSS kütüphanesini" temsil ettiği açıkça görünen etiket adına dayanmaktadır. Aynı şekilde çalışan aşağıdakiler arasındaki fark nedir?

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

Ayrıca, oluşturulan HTML çıktısı biraz farklıdır. URL modeli için bağlam yolu /contextnameve FacesServleteşleme verildiğinde *.xhtml, birincisi istek parametresi olarak kütüphane adıyla şu HTML'yi oluşturur:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/style.css.xhtml?ln=css" />
<script type="text/javascript" src="/contextname/javax.faces.resource/script.js.xhtml?ln=js"></script>
<img src="/contextname/javax.faces.resource/logo.png.xhtml?ln=img" alt="" />

İkincisi, sadece URI yolunda kütüphane adıyla aşağıdaki HTML'yi oluştururken:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml" alt="" />

İkinci yaklaşım, görünse de eski yaklaşımdan daha mantıklıdır. Bu durumda libraryözellik tam olarak ne kadar yararlıdır?

Yanıtlar:


256

Aslında, "js", "css", "img" gibi ortak içerik / dosya türlerinin kütüphane adı olarak kullanıldığı web üzerindeki tüm örnekler yanıltıcıdır .

Gerçek dünya örnekleri

Başlangıç olarak, böyle nasıl mevcut JSF uygulamaları en edelim bakmak Mojarra ve MyFaces ve benzeri JSF bileşen kütüphaneleri PrimeFaces ve OmniFaces kullanırlar. Hiç kimse bu şekilde kaynak kütüphanesi kullanmıyor. Bunu (kapakların altında @ResourceDependencyveya yoluyla UIViewRoot#addComponentResource()) aşağıdaki şekilde kullanırlar:

<h:outputScript library="javax.faces" name="jsf.js" />
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<h:outputScript library="omnifaces" name="omnifaces.js" />
<h:outputScript library="omnifaces" name="fixviewstate.js" />
<h:outputScript library="omnifaces.combined" name="[dynamicname].js" />
<h:outputStylesheet library="primefaces" name="primefaces.css" />
<h:outputStylesheet library="primefaces-aristo" name="theme.css" />
<h:outputStylesheet library="primefaces-vader" name="theme.css" />

Temel olarak, tüm bu kaynakların yaygın olarak ait olduğu ortak kütüphane / modül / tema adını temsil ettiği açıkça anlaşılmalıdır .

Daha kolay tanımlama

Bu şekilde, bu kaynakların nereden geldiğini ve / veya nereden geldiğini belirlemek ve ayırt etmek çok daha kolaydır. primefaces.cssKendi web uygulamanızda, PrimeFaces'in bazı varsayılan CSS'lerini geçersiz kıldığınız / sonlandırdığınız bir kaynağa sahip olduğunuzu düşünün ; PrimeFaces kendi için bir kütüphane adı kullanmadıysa primefaces.css, PrimeFaces kendi olanı yüklenmeyecek, bunun yerine webapp tarafından sağlanan ad, görünümünün bozulmasına neden olacaktır.

Ayrıca, özel ResourceHandlerbir libraryyöntem kullanırken, doğru şekilde kullanıldığında belirli bir kitaplıktan gelen kaynaklar üzerinde daha hassas taneli denetim uygulayabilirsiniz . Tüm bileşen kitaplıkları tüm JS dosyaları için "js" kullanırsa, ResourceHandlerbelirli bir bileşen kitaplığından gelip gelmediğini nasıl fark ederdiniz ? Örnekler OmniFaces CombinedResourceHandlerve GraphicResourceHandler; createResource()zincirdeki bir sonraki kaynak işleyicisine devretmeden önce kütüphanenin kontrol edildiği yöntemi kontrol edin . Bu şekilde ne zaman yaratılacaklarını CombinedResourceya GraphicResourceda amaçlarını bilirler .

RichFaces yanlış yaptığını kaydetti. Hiç kullanmadı libraryve üzerinde başka bir kaynak işleme katmanı oluşturdu ve bu nedenle RichFaces kaynaklarını programlı olarak tanımlamak imkansız. İşte bu yüzden OmniFaces , RichFaces kaynakları ile çalışmasını sağlamak için yansıma tabanlı bir saldırı yapmakCombinedResourceHander zorundaydı .

Kendi web uygulamanız

Kendi web uygulamanızın mutlaka bir kaynak kütüphanesine ihtiyacı yoktur. En iyisi onu atlasan iyi olur.

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

Ya da gerçekten bir tanesine ihtiyacınız varsa, ona "varsayılan" veya bazı şirket adı gibi daha mantıklı bir ortak ad verebilirsiniz.

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

Veya, kaynaklar bazı ana Facelets şablonuna özel olduğunda, şablonun adını da verebilir, böylece birbiriyle daha kolay ilişki kurabilirsiniz. Başka bir deyişle, daha çok kişisel belgesel amaçlıdır. Örneğin bir /WEB-INF/templates/layout.xhtmlşablon dosyasında:

<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />

Ve bir /WEB-INF/templates/admin.xhtmlşablon dosyası:

<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />

Gerçek dünya örneği için OmniFaces vitrin kaynak kodunu kontrol edin .

Ya da, aynı kaynakları birden çok webapp üzerinde paylaşmak istediğinizde ve bunun için webapp'larda JAR olarak gömülü olan bu cevaptaki örneğe dayalı olarak "ortak" bir proje oluşturduğunuzda /WEB-INF/lib, bunu kitaplık olarak da belirtin (ad seçtiğiniz için ücretsizdir; OmniFaces ve PrimeFaces gibi bileşen kitaplıkları da bu şekilde çalışır):

<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />

Kütüphane sürümlendirme

Bir başka temel avantaj, kendi web uygulamanız tarafından sağlanan kaynaklara kaynak kitaplığı sürümünü doğru şekilde uygulayabilmenizdir (bu, bir JAR'a gömülmüş kaynaklar için çalışmaz). \d+(_\d+)*Kaynak kitaplığı sürümünü belirtmek için desende bir adla kütüphane klasöründe doğrudan alt alt klasör oluşturabilirsiniz .

WebContent
 |-- resources
 |    `-- default
 |         `-- 1_0
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :

Bu işaretlemeyi kullanırken:

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

Bu, vparametre olarak kütüphane sürümü ile aşağıdaki HTML'yi oluşturur :

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_0" alt="" />

Bu nedenle, bir kaynağı düzenlediyseniz / güncellediyseniz, yapmanız gereken tek şey sürüm klasörünü kopyalamak veya yeni bir değere yeniden adlandırmaktır. Birden çok sürüm klasörünüz varsa, JSF ResourceHandler, sayısal sıralama kurallarına göre kaynağı otomatik olarak en yüksek sürüm numarasından sunar.

Bu nedenle, resources/default/1_0/*klasörü kopyalarken / yeniden adlandırırken resources/default/1_1/*aşağıdaki gibi:

WebContent
 |-- resources
 |    `-- default
 |         |-- 1_0
 |         |    :
 |         |
 |         `-- 1_1
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :

Sonra son biçimlendirme örneği aşağıdaki HTML'yi oluşturur:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_1" alt="" />

Bu, değiştirilen parametreye sahip URL ilk kez istendiğinde, web tarayıcısını kaynağı önbellekten aynı ada sahip olanı göstermek yerine doğrudan sunucudan istemeye zorlar. Bu şekilde, son kullanıcıların güncellenmiş CSS / JS kaynağını almaları gerektiğinde sert bir yenileme (Ctrl + F5 vb.) Yapması gerekmez.

Bir JAR dosyasındaki kaynaklar için kütüphane sürümlendirmesinin mümkün olmadığını lütfen unutmayın. Bir geleneğe ihtiyacın var ResourceHandler. Ayrıca bkz . Jar içindeki kaynaklar için JSF sürümlerini kullanma .

Ayrıca bakınız:


2
Kütüphane için EL kullanmak mümkün müdür? Eğer bir kaynak / varsayılan ve bir kaynak / feelingFroggyToday olmasını istersem kütüphane = "# {someLibraryHere}" map someLibraryHere 'ı seçtiğim kütüphaneme kopyalayabilirim ve her zaman kaynaklar dizinini daha yüksek bir sürüme yeniden adlandırmaya güvenmek zorunda kalmam Onları değiştirmek istedim.
gebuh

Library = admin veya libray = layout dediğinizde, bu (admin ve layout) klasörler kaynaklar klasöründe mi?
Koray Tugay

Umm. Çok ilginç Balus. Yüklerken theme.css dosyasının boş göründüğü bir web uygulamasında bir sorunla karşılaşıyorum. Bu yalnızca çeşitli yeniden alaşımlardan sonra (JBOSS EAP'de) olur. Css url'si şöyledir: /javax.faces.resource/css/theme.css.xhtml?ln=default&v=3_3_0_130416 ve şu şekilde bildirilir: <h: outputStylesheet library = "default" name = "css / theme. css "target =" head "/>. Belki bu sorun sürüm oluşturma sorunlarıyla ilgilidir?
Ricardo Vila

2
Değeri libraryveya bununla ilgili bir şey için izin verilen karakterler mojarra 2.2.5 (2.2.5-jbossorg-3, wildfly 8.0) ve 2.2.11 (2.2.11-jbossorg-1) arasında değişti mi? Releasenotlarda hiçbir şey bulamıyorum. Bkz. Stackoverflow.com/questions/35719808/…
Kukeltje

3
Teşekkürler @ BalusC. Ne yazık ki Oracle'ın kendi Java EE 7 Eğitimi bile css, 8.6 Web Kaynakları bölümünde bir kütüphane adı kullanarak ve guessnumber-jsf örnek uygulamasındaki css ve resimlerle yanlış yaparak yanlış örnek veriyor .
Jesper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.