İçindekiler:
Video: iron-ajax… wat?! -- Polycasts #26 2024
JAXB ile XML Bağlama için Java API'sı . JAXB ile bir XML belgesi alırsınız ve belgeyi işlemek için mükemmel bir Java sınıfı dosyası oluşturursunuz. İhtiyaçlarınız değiştiğinde ve sınıf artık ne yapmak istediğinizi yapmazsa, yeni bir alt sınıf oluşturursunuz.
SAX veya DOM kodu yazarken bir XML işleme programı oluşturursunuz. Programınız bir belge okur ve belgeyi yararlı iş yapmak için kullanır - public void startElement veya node gibi zararsız birşeyle başlayarak. getnodename (). Her iki durumda da, programınız belgenin içinde ne olduğuna dair bir varsayım yapmaz. Belgede bir kök öğesi, bazı alt öğeler bulunur ve hepsi bu kadar. Bu belge hakkında yaptığınız özel varsayımlar, kodun yararlılığını aslında daraltır.
Çok yönlü kod ile özelleştirilmiş kod arasında
Listeleme 1 ve 2'deki kodu düşünün. Liste 1, bir belge ağacındaki beş düğümü tarar. Bu beş düğüm belirli bir şekilde düzenlenmeli veya program çöküyor. (Liste, kök düğümün altında doğrudan en az iki çocuk bulunan bir yorum ve bir kök düğüm istiyor.)
Liste 1: Birkaç düğüm görüntüleme
içe aktarma organı. W3C. dom. Düğüm;
ithalat ofisi. W3C. dom. NamedNodeMap;
sınıf MyTreeTraverser
{
MyTreeTraverser (Düğüm noktası)
{
Sistem. dışarı. println (düğüm. getNodeName ());
düğüm = düğüm. getFirstChild ();
Sistem. dışarı. println (düğüm. getNodeName ());
düğüm = düğüm.) (GetNextSibling;
Sistem. dışarı. println (düğüm. getNodeName ());
düğüm = düğüm. getFirstChild ();
Sistem. dışarı. println (düğüm. getNodeName ());
düğüm = düğüm.) (GetNextSibling;
Sistem. dışarı. println (düğüm. getNodeName ());
}
}
Liste 2: DOM ağacını çaprazlama
import org. W3C. dom. Düğüm;
ithalat ofisi. W3C. dom. NamedNodeMap;
sınıf MyTreeTraverser
{
Düğüm düğüm;
MyTreeTraverser (Düğüm düğüm)
{
bu. düğüm = düğüm;
displayName ();
DisplayValue ();
if (node.getNodeType () == Düğüm ELEMENT_NODE)
displayAttributes ();
Sistem. dışarı. println ();
displayChildren ();
}
void displayName ()
{
Sistem. dışarı. yazdır ("İsim:");
Sistem. dışarı. println (düğüm. getNodeName ());
}
void displayValue ()
{
String nodeValue = düğüm. getNodeValue ();
if (nodeValue! = Null)
nodeValue = nodeValue.) (Döşeme;
Sistem. dışarı. yazdır ("Değer:");
Sistem. dışarı. println (nodeValue);
}
void displayAttributes ()
{
NamedNodeMap attribs = düğüm. GetAttributes ();
için (int i = 0; i { System ++. dışarı. println (); Sistem. dışarı. print ("Öznitelik:"); Sistem. dışarı. yazdır (attribs. item (i). getNodeName ()); Sistem. dışarı. yazdır ("="); Sistem. dışarı. println (öznitelikler item (i). getNodeValue ()); } } void displayChildren () { Node çocuk = düğüm. getFirstChild (); while (child! = Null) { yeni MyTreeTraverser (çocuk); çocuk = çocuk.) (GetNextSibling; } } } Liste 2'deki kod daha genel. Bu kod, çalıştırdığı belge yapısını denetler. Kod bir alt düğüm bulduğunda çocuğu tarar ve torun arar. Hiçbir torun yoksa, kod kardeşleri arar. Kod, herhangi bir belge ağacını işleyebilir - bir düğüm var mı yoksa bin düğüm var mı. Böylece, Liste 2, Liste 1'ten daha çok yönlüdür. Ancak, bu çok yönlülük dezavantajlarla birlikte gelir - çok yüksek masraf olasılığı da dahil olmak üzere. Liste 2'deki kod tüm XML belgesini ayrıştırmak zorundadır - ve belgenin ağacının bir temsilini bilgisayarın belleğine yerleştirmiştir. Belge çok büyükse temsili geniştir: Bellek, tüm bu geçici verilerin şişmesine neden olur ve Liste 2'deki kod yavaşlar tarama yapar. Boston, Massachusetts'deki Faneuil Hall'a gitmeye çalıştığınızı düşünün. Nereden başlayacağın önemli değil; Gezi her zaman kafa karıştırıcı ve zor olacak. Her neyse, rotanızı planlamanız gerekir. Yakındaki Revere veya Cambridge'de veya Boston şehir merkezinde kaybolabilirsiniz. Kaynaklarınıza bağlı olarak iki seçeneğiniz vardır: Kağıt haritasını kullanmak, konuşan GPS kullanmaktan daha fazla çalışma (daha fazla zaman, çaba, beceri ve sabır) gerektirir. Niye ya? Kağıt haritası özel ihtiyaçlarınıza göre özelleştirilmediğinden; Sonuçta, "Boston metropol bölgesinin tamamı burada. Faneuil Hall orada bir yerde. Siz bir sonraki adımda ne yapmanız gerektiğini öğreneceksiniz. " Özel bir sistem (beklediğiniz gibi) acil durumunuza göre ayarlanmayan bir sistem daha kolaydır. Böylece, Liste 2'nin XML işleme kodu, bilgisayarınızın bellek alanına ("İşte ağaca - sen sonra ne yapacağını bulmaya …") devasa, kaynak canlandırıcı bir DOM ağacı kılar. Çünkü kod isn ' özelleştirilmemiş.Kod, elinizde olmayan herhangi bir eski belge için geçerlidir ve bunu yapmak için her zaman kaynakları boşa çıkarır. JAXB'nin arkasındaki fikir, mevcut ihtiyaçlarınızı karşılamak için özel hazırlanmış sınıf yaratmaktır. Bir XML belgesinin açıklamasını alıp şema derleyici adlı özel bir programla çalıştırıp üretilen sınıf adında yeni bir sınıf elde etmiş olursun. Bu üretilen sınıf, belirli XML belgeleriyle çalışmak üzere uyarlanmıştır. Örneğin, XML belgeleriniz Total adında öğeler içeriyorsa, oluşturulan sınıf setTotal ve getTotal yöntemlerine sahip olabilir. Bir belgenin öğesi bir fullName özniteliğine sahipse, oluşturulan sınıf setFullName ve getFullName yöntemlerine sahip olabilir. (Bkz. Şekil 1). Bir XML belgesinin bir bölümü ile bir Java sınıfının bir parçası arasındaki bağlantıya bir bağlama adı verilir. Tüm bu bağlamalarla, sınıfın bir örneği tek bir XML belgesini temsil eder. Öyleyse bir nesneyi bir XML belgesine nasıl bağlarsınız? Peki, oluşturulan sınıf unmarshal ve mareşal adlı yöntemleri vardır. (Şekil 2'ye bakın.) Bunun gibi yöntemlerle bir XML belgesindeki verileri alabilir ve değiştirebilirsiniz.Özelleştirmenin faydaları
JAXB'nin özü