Im folgenden Abschnitt wird die Verwendung von Java-Servlets zur Realisierung von Webservern erläutert. Spezielles Augenmerk liegt dabei auf JavaServer Pages und der Velocity Template Engine.
Auf die grundlegende Beschaffenheit der Sprache Java wird nicht näher eingegangen.
Nötige Imports bezüglich des packages java.net werden folgend stetig ergänzt:
import java.net.ServerSocket; import java.net.Socket;
Um eine Kommunikation zwischen einem Client und einem Server zu realisieren muss zunächst eine Netzwerkverbindung über Sockets ermöglicht werden.
Serverseitig wird somit eine Java-Applikation erstellt, welche auf einem Serversocket nach Verbindungen lauscht. Bei einer einkommenden Verbindung reagiert der ServerSocket mit einem SocketEvent, welches durch die Funktion accept() ein neues Socket-Objekt erzeugt. Dieser Socket enthält die Anfrage des Clients in Form eines InputStreams.
try {
// Den ServerSocket initialisieren auf Port 8000
int port = 8000;
ServerSocket server = new ServerSocket(port);
// Endlosschleife zum "horchen" nach Verbindungen
while (true) {
// Sobald eine Client-Anfrage ankommt wird sie an die nocht nicht naeher beschriebene Funktion handleRequest uebergeben
Socket client = server.accept();
handleRequest(client);
}
} catch (IOException e) {
e.printStackTrace();
}
Clientseitig erfolgt lediglich der Aufruf der Server-IP samt Portangabe im Browser.
Beispiel für den Localhost:http://127.0.0.1:8000/
In der Funktion handleRequest(Socket client) throws IOException soll nun die Auswertung der Client-Anfrage, genauer gesagt des HTTP-Haeders erfolgen. Testweise implementieren wir die Funktion wie folgt, um den HTTP-Header zeilenweise in der Konsole auszugeben:
private void handleRequest(Socket client) throws IOException {
// Der Header ist im InputStream des Client-Sockets abgelegt
InputStream request = client.getInputStream();
// Umwandlung InputStream -> String
if (request != null) {
String line;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(request, "UTF-8"));
while ((line = reader.readLine()) != null) {
// Konsolenausgabe
System.out.println(line);
}
reader.close();
} finally {
request.close();
}
}
}