Skip to content

3. Wprowadzenie do tworzenia stron internetowych ASP.NET

3.1. Introduction

W poprzednim rozdziale przedstawiono zasady tworzenia stron internetowych, które są niezależne od używanego języka programowania. Obecnie na rynku tworzenia stron internetowych dominują trzy technologie:

  • J2EE, która jest platformą programistyczną opartą na Javie. W połączeniu z technologią Struts, zainstalowaną na różnych serwerach aplikacji, platforma J2EE jest wykorzystywana głównie w dużych projektach. Ze względu na używany język – Java – aplikacja J2EE może działać na głównych systemach operacyjnych (Windows, Unix, Linux, Mac OS itp.)
  • PHP, który jest językiem interpretowanym, również niezależnym od systemu operacyjnego. W przeciwieństwie do Javy nie jest to język obiektowy. Jednak wersja PHP5 powinna wprowadzić obiekty do tego języka. Łatwy w obsłudze, PHP jest szeroko stosowany w małych i średnich projektach.
  • ASP.NET to technologia działająca wyłącznie na komputerach z systemem Windows wyposażonych w platformę .NET (XP, 2000, 2003, ...). Językiem programowania może być dowolny język zgodny z platformą .NET, c.a.d. Jest ich ponad dziesięć, począwszy od języków firmy Microsoft (C#, VB.NET, J#), Delphi firmy Borland, Perla, Pythona...

W poprzednim rozdziale przedstawiono krótkie przykłady dotyczące każdej z tych trzech technologii. Niniejszy dokument skupia się na tworzeniu stron internetowych ASP.NET przy użyciu języka VB.NET. Zakładamy, że język ten jest znany. Jest to istotna kwestia. W niniejszym dokumencie skupiamy się wyłącznie na jego zastosowaniu w kontekście tworzenia stron internetowych. Wyjaśnijmy tę kwestię bardziej szczegółowo, omawiając metodologię tworzenia stron internetowych MVC.

Aplikacja internetowa zgodna z modelem MVC będzie miała następującą architekturę:

Image

Taka architektura, zwana trójwarstwową lub trójpoziomową, ma na celu zgodność z modelem MVC (Model View Controller):

  • interfejs użytkownika to V (widok)
  • logika aplikacji to C (kontroler)
  • źródła danych to M (model)

Interfejsem użytkownika jest często przeglądarka internetowa, ale może to być również aplikacja autonomiczna, która za pośrednictwem sieci wysyła zapytania HTTP do serwisu internetowego i formatuje wyniki, które ten jej przesyła. Logika aplikacji składa się ze skryptów przetwarzających żądania użytkownika. Źródłem danych jest często baza danych, ale mogą to być również proste pliki tekstowe, katalog LDAP, zdalna usługa internetowa... Programista powinien dążyć do zachowania dużej niezależności między tymi trzema elementami, tak aby w przypadku zmiany jednego z nich pozostałe dwa nie musiały ulegać zmianom lub zmiany te były minimalne.

  • Logikę biznesową aplikacji umieści się w klasach oddzielonych od klasy kontrolującej dialog żądanie-odpowiedź. W ten sposób powyższy blok [Logique applicative] może składać się z następujących elementów:

Image

W bloku [Logique Applicative] można wyróżnić

  • klasę kontrolera, która stanowi punkt wejścia do aplikacji,
  • blok [Classes métier], który obejmuje klasy niezbędne do logiki aplikacji. Są one niezależne od klienta.
  • blok [Classes d'accès aux données], który zawiera klasy niezbędne do pozyskania danych potrzebnych serwletowi, często danych trwałych (BD, pliki, usługa WEB, ...)
  • blok stron ASP, tworzący widoki aplikacji.

W prostych przypadkach logika aplikacji sprowadza się często do dwóch klas:

  • klasa kontrolera zapewniająca komunikację między klientem a serwerem: przetwarzanie żądania, generowanie różnych odpowiedzi
  • klasa biznesowa, która otrzymuje od kontrolera dane do przetworzenia i przekazuje mu w zamian wyniki. Ta klasa biznesowa sama zarządza wówczas dostępem do danych trwałych.

Specyfika tworzenia aplikacji internetowych polega na pisaniu klasy kontrolera oraz stron prezentacyjnych. Klasy biznesowe i klasy dostępu do danych są klasycznymi klasami .NET, które można wykorzystać zarówno w aplikacji internetowej, jak i w aplikacji dla systemu Windows, a nawet w aplikacji konsolowej. Pisanie tych klas wymaga dobrej znajomości programowania obiektowego. W niniejszym dokumencie klasy te będą napisane w języku VB.NET, dlatego zakładamy, że czytelnik opanował ten język. W związku z tym nie ma potrzeby rozpisywania się bardziej niż to konieczne na temat kodu zapewniającego dostęp do danych. W niemal wszystkich książkach poświęconych językowi ASP.NET jeden z rozdziałów poświęcony jest ADO.NET. Powyższy schemat pokazuje, że dostęp do danych odbywa się za pośrednictwem całkowicie klasycznych klas .NET, które nie są świadome, że są wykorzystywane w kontekście internetowym. Kontroler, który pełni rolę kierownika zespołu w aplikacji internetowej, nie musi martwić się o ADO.NET. Musi po prostu wiedzieć, do której klasy ma zwrócić się o potrzebne dane i w jaki sposób to zrobić. To wszystko. Umieszczanie kodu ADO.NET w kontrolerze nie jest zgodne z koncepcją MVC wyjaśnioną powyżej i nie będziemy tego robić.

3.2. Narzędzia

Niniejszy dokument jest przeznaczony dla studentów, dlatego będziemy korzystać z bezpłatnych narzędzi dostępnych do pobrania w Internecie:

  • platforma .NET (kompilatory, dokumentacja)
  • środowisko programistyczne WebMatrix, które zawiera serwer WWW Cassini
  • różne narzędzia SGBD (MSDE, MySQL)

Zachęcamy czytelnika do zapoznania się z załącznikiem „Narzędzia internetowe”, w którym wskazano, gdzie można znaleźć i jak zainstalować te różne narzędzia. W większości przypadków potrzebne będą tylko trzy narzędzia:

  • edytor tekstu do pisania aplikacji internetowych;
  • narzędzie programistyczne VB.NET do pisania kodu VB, gdy jest on obszerny. Tego typu narzędzie zazwyczaj oferuje pomoc przy wpisywaniu kodu (automatyczne uzupełnianie kodu) oraz sygnalizację błędów składniowych – albo już podczas wpisywania kodu, albo podczas kompilacji.
  • serwer internetowy do testowania napisanych aplikacji internetowych. W niniejszym dokumencie wykorzystamy Cassini. Czytelnik dysponujący serwerem IIS może zastąpić Cassini serwerem IIS. Oba są kompatybilne z .NET. Cassini ma jednak ograniczenie polegające na obsłudze wyłącznie żądań lokalnych (localhost), podczas gdy IIS może odpowiadać na żądania z komputerów zewnętrznych.

Doskonałym środowiskiem komercyjnym do programowania w VB.NET jest Visual Studio.NET firmy Microsoft. To bardzo rozbudowane narzędzie IDE pozwala zarządzać wszelkiego rodzaju dokumentami (kod VB.NET, dokumenty HTML, XML, arkusze stylów itp.). Podczas pisania kodu zapewnia ono cenne wsparcie w postaci automatycznego „uzupełniania” kodu. Niemniej jednak to narzędzie, które znacznie poprawia wydajność programisty, ma wadę wynikającą z jego zalet: ogranicza programistę do standardowego trybu programowania, który jest co prawda skuteczny, ale nie zawsze odpowiedni.

Możliwe jest korzystanie z serwera Cassini poza środowiskiem [WebMatrix] i będziemy to często robić. Plik wykonywalny serwera znajduje się w <WebMatrix>\<wersja>\WebServer.exe, gdzie <WebMatrix> to katalog instalacyjny [WebMatrix], a <version> to numer wersji:

Image

Otwórzmy okno wiersza poleceń i przejdźmy do folderu serwera Cassini:

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

Uruchommy program [WebServer.exe] bez żadnych parametrów:

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

Image

Powyższy panel wskazuje, że aplikacja [WebServer/Cassini] akceptuje trzy parametry:

  • /port: numer portu serwisu internetowego. Może to być dowolna wartość. Domyślnie jest to 80
  • /path: fizyczna ścieżka do folderu na dysku
  • /vpath: folder wirtualny powiązany z poprzednim folderem fizycznym.

Nasze przykłady umieścimy w drzewie plików o katalogu głównym P, zawierającym foldery chap1, chap2, ... odpowiadające poszczególnym rozdziałom niniejszego dokumentu. Z tym fizycznym katalogiem P powiążemy ścieżkę wirtualną V. Uruchomimy więc Cassini za pomocą następującego polecenia DOS:

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

Na przykład, jeśli chcemy, aby fizycznym katalogiem głównym serwera był katalog [D:\data\devel\aspnet\poly], a jego wirtualnym katalogiem głównym [aspnet], polecenie DOS uruchamiające serwer WWW będzie brzmiało:

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

Polecenie to można umieścić w skrócie. Po uruchomieniu Cassini umieszcza ikonę na pasku zadań. Po dwukrotnym kliknięciu na nią uzyskuje się dostęp do panelu włączania/wyłączania serwera:

Image

Panel wyświetla trzy parametry, z którymi został uruchomiony. Zawiera dwa przyciski do włączania i wyłączania oraz link testowy prowadzący do katalogu głównego drzewa stron internetowych. Klikamy ten link. Otwiera się przeglądarka i wyświetla się strona URL [http://localhost/aspnet]. Otrzymujemy zawartość folderu wskazanego w polu [Physical Path] powyżej:

Image

W tym przykładzie żądany adres URL odnosi się do folderu, a nie do dokumentu internetowego, dlatego serwer wyświetlił zawartość tego folderu, a nie konkretnego dokumentu internetowego. Jeśli w tym folderze znajduje się plik o nazwie [default.aspx], zostanie on wyświetlony. Utwórzmy na przykład następujący plik i umieśćmy go w katalogu głównym drzewa katalogów serwisu Cassini (w tym przypadku 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

Teraz wywołajmy URL [http://localhost/aspnet] za pomocą przeglądarki:

Image

Widać, że w rzeczywistości wyświetlono pliki URL i [http://localhost/aspnet/default.aspx]. W dalszej części dokumentu wyjaśnimy, jak należy skonfigurować serwer Cassini, stosując notację Cassini(path,vpath), gdzie [path] to nazwa katalogu głównego drzewa katalogów serwera, a [vpath] to powiązana ścieżka wirtualna. Należy pamiętać, że w przypadku serwera Cassini(path,vpath) adres URL [http://localhost/vpath/XX] odpowiada ścieżce fizycznej [path\XX]. Wszystkie nasze dokumenty umieścimy w katalogu głównym, który nazwiemy <webroot>. W ten sposób będziemy mogli odwoływać się do pliku <webroot>\chap2\here1.aspx. Dla każdego czytelnika ten katalog główny <webroot> będzie folderem na jego komputerze. Zrzuty ekranu pokazują, że folder ten często nosi nazwę [d:\data\devel\aspnet\poly]. Nie zawsze jednak tak będzie, ponieważ testy przeprowadzono na różnych komputerach.

3.3. Pierwsze przykłady

Przedstawimy proste przykłady dynamicznej strony internetowej utworzonej za pomocą pliku VB.NET. Zachęcamy czytelnika do przetestowania ich w celu sprawdzenia, czy jego środowisko programistyczne jest poprawnie zainstalowane. Przekonamy się, że istnieje kilka sposobów tworzenia strony ASP.NET. Wybierzemy jeden z nich do dalszych prac.

3.3.1. Podstawowy przykład – wariant 1

Niezbędne narzędzia: edytor tekstu, serwer WWW Cassini

Wracamy do przykładu z poprzedniego rozdziału. Tworzymy następujący plik [heure1.aspx]:

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

Ten kod to kod HTML ze specjalnym tagiem <% ... %>. Wewnątrz tego tagu można umieścić kod VB.NET. Tutaj kod

Date.Now.ToString("T")

generuje ciąg znaków C reprezentujący aktualną godzinę. Tag <% ... %> jest następnie zastępowany tym ciągiem znaków C. Jeśli więc C to ciąg 18:11:01, wiersz HTML zawierający kod VB.NET przyjmuje postać:

      Il est 18:11:01

Umieśćmy powyższy kod w pliku [<webroot>\chap2\heure1.aspx]. Uruchommy Cassini (<webroot>,/aspnet) i wywołajmy w przeglądarce adres URL [http://localhost/aspnet/chap2/heure1.aspx]:

Image

Po uzyskaniu tego wyniku wiemy, że środowisko programistyczne zostało poprawnie zainstalowane. Strona [heure1.aspx] została skompilowana, ponieważ zawiera kod VB.NET. Jej kompilacja spowodowała utworzenie pliku DLL, który został zapisany w folderze systemowym, a następnie uruchomiony przez serwer Cassini.

3.3.2. Podstawowy przykład – wariant 2

Wymagane narzędzia: edytor tekstu, serwer WWW Cassini

Dokument [heure1.aspx] zawiera zarówno kod HTML, jak i kod VB.NET. W tak prostym przykładzie nie stanowi to problemu. Jeśli jednak zajdzie potrzeba dołączenia większej ilości kodu VB.NET, warto jeszcze bardziej oddzielić kod HTML od kodu VB. Można to osiągnąć, umieszczając kod VB wewnątrz tagu <script>:

<script runat="server">
     ' obliczanie danych do wyświetlenia przez kod HTML
...
</script>
<html>
....
' wyświetlanie obliczonych wartości przez skrypt
</html>

Przykład [heure2.aspx] ilustruje tę metodę:

<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>

Umieszczamy dokument [heure2.aspx] w drzewie katalogów [<webroot>\chap2\heure2.aspx] na serwerze WWW Cassini (<webroot>,/aspnet) i wywołujemy ten dokument za pomocą przeglądarki:

Image

3.3.3. Podstawowy przykład – wariant 3

Potrzebne narzędzia: edytor tekstu, serwer WWW Cassini

Idziemy o krok dalej w procesie rozdzielenia kodu VB od kodu HTML, umieszczając je w dwóch oddzielnych plikach. Kod HTML znajdzie się w dokumencie [heure3.aspx], a kod VB w dokumencie [heure3.aspx.vb]. Treść dokumentu [heure3.aspx] będzie następująca:


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

Istnieją dwie zasadnicze różnice:

  • dyrektywa [Page] z atrybutami, których znaczenie nie jest jeszcze znane
  • wykorzystanie zmiennej [maintenant] w kodzie HTML, mimo że nie została ona nigdzie zainicjowana

Dyrektywa [Page] służy tutaj do wskazania, że kod VB, który zainicjuje stronę, znajduje się w innym pliku. To właśnie atrybut [src] wskazuje ten ostatni. Przekonamy się, że kod VB należy do klasy o nazwie [heure3]. W sposób niewidoczny dla programisty plik .aspx jest przekształcany w klasę wywodzącą się z klasy bazowej o nazwie [Page]. W tym przypadku nasz dokument HTML musi pochodzić od klasy, która definiuje i oblicza dane, które ma wyświetlać. W tym przypadku jest to klasa [heure3] zdefiniowana w pliku [heure3.aspx.vb]. Należy również wskazać powiązanie nadrzędno-podrzędne między dokumentami VB i [heure3.aspx.vb] a dokumentami HTML i [heure3.aspx]. To właśnie atrybut [inherits] określa ten związek. Musi on wskazywać nazwę klasy zdefiniowanej w pliku, do którego odwołuje się atrybut [src].

Przeanalizujmy teraz kod VB ze strony:

Public Class heure3
    Inherits System.Web.UI.Page

     ' dane strony internetowej do wyświetlenia
    Protected maintenant As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'obliczanie danych strony internetowej
        maintenant = Date.Now.ToString("T")
    End Sub
End Class

Należy zwrócić uwagę na następujące kwestie:

  • kod VB definiuje klasę [heure3] wywodzącą się z klasy [System.Web.UI.Page]. Tak jest zawsze, ponieważ strona internetowa musi zawsze wywodzić się z klasy [System.Web.UI.Page].
  • klasa deklaruje atrybut chroniony (protected) o nazwie [maintenant]. Wiadomo, że atrybut chroniony jest dostępny bezpośrednio w klasach pochodnych. To właśnie pozwala dokumentowi HTML [heure3.aspx] uzyskać dostęp do wartości danych [maintenant] w swoim kodzie.
  • Inicjalizacja atrybutu [maintenant] odbywa się w procedurze [Page_Load]. Później zobaczymy, że obiekt typu [Page] jest powiadamiany przez serwer WWW o pewnej liczbie zdarzeń. Zdarzenie [Load] ma miejsce, gdy obiekt [Page] i jego komponenty zostały utworzone. Obsługa tego zdarzenia jest określona przez dyrektywę [Handles MyBase.Load]
    Private Sub XX(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  • nazwa menedżera zdarzenia [XX] może być dowolna. Jego sygnatura musi jednak być zgodna z podaną powyżej. Na razie nie będziemy jej wyjaśniać.
  • Często wykorzystuje się menedżera zdarzenia [Page.Load] do obliczania wartości danych dynamicznych, które ma wyświetlać strona internetowa.

Dokumenty [heure3.spx] i [heure3.aspx.vb] są umieszczone w [<webroot>\chap2]. Następnie za pomocą przeglądarki wysyła się żądanie do serwera WWW (<webroot>,/aspnet) dotyczące plików URL i [http://localhost/aspnet/chap2/heure3.aspx]:

Image

3.3.4. Podstawowy przykład – wariant 4

Potrzebne narzędzia: edytor tekstu, serwer WWW Cassini

Zachowujemy ten sam przykład co poprzednio, ale ponownie umieszczamy cały kod w jednym pliku [heure4.aspx]:

<script runat="server">
     ' dane strony internetowej do wyświetlenia
    Private maintenant As String

     ' ewentualnie page_load
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         '– obliczanie danych strony internetowej
        maintenant = Date.Now.ToString("T")
    End Sub
</script>

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

Mamy tu sekwencję z przykładu 2:

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

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

Tym razem kod VB został podzielony na procedury. Znajduje się tu procedura [Page_Load] z poprzedniego przykładu. Chcemy tutaj pokazać, że sama strona .aspx (niepowiązana z kodem VB w oddzielnym pliku) jest domyślnie przekształcana w klasę pochodną od [Page]. Można zatem korzystać z atrybutów, metod i zdarzeń tej klasy. Tak właśnie postąpiono w tym przypadku, wykorzystując zdarzenie [Load] tej klasy.

Metoda testowa jest identyczna jak w poprzednich przypadkach:

Image

3.3.5. Podstawowy przykład – wariant 5

Potrzebne narzędzia: edytor tekstu, serwer WWW Cassini

Podobnie jak w przykładzie 3, kod VB i kod HTML umieszczamy w dwóch oddzielnych plikach. Kod VB umieszczamy w pliku [heure5.aspx.vb]:

Public Class heure5
    Inherits System.Web.UI.Page

     ' dane strony internetowej do wyświetlenia
    Protected maintenant As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         'obliczane  dane strony internetowej
        maintenant = Date.Now.ToString("T")
    End Sub
End Class

Kod HTML jest umieszczony w [heure5.aspx]:


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

Tym razem dyrektywa [Page] nie wskazuje już powiązania między kodem HTML a kodem VB. Serwer WWW nie ma już możliwości odnalezienia kodu VB w celu jego skompilowania (brak atrybutu src). To my musimy przeprowadzić tę kompilację. W oknie wiersza poleceń kompilujemy zatem klasę 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

Powyżej plik wykonywalny kompilatora [vbc.exe] znajdował się w pliku PATH na komputerze z systemem DOS. Gdyby tak nie było, należałoby podać pełną ścieżkę do pliku [vbc.exe], który znajduje się w drzewie katalogów folderu, w którym zainstalowano plik SDK.NET. Klasy pochodne od pliku [Page] wymagają zasobów zawartych w plikach DLL i [system.dll, system.web.dll], stąd odwołanie do nich za pomocą opcji /r kompilatora. Opcja /t:library służy do wskazania, że chcemy wygenerować plik DLL. Opcja /out określa nazwę generowanego pliku, w tym przypadku [heure5.dll]. Plik ten zawiera klasę [heure5], której potrzebuje dokument internetowy [heure5.aspx]. Serwer internetowy szuka jednak potrzebnych mu plików DLL w ściśle określonych lokalizacjach. Jednym z tych miejsc jest folder [bin] znajdujący się w katalogu głównym jego drzewa katalogów. Ten katalog główny to to, co nazwaliśmy <webroot>. W przypadku serwera IIS jest to zazwyczaj <dysk>:\inetpub\wwwroot, gdzie <dysk> to dysk (C, D, ...) na którym zainstalowano IIS. W przypadku serwera Cassini ten katalog główny odpowiada parametrowi /path, z którym uruchomiono serwer. Przypomnijmy, że wartość tę można uzyskać, klikając dwukrotnie ikonę serwera na pasku zadań:

Image

<webroot> odpowiada powyższemu atrybutowi [Physical Path]. Tworzymy zatem folder <webroot>\bin i umieszczamy w nim plik [heure5.dll]:

Image

Jesteśmy gotowi. Wysyłamy żądanie dotyczące plików URL i [http://localhost/aspnet/chap2/heure5.aspx] do serwera Cassini (<webroot>,/aspnet):

Image

3.3.6. Podstawowy przykład – wariant 6

Potrzebne narzędzia: edytor tekstu, serwer WWW Cassini

Jak dotąd pokazaliśmy, że dynamiczna aplikacja internetowa składa się z dwóch elementów:

  1. kod VB do obliczania dynamicznych części strony
  2. kod HTML, zawierający czasami kod VB służący do wyświetlania tych wartości na stronie. Ta część stanowi odpowiedź wysyłaną do klienta internetowego.

Komponent 1 nazywany jest komponentem kontrolera strony, a część 2 – komponentem prezentacji. Część prezentacji powinna zawierać jak najmniej kodu VB, a nawet w ogóle nie zawierać kodu VB. Zobaczymy, że jest to możliwe. Tutaj przedstawiamy przykład, w którym występuje tylko kontroler, a nie ma komponentu prezentacyjnego. To kontroler samodzielnie generuje odpowiedź dla klienta bez pomocy komponentu prezentacyjnego.

Kod prezentacji wygląda następująco:

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

Widać, że nie ma w nim już żadnego kodu HTML. Odpowiedź jest generowana bezpośrednio w kontrolerze:

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
         ' tworzy się odpowiedź
        Dim HTML As String
        HTML = "<html><head><title>heure6</title></head><body>Il est "
        HTML += Date.Now.ToString("T")
        HTML += "</body></html>"
         ' wysyłanie odpowiedzi
        Response.Write(HTML)
    End Sub
End Class

Kontroler generuje tutaj całą odpowiedź, a nie tylko jej dynamiczne części. Ponadto wysyła ją. Czyni to za pomocą właściwości [Response] typu [HttpResponse] klasy [Page]. Jest to obiekt reprezentujący odpowiedź serwera skierowaną do klienta. Klasa [HttpResponse] posiada metodę [Write] służącą do zapisywania danych w strumieniu HTML, który zostanie wysłany do klienta. W tym miejscu umieszczamy cały strumień HTML, który ma zostać wysłany, w zmiennej [HTML], a następnie wysyłamy ją do klienta za pomocą [Response.Write(HTML)].

Żądamy adresu URL [http://localhost/aspnet/chap2/heure6.aspx] od serwera Cassini (<webroot>,/aspnet):

Image

3.3.7. Wniosek

W dalszej części wykorzystamy metodę 3, która umieszcza kod VB oraz kod HTML z dynamicznego dokumentu internetowego w dwóch oddzielnych plikach. Zaletą tej metody jest podział strony internetowej na dwa elementy:

  1. komponent sterujący, składający się wyłącznie z kodu VB, służący do obliczania dynamicznych części strony
  2. komponent prezentacyjny, który stanowi odpowiedź wysyłaną do klienta. Składa się on z kodu HTML, zawierającego czasami kod VB służący do wyświetlania wartości dynamicznych. Zawsze będziemy dążyć do tego, aby w części prezentacyjnej znajdowało się jak najmniej kodu VB, a idealnym rozwiązaniem byłoby całkowite jego wyeliminowanie.

Jak wykazano w metodzie 5, kontroler można skompilować niezależnie od aplikacji internetowej. Ma to tę zaletę, że pozwala skupić się wyłącznie na kodzie i uzyskać przy każdej kompilacji listę wszystkich błędów. Po skompilowaniu kontrolera można przetestować aplikację internetową. Bez wcześniejszej kompilacji zajmie się tym serwer internetowy, a błędy będą zgłaszane pojedynczo. Może to być uciążliwe.

W przypadku poniższych przykładów wystarczą następujące narzędzia:

  • edytor tekstu do tworzenia dokumentów HTML i VB aplikacji, gdy są one proste
  • narzędzie programistyczne .NET do tworzenia klas VB.NET, aby skorzystać z pomocy, jaką tego typu narzędzie zapewnia przy pisaniu kodu. Przykładem takiego narzędzia jest na przykład CSharpDevelop (http://www.icsharpcode.net). Przykład zastosowania przedstawiono w załączniku [Les outils du développement web].
  • narzędzie WebMatrix do tworzenia stron prezentacyjnych aplikacji (patrz załącznik [Les outils du développement web]).
  • serwer Cassini

Wszystkie te narzędzia są bezpłatne.