5. کلاینتهای سرویس 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]، با دوبار کلیک، Object Explorer باز میشود.
- در [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 {
...
}
...
}
در بالا، ما تنها کد لازم برای تحلیل خود را حفظ کردهایم.
- خط ۲: کلاس [client] از کلاس [personne] ارث میبرد، همانطور که در سرویس وب است.
- خط ۸: یک خاصیت عمومی از کلاس [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);
}
}
}
}
در خط ۱۲، از کلاس پروکسی C به نام [Client] استفاده شده است، در حالی که همین الان دیدیم که نام واقعی آن در واقع [client] بود. اعلامیهای که در خط ۳ آمده است، به ما اجازه میدهد به جای [client] از [Client] استفاده کنیم. این امر به ما امکان میدهد تا با کنوانسیون نامگذاری کلاس مطابقت داشته باشیم. هنوز در خط ۱۲، متد [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 {
...
}
در بالا، ما تنها کد لازم برای تحلیل خود را حفظ کردهایم.
- خط ۱: کلاس [client] از کلاس [personne] ارث میبرد، همانطور که در سرویس وب است.
- خط ۵: کلاس [personne]
- خط ۷: یک ویژگی عمومی از کلاس [personne]
این کد مشابه کدی است که قبلاً برای کلاینت C# در بخش 5.1 مورد بحث قرار گرفته است.
- فضای نام پروکسی C تولیدشده همان چیزی است که در ویزارد ایجاد آن تعریف شده و با فضای نام خود پروژه وب پیشوند شده است: ListeDesClients1.Ws.RdvMedecins
- کلاس پروکسی که بهصورت محلی متدهای سرویس وب راه دور را پیادهسازی میکند، WsDaoJpaService نامیده میشود.
- نام کلاسها و ویژگیها با یک حرف کوچک آغاز میشوند
میتوانیم صفحهای به نام [Default.aspx] بنویسیم که فهرست کلاینتها را نمایش میدهد. این صفحه به شرح زیر است:
![]() |
خیر. | نوع | نام | نقش |
MultiView | نماها | مشاهده کانتینر | |
نما | VueClients | نما شامل لیست مشتریان | |
تکرارکننده | RepeaterClients | فهرست مشتریان را به صورت فهرست نقطهای نمایش میدهد | |
نما | VueErreurs | نمایانی که هرگونه خطا را نمایش میدهد | |
برچسب | LabelErreur | متن خطا |
کد HTML این صفحه به شرح زیر است:
<%@ 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 به عنوان مشتری).first_name%>
</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>
توجه کنید که در خط ۳، فضای نام [ListeDesClients1.Ws.RdvMedecins] از پروکسی C سرویس وب باید وارد شود تا کلاس [client] در خطوط ۲۰ و ۲۱ قابل دسترسی باشد.
کد کنترل [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();
}
}
}
}
- خط ۸: متد Page_Load هنگام بارگذاری اولیه صفحه اجرا میشود. این بارگذاری هر بار که کلاینت صفحه را درخواست میکند، انجام میشود.
- خط ۱۳: پروکسی محلی C نمونه سازی میشود. این پروکسی C رابط سرویس وب راه دور را پیادهسازی میکند. برنامه با این پروکسی C ارتباط برقرار خواهد کرد.
- خط ۱۵: اگر در حین نمونهسازی پروکسی محلی C هیچ استثنایی رخ ندهد، نمای با نام «VueClients» باید نمایش داده شود، c.a.d. نما شماره ۰ در بخش «نماها» (Views) صفحه MultiView.
- خط ۱۷: منبع داده برای répéteur فهرست مشتریان ارائهشده توسط متد getAllClients پروکسی C است.
- خط ۲۳: اگر هنگام نمونهسازی پروکسی محلی C استثنا رخ دهد، نمای با نام «VueErreurs» باید نمایش داده شود، c.a.d. نما شمارهٔ ۱ در بخش «نماها»ی MultiView صفحه.
- خط ۲۵: استثنا در label به صورت "LabelErreur" نمایش داده میشود.
اجرای پروژه وب نتیجه زیر را تولید میکند:
![]() |
5.3. یک کلاینت دوم ASP.NET (۲۰۰۸)
ما اکنون در حال نوشتن یک کلاینت دوم، ASP.NET / C#، هستیم، این بار با استفاده از Visual Web Developer Express 2008، که پیش از نسخه SP1 عرضه شده است.
![]() |
بیایید پروژه وب کلاینت .NET را ایجاد کنیم:
![]() |
ما یک سایت به نام web [1, 2] ایجاد میکنیم، با نام [ListeDesClients] [3].
![]() |
- در [4]، پروژه وب
- به [5]؛ با کلیک راست روی نام پروژه، یک مرجع سرویس اضافه کنید همانطور که قبلاً انجام دادید.
- در [6]، پروژه پس از افزودن ارجاع به سرویس وب راه دور
برخلاف پروژه وب SP1 که قبلاً بررسی شد، شما نمیتوانید از طریق Object Explorer به اشیاء کلاینت سرویس وب دسترسی پیدا کنید.
آنچه باید بدانید:
- فضای نام پروکسی C تولیدشده همان است که در جادوگر ایجاد آن تعریف شده است: Ws.RdvMedecins
- کلاس پروکسی که بهصورت محلی متدهای سرویس وب راه دور را پیادهسازی میکند، WsDaoJpaClient نام دارد.
- نام کلاسها و ویژگیها با یک حرف کوچک آغاز میشوند
میتوانیم صفحهای به نام [Default.aspx] بنویسیم تا فهرست کلاینتها را نمایش دهد. این صفحه به شرح زیر است:
![]() |
خیر. | نوع | نام | نقش |
MultiView | نماها | مشاهده کانتینر | |
نما | VueClients | نما حاوی فهرست مشتریان | |
تکرارکننده | RepeaterClients | فهرست مشتریان را به صورت فهرست نقطهای نمایش میدهد | |
نما | VueErreurs | نمایشی که هرگونه خطا را نمایش میدهد | |
برچسب | 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 as client).نام خانوادگی%>, <%#(Container.DataItem به عنوان کلاینت).first_name%>
</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>
توجه کنید که در خط ۲، فضای نام [Ws.RdvMedecins] از پروکسی وبسرویس C باید وارد شود تا کلاس [client] در خط ۱۹ قابل دسترسی باشد.
کد کنترل [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();
}
}
}
این کد با نسخه قبلی یکسان است. اجرای پروژه وب نتیجه زیر را تولید میکند:




















