5/12 Java Server Pages

Werbung
Java Server Pages
Teil 5/12.2.1 Seite 1
Übersicht
5/12.2
Grundlagen
5/12.2.1
Übersicht
Autor: Helmut Schopf
Java Server Pages wurden von Sun Microsystems entwickelt
und sind wie Active Server Pages serverseitig im Einsatz.
Was sind Java
Server Pages
Mit der JSP-Technologie besteht die Möglichkeit, die Webseitenentwicklung sauber aufzutrennen. Mittels HTML bzw.
XML können die Gestaltungselemente geschaffen werden
und mit JSPs werden die dynamischen Elemente einer Webseite geschaffen.
Zielsetzungen
Die JSP-Technologie ist so ausgelegt, dass eine gute Wiederverwendbarkeit und Plattformunabhängigkeit erreicht wird.
Wiederverwendbare Komponenten
Bei Webdesignern bzw. -entwicklern sollte man umfassende
Programmierkenntnisse nicht als normal voraussetzen. Bei
JSPs wird diesem Umstand Rechnung getragen, und viele
Elemente von JSP basieren auf XML-Tags. Standardmäßig
können über JSP aber auch Java Beans aufgerufen bzw.
Funktionsergebnisse abgerufen werden. Überdies kann der
Anwender auch noch auf Tag-Bibliotheken zugreifen.
Vereinfachen
der Seitenentwicklung mit Tags
JSP basiert auf Java und ist Bestandteil der J2EE Java 2 Enterprise Edition-Architektur von Sun Microsystems. So können JSPs in Java Servlets kompiliert werden und sind voll
einsatzfähig. Java-Technologie wie Bufferfunktionen oder
Fehlerbehandlung sind in JSP voll integriert. Bei JSP wurde
der Grundsatz „Write Once, Run Anywhere“ (einmal geschrieben, überall einsetzbar) weiter verfolgt.
14
Teil 5/12.2.1 Seite 2
Java Server Pages
Übersicht
Applikationsmodelle für Java Server Pages
Eine JSP-Seite wird auf einer JSP-Maschine ausgeführt. Diese muss Bestandteil des Servers, egal ob Web-Server oder
Applikations-Server, sein. Die JSP-Maschine erhält eine Anfrage vom Client auf die JSP-Seite. Nun wird eine Antwort
von der JSP-Seite generiert und dem Client übermittelt.
JSPs werden in Java Servlets kompiliert. Wird eine JSP-Seite
aufgerufen, wird sie zuerst in ein Java Servlet kompiliert und
im Server gespeichert. JSPs können in verschiedenen Anwendungsarchitekturen und Modellen arbeiten.
Beispiele
Die einfachste Anwendung ist die direkte Kommunikation
zwischen Browser, Client und JSP-Page. Die JSP ruft beispielsweise eine Datenbankabfrage auf, generiert das Ergebnis und erzeugt eine Webseite.
Abbildung 5/12.2.1-1: Die direkte Kommunikation ist nur
eingeschränkt einsetzbar
In diesem Beispiel wird das konventionelle CGI-Konzept mit
einem JSP durchgeführt. Diese Methode ist leicht realisierbar.
Der Autor kann auch schnell mit dynamischem Inhalt umgehen. Diese Vorgehensweise arbeitet bei vielen Applikationen
fehlerfrei. Will man aber beispielsweise viele Datenbankzugriffe realisieren, ist diese Lösung ungeeignet.
Flexible Lösung mit
einem Java Servlet
Die zweite Möglichkeit ist, mit einem Servlet zu arbeiten.
Der Client übergibt seine Anfrage sofort an das Servlet. Dieses geniert das dynamische Anfrageergebnis, wird an das JSP
übergeben und dort für den Client generiert. Hier können
über eine solche Konfiguration z.B. verschiedene Datenbankabfragen laufen.
Java Server Pages
Teil 5/12.2.1 Seite 3
Übersicht
Abbildung 5/12.2.1-2: Aufgaben verteilen und in Verbindung mit Java Beans arbeiten
Der Inhalt wird bei dieser Lösung nur über Java realisiert und
das Ergebnis in HTML dargestellt. Dies hat den Vorteil, dass
sich hier der Datenbankentwickler voll und ganz auf seinen
Bereich konzentrieren und der Webdesigner sich nicht um die
Datenbankproblematik kümmern muss.
Skalierbare Prozesse mit Enterprise JavaBeanTechnologie
Ein typischer Anwendungsfall ist das Aufteilen einer komplexen Aufgabenstellung, die oft auch eine umfangreichere
Lösung erfordert.
JSP vermittelt sozusagen zwischen den Back-End Ressourcen
über die Java Bean-Komponenten. Auf diese Art kann eine
sehr hohe Zahl von Anwendern bedient werden – eine
Grundvoraussetzung für E-Commerce. Dafür ist diese Art der
Lösung vorrangig gedacht.
Abbildung 5/12.2.1-3: Der Ansatz für komplexe Aufgaben
14
Teil 5/12.2.1 Seite 4
Java Server Pages
Übersicht
XML Technologie in JSP-Seiten
JSP-Seiten können HTML-, aber auch XML-Seiten erzeugen.
Für einfache Anwendungen können einfache statische XMLTags bzw. Templates eingesetzt werden. Für dynamisches
XML müssen Server-Based-Beans bzw. spezielle Tags verwendet werden.
JSPs sind zu den XML-Werkzeugen kompatibel. Die JSPSpezifikation von SunMicrosystems ist so ausgelegt, dass
JSP-Seiten schnell in XML-Seiten konvertiert werden können. Für die Umwandlung muss der JSP-Seite ein JSP RootElement hinzugefügt werden.
Fazit
JSP ist offen konzipiert und soll den Webdesigner bei der Erstellung dynamischer Webseiten unterstützen. JSP kann auf
unterschiedlichen Servern laufen, und auch die Anwendungsbereiche beginnen bei einfachen Lösungen. JSP ist aber
auch für komplexe Aufgabenstellungen wie E-CommerceLösungen geeignet.
JSP ist Bestandteil der J2EE und somit voll in Java integrierbar. Sie können einfach in Java Servlets kompiliert und in
XML-Dateien konvertiert werden.
Java Server Pages
Teil 5/12.2.2 Seite 1
Einführung
5/12.2.2
Einführung
Bevor wir mit den Details zu JSP beginnen, die sehr komplex
und umfangreich sind, hier ein erstes Beispiel, mit dem Sie
sofort loslegen können. Anhand dieses Beispiels wollen wir
Ihnen einige Aspekte von JSP erläutern.
<html>
<body>
<h1>Beispiel: Scripting Elemente</h1>
Beispiel 1.jsp
<%-- eine ’declaration’: Deklaration der
Methode square --%>
<%! int square (int n) { return n*n; } %>
<%-- ein Scriptlet: for Schleife --%>
<% for (int i = 1; i <= 10; i++) { %>
<%-- ein Ausruck (expression) --%>
<%=i %> times <%=i %> equals <%=square(i)
%>
<br>
<% } %>
</body>
</html>
Wie Sie sehen, kann man in JSP HTML-Tags mit Javacode
mischen. Das ist aber nur eine der Möglichkeiten, die JSP
bietet. Diese Möglichkeiten erlauben die Trennung von dynamischem und statischem Inhalt einer Seite. Neben dieser Mischung, die Sie oben sehen, gibt es in JSP noch die Möglichkeit, von JSP auf eine existierende Java-Klasse zuzugreifen,
also den Code nicht in die HTML-Seite zu schreiben, sondern in eine ganz normale Java-Klasse, die dann von JSP eingebunden wird. Wie dies genau geschieht, sehen Sie später.
14
HTML- und
Java-Mischung
Teil 5/12.2.2 Seite 2
Java Server Pages
Einführung
JSP und Servlets
Unterschiede und
Gemeinsamkeiten
Wenn Sie sich bereits mit Java Servlets befasst haben, werden Sie sicher die Frage stellen, welche Vorteile Java Server
Pages gegenüber Servlets haben. Sie können interaktive, dynamische Webseiten mit Servlets erstellen, wozu also Java
Server Pages? Ist die JSP-Technologie also einfacher,
schneller oder hat Sun Microsystems nur einen neuen „Hype“
geschaffen?
Auch wenn JSP den Einstieg in die Servlet-Programmierung
beschleunigen kann, gibt es dennoch mehrere wirklich interessante Gründe, sich mit der JSP-Technologie auseinanderzusetzen.
JSP setzen
auf Servlets auf
JSP setzen auf Servlets auf. Es ist somit eine Erweiterung der
Servlet-Technologie. JSP-Seiten werden dynamisch in Servlets kompiliert und vereinfachen somit die Verwendung von
statischen und dynamischen Daten. Damit haben Sie alle Vorteile von Servlets und können die Java APIs verwenden.
Natürlich können Sie mit Servlets interaktive, dynamische
Seiten erstellen, mit JSP wird dieser Prozess aber noch einmal vereinfacht. Sie können z.B. statische Templates in XML
oder HTML mit dynamischem Code kombinieren, so dass
Ihre Seite sowohl statische als auch dynamische Aspekte enthält. JSP-Seiten werden bei Bedarf dynamisch in Servlets
kompiliert. Es ist aber auch möglich, JSP-Seiten vorab in
Servlets zu kompilieren. Damit stehen Ihnen mehr Welten
offen als bei der Verwendung von Servlets.
Es gibt JSP-Schlüsselwörter, die JavaBeans verwalten und so
den Designer vor der Komplexität der Anwendung schützen.
Trennung
Denkbar ist hier z.B. eine Trennung von HTML/Web-Designer und Software-Entwickler. Die Struktur von JSP war außerdem vorausschauend, so dass die darunter liegende Struktur durchaus dafür gedacht ist, JSP-Seiten von Authoring
Tools (Autorenwerkzeugen) zu erzeugen, was die Entwicklung von JSP-Seiten enorm beschleunigt.
Java Server Pages
Teil 5/12.2.2 Seite 3
Einführung
Entwicklung anstelle von Seitenerstellung
Viele sehen in JSP eine Art „Servlets für Dummies“. Doch
das ist falsch. Es resultiert daraus, dass die Seitenerstellung
einfacher wird und eine komponentenbasierte Entwicklung
stattfinden kann. Entwickler können sich auf die Entwicklung
von Applikationslogik konzentrieren, anstelle sich mit dem
Entwerfen und Verwalten immer wieder neuer, individueller
Seiten zu befassen.
Entwickler
entwickeln,
Designer designen
Durch die Aufspaltung beim Erzeugen des Inhalts von Seiten
und dem Seitenlayout und Entwerfen von Designs erlauben
JSP die Entwicklung einer Multi-Tier-Applikation, basierend
auf dem WWW. Die größte Problematik besteht in der Erstellung von Seiten im Zusammenspiel von Grafik-Designern
und Entwicklern. JSP vereinfacht diese Schnittstelle.
• Entwickler können angepasste Schlüsselwortbibliotheken
(sog. Tag-Libraries) entwickeln, die die Autoren der Seite
dann wie z.B. XML-Syntax verwenden können. Da der
JSP-Container für die Kompilierung der Seiten verantwortlich ist, kann der Autor der Seiten Updates ganz einfach
einspielen.
• JSP-Seiten können ebenso JavaBeans als auch Enterprise
JavaBeans ansprechen, womit dann die komplizierte Geschäftslogik und Zugriff auf Host-Systeme oder andere
Backends gewährleistet wird. Diese Komponenten sind
dann natürlich auch anderweitig wiederverwendbar, was
die Entwicklungszeit verkürzt, und sie sind portabel, da sie
in Java geschrieben wurden. Es ist auch denkbar, dass es
einen Markt für solche Komponenten geben wird, was den
Entwickler mehr zu einem Bausteine-Entwickler als CodeProgrammierer werden lässt.
• Seitenautoren können die vorgegebenen Template-Teile
ändern und editieren, und das, sooft sie wollen. Damit verändert sich nicht die Applikationslogik. Andersherum können Entwickler die Logik ändern, ohne dass sich die Seiten
ändern müssen.
14
Vorteile von JSP
Teil 5/12.2.2 Seite 4
Java Server Pages
Einführung
Verbindung mit vorhandenen Servlets
JSP wird in
Servlets kompiliert
Die JSP-Technologie ist eine Erweiterung der Servlet-Technologie. Eine wurde bereits erwähnt, nämlich dass JSP-Seiten
in Servlets kompiliert werden.
Eine andere Möglichkeit ist das Einbinden von Servlets in
JSP-Seiten und umgekehrt sowie das Delegieren von Anfragen an Servlets und von Servlets an JSP. Wenn Sie also schon
Servlets haben, müssen Sie nicht alles wieder verwerfen,
wenn Sie auf JSP umstellen möchten. Im Gegenteil, Sie können diese verwenden und via JSP eventuell noch einfacher
und besser verteilen, besser warten und, wie oben beschrieben, Änderungen im Design oder in der Logik vornehmen,
ohne den anderen Teil in Mitleidenschaft zu ziehen.
Java Server Pages
Teil 5/12.3.1 Seite 1
Marktübersicht
5/12.3
JSP-Engines
Es gibt einige Anbieter von Servlet/JSP-Engines. Diese sind
nötig, damit man mit Servlets und JSP überhaupt arbeiten
kann. Einige davon möchte wir hier kurz vorstellen und vergleichen. Eine Empfehlung wird aber nicht ausgesprochen,
da die Engines sehr unterschiedlich und die Ansprüche an
eine Engine problembezogen sind.
5/12.3.1
•
•
•
•
•
•
•
•
•
•
•
•
14
Marktübersicht
Apache: JServ/GNU-JSP
LiveSoftware/Allaire: JRun
NewAtlanta: ServletExec (wird von Gemstone verwendet)
Netscape: Enterprise Server 4.0 mit eingebauter ServletEngine
Lotus: Domino Server mit GWAPI (OS390)
Caucho: Resin 1.0
Sun: Java Web-Server JWSDK 1.0
PolyJsp
SJSP
IBM: WebSphere Application Server
Orion Web-Server
und andere…
Teil 5/12.3.1 Seite 2
Marktübersicht
Java Server Pages
Java Server Pages
Teil 5/12.3.2 Seite 1
Testumgebung
5/12.3.2
Testumgebung
Die Testkonfiguration geht von realen Fällen aus, also nicht
einfach ein paar JSP-Seiten und Servlets, sondern mit Anbindung an Brokat Twister, das als Middleware fungiert. Daher
wurden hier Brokat-spezifische Klassen für die Middleware
verwendet. Diese sollten Sie aber nicht abschrecken, denn
Sie werden mit Ihren Servlets und JSP-Seiten auch auf andere Objekte zugreifen, in diesem Fall sind es eben die von
Brokat.
Reale Fälle
Des Weiteren wurde die „Punk“-Applikation verwendet. Diese verbindet sich mit einer URL, und man kann mit der Option -t die Anzahl der Threads angeben und mit der Option -c
die Anzahl der Schleifen. Auch Cookies können damit verwaltet werden, um sich die Performance von Sessions anzusehen.
PunkTestapplikation
Der Aufruf sieht folgendermaßen aus:
$java punk
Usage: java punk -h http://localhost/date.jsp -t 10 -c 10
-h <target>
destination host and url
-t <threads> n parallel sessions
-c <cycles>
repeat n times each session
-x <csvfile> append statistics to specified file
-s
silent mode
-?
show this help
Wie Sie sehen, wurde eine JSP-Seite date.jp verwendet. Diese greift auf eine Bean zu. Beide Dateien wurden angegeben,
damit Sie sehen, welcher Code unseren Tests zu Grunde lag.
Außerdem wurde noch eine andere Applikation, PerfTest,
geschrieben, die wiederum eine JSP-Seite und eine Bean enthält. Diese greift außerdem auf die Brokat Twister Middleware zu.
14
Teil 5/12.3.2 Seite 2
Java Server Pages
Testumgebung
date.jsp
<html>
<USEBEAN name="date" type="beans.BeanDate" lifespan="page">
</USEBEAN>
<body>
<h1> Server Time</h1>
<ul>
<li>Month
: <DISPLAY property=date:Month>
<li>Year
: <DISPLAY property=date:Year>
<li>Day
: <DISPLAY property=date:Day>
<li>Time
: <DISPLAY property=date:Time>
<li>Date
: <DISPLAY property=date:Date>
<li>Day Of Year : <DISPLAY property=date:DayOfYear>
<li>Week Of Year: <DISPLAY property=date:WeekOfYear>
<li>Day of month: <DISPLAY property=date:DayOfMonth>
<li>Era
: <DISPLAY property=date:Era>
<li>DST Offset : <DISPLAY property=date:DSTOffset>
<li>Zone Offset : <DISPLAY property=date:ZoneOffset>
<li>Time zone
: <DISPLAY property=date:TimeZone>
</ul>
</body>
</html>
BeanDate.java
package beans;
import java.text.DateFormat;
import java.util.*;
public class BeanDate
{
Calendar calendar = null;
public BeanDate()
{
calendar = Calendar.getInstance();
Date trialTime = new Date();
calendar.setTime(trialTime);
}
Java Server Pages
Teil 5/12.3.2 Seite 3
Testumgebung
public int getYear()
{
return calendar.get(Calendar.YEAR);
}
public String getMonth()
{
int m = getMonthInt();
String[] months = new String [] {
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December" };
if (m > 12)
{
return "Unknown to Man";
}
return months[m - 1];
}
public String getDay()
{
int x = getDayOfWeek();
String[] days = new String[] {"Sunday", "Monday", "Tuesday",
"Wednesday",
"Thursday", "Friday", "Saturday"};
if (x > 7)
{
return "Unknown to Man";
}
return days[x - 1];
}
public int getMonthInt()
{
return 1 + calendar.get(Calendar.MONTH);
}
public String getDate()
{
return getMonthInt() + "/" + getDayOfMonth() + "/" +
getYear();
}
14
Teil 5/12.3.2 Seite 4
Java Server Pages
Testumgebung
public String getTime()
{
return getHour() + ":" + getMinute() + ":" + getSecond();
}
public int getDayOfMonth()
{
return calendar.get (Calendar.DAY_OF_MONTH);
}
public int getDayOfYear()
{
return calendar.get (Calendar.DAY_OF_YEAR);
}
public int getWeekOfYear()
{
return calendar.get (Calendar.WEEK_OF_YEAR);
}
public int getWeekOfMonth()
{
return calendar.get (Calendar.WEEK_OF_MONTH);
}
public int getDayOfWeek()
{
return calendar.get (Calendar.DAY_OF_WEEK);
}
public int getHour()
{
return calendar.get (Calendar.HOUR_OF_DAY);
}
public int getMinute()
{
return calendar.get(Calendar.MINUTE);
}
public int getSecond()
{
return calendar.get(Calendar.SECOND);
Java Server Pages
Teil 5/12.3.2 Seite 5
Testumgebung
}
public static void main(String args[])
{
BeanDate db = new BeanDate();
p("DayOfMonth: " + db.getDayOfMonth());
p("Year: " + db.getYear());
p("Month: " + db.getMonth());
p("Time: " + db.getTime());
p("Date: " + db.getDate());
p("Day: " + db.getDay());
p("DayOfYear: " + db.getDayOfYear());
p("WeekOfYear: " + db.getWeekOfYear());
p("Era: " + db.getEra());
p("AMPM: " + db.getAMPM());
p("DSTOffset: " + db.getDSTOffset());
p("ZONEOffset: " + db.getZoneOffset());
p("TimeZone: " + db.getTimeZone());
}
public int getEra()
{
return calendar.get(Calendar.ERA);
}
public String getTimeZone()
{
String aZones[] = new String[12];
aZones[0] = "Hawaii"
;
aZones[1] = "Alaskan"
;
aZones[2] = "Pacific"
;
aZones[3] = "Mountain"
;
aZones[4] = "Central"
;
aZones[5] = "Eastern"
;
aZones[6] = "Greenland"
;
aZones[7] = "Iceland"
;
aZones[8] = "Atlantic"
;
aZones[9] = "Central Europe"
;
aZones[10] = "Eastern Europe" ;
aZones[11] = "Western Russia" ;
return aZones[4 + getZoneOffset()];
}
14
Teil 5/12.3.2 Seite 6
Java Server Pages
Testumgebung
public int getZoneOffset()
{
return calendar.get (Calendar.ZONE_OFFSET)/(60*60*1000);
}
public int getDSTOffset()
{
return calendar.get (Calendar.DST_OFFSET)/(60*60*1000);
}
public int getAMPM()
{
return calendar.get(Calendar.AM_PM);
}
private static void p(String x)
{
System.out.println(x);
}
}
PerfTest.jsp
<html>
<!-PerfTest.jsp
-->
<USEBEAN name="twobject1" class="beans.PerfTest"
type="beans.PerfTest" lifespan="session">
</USEBEAN>
<meta http-equiv="refresh" content="0; URL=PerfTest.jsp">
<head>
<title>PerfTest JSP</title>
<%@ language="java" %>
<%@ import="java.util.Date" %>
<%@ import="java.util.Enumeration" %>
<%@ import="javax.servlet.*" %>
<%@ import="javax.servlet.http.*" %>
Java Server Pages
Teil 5/12.3.2 Seite 7
Testumgebung
</head>
<body>
<h2>PerfTest</h2>
<hr>
<%
try
{
twobject1.execute();
}
catch (Throwable e)
{
out.print("<h1>Error: "+e+"</h1>\n");
}
%>
<h4>Requests per second:
<%= twobject1.getReqPerSec() %>
</h4>
<h4>Request Duration
<%= twobject1.getDuration() %>
ms</h4>
<h4>PerfTest Bean Counter (1 - 100):
<%= twobject1.getCount() %>
</h4>
<h4>PerfTest RDO Counter:
<%= twobject1.getRDOCount() %>
</h4>
<hr>
<pre>
HTTPSession
----------<%
HttpSession session = request.getSession (true);
String aStr[] = session.getValueNames();
int ic=0;
for (; ic<aStr.length; ic++)
{
out.print("Session value name: "+aStr[ic]+" =
"+session.getValue (aStr[ic])+"<br>");
}
Integer ival = (Integer) session.getValue ("counter");
14
Teil 5/12.3.2 Seite 8
Java Server Pages
Testumgebung
if (ival == null)
{
ival = new Integer (1);
}
else
{
ival = new Integer (ival.intValue () + 1);
}
session.putValue ("counter", ival);
out.print("Session creation time
: "+ new
Date(session.getCreationTime())+"<br>");
out.print("Session last access time: "+ new Date (session.
GetLastAccessedTime ())+"<br>");
out.print("Session id
: "+ session.getId()+"<br>");
%>
HTTPRequest Header
-----------------<% java.util.Enumeration e = request. getHeaderNames();
while (e.hasMoreElements())
{
String s = (String) e.nextElement();
out.println(" "+s+" = "+request.getHeader(s));
}
%>
HTTPRequest-Information
----------------------<% javax.servlet.http.Cookie c[] = request. getCookies();
for (int i=0; i<c.length; i++)
out.print(" Cookie["+i+"] = "+c[i].getName()+" =
"+c[i].getValue());
%>
AuthType = <%= request.getAuthType() %>
Method = <%= request.getMethod() %>
PathInfo = <%= request.getPathInfo() %>
PathTranslated = <%= request. getPathTranslated() %>
QueryString = <%= request.getQueryString() %>
RemoteUser = <%= request.getRemoteUser() %>
RequestedSessionId = <%= request.getRequestedSessionId() %>
RequestURI = <%= request.getRequestURI() %>
Java Server Pages
Teil 5/12.3.2 Seite 9
Testumgebung
ServletPath = <%= request.getServletPath() %>
</pre>
</font>
</body>
</html>
PerfTest.java
package beans;
import com.brokat.twister.*;
import java.io.*;
public class PerfTest
{
private String target = "demo.PerfTest";
private String result = "";
private long lTimeStart = System.currentTimeMillis();
private long duration = 0;
private long counter = 1;
private int iRDOCounter = -1;
private int iReqPerSec = 0;
private BSession session1 = null;
private BObject object = null;
static boolean bIsInit = false;
public BAnythingPool apool = new BAnythingPool();
public BAnythingPool rpool = null;
private synchronized void init()
{
if (!bIsInit)
{
BStdLib.init ("PerfTest");
BStdLib.setLogTCP ("pc-kschulz", 10010);
BStdLib.log ("PerfTest initialization finished");
bIsInit = true;
}
}
public PerfTest()
14
Teil 5/12.3.2 Seite 10
Java Server Pages
Testumgebung
{
}
public void execute() throws IOException
{
long t1 = System.currentTimeMillis();
long t2 = -1;
this.init ();
if (session1==null)
session1 = BSession.newSession();
rpool = new BAnythingPool();
if (session1.process(target, apool, rpool) ==
BError.failed())
throw new IOException("Request failed for session1: " +
target);
t2 = System.currentTimeMillis();
duration = t2 - t1;
counter++;
iRDOCounter = rpool.getLong ("OUT_COUNTER");
iReqPerSec = (int) ((counter*1000)/(t2-lTimeStart));
if (counter % 100 == 0)
{
counter = 1;
lTimeStart = System. currentTimeMillis();
}
}
public long getDuration ()
{
return duration;
}
public int getReqPerSec ()
{
return(iReqPerSec);
}
public long getCount ()
{
return counter;
Java Server Pages
Teil 5/12.3.2 Seite 11
Testumgebung
}
public int getRDOCount ()
{
return iRDOCounter;
}
public static void main ( String args[] ) throws Exception
{
PerfTest perftest = new PerfTest();
perftest.execute();
System.exit(1);
}
}
14
Teil 5/12.3.2 Seite 12
Testumgebung
Java Server Pages
Java Server Pages
Teil 5/12.3.3 Seite 1
Apache 1.3.6/JServ1.05b/Gnu-JSP 0.92
5/12.3.3
Apache 1.3.6/JServ1.05b/
Gnu-JSP 0.92
Komponente
Beschreibung
Hardware
Sun Sparc Ultra2 mit Solaris 2.5.1.
Limit: 100 Prozesse/Anwender!
Performance
Dreimal langsamer als Netscape Enterprise Server 4.0.
Skalierbarkeit
Mit steigender Zahl von parallelen Anfragen steigt die Laufzeit
für eine einzelne Anfrage unproportional hoch. Das kann am
Limit liegen, konnte aber nicht verifiziert werden.
Stabilität
JServ erzeugt häufig einen ClassFormatError.
JDK-1.1.7 auf Solaris hat einen Memory Leak, d.h. die VM
wächst unendlich
Verfügbarkeit
Unix und NT. Auf NT war es eine Betaversion!
Sonstiges
Für Stronghold, der kommerziellen Version von Apache, sollten die Ergebnisse dieselben sein.
14
Teil 5/12.3.3 Seite 2
Apache 1.3.6/JServ1.05b/Gnu-JSP 0.92
Java Server Pages
Java Server Pages
Teil 5/12.3.4 Seite 1
ServletExec-2.2
5/12.3.4
ServletExec-2.2
Komponente
Beschreibung
Hardware
Sun Solaris 2.5.1 E450, 4 CPUs
Performance
date.jsp : Peak 40 Anfragen/Sekunde
PerfTest.jsp: Peak 31 Anfragen/Sekunde
Skalierbarkeit
Die Performance lag zwischen 24 - 31 Anfragen/Sekunde (r/s):
•
•
•
•
•
•
punk –c 10 –t 10 von einem PC: 24 r/s
punk –c 20 –t 20 von einem PC: 24 r/s
punk –c 50 –t 50 von einem PC: 27 r/s
punk –c 150 –t 150 von einem PC: 31 r/s
punk –c 50 –t 50 von einem PC: 24 r/s
punk –c 150 –t 150 von einem PC: 28 r/s
Stabilität
keine Probleme
Verfügbarkeit
Apache 1.3, Microsoft IIS 4.x, Netscape 3.x und 4.0 und MacOS
Server
Sonstiges
Die Administration ist sehr einfach und erfolgt Web-basiert.
14
Teil 5/12.3.4 Seite 2
ServletExec-2.2
Java Server Pages
Java Server Pages
Teil 5/12.3.5 Seite 1
Netscape 4.0 auf Solaris
5/12.3.5
Netscape 4.0 auf Solaris
Komponente
Beschreibung
Hardware
Sun Solaris E450, 4 CPUs
Performance
date.jsp :
Peak 69 r/s
PerfTest.jsp: Peak 31 r/s
Skalierbarkeit
Die Performance war stabil und lag um die 25 r/s:
• punk –c 800 –t 25 von einem PC
• punk –c 100 –t 25 von drei PCs
• punk –c 200 –t 25 von drei PCs
Stabilität
14
punk –c 200 –t 25 von drei PCs:
Plötzlich starb der Web-Server und musste neu gestartet werden. Gründe konnte nicht identifiziert werden.
Teil 5/12.3.5 Seite 2
Netscape 4.0 auf Solaris
Java Server Pages
Java Server Pages
Teil 5/12.3.6 Seite 1
Netscape 4.0 auf NT
5/12.3.6
Netscape 4.0 auf NT
Komponente
Beschreibung
Hardware
Pentium II/233, 128 MB Speicher
Performance
date.jsp :
Peak 25 r/s.
PerfTest.jsp: Peak 18 r/s
Skalierbarkeit
punk –c 800 –t 25 von lokalem PC: N/A.
Kam einem Denial Of Service nahe.
punk –c 100 –t 100 von lokalem PC: 21 r/s.
punk –c 200 –t 25 von lokalem PC: 19 r/s.
Für hohe Last ist diese Kombination nicht zu empfehlen.
Stabilität
punk –c 800 –t 25 schoss den Web-Server ab.
Denial of Service!
Nachdem die obigen Tests vorgenommen wurden, haben wir
uns für ServletExec und Netscape 4.0 Web-Server entschieden und weitere Tests durchgeführt. Die Ergebnisse waren
wie nachfolgend beschrieben.
Für die Tests wurde folgende Konfiguration verwendet:
• SUN Enterprise 450 (4 x 400 MHz, 1 GByte RAM, Solaris
2.6)
• Netscape Enterprise Server 4.0
• JDK 1.1.8
• ServletExec 2.2
• Client-Rechner: bis zu vier NT-Rechner, mit P2- bzw. P3Prozessoren.
• Client-Applikation: "Punk"
• Server-Applikation: PerfTest10.jsp, date10.jsp
Anzahl Request
Parallel
PC-1
PC-2
5000
50
90r/s
60r/s
5000
100
97r/s
74r/s
14
Beschreibung
der Testumgebung
Teil 5/12.3.6 Seite 2
Netscape 4.0 auf NT
Java Server Pages
Herunterladen