Jsf'de 'bağlama' özniteliği nasıl çalışır? Ne zaman ve nasıl kullanılmalıdır?

jsf'de value özniteliğini ve binding özniteliğini ayırt eden çok sayıda malzeme var.

her iki yaklaşımın birbirinden nasıl farklı olduğu ile ilgileniyorum. Verilen:

public class User {
    private String name;
    private UICommand link;

    // Getters and setters omitted.
}
<h:form>
    <h:commandLink binding="#{user.link}" value="#{user.name}" />
</h:form>

bir value özniteliği belirtildiğinde ne olur oldukça düz ileri. Getter User fasulye name özellik değerini döndürmek için çalışır. Değer HTML çıktısına yazdırılır.

ama binding nasıl çalıştığını anlayamadım. Oluşturulan HTML User fasulye link özelliği ile bir bağlama korumak nasıl?

aşağıda, manuel güzelleştirme ve yorum yaptıktan sonra oluşturulan çıktıyla ilgili bölümdür ( j_id_jsp_1847466274_1 kimliğinin otomatik olarak üretildiğini ve iki gizli giriş widget'ının bulunduğunu unutmayın). Sun's JSF RI, sürüm 1.2 kullanıyorum.

<form action="/TestJSF/main.jsf" enctype="application/x-www-form-urlencoded"
    id="j_id_jsp_1847466274_1" method="post"  name="j_id_jsp_1847466274_1">
    <input name="j_id_jsp_1847466274_1" type="hidden" value="j_id_jsp_1847466274_1">
    <a href="#" onclick="...">Name</a>
    <input autocomplete="off" id="javax.faces.ViewState" name="javax.faces.ViewState"
        type="hidden" value="-908991273579182886:-7278326187282654551">
</form>

nerede binding burada mı saklandı?

66
tarihinde sordu BalusC 2013-02-16 18:09:17
kaynak

2 ответов

nasıl çalışır?

bir JSF görünümü (Facelets/JSP dosyası) yerleşik/geri yüklendiğinde, bir JSF bileşen ağacı üretilecektir. O anda, görünüm yapı zamanı , tüm binding öznitelikleri değerlendirilir ( ile birlikte id attribtues ve taghandlers gibi jstl ). Bileşen ağacına eklenmeden önce JSF bileşeninin oluşturulması gerektiğinde, JSF binding özniteliğinin bir önceden muamele edilmiş bileşen (yani null değil) ve eğer öyleyse kullanın. Önceden muamele edilmezse, JSF bileşeni "her zamanki gibi" otomatik olarak oluşturur ve binding özniteliğinin arkasındaki ayarlayıcıyı bağımsız değişken olarak otomatik muamele edilmiş bileşen örneğiyle çağırır.

efektlerde, bileşen ağacındaki bileşen örneğinin bir referansını scoped değişkenine bağlar. Bu Bilgi, bileşenin kendisinin oluşturulan HTML gösteriminde hiçbir şekilde görünmez. Bunca bilgi, oluşturulan HTML çıktısıyla hiçbir şekilde alakalı değildir. Form gönderildiğinde ve görünüm geri yüklendiğinde, JSF bileşen ağacı sıfırdan yeniden oluşturulur ve tüm binding öznitelikleri yukarıdaki paragrafta açıklandığı gibi yeniden değerlendirilir. Bileşen ağacı yeniden oluşturulduktan sonra, JSF bileşen ağacına JSF görünüm durumunu geri yükler.

bileşen örnekleri istek scoped vardır!

önemli bilmek ve anlamak somut bileşen örnekleri etkin bir şekilde scoped talep olmasıdır. Her istek üzerine yeni oluşturuluyorlar ve özellikleri, geri yükleme görünümü aşamasında JSF görünüm durumundan değerlerle dolduruluyor. Bu nedenle, bileşeni bir destek fasulyesi özelliğine bağlarsanız, destek fasulyesi kesinlikle isteği kapsamından daha geniş bir kapsamda olmalıdır. Ayrıca bakınız JSF 2.0 specitication bölüm 3.1.5:

3.1.5 Bileşen Bağları

...

bileşen bağlamaları genellikle yönetilen aracılığıyla dinamik olarak örneklenen JavaBeans ile birlikte kullanılır Fasulye oluşturma tesisi (Bkz. Bölüm 5.8.1 "VariableResolver ve varsayılan VariableResolver"). güçlü uygulama geliştiricilerinin, bileşen bağlama ifadelerine göre işaret edilen yönetilen fasulye yerleştirmesini öneririz "istek" kapsamı. bunun nedeni, oturum veya uygulama alanına yerleştirilmesinin iş parçacığı güvenliği gerektirmesidir. UIComponent örnekleri tek bir iş parçacığı içinde çalışan bağlıdır. Üzerinde potansiyel olarak olumsuz etkiler de vardır "oturum" kapsamında bir bileşen bağlama yerleştirirken bellek yönetimi.

aksi takdirde, bileşen örnekleri birden çok istek arasında paylaşılır, muhtemelen " yinelenen bileşen kimliği " hataları ve görünümde bildirilen doğrulayıcılar, dönüştürücüler ve dinleyiciler önceki istek(ler) den varolan bileşen örneğine yeniden bağlandığından "garip" davranışlar. Belirtiler açıktır: birden çok kez yürütülür, bileşen ile aynı kapsamda her istek ile bir kez daha bağlanmıştır.

ve ağır yük altında (yani birden çok farklı HTTP isteği (iş parçacığı) aynı anda aynı bileşen örneğine eriştiğinde ve işlediğinde), er ya da geç uıcomponent'de sıkışmış iş parçacığı ile bir uygulama çökmesine karşı karşıya.popcomponentfromel veya richfaces uidataadaptorbase ve dahili HashMap veya hatta bazı "garip " IndexOutOfBoundsException veya ConcurrentModificationException kullanarak %100 CPU kullanımında Java konuları JSF uygulama kaynak kodundan düz geliyor iken JSF, görünüm durumunu kaydetmekle veya geri yüklemekle meşgul (yani yığın izi saveState() veya restoreState() yöntemlerini ve benzerini gösterir).

kullanarak binding bir fasulye özelliği üzerinde kötü uygulama

ne olursa olsun, binding kullanarak bu şekilde, bir bütün bileşen örneğini bir bean özelliğine bağlama, bir istek üzerine bile scoped bean, JSF 2'de.x oldukça nadir bir kullanım durumu ve genellikle en iyi uygulama değil. Bir tasarım kokusu gösterir. Normalde bileşenleri görünüm tarafında beyan eder ve çalışma zamanı özniteliklerini value ve belki de styleClass gibi bağlarsınız , disabled , rendered , vb. normal fasulye özelliklerine. Ardından, tam olarak tüm bileşeni kapma ve öznitelik ile ilişkili ayarlayıcı yöntemini çağırmak yerine istediğiniz fasulye özelliğini manipüle edersiniz.

bir bileşenin statik bir modele dayalı olarak "dinamik olarak oluşturulması" gerektiğinde, jstl gibi yapı zaman etiketlerini görüntülemek için daha iyi bir etiket dosyasında yerine createComponent() , new SomeComponent() , getChildren().add() ve ne değil. Ayrıca bakınız bazı JSF eşdeğer eski JSP snippet refactor nasıl?

veya bir bileşenin dinamik bir modele göre "dinamik olarak işlenmesi" gerekiyorsa, yineleyici bileşenini kullanın ( <ui:repeat> , <h:dataTable> , vb). Ayrıca Bkz. JSF bileşenleri dinamik olarak nasıl eklenir.

Kompozit bileşenler tamamen farklı bir hikaye. <cc:implementation> içindeki bileşenleri destek bileşenine (yani <cc:interface componentType> ile tanımlanan bileşen) bağlamak tamamen yasaldır. Ayrıca Bkz. a.o. bölünmüş java.utıl.Saat ve dakikayı f:convertDateTime ve ile temsil eden ınputtext alanları JSF 2.0 Kompozit bileşeniyle dinamik bir liste nasıl uygulanır?

sadece binding yerel kapsam

kullanın

Ancak, bazen eylem / değer bağımlı doğrulama ile ilgili kullanım durumlarda daha sık, belirli bir bileşenin içinden farklı bir bileşenin durumu hakkında bilmek istiyorum. Bunun için, binding özniteliği fasulye bir özelliği ile birlikte kullanılan 1519950920, ama değil 'olabilir. binding özniteliğinde, binding="#{foo}" gibi bir yerel EL kapsam benzersiz değişken adı belirtebilirsiniz ve bileşen, başka bir yerde render yanıtı sırasında UIComponent referansı #{foo} ile doğrudan aynı görünüm. İşte böyle bir çözümün cevapta kullanıldığı birkaç ilgili soru:

Ayrıca bakınız:

109
cevap BalusC 2017-05-23 14:47:26
kaynak

her JSF bileşeni kendisini HTML'ye dönüştürür ve HTML'nin ürettiği şey üzerinde tam kontrole sahiptir. Orada JSF tarafından kullanılabilecek birçok hileler vardır ve bu hileler tam olarak hangi kullanılacak kullandığınız JSF uygulamasına bağlıdır.

  • , girişten her birinin toplam benzersiz bir ada sahip olduğundan emin olun, böylece form onu oluşturan bileşen ağacına geri gönderildiğinde, her bileşenin değer formunu nerede okuyabileceğini söylemek kolaydır.
  • JSF bileşeni serere geri gönderir javascript üretebilir, oluşturulan javascript bileşeni tarafından oluşturulan çünkü her bileşen de bağlı olduğu bilir.
  • hlink gibi şeyler için URL'ye sorgu params olarak veya URL'nin kendisinin bir parçası olarak veya matrx parametreleri olarak bağlama bilgilerini ekleyebilirsiniz. mesela.

    http:..../somelink?componentId=123 , jsf'nin bileşen ağacına bakmasına izin verir bu bağlantı 123 tıklandı. veya htp:..../jsf;LinkId=123

bu soruyu cevaplamanın en kolay yolu, yalnızca bir bağlantıya sahip bir JSF sayfası oluşturmak, daha sonra ürettiği html çıktısını incelemektir. Bu şekilde, bunun kullandığınız JSF sürümünü kullanarak tam olarak nasıl gerçekleştiğini bileceksiniz.

0
cevap ams 2013-02-16 19:50:12
kaynak

Diğer sorular jsf-2 binding jsf components