أمثلة على مواقع الويب المهيكلة JSP+XML
الكاتب:Eve Cole
وقت التحديث:2009-07-02 17:11:58
قد تبدو لغة XML (لغة التوصيف القابلة للتوسيع) وكأنها أحد معايير W3C - فهي ذات تأثير عملي ضئيل الآن، وإذا أصبحت مفيدة لاحقًا، فسوف يستغرق الأمر وقتًا طويلاً. ولكن في الواقع، يتم استخدامه بالفعل. لذا، لا تنتظر حتى تتم إضافة XML إلى محرر HTML المفضل لديك لبدء استخدامه. يمكنه الآن حل المشكلات الداخلية المختلفة ومشاكل نظام B2B.
في Sparks.com، نستخدم لغة XML لتوحيد تمثيل البيانات عبر الأنظمة المختلفة، بدءًا من كائنات Java وحتى عروض بيانات HTML.
وعلى وجه الخصوص، وجدنا أنه يمكن مشاركة البيانات ومعالجتها بسهولة أكبر عندما يتم توحيدها على بنية XML أساسية جدًا. وعلى طول الطريق، اكتشفنا العديد من الطرق الفعالة لاستخدام لغة XML. فيما يلي وصف لتطبيقنا الحالي بالتفصيل.
توحيد قبل استخدام XML، قم بإنشاء تنسيق بيانات XML مختلف عن المعلومات التي تريد استخدامها.
إنشاء ملف XML ديناميكي
إن إنشاء HTML من قاعدة بيانات ليس بالأمر الجديد، ولكن إنشاء XML هو أمر جديد. نقدم هنا خطوات التوليد المحددة.
استخدام XSL كلغة قالب
تعد XSL (لغة أوراق الأنماط القابلة للتوسيع) طريقة جيدة لتحديد تنسيق عرض بيانات XML، وستكون أكثر كفاءة إذا تمت كتابتها كقوالب ثابتة متعددة.
توليد HTML
XML بالإضافة إلى XSL يساوي HTML. قد لا يبدو هذا صحيحًا، ولكن صفحات HTML التي يراها المستخدمون هي في الواقع نتيجة الجمع بين XML وXSL.
1. التقييس
قوة XML تأتي من مرونتها. لكن لسوء الحظ، يكون الأمر مرنًا جدًا في بعض الأحيان بحيث تترك أمامك صفحة فارغة تتساءل عن كيفية حل المشكلة.
في أي مشروع XML، الخطوة الأولى هي إنشاء تنسيق بيانات قياسي. للقيام بذلك، عليك اتخاذ القرارات التالية:
&&&
تأكيد البيانات:
نظرًا لعدم وجود تنسيق XML قياسي، يتمتع المطورون بحرية تطوير التنسيقات الخاصة بهم. ومع ذلك، إذا تم التعرف على التنسيق الخاص بك بواسطة تطبيق واحد فقط، فيمكنك تشغيل هذا التطبيق فقط لاستخدام التنسيق. من الواضح أنه سيكون أكثر فائدة إذا كانت هناك برامج أخرى يمكنها أيضًا قراءة تنسيق XML الخاص بك. إذا تم تعديل تنسيق XML، فقد يحتاج النظام الذي يستخدمه أيضًا إلى التعديل، لذا يجب عليك إنشاء التنسيق كاملاً قدر الإمكان. نظرًا لأن معظم الأنظمة تتجاهل العلامات التي لا تتعرف عليها، فإن الطريقة الأكثر أمانًا لتغيير تنسيق XML هي إضافة علامات، بدلاً من تعديلها.
انقر هنا لعرض أمثلة تنسيق بيانات XML
في Sparks.com، قمنا بمراجعة جميع بيانات المنتج المطلوبة لمختلف العروض التقديمية للمنتجات. على الرغم من أن جميع الصفحات لا تستخدم جميع البيانات، فقد قمنا بتطوير تنسيق بيانات XML كامل جدًا ومناسب لجميع البيانات. على سبيل المثال، تعرض صفحة تفاصيل المنتج بيانات أكثر من تلك التي تعرضها صفحة تصفح المنتج. ومع ذلك، ما زلنا نستخدم نفس تنسيق البيانات في كلتا الحالتين لأن قالب XSL لكل صفحة يستخدم الحقول التي تتطلبها فقط.
ما إذا كان سيتم استخدام DTD
في Sparks.com، نستخدم XML جيد التنظيم بدلاً من XML الصحيح فقط، حيث أن الأول لا يتطلب DTD. يضيف DTD طبقة من المعالجة بين نقر المستخدم ورؤيته للصفحة. لقد وجدنا أن هذه الطبقة تتطلب الكثير من المعالجة. بالطبع، لا يزال من الجيد استخدام DTDs عند التواصل مع الشركات الأخرى بتنسيق XML. لأن DTD يمكن أن يضمن صحة بنية البيانات عند الإرسال والاستقبال.
اختيار محرك التحليل يوجد الآن العديد من محركات التحليل التي يمكن استخدامها. أي واحد تختاره يعتمد بشكل كامل تقريبًا على احتياجات التطبيق الخاص بك. إذا قررت استخدام DTD، فيجب أن يقوم محرك التحليل بتمكين التحقق من صحة XML الخاص بك بواسطة DTD. يمكنك وضع التحقق من الصحة في عملية منفصلة، ولكن ذلك قد يؤثر على الأداء.
SAX وDOM هما نموذجان أساسيان للتحليل. يعتمد SAX على الأحداث، لذلك عندما يتم تحليل XML، يتم إرسال الأحداث إلى المحرك. بعد ذلك، تتم مزامنة الأحداث مع ملف الإخراج. يقوم محرك تحليل DOM بإنشاء بنية شجرة هرمية لبيانات XML الديناميكية وأوراق أنماط XSL. من خلال الوصول عشوائيًا إلى شجرة DOM، يمكن توفير بيانات XML كما لو تم تحديدها بواسطة ورقة أنماط XSL. يركز النقاش حول نموذج SAX بشكل أساسي على تقليل الذاكرة المفرطة لبنية DOM وتسريع وقت تحليل ورقة أنماط XSL.
ومع ذلك، وجدنا أن العديد من الأنظمة التي تستخدم SAX لم تستخدمه بكامل إمكاناته. تستخدمه هذه الأنظمة لبناء بنية DOM وإرسال الأحداث من خلال بنية DOM. باستخدام هذا الأسلوب، يجب إنشاء DOM من ورقة الأنماط قبل أي معالجة لـ XML، لذلك سيتأثر الأداء.
2. إنشاء XML الديناميكي
بمجرد إنشاء تنسيق XML، نحتاج إلى طريقة لنقله ديناميكيًا من قاعدة البيانات.
يعد إنشاء مستندات XML أمرًا بسيطًا نسبيًا لأنه يتطلب فقط نظامًا يمكنه التعامل مع السلاسل. قمنا ببناء نظام باستخدام Java Servlets، وEnterprise JavaBean server، وJDBC، وRDBMS (نظام إدارة قواعد البيانات العلائقية).
&&&&
(للحصول على معلومات إضافية حول تطبيق XSL، راجع XSL كلغة قالب.)
مثال على إنشاء XML يمكن تقسيم الكود الفعلي لإنشاء سلسلة مستندات XML في Java إلى عدة طرق وفئات.
يتم وضع الكود الذي يبدأ عملية إنشاء XML في طريقة EJB. يقوم هذا المثيل على الفور بإنشاء StringBuffer لتخزين سلسلة XML التي تم إنشاؤها.
StringBuffer xml = new StringBuffer();
xml.append(XmlUtils.beginDocument("/browse_find/browse.xsl"، "browse"، request));
xml.append(product.toXml());
xml.append(XmlUtils.endDocument("browse");
print(xml.toString());
المتغيرات الثلاثة التالية xml.append() هي نفسها استدعاءات لطرق أخرى.
إنشاء رأس الملف تستدعي الطريقة الإضافية الأولى فئة XmlUtils لإنشاء رأس ملف XML. الكود الموجود في Java Servlet الخاص بنا هو كما يلي:
بداية السلسلة الثابتة العامة (ورقة أنماط السلسلة، صفحة السلسلة)
{
StringBuffer xml = new StringBuffer();
xml.append("<?xml version="1.0"?> ")
.append("<?xml-stylesheet href="")
.إلحاق(ورقة الأنماط).إلحاق(""")
.append(" type ="text/xsl"?> ");
xml.append("<").append(page).append("> ");
إرجاع xml.toString();
}
يقوم هذا الرمز بإنشاء رأس ملف XML. تحدد العلامة <?xml> هذا الملف كملف XML يدعم الإصدار 1.0. يشير السطر الثاني من التعليمات البرمجية إلى موقع ورقة الأنماط الصحيحة لعرض البيانات. آخر شيء تم تضمينه هو علامة مستوى العنصر (<browse> في هذا المثال). في نهاية الملف، يجب إغلاق علامة <browse> فقط.
<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>
بعد ملء معلومات المنتج واستكمال رأس الملف، ستستدعي طريقة التحكم كائن Java لإنشاء XML الخاص به. في هذا المثال، يتم استدعاء كائن المنتج. يستخدم كائن المنتج طريقتين لإنشاء تمثيل XML الخاص به. الطريقة الأولى toXML() تنشئ عقدة المنتج عن طريق إنشاء علامتي <product> و</product>. ثم يقوم بعد ذلك باستدعاء InternalXML()، الذي يوفر المحتوى المطلوب لـ XML للمنتج. InternalXML() عبارة عن سلسلة من استدعاءات StringBuffer.append(). يتم أيضًا تحويل StringBuffer إلى سلسلة وإعادته إلى طريقة التحكم.
السلسلة العامة toXml()
{
StringBuffer xml = new StringBuffer("<product> ");
xml.append(internalXml());
xml.append("</product> ");
إرجاع xml.toString();
}
السلسلة العامة InternalXml ()
{
StringBuffer xml = new
StringBuffer(" ")
.append(productType).append(" ");
xml.append(" ").append(idValue.trim())
.إلحاق("");
xml.append(" ").append(idName.trim())
.إلحاق("");
xml.append(" ").append(page.trim())
.إلحاق("");
بانغ؟
xml.append(" ").append(amount).append(" ");
xml.append(" ").append(vendor).append(" ");
xml.append(" ");
xml.append(" ").append(pubDesc).append(" ");
xml.append(" ").append(venDesc).append(" ";
بانغ؟
إرجاع xml.toString();
}
وأخيرًا، يتم استدعاء الأسلوب XMLUtils.endDocument() بعد إغلاق الملف. يؤدي هذا الاستدعاء إلى إغلاق علامة XML (في هذه الحالة) وإكمال ملف XML المنظم في النهاية. يتم أيضًا تحويل StringBuffer بأكمله من طريقة التحكم إلى سلسلة وإعادته إلى servlet الذي يتعامل مع طلب HTTP الأصلي.
3. استخدم XSL كلغة قالب
للحصول على مخرجات HTML، نقوم بدمج ملف XML الذي تم إنشاؤه مع قالب XSL الذي يتحكم في كيفية تمثيل بيانات XML. تتكون قوالب XSL الخاصة بنا من علامات XSL وHTML منظمة بعناية.
ابدأ في إنشاء القالب تبدو بداية قالب XSL الخاص بنا مشابهة للكود التالي. السطر الأول من التعليمات البرمجية مطلوب ويحدد هذا الملف على أنه ورقة أنماط XSL. تشير السمة xmlns:xsl= إلى مساحة اسم XML التي يستخدمها هذا الملف، وتحدد السمة version= رقم إصدار مساحة الاسم. في نهاية الملف نغلق العلامة.
يحدد السطر الثاني من التعليمات البرمجية الذي يبدأ بـ <xsl:template> نمط قالب XSL. سمة المطابقة مطلوبة وتشير هنا إلى علامة XML <basketPage>. في نظامنا، تحتوي علامة <basketPage> على علامة <product>، والتي تسمح لقالب XSL بالوصول إلى معلومات المنتج المضمنة في علامة <product>. مرة أخرى يتعين علينا إغلاق العلامة <xsl:template> في نهاية الملف.
بعد ذلك، دعونا نلقي نظرة على HTML جيد التنظيم. نظرًا لأنه ستتم معالجته بواسطة محرك تحليل XML، فيجب أن يتوافق مع جميع قواعد XML جيدة التنظيم. هذا يعني بشكل أساسي أن جميع العلامات الافتتاحية يجب أن يكون لها علامة إغلاق مقابلة. على سبيل المثال، يجب إغلاق علامة <P> غير المغلقة عادةً بـ </P>.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
الإصدار = "1.0">
<xsl:مطابقة القالب = "صفحة السلة">
<أتش تي أم أل>
<الرأس>
<title>حقيبة التسوق / ضبط الكمية</title>
</الرأس>
<الجسم بجي كولور ="
</xsl:قالب>
</xsl:ورقة الأنماط>
يوجد داخل نص القالب العديد من علامات XSL المستخدمة لتوفير منطق عرض البيانات. تم شرح علامتين شائعتين الاستخدام أدناه.
يختار
العلامة <xsl:choose> تشبه بداية بنية if-then-else في لغات البرمجة التقليدية. في XSL، تشير علامة الاختيار إلى أنه في الجزء الذي يتم إدخال الكود فيه، سيؤدي التعيين إلى تشغيل الإجراء. العلامة <xsl:when> ذات السمات المعينة تتبع علامة الاختيار. إذا كان التعيين صحيحًا، فسيتم استخدام المحتوى الموجود بين علامتي الفتح والإغلاق لـ <xsl:when>. إذا كان التعيين خاطئًا، فسيتم استخدام المحتوى الموجود بين علامتي الفتح والإغلاق لـ <xsl:otherwise>. ينتهي القسم بأكمله بـ </xsl:choose>.
في هذا المثال، تقوم العلامة When بالتحقق من XML لعلامة الكمية. إذا كانت علامة الكمية تحتوي على سمة خطأ بقيمة صحيحة، فستعرض علامة الكمية خلايا الجدول المدرجة أدناه. إذا كانت قيمة السمة غير صحيحة، فسوف يعرض XSL المحتوى بين العلامات. في المثال أدناه، إذا كانت سمة الخطأ غير صحيحة، فلن يتم عرض أي شيء.
<xsl:اختر>
<xsl:when test="quantity[@error='true']">
<td bgcolor="src=""/></td>
<td valign="top" bgcolor="<fontface="Verdana, Arial" size="1" color="<b>*لم يكن المخزون كافيًا وفقًا لذلك.</b></font>
</TD>
</xsl:متى>
<xsl:خلاف ذلك>
</xsl:خلاف ذلك>
</xsl:اختر>
لكل
يمكن استخدام العلامة <xsl:for-each> لتطبيق نفس ورقة الأنماط على مواقف متعددة لبيانات XML مماثلة. بالنسبة لنا، يمكن أخذ سلسلة من معلومات المنتج من قاعدة البيانات وتنسيقها بشكل موحد على صفحة الويب. هنا مثال:
<xsl:for-each حدد = "package">
<xsl:apply-templates حدد = "منتج"/>
</xsl:لكل>
تبدأ حلقة for-each عندما يواجه البرنامج تسمية. ستنتهي هذه الحلقة عندما يواجه البرنامج تسمية. بمجرد تشغيل هذه الحلقة، سيتم تطبيق هذا القالب في كل مرة تظهر فيها التسمية.
4. إنشاء HTML
في مرحلة ما في المستقبل، ستقوم المتصفحات بدمج محركات تحليل XML. عند هذه النقطة، يمكنك إرسال ملفات XML وXSL مباشرة إلى المتصفح، ويعرض المتصفح بيانات XML وفقًا للقواعد المدرجة في ورقة الأنماط. ومع ذلك، حتى ذلك الحين، سيتعين على المطورين إنشاء إمكانات التحليل في أنظمتهم من جانب الخادم.
في Sparks.com، قمنا بدمج محلل XML في Java servlet. يستخدم هذا المحلل آلية تسمى XSLT (تحويل XSL) لإضافة بيانات XML إلى قالب XSL كما هو محدد بواسطة علامة XSL.
عندما يتعامل Java servlet مع طلب HTTP، يقوم servlet باسترداد ملف XML الذي تم إنشاؤه ديناميكيًا، والذي يتم بعد ذلك تمريره إلى محرك التحليل. استنادًا إلى الإرشادات الموجودة في ملف XML، يبحث محرك التحليل عن ورقة أنماط XSL المناسبة. يقوم المحلل اللغوي بإنشاء ملف HTML من بنية DOM، ثم يتم إرسال هذا الملف إلى المستخدم الذي يقوم بطلب HTTP.
إذا اخترت استخدام نموذج SAX، فسيقوم المحلل بقراءة مصدر XML وإنشاء حدث لكل علامة XML. تتوافق الأحداث مع بيانات XML، ويتم إدراج البيانات في النهاية في ورقة الأنماط وفقًا لعلامات XSL.