Skip to content

5. عملاء .NET لخدمة J2EE الخاصة بالمواعيد

5.1. عميل C# 2008

نفترض الآن أن خدمة الويب السابقة متاحة ونشطة. يمكن استخدام خدمة الويب من قبل عملاء مكتوبين بلغات برمجة مختلفة. سنقوم هنا بكتابة عميل وحدة التحكم بلغة C# لعرض قائمة الأطباء.

لنبدأ بإنشاء مشروع C#:

نقوم بإنشاء تطبيق وحدة التحكم [1] المسمى [ListeDesMedecins] [2]. في [3]، نقوم بإنشاء مرجع إلى خدمة ويب. هذه الأداة مشابهة لتلك المستخدمة في NetBeans: فهي تنشئ وكيلًا محليًّا لخدمة الويب البعيدة.

  • في [1]، يتم تحديد عنوان URI لملف WSDL الخاص بخدمة الويب (انظر الفقرة 4.10.2).
  • في [2]، يُطلب من المساعد اكتشاف خدمات الويب المعروضة على عنوان URI هذا
  • في [3]، يتم عرض خدمة الويب التي تم العثور عليها، وفي [4] يتم عرض الطرق التي توفرها.
  • في [5]، يتم تحديد مساحة الأسماء التي يجب أن تُنشأ فيها فئات الوكيل C
  • في [6]، يتم إنشاء الوكيل C.
  • في [1]، نجد الرابط الويب الذي أنشأناه للتو. انقر عليه نقرًا مزدوجًا.
  • في [2]، مستكشف الكائنات الذي تم فتحه بالنقر المزدوج.
  • في [3]، نختار مساحة الاسم [ListeDesMedecins.Ws.RdvMedecins] وهي مساحة الاسم للوكيل C الذي تم إنشاؤه. المصطلح الأول [ListeDesMedecins] هو مساحة الاسم الافتراضية لتطبيق C# الذي تم إنشاؤه (وقد أطلقنا عليه اسم ListeDesMedecins). أما المصطلح الثاني [Ws.Rdvmedecins] فهو مساحة الاسم التي أطلقناها على الوكيل C في المعالج. وفي النهاية، تكون كائنات الوكيل C ضمن مساحة الاسم [ListeDesMedecins.Ws.RdvMedecins].
  • في [4]، كائنات الوكيل C الذي تم إنشاؤه
  • في [5]، [WsDaoJpaClient] هي الفئة التي تنفذ محليًّا أساليب خدمة الويب البعيدة.
  • في [6]، طرق الفئة [WsDaoJpaClient]. ونجد فيها طرق خدمة الويب البعيدة، مثل الطريقة getAllClients في [7].

دعونا نلقي نظرة على كود الكيانات التي تم إنشاؤها:

في [1] أعلاه، نطلب عرض كود الفئة [client]:


...
    public partial class client : personne {
    }
    
....
    public partial class personne : object, System.ComponentModel.INotifyPropertyChanged {
    ...
        public long id {
       ...
        }
        
...
}

فيما سبق، لم نحتفظ سوى بالرمز الضروري لدراستنا.

  • السطر 2: الفئة [client] مشتقة من الفئة [personne] كما هو الحال في خدمة الويب.
  • السطر 8: خاصية عامة للفئة [personne]

ما نلاحظه هو أن الكود الذي تم إنشاؤه لا يتوافق مع معايير البرمجة المعتادة في لغة C#. يجب أن تبدأ أسماء الفئات والخصائص العامة بحرف كبير.

لنعد إلى تطبيق C# الخاص بنا:

[Program.cs] [1] هي فئة الاختبار. وكودها كما يلي:


using System;
using ListeDesMedecins.Ws.RdvMedecins;
using Client = ListeDesMedecins.Ws.RdvMedecins.client;

namespace ListeDesMedecins {
    class Program {
        static void Main(string[] args) {
            try {
                // إنشاء مثيل لطبقة [dao] الخاصة بالعميل
                WsDaoJpaClient dao = new WsDaoJpaClient();
                // قائمة الأطباء
                foreach (Client client in dao.getAllClients()) {
                    Console.WriteLine(String.Format("{0} {1} {2}", client.titre, client.prenom, client.nom));
                }
            } catch (Exception e) {
                Console.WriteLine(e);
            }
        }
    }
}

في السطر 12، يتم استخدام فئة [Client] الخاصة بالوكيل C، في حين أننا رأينا للتو أن اسمها في الواقع هو [client]. إن الإعلان الوارد في السطر 3 هو الذي يسمح لنا باستخدام [Client] بدلاً من [client]. وهذا يتيح لنا الالتزام بمعيار ترميز أسماء الفئات. وفي السطر 12 أيضًا، تُستخدم الطريقة [getAllClients] لأن هذا هو اسمها في الوكيل C. وتقتضي قواعد الترميز في لغة C# أن يُسمى هذا الاسم [GetAllClients].

يؤدي تشغيل البرنامج [1] السابق إلى النتائج الموضحة في [2].

5.2. أول عميل ASP.NET 2008

نقوم الآن بكتابة أول عميل ASP.NET / C# لعرض قائمة العملاء.

في هذه البنية، يوجد خادمان ويب:

  • الخادم الذي يقوم بتشغيل خدمة الويب البعيدة
  • الخادم الذي يقوم بتشغيل عميل ASP.NET الخاص بخدمة الويب البعيدة

سنقوم بإنشاء مشروع الويب الخاص بالعميل ASP.NET باستخدام إصدار Visual Web Express 2008 SP1. توضح الفقرة التالية كيفية إنشاء نفس المشروع في حالة عدم توفر إصدار Visual Web Express 2008 SP1.

نقوم بإنشاء تطبيق web [1, 2, 3] باسم [ListeDesClients1] [4,5,6]. يمكن رؤية المشروع الذي تم إنشاؤه بهذه الطريقة في [7].

  • في [5]، عن طريق النقر بزر الماوس الأيمن على اسم المشروع، يمكن إضافة مرجع لخدمة الويب.
  • في [6]، نحدد عنوان URI لملف WSDL الخاص بخدمة الويب (انظر الفقرة 4.10.2).
  • في [7]، يُطلب من المساعد اكتشاف خدمات الويب المعروضة على عنوان URI هذا
  • في [8]، يتم عرض خدمة الويب التي تم العثور عليها، وفي [9] يتم عرض الطرق التي تعرضها.
  • في [10]، يتم تحديد مساحة الأسماء التي يجب أن تُنشأ فيها فئات الوكيل C
  • في [11]، يتم عرض مرجع خدمة الويب الذي تم إنشاؤه

يؤدي النقر المزدوج على المرجع [Ws.Rdvmedecins] [12] إلى عرض الفئات والواجهات التي تم إنشاؤها للوكيل C:

  • في [1]، مستكشف الكائنات الذي تم فتحه بالنقر المزدوج.
  • في [2]، يتم تحديد مساحة الاسم [ListeDesClients1.Ws.RdvMedecins]، وهي مساحة الاسم للوكيل C الذي تم إنشاؤه. المصطلح الأول [ListeDesClients1] هو مساحة الاسم الافتراضية للتطبيق ASP.NET الذي تم إنشاؤه (وقد أطلقنا عليه اسم ListeDesClients1). أما المصطلح الثاني [Ws.Rdvmedecins] فهو مساحة الاسم التي أطلقناها على الوكيل C في المعالج. وفي النهاية، تكون كائنات الوكيل C ضمن مساحة الاسم [ListeDesClients1.Ws.RdvMedecins].
  • في [3]، كائنات الوكيل C التي تم إنشاؤها
  • في [4]، [WsDaoJpaService] هي الفئة التي تنفذ محليًّا أساليب خدمة الويب البعيدة.
  • في [5]، طرق الفئة [WsDaoJpaService]. ونجد فيها طرق خدمة الويب البعيدة مثل الطريقة getAllClients في [6].

دعونا نلقي نظرة على كود الكيانات التي تم إنشاؤها:

في [1] أعلاه، نطلب عرض كود الفئة [client]:


public partial class client : personne {
    }
    
...
    public partial class personne {
  ...
        public long id {
...
        }

فيما سبق، لم نحتفظ سوى بالرمز الضروري لدراستنا.

  • السطر 1: الفئة [client] مشتقة من الفئة [personne] كما هو الحال في خدمة الويب.
  • السطر 5: الفئة [personne]
  • السطر 7: خاصية عامة للفئة [personne]

نجد هنا كودًا مشابهًا للكود الذي تم شرحه سابقًا للعميل C# في الفقرة 5.1.

  • مساحة أسماء الوكيل C الذي تم إنشاؤه هي تلك المحددة في مساعد الإنشاء الخاص به، مسبوقة بمساحة أسماء مشروع الويب نفسه: ListeDesClients1.Ws.RdvMedecins
  • تسمى فئة الوكيل التي تنفذ محليًّا أساليب خدمة الويب البعيدة WsDaoJpaService.
  • تبدأ أسماء الفئات والخصائص بحرف صغير

يمكننا كتابة صفحة [Default.aspx] تعرض قائمة العملاء. الصفحة هي كما يلي:

رقم
النوع
الاسم
الدور
1
MultiView
طرق العرض
حاوية المشاهدات
2
عرض
VueClients
الطريقة التي تحتوي على قائمة العملاء
3
المكرر
RepeaterClients
يعرض قائمة العملاء في شكل قائمة ذات نقاط
4
عرض
VueErreurs
الطريقة التي تعرض بها أي أخطاء محتملة
5
التسمية
LabelErreur
نص الخطأ

رمز عرض هذه الصفحة هو كما يلي:


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ListeDesClients1._Default" %>

<%@ Import Namespace="ListeDesClients1.Ws.RdvMedecins" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title>Liste des clients</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:MultiView ID="Vues" runat="server">
      <asp:View ID="VueClients" runat="server">
        Liste des clients :<br />
        <br />
        <ul>
          <asp:Repeater ID="RepeaterClients" runat="server">
            <ItemTemplate>
              <li>
                <%#(Container.DataItem كعميل).الاسم%>,
                <%#(Container.DataItem كعميل).الاسم الأول%>
              </li>
            </ItemTemplate>
          </asp:Repeater>
        </ul>
      </asp:View>
      <asp:View ID="VuesErreurs" runat="server">
        L'erreur suivante s'est produite :<br />
        <br />
        <asp:Label ID="LabelErreur" runat="server"></asp:Label></asp:View>
    </asp:MultiView><br />
  </div>
  </form>
</body>
</html>

تجدر الإشارة، في السطر 3، إلى ضرورة استيراد مساحة الاسم [ListeDesClients1.Ws.RdvMedecins] من الوكيل C لخدمة الويب حتى يمكن الوصول إلى الفئة [client] في السطرين 20 و21.

رمز التحكم [Default.aspx.cs] المرتبط بصفحة العرض [Default.aspx] هو كما يلي:


using System;
using ListeDesClients1.Ws.RdvMedecins;

namespace ListeDesClients1
{
  public partial class _Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      try
      {
        // مثيل الوكيل المحلي للطبقة البعيدة [dao]
        WsDaoJpaService dao = new WsDaoJpaService();
        // عرض العميل
        Vues.ActiveViewIndex = 0;
        // تهيئة عرض العميل
        RepeaterClients.DataSource = dao.getAllClients();
        RepeaterClients.DataBind();
      }
      catch (Exception ex)
      {
        // عرض الأخطاء
        Vues.ActiveViewIndex = 1;
        //تهيئة عرض الأخطاء
        LabelErreur.Text = ex.ToString();
      }
    }
  }
}
  • السطر 8: يتم تنفيذ الطريقة Page_Load عند التحميل الأولي للصفحة. ويحدث هذا التحميل عند كل طلب من عميل يطلب الصفحة.
  • السطر 13: يتم إنشاء مثيل للوكيل المحلي C. يقوم هذا الوكيل C بتنفيذ واجهة خدمة الويب البعيدة. سيتواصل التطبيق مع هذا الوكيل C.
  • السطر 15: إذا لم تحدث أي استثناءات أثناء إنشاء مثيل الوكيل المحلي C، فيجب عرض العرض المسمى «VueClients»، c.a.d. الطريقة رقم 0 في «طرق العرض» لـ MultiView الخاصة بالصفحة.
  • السطر 17: مصدر بيانات répéteur هو قائمة العملاء التي توفرها الطريقة getAllClients للوكيل C.
  • السطر 23: في حالة حدوث استثناء أثناء إنشاء مثيل للوكيل المحلي C، يجب عرض العرض المسمى "VueErreursc.a.d. العرض رقم 1 في قسم «العروض» (Vues) الخاص بـ MultiView في الصفحة.
  • السطر 25: يتم عرض الاستثناء في label "LabelErreur".

يؤدي تشغيل مشروع الويب إلى النتيجة التالية:

5.3. عميل ثانٍ ASP.NET 2008

نقوم الآن بكتابة عميل ثانٍ ASP.NET / C#، ولكن هذه المرة باستخدام إصدار Visual Web Developer Express 2008 الذي سبق الإصدار SP1.

لنقم بإنشاء مشروع الويب الخاص بالعميل .NET:

نقوم بإنشاء موقع web [1, 2] يُسمى [ListeDesClients] [3].

  • في [4]، مشروع الويب
  • إلى [5]، ومن خلال النقر بزر الماوس الأيمن على اسم المشروع، نضيف مرجع خدمة كما تم سابقًا.
  • في [6]، المشروع بعد إضافة مرجع الخدمة الويب البعيدة

على عكس مشروع الويب SP1 الذي تمت دراسته سابقًا، لا يمكن الوصول إلى كائنات عميل خدمة الويب عبر مستكشف الكائنات.

ما يجب معرفته:

  • مساحة أسماء الوكيل C الذي تم إنشاؤه هي تلك المحددة في مساعد الإنشاء الخاص به: Ws.RdvMedecins
  • تسمى فئة الوكيل التي تنفذ محليًّا أساليب خدمة الويب البعيدة WsDaoJpaClient.
  • تبدأ أسماء الفئات والخصائص بحرف صغير

يمكننا كتابة صفحة [Default.aspx] تعرض قائمة العملاء. الصفحة هي كما يلي:

رقم
النوع
الاسم
الدور
1
MultiView
طرق العرض
حاوية المشاهدات
2
عرض
VueClients
الطريقة التي تحتوي على قائمة العملاء
3
المكرر
RepeaterClients
يعرض قائمة العملاء في شكل قائمة ذات نقاط
4
عرض
VueErreurs
الطريقة التي تعرض أي خطأ محتمل
5
التسمية
LabelErreur
نص الخطأ

رمز عرض هذه الصفحة هو كما يلي:


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="Ws.RdvMedecins" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Liste des clients</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:MultiView ID="Vues" runat="server">
                <asp:View ID="VueClients" runat="server">
                    Liste des clients :<br />
                    <br />
                    <ul>
                        <asp:Repeater ID="RepeaterClients" runat="server">
                            <ItemTemplate>
                                <li>
                                    <%#(Container.DataItem كعميل).الاسم%>, <%#(Container.DataItem كعميل).الاسم الأول%>
                                </li>
                            </ItemTemplate>
                        </asp:Repeater>
                    </ul>
                </asp:View>
                <asp:View ID="VuesErreurs" runat="server">
                    L'erreur suivante s'est produite :<br />
                    <br />
                    <asp:Label ID="LabelErreur" runat="server"></asp:Label></asp:View>
            </asp:MultiView><br />
        </div>
    </form>
</body>
</html>

تجدر الإشارة، في السطر 2، إلى ضرورة استيراد مساحة الاسم [Ws.RdvMedecins] من الوكيل C لخدمة الويب حتى يمكن الوصول إلى الفئة [client] الموجودة في السطر 19.

رمز التحكم [Default.aspx.cs] المرتبط بصفحة العرض [Default.aspx] هو كما يلي:


using System;
using Ws.RdvMedecins;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    try
    {
      // إنشاء مثيل وكيل محلي للطبقة البعيدة [dao]
      WsDaoJpaClient dao = new WsDaoJpaClient();
      // عرض العميل
      Vues.ActiveViewIndex = 0;
      // تهيئة عرض العميل
      RepeaterClients.DataSource = dao.getAllClients();
      RepeaterClients.DataBind();
    }
    catch (Exception ex)
    {
      // عرض الأخطاء
      Vues.ActiveViewIndex = 1;
      //تهيئة عرض الأخطاء
      LabelErreur.Text = ex.ToString();
    }
  }
}

هذا الرمز مشابه لرمز الإصدار السابق. يؤدي تنفيذ مشروع الويب إلى النتيجة التالية:

Image