« September 2007 | صÙ?حه اصلی | November 2007 »

مروري بر XML

October 29, 2007 09:20 AM

قبل از ادامه بحث ارتباط جاوا و XML ترجيح دادم اول كمي به معر�?ي XML و م�?اهيم مرتبط با آن بپردازم. البته مي دانم كه احتمالا با آن آشنا هستيد. با اين حال شايد مرور دوباره م�?اهيم آن بد نباشد. مطالب را از w3schools برداشته ام.

XML يا Extensible Markup Language امكاني است براي توصي�? داده ها. عبارت است از يك �?ايل متني با پسوند XML كه با هر اديتور متني قابل ويرايش است. شيوه نگارش آن در ادامه شرح داده خواهد شد.

برخي مشخصات XML :
* مانند HTML است اما تگ هاي آن از پيش تعري�? شده نيستند و كاربر، خود بايد آنها را تعري�? نمايد.
* از DTD يا يك XML Schema براي توصي�? داده ها است�?اده مي كند.

ت�?اوت اصلي XML و HTML اين است كه HTML بر چگونگي نمايش داده ها تاكيد دارد. در حالي كه XML محتواي داده ها را توصي�? مي كند. در واقع XML مكملي است بر HTML. نه جايگزين آن

كاربردهاي XML :
* با XML داده ها خارج از HTML نگهداري مي شوند.
* XML براي جابجايي داده ها به كار مي رود.
* XML براي به اشتراك گذاري داده ها به كار مي رود
* XML براي ذخيره سازي داده هاي به كار مي رود
* در واقع XML باعث مي شود كه داده هاي شما پركاربرد تر باشند
* XML مي تواند براي ساخت يك زبان جديد به كار رود. XML مادر زبان هايي چون WAP و WML است.

سينتكس :
سينتكس XML بسيار ساده است
مثال:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note date="12/11/2006">
<to>You</to>
<from>me</from>
<heading>Reminder</heading>
<body>Don't forget</body>
</note>

اولين خط آن هميشه XML declaration است كه ورژن و character encoding به كار ر�?ته در سند XML را مشخص مي كند.
خط بعدي عنصر ريشه يا root element را مشخص مي نمايد. عنصر ريشه ماهيت سند XML را مشخص مي كند. مثل اينكه مي گوييم اين سند يك note است.

نكات:
* همه تگ هاي XML بايد بسته شوند و اين اجباري است.
* تگ هاي XML همه case sensitive هستند. بنابراين تگ هاي باز Ùˆ بسته بايد عينا يكسان نوشته شوند. به عبارت ديگر مثلا تگ <message> نمي تواند با <Message/> Ø¨Ø³ØªÙ‡ شود.
* ساختار تو درتوي تگ ها بايد به درستي رعايت شود.
* همه اسناد XML الزاما بايد داراي عنصر ريشه باشند . بقيه عناصر درون آن قرار داده شوند.
* در دو طر�? value همه attribute هاي سند XML بايد كوتيشن قرار گيرد. هم مي تواند single quote باشد و هم double quote
* �?ضاي خالي يا space رشته ها در سند XML پاك نمي شود.

comment در XML

<!-- This is a comment -->

عناصر XML
بين عناصر XML رابطه پدر و �?رزندي حاكم است.

<book>
<title>My First XML</title>
<prod id="33-657" media="paper"></prod>
<chapter>Introduction to XML
<para>What is HTML</para>
<para>What is XML</para>
</chapter>

<chapter>XML Syntax
<para>Elements must have a closing tag</para>
<para>Elements must be properly nested</para>
</chapter>

</book> 

محتواي element ها داراي چهار حالت است:

* element content : مثل book
* mixed content : مثل chapter
* simple content : مثل para
* empty content : مثل prod

در مثال بالا تنها prod داراي attribute است.

قواعد نامگذاري element ها:
* اسامي شامل حرو�? و اعداد و برخي كاراكترهاي ديگر مي شوند
* اسامي نبايد با عدد يا كاراكترهاي نقطه گذاري شروع شوند
* اسامي نبايد با عبارت xml يا XML يا Xml و ساير حالات XML شروع شود
* اسامي نبايد space داشته باشد
* اسامي نبايد ":" داشته باشند

اسامي element ها بهتر است گويا و توصي�?ي باشند.

كجا از element است�?اده شود و كجا از attribute ؟
هيچ قانوني براي اين كار وجود ندارد. اما كلا است�?اده از element ها در جاهايي كه نمي توان تمايزي بين اين دو قائل شد، توصيه مي شود. بهتر است هميشه داده ها را در element ها گنجاند. attribute ها را صر�?ا براي �?راهم نمودن اطلاعات در مورد داده ها (metadata) مقداردهي نماييد.
بعنوان برخي مشكلات است�?اده از attribute مي توان اين موارد را برشمرد:
* attribute ها نمي توانند چند مقدار بپذيرند
* attribute ها توسعه دادنشان سخت تر است.
* attribute ها قابليت نمايش structure ها را ندارند.
* كار با attribute ها در برنامه سخت تر است.
* attribute ها در تقابل با DTD تست كردنشان سخت تر است.

يك استثناء:
شناسه يا كد داده ها مثل counter اي كه بصورت سريال بالا مي رود را مي توان در attribute ها هم قرارداد.

XML با سينتكس درست Well Formed XML ناميده مي شود.
XML كه با DTD اعتبارسنجي شده ، Valid XML خوانده مي شود.

mahyar_ev | 09:20 AM | Comment(s)(2)

Binding بين XML Schema و كلاس هاي جاوا

October 15, 2007 12:31 PM

اين كار در جاوا با JAXB يا Java Architecture for XML Binding انجام مي شود. يك implementation از JAXB شامل بخش هاي زير است:
• Schema compiler: يك XML schema را به مجموعه اي از عناصر داخل برنامه bind مي كند. رويه Binding توسط يك زبان مبتني بر XML تعري�? مي شود.
• Schema generator: مجموعه اي از عناصر موجود در برنامه را به يك XML schema مرتبط (map) مي كند.
• Binding runtime framework : امكان عمليات marshaling (نوشتن به) و unmarshaling (خواندن از) محتواي XML را �?راهم مي كند.

مراحل كلي در انجام رويه data binding با JAXB عبارت است از:
1- ساخت كلاس ها: در اين مرحله JAXB binding compiler يك XML schema را بعنوان ورودي دريا�?ت مي كند و بر اساس آن كلاس هاي JAXB را مي سازد.
2- كامپايل كلاس ها: همه كلاس هاي ساخته شده به همراه source و كد application بايد كامپايل شوند.
3- Unmarshalling: توسط JAXB binding framework اسناد XML اي كه مطابق schema نوشته شده اند، Unmarshal مي گردند.
4- ساخت درخت محتوا: نتيجه Unmarshaling ساخت يك درخت از data object هايي است كه نمونه هايي از كلاس هاي JAXB ساخته شده، هستند. اين درخت محتوا ساختار و محتواي اسناد XML منبع را نمايش مي دهند.
5- اعتبارسنجي: اين مورد اختياري است و مي تواند انجام نشود. اما اگر مثلا تغييري در درخت محتوا ايجاد كنيد (آنگونه كه در مرحله بعدي گ�?ته شده) لازم است كه قبل از Marshaling يا بازگرداندن محتوا به اسناد XML ، با است�?اده از عمليات validation موجود در JAXB، صحت و اعتبار آنها را بررسي نماييد.
6- پردازش محتوا: application مي تواند داده هاي XML نمايش داده شده در درخت محتوا را ويرايش نمايد.
7- Marshalling: در نهايت درخت محتوا بايد به يك يا چند سند XML خروجي ، منتقل شود. همانگونه كه ذكر شد اين محتوا ممكن است قبل از انجام عمل Marshaling اعتبارش سنجيده شود.

در ادامه برخي از م�?اهيم ذكر شده براي آشنايي بيشتر، معر�?ي مي گردد:
XML schema :
نوع سند XML را تعري�? مي كند. معمولا بصورت شرايطي (constraints) كه بر ساختار و محتواي XML بايد اعمال شود، بيان مي گردد. زبان هاي گوناگوني براي بيان XML Schema وجود دارد. شناخته شده ترين آنها زبان Document Type Definition يا DTD است كه در واقع بعنوان يكي از ويژگي هاي XML شناخته مي شود. اين زبان قابليت هاي محدودي دارد، اما كاربردهاي ديگري نيز علاوه بر تعري�? XML schema دارد. دو زبان ديگر پركاربرد در حوزه تعري�? XML schemaعبارتند از XML schema (W3C) و RELAX NG
XML Data binding:
اين عبارت اشاره دارد به �?رايند نمايش اطلاعات موجود در يك سند XML بصورت يك object در حا�?ظه كامپيوتر. اين كار به application امكان مي دهد كه مستقيما و بدون است�?اده از DOM به داده هاي XML دست يابد.
Marshaling:
Marshaling كه همچنين با عنوان serialization نيز شناخته مي شود، عبارت است از �?رايند تبديل يك object موجود در حا�?ظه به يك �?رمت داده قابل انتقال يا ذخيره سازي (مثلا يك �?ايل). Marshaling در JAXB به application امكان مي دهد كه object هاي JAXB را به داده هاي XML تبديل نمايد.
Unmarshalling:
عمل معكوس Marshaling نيز Unmarshaling يا deserialization ناميده مي شود كه عبارت است از استخراج يك ساختمان داده از يك �?ايل (يا يك سري از بايت ها). Unmarshaling در JAXB به application اين امكان را مي دهد كه داده هاي XML را به object هاي JAXB تبديل كند.

ادامه دارد...

mahyar_ev | 12:31 PM | Comment(s)(0)

استÙ?اده از Web Service در برنامه

October 1, 2007 12:49 PM

در مطلب قبل چگونگي ايجاد يك Web Service را ديديم. در اين مطلب يك Web Service Client خواهيم ساخت كه از Web Service ساخته شده در قسمت قبل استÙ?اده كند. براي اينكار ما همچنان ازJavaEE 5 Ùˆ NetBeans IDE 5.5 استÙ?اده خواهيم نمود.

مراحل كار:

1- ساخت يك Web Application
همانگونه كه در مطلب قبل نيز توضيح داده شد براي ساخت يك Web Application بايد پس از اجراي NetBeans IDE از منوي File منوي New Project را انتخاب نماييد. با اين كار Ù?رم ديگري باز مي شود. در Ù?رم مذكور از قسمت Web گزينه Web Application را انتخاب كرده، دكمه Next را بÙ?شاريد. در مرحله بعدي، نام پروژه Ùˆ مسير آن را مشخص كنيد Ùˆ دكمه Finish را بزنيد.

نكته: اجباري نيست كه براي استÙ?اده از Web Service حتما يك Web Application داشته باشيد. مي توان Web Service را از داخل هر Application جاوا Ù?راخواني كرد. در اينجا بعنوان نمونه از Web Application براي اين كار استÙ?اده شده است.

2- ساخت يك package
در NetBeans روي پروژه راست كليك كرده، گزينه New Ùˆ سپس Java Package را انتخاب نماييد. در Ù?رمي كه باز مي شود نام package را WSClientPac وارد كنيد. همچنين Ù?يلد location را Source Package قرار دهيد. در انتها دكمه Finish را Ù?شار دهيد.

3- ساخت يك Web Service Client
روي پروژه راست كليك كرده، گزينه New Ùˆ سپس Web Service client را انتخاب نماييد. Ù?رمي باز مي شود. در اين Ù?رم اولا گزينه WSDL URL را انتخاب كنيد Ùˆ مسير Ù?ايل wsdl مربوط به Web Service را در باكس مقابل آن وارد كنيد. همچنين Ù?يلد package را با WSClientPac پر كنيد. دكمه Finish را در پايان Ù?شار دهيد. اگر خطايي رخ ندهد، با اين كار در مسير پروژه Ù?ولدري به نام Web Service Refrences ايجاد مي شود كه مشخصات Web Service Client مربوطه را در خود دارد.

سوال: Ù?ايل wsdl چيست Ùˆ چطور آن را بيابيم؟
wsdl مخÙ?Ù? Web Service Description Language ØŒ Ù?ايلي است به Ù?رمت XML كه مشخصات Web Service را در خود دارد. براي استÙ?اده از Web Service بايد مسير Ù?ايل wsdl آن را بدانيد. همه توليد كنندگان Web Service اين مسير را در اختيار استÙ?اده كنندگان قرار مي دهند.
در مورد Web Service اي كه در قسمت قبل ساختيم، براي پيدا كردن مسير اين Ù?ايل، روي Web Service مربوطه راست كليك كنيد Ùˆ گزينه peoperties را انتخاب كنيد. مسير wsdl در پايين اين صÙ?حه نوشته شده است. اين مسير بايد چنين باشد:

http://localhost:8080/TestWebApplication/TestWebServiceService?wsdl

4- ايجاد يك كلاس براي Ù?راخواني Web Service Ùˆ نوشتن كدهاي لازم
روي پروژه راست كليك كرده Ùˆ New Ùˆ سپس Java Class را انتخاب كنيد. نام كلاس را HelloClient وارد كنيد. همچنين Ù?يلد Package را هم با WSClientPac مقداردهي كنيد. دكمه Finish را بزنيد.
بدين ترتيب Ù?ابل HelloClient.java ساخته مي شود كه حاوي كدهاي اوليه تعريÙ? كلاس است. كدهاي لازم را به اين Ù?ايل اضاÙ?Ù‡ كنيد تا نهايتا محتويات Ù?ايل به اين صورت شود:

package WSClientPac;

import javax.xml.ws.WebServiceRef;
import WSClientPac.TestWebService;
import WSClientPac.TestWebServiceService;

public class HelloClient {
    static TestWebServiceService service = new TestWebServiceService();
   
    public HelloClient() {}
   
    public String getHello(String name){
        String result="";
        try{
            TestWebService port = service.getTestWebServicePort();
            result = port.sayHello(name);
        } catch (Exception e){
             result = e.toString();
        }
       
        return result;
    }
   
}
 

5- Ù?راخواني متد getHello
در قسمت body Ù?ايل index.jsp واقع در Ù?ولدر Web Pages دستورات زير را اضاÙ?Ù‡ نماييد:

<%@ page import="WSClientPac.HelloClient" %>
<% HelloClient hc = new HelloClient(); %>
<p><%= hc.getHello("JavaBorder") %> </p>

6- اجراي برنامه
با F6 برنامه را اجرا كرده Ùˆ نتيجه را در Browser ببينيد. اگر خطايي رخ ندهد، در خروجي بايد پيغام "Hello, JavaBorder" را ببينيد. البته Ù?راموش نكنيد كه قبل از اجراي برنامه Web Service را Deploy نماييد.

mahyar_ev | 12:49 PM | Comment(s)(2)