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 @ResourceDependency
veya 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.css
Kendi 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 ResourceHandler
bir library
yö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, ResourceHandler
belirli bir bileşen kitaplığından gelip gelmediğini nasıl fark ederdiniz ? Örnekler OmniFaces CombinedResourceHandler
ve 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ı CombinedResource
ya GraphicResource
da amaçlarını bilirler .
RichFaces yanlış yaptığını kaydetti. Hiç kullanmadı library
ve ü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, v
parametre 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&v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&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&v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&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: