3. Einführung in die ASP.NET-Webentwicklung
3.1. Einführung
Im vorigen Kapitel wurden die Grundlagen der Webentwicklung vorgestellt, die unabhängig von der verwendeten Programmiersprache sind. Derzeit dominieren drei Technologien den Markt für Webentwicklung:
- J2EE, eine Java-Entwicklungsplattform. In Kombination mit der Struts-Technologie, die auf verschiedenen Anwendungsservern installiert ist, wird die J2EE-Plattform vor allem in Großprojekten eingesetzt. Aufgrund der verwendeten Sprache – Java – kann eine J2EE-Anwendung auf den gängigen Betriebssystemen (Windows, Unix, Linux, Mac OS usw.) ausgeführt werden
- PHP, eine interpretierte Sprache, die ebenfalls betriebssystemunabhängig ist. Im Gegensatz zu Java handelt es sich nicht um eine objektorientierte Sprache. Es wird jedoch erwartet, dass die PHP5-Version objektorientierte Funktionen in die Sprache einführt. PHP ist einfach zu verwenden und wird häufig in kleinen und mittleren Projekten eingesetzt.
- ASP.NET ist eine Technologie, die nur auf Windows-Rechnern läuft, die mit der .NET-Plattform ausgestattet sind (XP, 2000, 2003 usw.). Als Entwicklungssprache kann jede .NET-kompatible Sprache verwendet werden, d. h. mehr als ein Dutzend, angefangen bei den Microsoft-Sprachen (C#, VB.NET, J#) über Borlands Delphi bis hin zu Perl, Python, ...
Im vorigen Kapitel wurden kurze Beispiele für jede dieser drei Technologien vorgestellt. Dieses Dokument konzentriert sich auf die ASP.NET-Webentwicklung unter Verwendung der Sprache VB.NET. Wir gehen davon aus, dass Sie mit dieser Sprache vertraut sind. Dieser Punkt ist wichtig. Hier befassen wir uns ausschließlich mit ihrer Verwendung im Kontext der Webentwicklung. Lassen Sie uns diesen Punkt näher erläutern, indem wir die MVC-Methodik für die Webentwicklung besprechen.
Eine Webanwendung, die dem MVC-Modell folgt, ist wie folgt aufgebaut:

Eine solche Architektur, die als 3-Tier- oder 3-Level-Architektur bezeichnet wird, zielt darauf ab, dem MVC-Modell (Model-View-Controller) zu folgen:
- Die Benutzeroberfläche ist das V (die Ansicht)
- die Anwendungslogik ist das C (der Controller)
- die Datenquellen sind das M (Model)
Die Benutzeroberfläche ist oft ein Webbrowser, es kann sich aber auch um eine eigenständige Anwendung handeln, die über das Netzwerk HTTP-Anfragen an den Webdienst sendet und die empfangenen Ergebnisse formatiert. Die Anwendungslogik besteht aus Skripten, die Benutzeranfragen verarbeiten. Die Datenquelle ist oft eine Datenbank, es können aber auch einfache Flatfiles, ein LDAP-Verzeichnis, ein Remote-Webservice usw. sein. Es liegt im Interesse des Entwicklers, ein hohes Maß an Unabhängigkeit zwischen diesen drei Entitäten zu wahren, damit bei einer Änderung an einer der drei Entitäten die anderen beiden nicht oder nur minimal angepasst werden müssen.
- Die Geschäftslogik der Anwendung wird in Klassen untergebracht, die von der Klasse getrennt sind, welche den Anfrage-Antwort-Dialog steuert. Somit könnte der obige [Anwendungslogik]-Block aus den folgenden Elementen bestehen:

Innerhalb des Blocks [Anwendungslogik] können wir unterscheiden zwischen
- die Controller-Klasse, die als Einstiegspunkt der Anwendung dient.
- den Block [Business Classes], der die für die Anwendungslogik erforderlichen Klassen zusammenfasst. Diese sind vom Client unabhängig.
- den Block [Datenzugriffsklassen], der die Klassen zusammenfasst, die zum Abrufen der vom Servlet benötigten Daten erforderlich sind, häufig persistente Daten (Datenbank, Dateien, Webdienst usw.)
- den Block der ASP-Seiten, die die Ansichten der Anwendung bilden.
In einfachen Fällen lässt sich die Anwendungslogik oft auf zwei Klassen reduzieren:
- die Controller-Klasse, die die Client-Server-Kommunikation abwickelt: Bearbeitung der Anfrage und Generierung verschiedener Antworten
- die Business-Klasse, die vom Controller zu verarbeitende Daten empfängt und Ergebnisse an ihn zurückgibt. Diese Business-Klasse verwaltet dann selbst den Zugriff auf persistente Daten.
Das Besondere an der Webentwicklung liegt im Schreiben der Controller-Klasse und der Präsentationsseiten. Die Business- und Datenzugriffsklassen sind Standard- .NET-Klassen, die sowohl in einer Webanwendung als auch in einer Windows-Anwendung oder sogar einer Konsolenanwendung verwendet werden können. Das Schreiben dieser Klassen erfordert ein solides Verständnis der objektorientierten Programmierung. In diesem Dokument werden sie in VB.NET geschrieben, daher gehen wir davon aus, dass Sie diese Sprache beherrschen. Aus dieser Perspektive besteht keine Notwendigkeit, sich länger als nötig mit dem Datenzugriffscode aufzuhalten. In fast allen Büchern über ASP.NET ist ein Kapitel dem ADO.NET gewidmet. Das obige Diagramm zeigt, dass der Datenzugriff von Standard-.NET-Klassen abgewickelt wird, die nicht wissen, dass sie in einem Webkontext verwendet werden. Der Controller, der als Teamleiter der Webanwendung fungiert, muss sich nicht um ADO.NET kümmern. Er muss lediglich wissen, von welcher Klasse die benötigten Daten angefordert werden sollen und wie dies zu geschehen hat. Das ist alles. Das Einfügen von ADO.NET-Code in den Controller verstößt gegen das oben erläuterte MVC-Konzept, und wir werden dies nicht tun.
3.2. Tools
Dieses Dokument richtet sich an Studierende, daher werden wir mit kostenlosen Tools arbeiten, die im Internet zum Download bereitstehen:
- die .NET-Plattform (Compiler, Dokumentation)
- die WebMatrix-Entwicklungsumgebung, die den Cassini-Webserver enthält
- verschiedene DBMS (MSDE, MySQL)
Leser werden gebeten, den Anhang „Web-Tools“ zu konsultieren, in dem erklärt wird, wo diese verschiedenen Tools zu finden sind und wie sie installiert werden. Meistens benötigen wir nur drei Tools:
- einen Texteditor zum Schreiben von Webanwendungen
- ein VB.NET-Entwicklungstool zum Schreiben von VB-Code, wenn dieser umfangreich ist. Diese Art von Tool bietet in der Regel Unterstützung bei der Codeeingabe (Autovervollständigung) und die Erkennung von Syntaxfehlern, entweder während der Codeeingabe oder bei der Kompilierung.
- einen Webserver zum Testen der von Ihnen geschriebenen Webanwendungen. In diesem Dokument verwenden wir Cassini. Leser mit einem IIS-Server können Cassini durch IIS ersetzen. Beide sind .NET-kompatibel. Cassini ist jedoch darauf beschränkt, nur auf lokale Anfragen (localhost) zu reagieren, während IIS auf Anfragen von externen Rechnern reagieren kann.
Eine hervorragende kommerzielle Entwicklungsumgebung für VB.NET ist Microsofts Visual Studio.NET. Diese funktionsreiche IDE ermöglicht es Ihnen, alle Arten von Dokumenten zu verwalten (VB.NET-Code, HTML-Dokumente, XML, Stylesheets usw.). Beim Schreiben von Code bietet sie die unschätzbare Hilfe der automatischen Code-„Vervollständigung“. Allerdings hat dieses Tool, das die Produktivität der Entwickler erheblich steigert, auch einen Nachteil: Es beschränkt den Entwickler auf einen Standard-Entwicklungsmodus, der zwar effizient, aber nicht immer angemessen ist.
Es ist möglich, den Cassini-Server außerhalb von [WebMatrix] zu verwenden, und genau das werden wir häufig tun. Die ausführbare Datei des Servers befindet sich unter <WebMatrix>\<version>\WebServer.exe, wobei <WebMatrix> das Installationsverzeichnis von [WebMatrix] und <version> die Versionsnummer ist:

Öffnen wir ein Eingabeaufforderungsfenster und navigieren wir zum Cassini-Serverordner:
E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>dir
...
29/05/2003 11:00 53 248 WebServer.exe
...
Führen wir [WebServer.exe] ohne Parameter aus:

Das obige Fenster zeigt, dass die Anwendung [WebServer/Cassini] drei Parameter akzeptiert:
- /port: Portnummer des Webdienstes. Kann eine beliebige Zahl sein. Der Standardwert ist 80
- /path: physischer Pfad zu einem Ordner auf der Festplatte
- /vpath: virtueller Ordner, der dem vorangehenden physischen Ordner zugeordnet ist.
Wir werden unsere Beispiele in einer Verzeichnisstruktur mit dem Stammverzeichnis P und den Ordnern chap1, chap2, ... für die verschiedenen Kapitel dieses Dokuments ablegen. Wir werden den virtuellen Pfad V diesem physischen Ordner P zuordnen. Außerdem werden wir Cassini mit dem folgenden DOS-Befehl starten:
Wenn wir beispielsweise möchten, dass das physische Stammverzeichnis des Servers der Ordner [D:\data\devel\aspnet\poly] und sein virtuelles Stammverzeichnis [aspnet] ist, lautet der DOS-Befehl zum Starten des Webservers:
Sie können diesen Befehl als Verknüpfung speichern. Nach dem Start platziert Cassini ein Symbol in der Taskleiste. Ein Doppelklick darauf öffnet ein Start-/Stopp-Fenster für den Server:

Das Fenster zeigt die drei Parameter an, die zum Starten verwendet wurden. Es bietet zwei Start-/Stopp-Schaltflächen sowie einen Testlink zum Stammverzeichnis des Webverzeichnisbaums. Wir klicken darauf. Ein Browser öffnet sich und die URL [http://localhost/aspnet] wird aufgerufen. Wir sehen den Inhalt des Ordners, der im Feld [Physical Path] oben angegeben wurde:

In diesem Beispiel entspricht die angeforderte URL einem Ordner und nicht einem Webdokument, daher zeigt der Server den Inhalt dieses Ordners anstelle eines bestimmten Webdokuments an. Befindet sich in diesem Ordner eine Datei namens [default.aspx], wird diese angezeigt. Erstellen wir beispielsweise die folgende Datei und legen sie im Stammverzeichnis von Cassinis Webverzeichnisbaum ab (hier d:\data\devel\aspnet\poly):
Rufen wir nun die URL [http://localhost/aspnet] über einen Browser auf:

Wir sehen, dass tatsächlich die URL [http://localhost/aspnet/default.aspx] angezeigt wurde. Später in diesem Dokument werden wir erläutern, wie Cassini unter Verwendung der Notation Cassini(path,vpath) konfiguriert werden sollte, wobei [path] der Name des Stammordners der Webverzeichnisstruktur des Servers und [vpath] der zugehörige virtuelle Pfad ist. Erinnern Sie sich daran, dass beim Cassini(path,vpath)-Server die URL [http://localhost/vpath/XX] dem physischen Pfad [path\XX] entspricht. Wir werden alle unsere Dokumente in einem physischen Stammverzeichnis ablegen, das wir <webroot> nennen werden. Somit können wir auf die Datei <webroot>\chap2\here1.aspx verweisen. Für jeden Leser wird dieses <webroot>-Verzeichnis ein Ordner auf seinem eigenen Rechner sein. Die Screenshots zeigen hier, dass dieser Ordner häufig [d:\data\devel\aspnet\poly] ist. Dies ist jedoch nicht immer der Fall, da die Tests auf verschiedenen Rechnern durchgeführt wurden.
3.3. Erste Beispiele
Wir werden einige einfache Beispiele für dynamische Webseiten vorstellen, die mit VB.NET erstellt wurden. Die Leser werden gebeten, diese zu testen, um zu überprüfen, ob ihre Entwicklungsumgebung ordnungsgemäß installiert ist. Wir werden sehen, dass es mehrere Möglichkeiten gibt, eine ASP.NET-Seite zu erstellen. Wir werden eine davon für den Rest unserer Entwicklungsarbeit auswählen.
3.3.1. Grundlegendes Beispiel – Variante 1
Erforderliche Tools: ein Texteditor, der Cassini-Webserver
Wir greifen das Beispiel aus dem vorherigen Kapitel wieder auf. Wir erstellen die folgende Datei [heure1.aspx]:
<html>
<head>
<title>Demo asp.net </title>
</head>
<body>
Il est <% =Date.Now.ToString("T") %>
</body>
</html>
Dieser Code ist HTML-Code mit einem speziellen <% ... %>-Tag. Innerhalb dieses Tags können Sie VB.NET-Code platzieren. Hier ist der Code
eine C-Zeichenkette, die die aktuelle Uhrzeit darstellt. Das <% ... %>-Tag wird dann durch diese C-Zeichenkette ersetzt. Wenn C also die Zeichenkette 18:11:01 ist, lautet die HTML-Zeile, die den VB.NET-Code enthält:
Fügen wir den obigen Code in die Datei [<webroot>\chap2\heure1.aspx] ein. Starten wir Cassini(<webroot>,/aspnet) und rufen wir die URL [http://localhost/aspnet/chap2/heure1.aspx] in einem Browser auf:

Sobald wir dieses Ergebnis erhalten, wissen wir, dass die Entwicklungsumgebung korrekt installiert ist. Die Seite [heure1.aspx] wurde kompiliert, da sie VB.NET-Code enthält. Bei der Kompilierung wurde eine DLL-Datei erzeugt, die in einem Systemordner gespeichert und anschließend vom Cassini-Server ausgeführt wurde.
3.3.2. Einfaches Beispiel – Variante 2
Benötigte Tools: ein Texteditor, der Cassini-Webserver
Das Dokument [heure1.aspx] enthält sowohl HTML-Code als auch VB.NET-Code. In einem so einfachen Beispiel ist das kein Problem. Wenn Sie mehr VB.NET-Code einbinden müssen, sollten Sie den HTML-Code deutlicher vom VB-Code trennen. Dies kann erreicht werden, indem Sie den VB-Code in ein <script>-Tag einschließen:
<script runat="server">
' calcul des données à afficher par le code HTML
...
</script>
<html>
....
' affichage des valeurs calculées par la partie script
</html>
Das Beispiel [heure2.aspx] veranschaulicht diese Methode:
<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>
Wir legen das Dokument [heure2.aspx] im Verzeichnisbaum [<webroot>\chap2\heure2.aspx] auf dem Cassini-Webserver (<webroot>,/aspnet) ab und rufen das Dokument über einen Browser auf:

3.3.3. Einfaches Beispiel – Variante 3
Benötigte Werkzeuge: ein Texteditor, der Cassini-Webserver
Wir gehen bei der Trennung von VB-Code und HTML-Code noch einen Schritt weiter, indem wir sie in zwei separate Dateien ablegen. Der HTML-Code befindet sich in der Datei [heure3.aspx] und der VB-Code in [heure3.aspx.vb]. Der Inhalt von [heure3.aspx] sieht wie folgt aus:
<%@ Page Language="vb" src="heure3.aspx.vb" Inherits="heure3" %>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
Es gibt zwei grundlegende Unterschiede:
- die [Page]-Direktive mit noch nicht definierten Attributen
- die Verwendung der Variablen [now] im HTML-Code, obwohl sie nirgendwo initialisiert ist
Die [Page]-Direktive wird hier verwendet, um anzugeben, dass sich der VB-Code, der die Seite initialisiert, in einer anderen Datei befindet. Das [src]-Attribut gibt diese Datei an. Wir werden sehen, dass der VB-Code zu einer Klasse namens [heure3] gehört. Für den Entwickler transparent wird eine .aspx-Datei in eine Klasse umgewandelt, die von einer Basisklasse namens [Page] abgeleitet ist. Hier muss unser HTML-Dokument von der Klasse abgeleitet sein, die die Daten definiert und berechnet, die es anzeigen muss. In diesem Fall ist es die Klasse [heure3], die in der Datei [heure3.aspx.vb] definiert ist. Wir müssen daher diese Eltern-Kind-Beziehung zwischen dem VB-Dokument [heure3.aspx.vb] und dem HTML-Dokument [heure3.aspx] angeben. Das Attribut [inherits] gibt diese Beziehung an. Es muss den Namen der Klasse angeben, die in der Datei definiert ist, auf die das Attribut [src] verweist.
Sehen wir uns nun den VB-Code für die Seite an:
Public Class heure3
Inherits System.Web.UI.Page
' data of the web page to be displayed
Protected maintenant As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'calculates the web page data
maintenant = Date.Now.ToString("T")
End Sub
End Class
Beachten Sie folgende Punkte:
- Der VB-Code definiert eine Klasse [heure3], die von der Klasse [System.Web.UI.Page] abgeleitet ist. Dies ist immer der Fall, da eine Webseite immer von [System.Web.UI.Page] abgeleitet sein muss.
- Die Klasse deklariert ein geschütztes Attribut [now]. Wir wissen, dass ein geschütztes Attribut in abgeleiteten Klassen direkt zugänglich ist. Dadurch kann das HTML-Dokument [heure3.aspx] in seinem Code auf den Wert der [now]-Daten zugreifen.
- Das Attribut [now] wird in einer [Page_Load]-Prozedur initialisiert. Wir werden später sehen, dass ein [Page]-Objekt vom Webserver über eine Reihe von Ereignissen benachrichtigt wird. Das [Load]-Ereignis tritt ein, wenn das [Page]-Objekt und seine Komponenten erstellt wurden. Der Handler für dieses Ereignis wird durch die Anweisung [Handles MyBase.Load] festgelegt
- Der Name [XX] des Ereignisbehandlungsroutinen kann beliebig gewählt werden. Seine Signatur muss der oben gezeigten entsprechen. Wir werden dies vorerst nicht im Detail erläutern.
- Wir verwenden häufig den [Page.Load]-Ereignishandler, um die Werte der dynamischen Daten zu berechnen, die die Webseite anzeigen muss.
Die Dateien [heure3.spx] und [heure3.aspx.vb] befinden sich in [<webroot>\chap2]. Anschließend rufen wir mit einem Browser die URL [http://localhost/aspnet/chap2/heure3.aspx] vom Webserver (<webroot>,/aspnet) ab:

3.3.4. Einfaches Beispiel – Variante 4
Benötigte Tools: ein Texteditor, der Cassini-Webserver
Wir verwenden dasselbe Beispiel wie zuvor, fassen jedoch den gesamten Code in einer einzigen Datei [heure4.aspx] zusammen:
<script runat="server">
' data of the web page to be displayed
Private maintenant As String
' evt page_load
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'calculates the web page data
maintenant = Date.Now.ToString("T")
End Sub
</script>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
Wir sehen dieselbe Abfolge wie in Beispiel 2:
Diesmal wurde der VB-Code in Prozeduren gegliedert. Wir sehen die Prozedur [Page_Load] aus dem vorherigen Beispiel. Das Ziel hierbei ist es, zu zeigen, dass eine eigenständige .aspx-Seite (die nicht mit VB-Code in einer separaten Datei verknüpft ist) implizit in eine von [Page] abgeleitete Klasse umgewandelt wird. Daher können wir die Attribute, Methoden und Ereignisse dieser Klasse verwenden. Genau das geschieht hier, wo wir das [Load]-Ereignis dieser Klasse nutzen.
Die Testmethode ist identisch mit den vorherigen:

3.3.5. Einfaches Beispiel – Variante 5
Benötigte Werkzeuge: ein Texteditor, der Cassini-Webserver
Wie in Beispiel 3 trennen wir den VB-Code und den HTML-Code in zwei separate Dateien. Der VB-Code befindet sich in [heure5.aspx.vb]:
Public Class heure5
Inherits System.Web.UI.Page
' data of the web page to be displayed
Protected maintenant As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'calculates the web page data
maintenant = Date.Now.ToString("T")
End Sub
End Class
Der HTML-Code befindet sich in [heure5.aspx]:
<%@ Page Inherits="heure5" %>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
Diesmal legt die [Page]-Direktive nicht mehr die Verbindung zwischen dem HTML-Code und dem VB-Code fest. Der Webserver kann den VB-Code nicht mehr finden, um ihn zu kompilieren (das src-Attribut fehlt). Es liegt an uns, diese Kompilierung durchzuführen. In einem DOS-Fenster kompilieren wir daher die VB-Klasse [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
Im obigen Beispiel befand sich die ausführbare Datei des Compilers [vbc.exe] im PATH des DOS-Rechners. Wäre dies nicht der Fall gewesen, hätten Sie den vollständigen Pfad zu [vbc.exe] angeben müssen, die sich in der Verzeichnisstruktur befindet, in der das .NET SDK installiert wurde. Von [Page] abgeleitete Klassen benötigen Ressourcen, die in den DLLs [system.dll, system.web.dll] vorhanden sind, daher der Verweis auf diese über die Option /r des Compilers. Die Option /t:library wird verwendet, um anzugeben, dass wir eine DLL generieren möchten. Die Option /out gibt den Namen der zu generierenden Datei an, in diesem Fall [heure5.dll]. Diese Datei enthält die Klasse [heure5], die vom Webdokument [heure5.aspx] benötigt wird. Der Webserver sucht jedoch an bestimmten Orten nach den benötigten DLLs. Einer dieser Orte ist der Ordner [bin] im Stammverzeichnis seiner Verzeichnisstruktur. Dieses Stammverzeichnis haben wir als <webroot> bezeichnet. Für den IIS-Server ist dies in der Regel <Laufwerk>:\inetpub\wwwroot, wobei <Laufwerk> das Laufwerk (C, D, ...) ist, auf dem IIS installiert wurde. Für den Cassini-Server entspricht dieses Stammverzeichnis dem Parameter /path, der beim Starten verwendet wurde. Denken Sie daran, dass Sie diesen Wert durch Doppelklick auf das Server-Symbol in der Taskleiste abrufen können:

<webroot> entspricht dem oben genannten Attribut [Physical Path]. Wir erstellen daher einen Ordner <webroot>\bin und legen [heure5.dll] darin ab:

Wir sind bereit. Wir rufen die URL [http://localhost/aspnet/chap2/heure5.aspx] vom Cassini-Server (<webroot>,/aspnet) auf:

3.3.6. Einfaches Beispiel – Variante 6
Benötigte Tools: ein Texteditor, der Cassini-Webserver
Wir haben bisher gezeigt, dass eine dynamische Webanwendung aus zwei Komponenten besteht:
- VB-Code zur Berechnung der dynamischen Teile der Seite
- HTML-Code, der manchmal VB-Code enthält, um diese Werte auf der Seite anzuzeigen. Dieser Teil stellt die an den Web-Client gesendete Antwort dar.
Komponente 1 wird als Seiten-Controller-Komponente bezeichnet, und Komponente 2 ist die Präsentationskomponente. Die Präsentationskomponente sollte so wenig VB-Code wie möglich oder gar keinen VB-Code enthalten. Wir werden sehen, dass dies möglich ist. Hier zeigen wir ein Beispiel, bei dem es nur einen Controller und keine Präsentationskomponente gibt. Es ist der Controller selbst, der die Antwort an den Client generiert, ohne die Hilfe der Präsentationskomponente.
Der Präsentationscode sieht wie folgt aus:
Wir sehen, dass sich darin kein HTML-Code mehr befindet. Die Antwort wird direkt im Controller generiert:
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
' we work out the answer
Dim HTML As String
HTML = "<html><head><title>heure6</title></head><body>Il est "
HTML += Date.Now.ToString("T")
HTML += "</body></html>"
' we send it
Response.Write(HTML)
End Sub
End Class
Hier erstellt der Controller die gesamte Antwort und nicht nur deren dynamische Teile. Er sendet sie auch. Dazu verwendet er die [Response]-Eigenschaft vom Typ [HttpResponse] in der [Page]-Klasse. Dieses Objekt repräsentiert die Antwort des Servers an den Client. Die Klasse [HttpResponse] verfügt über eine [Write]-Methode zum Schreiben in den HTML-Stream, der an den Client gesendet wird. Hier speichern wir den gesamten zu sendenden HTML-Stream in der Variablen [HTML] und senden ihn mit [Response.Write(HTML)] an den Client.
Wir fordern die URL [http://localhost/aspnet/chap2/heure6.aspx] vom Cassini-Server (<webroot>,/aspnet) an:

3.3.7. Fazit
Als Nächstes verwenden wir Methode 3, bei der der VB-Code und der HTML-Code eines dynamischen Webdokuments in zwei separate Dateien ausgelagert werden. Diese Methode hat den Vorteil, dass eine Webseite in zwei Komponenten aufgeteilt wird:
- eine Controller-Komponente, die ausschließlich aus VB-Code besteht, um die dynamischen Teile der Seite zu berechnen
- eine Präsentationskomponente, die die an den Client gesendete Antwort darstellt. Sie besteht aus HTML-Code, der VB-Code zur Anzeige dynamischer Werte enthalten kann. Wir werden stets darauf abzielen, so wenig VB-Code wie möglich in der Präsentationskomponente zu haben; im Idealfall gar keinen.
Wie in Methode 5 gezeigt, kann der Controller unabhängig von der Webanwendung kompiliert werden. Dies hat den Vorteil, dass Sie sich ausschließlich auf den Code konzentrieren können und bei jeder Kompilierung eine Liste aller Fehler erhalten. Sobald der Controller kompiliert ist, kann die Webanwendung getestet werden. Ohne vorherige Kompilierung übernimmt der Webserver dies, und Fehler werden einzeln gemeldet. Dies kann als mühsam empfunden werden.
Für die folgenden Beispiele reichen folgende Tools aus:
- ein Texteditor zum Erstellen der HTML- und VB-Dokumente der Anwendung, sofern diese einfach sind
- eine .NET-Entwicklungs-IDE zum Erstellen von VB.NET-Klassen, um von der Unterstützung zu profitieren, die diese Art von Tool beim Schreiben von Code bietet. Ein Beispiel für ein solches Tool ist CSharpDevelop (http://www.icsharpcode.net). Ein Anwendungsbeispiel finden Sie im Anhang [Webentwicklungs-Tools].
- das WebMatrix-Tool zum Erstellen der Präsentationsseiten der Anwendung (siehe Anhang [Webentwicklungs-Tools]).
- Der Cassini-Server
Alle diese Tools sind kostenlos.