Skip to content

3. مقدمه‌ای بر توسعه وب ASP.NET

3.1. Introduction

فصل پیشین اصول توسعه وب را تشریح کرد که از زبان برنامه‌نویسی مورد استفاده مستقل هستند. در حال حاضر، سه فناوری بر بازار توسعه وب تسلط دارند:

  • J2EE که یک پلتفرم توسعه جاوا است. پلتفرم J2EE که با فناوری Struts ترکیب شده و روی سرورهای برنامه‌های کاربردی مختلف نصب می‌شود، عمدتاً در پروژه‌های بزرگ‌مقیاس استفاده می‌شود. به دلیل زبان مورد استفاده – جاوا – یک برنامه J2EE می‌تواند روی تمام سیستم‌عامل‌های اصلی (ویندوز، یونیکس، لینوکس، مک OS و غیره) اجرا شود.
  • PHP که یک زبان تفسیرشده است، همچنین از نظر سیستم‌عامل مستقل است. برخلاف جاوا، این یک زبان شیءگرا نیست. با این حال، انتظار می‌رود نسخه PHP5 ویژگی‌های شیءگرایی را به این زبان اضافه کند. PHP که استفاده آسانی دارد، به طور گسترده در پروژه‌های کوچک و متوسط به کار می‌رود.
  • ASP.NET فناوری‌ای است که تنها روی ماشین‌های ویندوزی که پلتفرم .NET (XP، ۲۰۰۰، ۲۰۰۳ و غیره) را اجرا می‌کنند، اجرا می‌شود. زبان توسعه مورد استفاده می‌تواند هر زبان سازگار با .NET و c.a.d باشد. بیش از دوازده زبان از این دست وجود دارد، از زبان‌های مایکروسافت (C#، VB.NET، J#)، دلفی بورلند، پرل، پایتون و غیره.

فصل قبلی مثال‌های کوتاهی از هر یک از این سه فناوری ارائه داد. این سند بر توسعه وب ASP.NET با استفاده از زبان VB.NET تمرکز دارد. ما فرض می‌کنیم که خوانندگان با این زبان آشنا هستند. این نکته مهمی است. در اینجا، ما صرفاً به کاربرد آن در زمینه توسعه وب می‌پردازیم. بیایید با بحث در مورد روش‌شناسی توسعه وب MVC این نکته را توضیح دهیم.

یک برنامه وب که از مدل MVC پیروی می‌کند، به شکل زیر معماری خواهد شد:

Image

چنین معماری، که به عنوان معماری سه‌لایه یا سه‌سطحی شناخته می‌شود، هدف آن پایبندی به مدل MVC (مدل نما-کنترل‌کننده) است:

  • رابط کاربری V (نما) است
  • منطق برنامه C (کنترل‌کننده) است
  • منابع داده، M (مدل) هستند

رابط کاربری اغلب یک مرورگر وب است، اما می‌تواند یک برنامه مستقل باشد که درخواست‌ها را از طریق شبکه به سرویس وب ارسال کرده و نتایج دریافتی را قالب‌بندی می‌کند. منطق برنامه از اسکریپت‌هایی تشکیل شده است که درخواست‌های کاربر را پردازش می‌کنند. منبع داده اغلب یک پایگاه داده است، اما می‌تواند فایل‌های ساده‌ی تخت، یک دایرکتوری LDAP، یک سرویس وب از راه دور و غیره نیز باشد. در بهترین منافع توسعه‌دهنده است که استقلال بالایی بین این سه عنصر حفظ کند تا اگر یکی از آنها تغییر کند، دو عنصر دیگر نیازی به تغییر نداشته باشند یا تنها به حداقل تغییر نیاز داشته باشند.

  • منطق کسب‌وکار برنامه در کلاس‌هایی جدا از کلاسی که دیالوگ درخواست-پاسخ را کنترل می‌کند، قرار خواهد گرفت. بنابراین، بلوک [Logique applicative] بالا می‌تواند شامل عناصر زیر باشد:

Image

درون بلوک [Logique Applicative]، می‌توانیم تشخیص دهیم

  • کلاس کنترل‌کننده، که به‌عنوان نقطه ورود به برنامه عمل می‌کند،
  • بلوک [Classes métier]، که شامل کلاس‌های مورد نیاز برای منطق برنامه است. این‌ها مستقل از کلاینت هستند.
  • بلوک [Classes d'accès aux données]، که حاوی کلاس‌های مورد نیاز برای بازیابی داده‌های لازم برای سرولت است، که اغلب داده‌های پایدار هستند (BD، فایل‌ها، سرویس WEB و غیره).
  • بلوک صفحه ASP که نماهای برنامه را تشکیل می‌دهد.

در موارد ساده، منطق برنامه اغلب به دو کلاس کاهش می‌یابد:

  • کلاس کنترل‌کننده، که به ارتباط کلاینت-سرور رسیدگی می‌کند: پردازش درخواست و تولید پاسخ‌های مختلف
  • کلاس کسب‌وکار، که داده‌های پردازش‌شده را از کنترلر دریافت می‌کند و در مقابل نتایج را در اختیار آن قرار می‌دهد. این کلاس کسب‌وکار سپس خود دسترسی به داده‌های پایدار را مدیریت می‌کند.

ویژگی متمایز توسعه وب در نوشتن کلاس کنترل‌کننده و صفحات نمایشی نهفته است. کلاس‌های منطق کسب‌وکار و دسترسی به داده‌ها، کلاس‌های استاندارد .NET هستند که به همان آسانی در یک برنامه وب، در یک برنامه ویندوزی یا حتی یک برنامه کنسولی قابل استفاده هستند. نوشتن این کلاس‌ها نیازمند درک خوبی از برنامه‌نویسی شیءگرا است. در این سند، این کلاس‌ها به زبان VB.NET نوشته خواهند شد، بنابراین فرض می‌کنیم که خوانندگان در این زبان مهارت دارند. با در نظر گرفتن این موضوع، نیازی نیست بیش از حد لازم روی کد دسترسی به داده‌ها تمرکز کرد. در تقریباً تمام کتاب‌های مربوط به ASP.NET، یک فصل به ADO.NET اختصاص داده شده است. نمودار بالا نشان می‌دهد که دسترسی به داده‌ها به‌طور کامل توسط کلاس‌های استاندارد .NET انجام می‌شود که از قرار گرفتن در یک محیط وب بی‌خبرند. کنترلر، که به‌عنوان «سرگروه» اپلیکیشن وب عمل می‌کند، نیازی ندارد که خود را درگیر ADO.NET کند. این کنترلر صرفاً باید بداند از کدام کلاس داده‌های مورد نیاز خود را درخواست کند و چگونه این کار را انجام دهد. همین. قرار دادن کد ADO.NET در کنترلر با مفهوم MVC که در بالا توضیح داده شد، همخوانی ندارد و ما این کار را انجام نخواهیم داد.

3.2. ابزارها

این سند برای دانشجویان در نظر گرفته شده است، بنابراین ما با ابزارهای رایگانی که از اینترنت قابل دانلود هستند کار خواهیم کرد:

  • پلتفرم NET (کامپایلرها، مستندات)
  • محیط توسعه WebMatrix که شامل وب‌سرور Cassini است
  • ابزارهای مختلف SGBD (MSDE، MySQL)

از خوانندگان دعوت می‌شود تا به ضمیمه «ابزارهای وب» مراجعه کنند که توضیح می‌دهد این ابزارهای مختلف را کجا پیدا کرده و چگونه نصب کنند. در بیشتر موارد، تنها به سه ابزار نیاز خواهیم داشت:

  • یک ویرایشگر متن برای نوشتن برنامه‌های وب.
  • یک ابزار توسعه VB.NET برای نوشتن کد VB هنگامی که حجم آن قابل توجه است. این نوع ابزار معمولاً کمک به وارد کردن کد (تکمیل خودکار) ارائه می‌دهد و خطاهای نحوی را یا هنگام تایپ یا در حین کامپایل برجسته می‌کند.
  • یک وب‌سرور برای آزمایش برنامه‌های وب نوشته‌شده. در این سند از Cassini استفاده خواهد شد. خوانندگانی که سرور IIS را دارند می‌توانند Cassini را با IIS جایگزین کنند. هر دو با .NET سازگار هستند. با این حال، Cassini تنها به درخواست‌های محلی (localhost) پاسخ می‌دهد، در حالی که IIS می‌تواند به درخواست‌های ماشین‌های خارجی پاسخ دهد.

یک محیط تجاری عالی برای توسعه در VB.NET، ویژوال Studio.NET مایکروسافت است. این IDE بسیار غنی از امکانات به شما امکان می‌دهد تا انواع اسناد (کد VB.NET، اسناد HTML، XML، صفحات سبک و غیره) را مدیریت کنید. هنگام نوشتن کد، کمک بی‌نظیر تکمیل خودکار کد را ارائه می‌دهد. با این حال، در حالی که این ابزار بهره‌وری توسعه‌دهنده را به‌طور چشمگیری افزایش می‌دهد، نقاط قوت آن یک نقطه‌ضعف نیز دارد: توسعه‌دهنده را به یک حالت توسعهٔ استاندارد محدود می‌کند که هرچند قطعاً کارآمد است، اما همیشه مناسب نیست.

امکان استفاده از سرور Cassini خارج از [WebMatrix] وجود دارد و این کاری است که اغلب انجام خواهیم داد. فایل اجرایی سرور در <WebMatrix>\<version>\ قرار دارد.WebServer.exe، که در آن <WebMatrix> مسیر نصب [WebMatrix] و <version> شماره نسخه آن است:

Image

یک پنجره DOS را باز کرده و به پوشه سرور Cassini بروید:

E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>dir
...
29/05/2003  11:00               53 248 WebServer.exe
...

بیایید [WebServer.exe] را بدون هیچ پارامتری اجرا کنیم:

E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>webserver

Image

پنل بالا نشان می‌دهد که برنامه [WebServer/Cassini] سه پارامتر را می‌پذیرد:

  • /port: شماره پورت سرویس وب. می‌تواند هر مقداری باشد. مقدار پیش‌فرض 80 است
  • /path: مسیر فیزیکی یک پوشه روی دیسک
  • /vpath: پوشهٔ مجازی مرتبط با پوشهٔ فیزیکی قبلی.

ما مثال‌های خود را در یک ساختار درختی فایل با دایرکتوری ریشه P قرار می‌دهیم که شامل پوشه‌های chap1، chap2، … برای فصل‌های مختلف این سند است. ما مسیر مجازی V را با این پوشه فیزیکی P مرتبط خواهیم کرد. بنابراین، کاسینی را با استفاده از دستور DOS زیر راه‌اندازی خواهیم کرد:

dos> WebServer /port:80 /path:P vpath:V

برای مثال، اگر بخواهیم ریشه فیزیکی سرور پوشه [D:\data\devel\aspnet\poly] و ریشه مجازی آن [aspnet] باشد، دستور DOS برای راه‌اندازی وب‌سرور به این صورت خواهد بود:

dos> WebServer /port:80 /path:D:\data\devel\aspnet\poly vpath:/aspnet

شما می‌توانید این دستور را به عنوان یک میانبر ذخیره کنید. پس از راه‌اندازی، Cassini یک آیکون روی نوار وظیفه قرار می‌دهد. با دوبار کلیک روی آن، به پنل شروع/توقف سرور دسترسی پیدا می‌کنید:

Image

پنل سه پارامتری را که با آن‌ها راه‌اندازی شده است نمایش می‌دهد. این پنل دارای دو دکمه شروع/توقف و یک لینک آزمایشی به ریشه دایرکتوری وب آن است. ما این لینک را دنبال می‌کنیم. یک مرورگر باز می‌شود و صفحه URL [http://localhost/aspnet] درخواست می‌شود. ما محتویات پوشه‌ای را که در فیلد [Physical Path] بالا مشخص شده است، بازیابی می‌کنیم:

Image

در این مثال، URL درخواستی به جای یک سند وب، مربوط به یک پوشه است، بنابراین سرور به جای یک سند وب خاص، محتویات آن پوشه را نمایش داده است. اگر در این پوشه فایلی به نام [default.aspx] وجود داشته باشد، این فایل نمایش داده می‌شود. برای مثال، بیایید فایل زیر را ایجاد کرده و آن را در ریشه درخت وب Cassini (در این مورد d:\data\devel\aspnet\poly) قرار دهیم:

<html>
    <head>
        <title>Page d'entrée</title>
    </head>
    <body>
    Page d'index...
    </body>
</html>
dos>dir d:\data\devel\aspnet\poly\default.aspx
23/03/2004  18:21                  107 default.aspx

اکنون با استفاده از یک مرورگر وب، URL و [http://localhost/aspnet] را درخواست کنیم:

Image

می‌توانیم ببینیم که در واقع، URL و [http://localhost/aspnet/default.aspx] نمایش داده شده‌اند. بعداً در این سند، توضیح خواهیم داد که چگونه باید Cassini با استفاده از نگاشت Cassini(path,vpath) پیکربندی شود، که در آن [path] نام دایرکتوری ریشه ساختار دایرکتوری وب سرور و [vpath] مسیر مجازی مرتبط است. شایان ذکر است که در سرور Cassini(path,vpathURL [http://localhost/vpath/XX] با مسیر فیزیکی [path\XX] مطابقت دارد. ما تمام اسناد خود را در زیر یک دایرکتوری ریشهٔ فیزیکی قرار خواهیم داد که آن را <webroot> می‌نامیم. بنابراین می‌توانیم به فایل <webroot>\chap2\here1.aspx مراجعه کنیم. برای هر خواننده، این دایرکتوری <webroot> یک پوشه روی کامپیوتر خودشان خواهد بود. اسکرین‌شات‌های اینجا نشان می‌دهند که این پوشه اغلب [d:\data\devel\aspnet\poly] است. با این حال، این همیشه صادق نخواهد بود، زیرا آزمایش‌ها روی ماشین‌های مختلفی انجام شده‌اند.

3.3. مثال‌های اولیه

ما چند مثال ساده از صفحات وب پویا را که با استفاده از VB.NET ایجاد شده‌اند، ارائه خواهیم داد. از خوانندگان دعوت می‌شود تا این مثال‌ها را آزمایش کنند تا اطمینان حاصل کنند که محیط توسعه آن‌ها به درستی نصب شده است. در ادامه خواهیم دید که راه‌های مختلفی برای ساخت یک صفحه ASP.NET وجود دارد. ما یکی از این روش‌ها را برای ادامه کار توسعه خود انتخاب خواهیم کرد.

3.3.1. مثال پایه – گزینه‌ی ۱

ابزارهای مورد نیاز: یک ویرایشگر متن، وب‌سرور Cassini

ما از مثال فصل قبلی استفاده خواهیم کرد. ما فایل [heure1.aspx] زیر را ایجاد خواهیم کرد:

<html>
  <head>
      <title>Demo asp.net </title>
  </head>
  <body>
      Il est <% =Date.Now.ToString("T") %>
  </body>
</html>

این کد HTML با یک تگ ویژه <% ... %> است. در داخل این تگ می‌توانید کد VB.NET را درج کنید. در اینجا، کد

Date.Now.ToString("T")

یک رشته C تولید می‌کند که نمایانگر زمان فعلی است. سپس تگ <% ... %> با این رشته C جایگزین می‌شود. بنابراین، اگر C رشته 18:11:01 باشد، خط HTML که حاوی کد VB.NET است، به صورت زیر درمی‌آید:

      Il est 18:11:01

بیایید کد بالا را در فایل [<webroot>\chap2\heure1.aspx] قرار دهیم. بیایید Cassini را راه‌اندازی کنیم (<webroot>,/aspnet) و با استفاده از یک مرورگر فایل‌های URL و [http://localhost/aspnet/chap2/heure1.aspx] را درخواست کنیم:

Image

پس از به دست آوردن این نتیجه، می‌دانیم که محیط توسعه به درستی نصب شده است. صفحه [heure1.aspx] کامپایل شده است زیرا حاوی کد VB.NET است. کامپایل آن یک فایل DLL تولید کرد که در یک پوشه سیستمی ذخیره و سپس توسط سرور Cassini اجرا شد.

3.3.2. مثال پایه – نوع ۲

ابزارهای مورد نیاز: یک ویرایشگر متن، وب سرور Cassini

سند [heure1.aspx] کدهای HTML و VB.NET را با هم ترکیب می‌کند. در چنین مثال ساده‌ای، این یک مشکل نیست. اگر نیاز به درج کدهای VB.NET بیشتری داشته باشید، باید کد HTML را از کد VB بیشتر تفکیک کنید. این کار را می‌توان با قرار دادن کد VB درون یک تگ <script> انجام داد:

<script runat="server">
     'محاسبه داده‌ها برای نمایش توسط کد HTML
...
</script>
<html>
....
' نمایش مقادیر محاسبه شده توسط اسکریپت
</html>

مثال [heure2.aspx] این روش را نشان می‌دهد:

<script runat="server">
    Dim maintenant as String=Date.Now.ToString("T")
</script>
<html>
    <head>
        <title>Demo asp.net </title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

ما سند [heure2.aspx] را در ساختار دایرکتوری [<webroot>\chap2\heure2.aspx] روی وب‌سرور Cassini (<webroot>,/aspnet) قرار می‌دهیم و با استفاده از یک مرورگر، سند را درخواست می‌کنیم:

Image

3.3.3. مثال پایه – نسخه ۳

ابزارهای لازم: یک ویرایشگر متن، وب‌سرور Cassini

ما فرایند جداسازی کد VB و کد HTML را با قرار دادن آن‌ها در دو فایل جداگانه یک گام فراتر می‌بریم. کد HTML در سند [heure3.aspx] قرار خواهد گرفت و کد VB در [heure3.aspx.vb]. محتوای [heure3.aspx] به شرح زیر خواهد بود:


<%@ Page Language="vb" src="heure3.aspx.vb" Inherits="heure3" %>
<html>
    <head>
        <title>Demo asp.net</title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

دو تفاوت اساسی وجود دارد:

  • دستور [Page] با ویژگی‌هایی که هنوز ناشناخته‌اند
  • استفاده از متغیر [maintenant] در کد HTML، در حالی که در هیچ کجا مقداردهی نشده است

دستور [Page] در اینجا برای نشان دادن اینکه کد VB که صفحه را اولیه می‌کند، در فایلی دیگر قرار دارد، استفاده می‌شود. این ویژگی [src] است که این موضوع را مشخص می‌کند. خواهیم دید که کد VB متعلق به کلاسی به نام [heure3] است. به شکلی که برای توسعه‌دهنده شفاف است، یک فایل .aspx به کلاسی مشتق از یک کلاس پایه به نام [Page] تبدیل می‌شود. در اینجا، سند ما HTML باید از کلاسی مشتق شود که داده‌های قابل نمایش را تعریف و محاسبه می‌کند. در این مورد، این کلاس [heure3] است که در فایل [heure3.aspx.vb] تعریف شده است. بنابراین، ما باید این رابطه والد-فرزندی را بین اسناد VB و [heure3.aspx.vb]، و اسناد HTML و [heure3.aspx] مشخص کنیم. این ویژگی [inherits] است که این رابطه را مشخص می‌کند. این ویژگی باید نام کلاسی را که در فایلی تعریف شده و توسط ویژگی [src] ارجاع شده است، مشخص کند.

اکنون بیایید کد VB را در صفحه بررسی کنیم:

Public Class heure3
    Inherits System.Web.UI.Page

     'داده‌های صفحه وب برای نمایش
    Protected maintenant As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'داده‌های صفحه وب محاسبه می‌شود
        maintenant = Date.Now.ToString("T")
    End Sub
End Class

لطفاً به نکات زیر توجه کنید:

  • کد VB کلاسی به نام [heure3] را تعریف می‌کند که از کلاس [System.Web.UI.Page] مشتق شده است. این همیشه صادق است، زیرا یک صفحه وب باید همیشه از [System.Web.UI.Page] مشتق شود.
  • این کلاس یک ویژگی محافظت‌شده [maintenant] را اعلام می‌کند. ما می‌دانیم که یک ویژگی محافظت‌شده (protected) در کلاس‌های مشتق‌شده به طور مستقیم قابل دسترسی است. این همان چیزی است که به سند HTML [heure3.aspx] اجازه می‌دهد تا در کد خود به مقدار داده [maintenant] دسترسی داشته باشد.
  • ابتدایی‌سازی ویژگی [maintenant] در یک رویه [Page_Load] انجام می‌شود. بعداً خواهیم دید که یک شیء از نوع [Page] توسط وب‌سرور از تعدادی رویداد مطلع می‌شود. رویداد [Load] زمانی رخ می‌دهد که شیء [Page] و اجزای آن ایجاد شده باشند. دست‌پردازشگر این رویداد توسط دستور [Handles MyBase.Load] مشخص می‌شود
    Private Sub XX(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  • نام [XX]ِ رویدادپرداز می‌تواند هر چیزی باشد. با این حال، امضای آن باید همان‌طور که در بالا نشان داده شده باشد. در حال حاضر این موضوع را به تفصیل توضیح نمی‌دهیم.
  • روندپرداز رویداد [Page.Load] اغلب برای محاسبه مقادیر داده‌های پویا که باید در صفحه وب نمایش داده شوند، استفاده می‌شود.

اسناد [heure3.spx] و [heure3.aspx.vb] در داخل [<webroot>\chap2] قرار می‌گیرند. سپس، با استفاده از یک مرورگر، فایل‌های URL و [http://localhost/aspnet/chap2/heure3.aspx] را از سرور وب (<webroot>,/aspnet) درخواست می‌کنید:

Image

3.3.4. مثال پایه – واریانت ۴

ابزارهای لازم: یک ویرایشگر متن، وب‌سرور Cassini

ما از همان مثال قبلی استفاده خواهیم کرد، اما تمام کد را دوباره در یک فایل واحد [heure4.aspx] گروه‌بندی می‌کنیم:

<script runat="server">
     ' داده‌های صفحه وب برای نمایش
    Private maintenant As String

     'احتمالاً page_load
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'داده‌های صفحه وب محاسبه می‌شود
        maintenant = Date.Now.ToString("T")
    End Sub
</script>

<html>
    <head>
        <title>Demo asp.net</title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

ما توالی را از مثال ۲ می‌بینیم:

<script runat="server">
.... code VB
</script>

<html>
... code HTML
</html>

این بار، کد VB به رویه‌ها سازماندهی شده است. رویه [Page_Load] از مثال قبلی در اینجا گنجانده شده است. هدف در اینجا نشان دادن این است که یک صفحهٔ مستقل .aspx (که به کدی در VB در یک فایل جداگانه متصل نیست) به‌طور ضمنی به کلاسی مشتق‌شده از [Page] تبدیل می‌شود. بنابراین می‌توانیم از ویژگی‌ها، متدها و رویدادهای این کلاس استفاده کنیم. این کاری است که در اینجا انجام شده است، جایی که از رویداد [Load] این کلاس استفاده می‌کنیم.

روش تست با موارد قبلی یکسان است:

Image

3.3.5. مثال پایه – واریانت ۵

ابزارهای مورد نیاز: یک ویرایشگر متن، وب‌سرور Cassini

همانند مثال ۳، کد VB و کد HTML به دو فایل جداگانه تقسیم شده‌اند. کد VB در [heure5.aspx.vb] قرار داده شده است:

Public Class heure5
    Inherits System.Web.UI.Page

     ' داده‌های صفحه وب برای نمایش
    Protected maintenant As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'داده‌های صفحه وب محاسبه می‌شود
        maintenant = Date.Now.ToString("T")
    End Sub
End Class

کد HTML در داخل [heure5.aspx] قرار می‌گیرد:


<%@ Page Inherits="heure5" %>
<html>
    <head>
        <title>Demo asp.net</title>
    </head>
    <body>
        Il est
        <% =maintenant %>
    </body>
</html>

این بار، دستور [Page] دیگر پیوند بین کد HTML و کد VB را مشخص نمی‌کند. سرور وب دیگر نمی‌تواند کد VB را برای کامپایل کردن پیدا کند (ویژگی src وجود ندارد). انجام این کامپایل بر عهده ماست. بنابراین در یک پنجره DOS، کلاس‌های VB و [heure5.aspx.vb] را کامپایل می‌کنیم:

dos>dir
23/03/2004  18:34                  133 heure1.aspx
24/03/2004  09:47                  232 heure2.aspx
24/03/2004  10:16                  183 heure3.aspx
24/03/2004  10:16                  332 heure3.aspx.vb
24/03/2004  14:31                  440 heure4.aspx
24/03/2004  14:45                  332 heure5.aspx.vb
24/03/2004  14:56                  148 heure5.aspx
dos>vbc /r:system.dll /r:system.web.dll /t:library /out:heure5.dll heure5.aspx.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>dir heure5.dll
24/03/2004  14:51                3 072 heure5.dll

در بالا، فایل اجرایی کامپایلر [vbc.exe] در دایرکتوری PATH روی ماشین DOS قرار داشت. اگر این‌طور نبود، لازم بود مسیر کامل [vbc.exe] را که در درخت دایرکتوری محل نصب SDK.NET قرار دارد، مشخص کنیم. کلاس‌های مشتق‌شده از [Page] به منابعی که در DLL و [system.dll, system.web.dll] موجود هستند نیاز دارند، از این رو با استفاده از گزینه /r کامپایلر به آن‌ها ارجاع داده می‌شود. گزینه /t:library برای مشخص کردن تولید یک فایل DLL استفاده می‌شود. گزینه /out نام فایلی را که باید تولید شود مشخص می‌کند، که در این مورد [heure5.dll] است. این فایل حاوی کلاس [heure5] است که توسط سند وب [heure5.aspx] مورد نیاز است. با این حال، وب‌سرور فایل‌های DLL مورد نیاز خود را در مکان‌های بسیار مشخصی جستجو می‌کند. یکی از این مکان‌ها پوشه [bin] است که در ریشه درخت دایرکتوری آن قرار دارد. این ریشه همان چیزی است که ما آن را <webroot> نامیده‌ایم. برای سرور IIS، این معمولاً <drive>:\inetpub\wwwroot است، که در آن <drive> درایو (C، D، ...) که IIS روی آن نصب شده است. برای سرور Cassini، این ریشه با پارامتر /path که هنگام راه‌اندازی آن استفاده می‌شود، مطابقت دارد. به یاد داشته باشید که این مقدار را می‌توان با دوبار کلیک روی آیکون سرور در نوار وظیفه به دست آورد:

Image

<webroot> با ویژگی [Physical Path] در بالا مطابقت دارد. بنابراین، یک پوشه <webroot>\bin ایجاد کرده و [heure5.dll] را در داخل آن قرار می‌دهیم:

Image

آماده‌ایم. ما URL و [http://localhost/aspnet/chap2/heure5.aspx] را از سرور Cassini (<webroot>,/aspnet) درخواست می‌کنیم:

Image

3.3.6. مثال پایه – واریانت ۶

ابزارهای لازم: یک ویرایشگر متن، وب‌سرور Cassini

تا اینجا نشان داده‌ایم که یک برنامه وب پویا دو مؤلفه دارد:

  1. کد VB برای محاسبه بخش‌های پویا صفحه
  2. کد HTML که گاهی ممکن است شامل کد VB برای نمایش این مقادیر در صفحه باشد. این بخش نمایانگر پاسخی است که به کلاینت وب ارسال می‌شود.

جزء اول، جزء کنترل‌کننده صفحه و جزء دوم، جزء ارائه نامیده می‌شود. جزء ارائه باید کمترین مقدار ممکن کد VB را در خود داشته باشد، یا در واقع اصلاً هیچ کد VB در آن وجود نداشته باشد. خواهیم دید که این امر امکان‌پذیر است. در اینجا، مثالی را نشان می‌دهیم که در آن تنها یک کنترلر وجود دارد و هیچ مؤلفهٔ نمایشی وجود ندارد. خودِ کنترلر است که بدون کمک مؤلفهٔ نمایشی، پاسخ را برای کلاینت تولید می‌کند.

کد ارائه به صورت زیر درمی‌آید:

 <%@ Page src="heure6.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="heure6" %>

می‌توانیم ببینیم که دیگر هیچ کد HTML در آن وجود ندارد. پاسخ مستقیماً در کنترلر تولید می‌شود:

Public Class heure6
    Inherits System.Web.UI.Page

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'پاسخ تولید می‌شود
        Dim HTML As String
        HTML = "<html><head><title>heure6</title></head><body>Il est "
        HTML += Date.Now.ToString("T")
        HTML += "</body></html>"
         'ارسال آن
        Response.Write(HTML)
    End Sub
End Class

در اینجا، کنترل‌کننده کل پاسخ را تولید می‌کند، نه فقط بخش‌های پویا آن. علاوه بر این، آن را ارسال می‌کند. این کار را با استفاده از خاصیت [Response]، از نوع [HttpResponse]، که متعلق به کلاس [Page] است، انجام می‌دهد. این یک شیء است که پاسخ سرور را به کلاینت نشان می‌دهد. کلاس [HttpResponse] دارای متدی به نام [Write] برای نوشتن در استریم HTML است که به کلاینت ارسال خواهد شد. در اینجا، کل جریان HTML را که باید ارسال شود، در متغیر [HTML] ذخیره کرده و آن را از طریق [Response.Write(HTML)] برای کلاینت ارسال می‌کنیم.

ما URL [http://localhost/aspnet/chap2/heure6.aspx] را از سرور Cassini (<webroot>,/aspnet) درخواست می‌کنیم:

Image

3.3.7. نتیجه‌گیری

ما سپس از روش ۳ استفاده خواهیم کرد که کد VB و کد HTML را از یک سند وب پویا در دو فایل جداگانه قرار می‌دهد. این روش مزیت تقسیم یک صفحه وب به دو مؤلفه را دارد:

  1. یک مؤلفه کنترل‌کننده که صرفاً از کد VB برای محاسبه بخش‌های پویا صفحه تشکیل شده است
  2. یک مؤلفه ارائه، که پاسخی است که به کلاینت ارسال می‌شود. این مؤلفه شامل کد HTML است، که گاهی شامل کد VB برای نمایش مقادیر پویا نیز می‌شود. ما همواره تلاش می‌کنیم تا کمترین مقدار کد VB را در لایهٔ ارائه داشته باشیم؛ در حالت ایده‌آل، اصلاً نباید کدی وجود داشته باشد.

همانطور که در روش ۵ نشان داده شده است، کنترلر را می‌توان به طور مستقل از برنامه وب کامپایل کرد. این مزیت را دارد که به ما اجازه می‌دهد تا صرفاً بر روی کد تمرکز کنیم و در هر بار کامپایل، فهرستی از تمام خطاها را دریافت کنیم. پس از کامپایل شدن کنترلر، می‌توان اپلیکیشن وب را آزمایش کرد. بدون کامپایل اولیه، وب سرور این کار را انجام می‌دهد و خطاها یکی یکی گزارش خواهند شد. این کار ممکن است خسته‌کننده تلقی شود.

برای مثال‌های زیر، ابزارهای زیر کافی هستند:

  • یک ویرایشگر متن برای ایجاد اسناد HTML و VB برنامه زمانی که ساده هستند
  • یک ابزار توسعه مانند IDE برای تولید کلاس‌های VB.NET، به منظور بهره‌مندی از کمک‌هایی که این نوع ابزار هنگام نوشتن کد ارائه می‌دهد. یکی از این ابزارها، برای مثال، CSharpDevelop (http://www.icsharpcode.net) است. مثالی از کاربرد آن در ضمیمه [Les outils du développement web] نشان داده شده است.
  • ابزار WebMatrix برای ساخت صفحات نمایش برنامه (رجوع کنید به ضمیمه [Les outils du développement web]).
  • سرور کاسینی

تمام این ابزارها رایگان هستند.