Eine Einfuehrung zu JSP finden Sie unter jsp-einfuehrung.htm
Installationsbeschreibungen finden Sie unter jsp-install.htm
JSP-Aufrufe im HTML-Dokument |
|
<html> <head> <title>Meine erste JSP</title> </head> <body> <h1>Meine erste JSP</h1> <% // beliebiger Java-Code out.println( "Hallo" ); %> <%= request.getRemoteHost() %> ... </body> </html> |
<html> schließt das gesamte HTML-Dokument ein. <head> schließt den Header ein. <body> schließt den Hauptteil ein. JSP-Kommandos sind in <% ... %> oder <jsp:... .../> eingeschlossen. Sie können auch in einer externen Datei enthalten sein, die per Include eingebunden wird: '<%@ include file="Header.html" %>' (Compilierzeit) oder '<jsp:include page="Header.html"/>' (Laufzeit) |
Predefined Variables (Implicit Objects) |
|
request.getAttribute(); request.getParameterNames(); request.getParameter(); request.getParameterValues(); request.getQueryString(); request.getRemoteHost(); |
request (HttpServletRequest) Anfrage vom Client. |
response.setContentType("text/plain"); |
response (HttpServletResponse) Antwort an den Client, z.B. MIME-Typ. |
out.println( "Hallo !" ); out.flush(); |
out (JspWriter, buffered PrintWriter). |
session.getId(); session.getAttributeNames(); session.getAttribute(); session.setAttribute(); |
session (HttpSession). |
config.getInitParameter(); config.getInitParameterNames(); |
config (ServletConfig). |
application.log(); application.getServerInfo(); application.getMimeType(); application.getRealPath(); application.getResourceAsStream(); application.getAttribute(); application.setAttribute(); |
application (ServletContext, getServletConfig().getContext()). |
pageContext.findAttribute(); pageContext.getAttribute(); |
pageContext (PageContext) Seitenattribute, implizite Objekte und Kapselung Server-spezifischer Features. |
page... |
page (this) Wird mit Java nicht benötigt. |
exception.getMessage(); exception.printStackTrace(); exception.toString(); |
exception (Throwable) Ausnahmen. |
Sonderzeichen |
|
<\% | <% im statischen HTML-Template oder Attribut. |
%\> | %> im JSP-Java-Code oder Attribut. |
\' \" | ' und " im Attribut. |
Directives, Declarations, Scriptlets, Expressions |
|
<!-- ... --> Beispiel: <!-- HTML Kommentar --> |
HTML Comment, ist in Ergebnis-HTML-Datei sichtbar. |
<%-- ... --%> Beispiel: <%-- JSP Kommentar --%> |
JSP Comment, in Ergebnis-HTML-Datei nicht mehr sichtbar. |
<%@ ... %> Beispiele: <%@ page import="java.util.*" %> <%@ page isThreadSafe="false" %> <%@ include file="url" %> |
JSP Directives sind Anweisung zum globalen Dokument und Anweisungen an die JSP-Engine. |
<%! ... %> Beispiel: <%! private int accessCount = 0; %> Accesses to page since server reboot: <%= ++accessCount %> |
JSP Declarations sind Dokument-weite Deklarationen und werden außerhalb der service-Methode implementiert. Hier können bei Bedarf die Funktionen jspInit() und jspDestroy() des Interface JspPage implementiert werden. Hier deklarierte Variablen sind von allen Threads gemeinsam genutzte Instanzvariablen, weshalb wegen der Thread-Sicherheit hier normalerweise nur Konstanten und Methoden Sinn machen. |
<% ... %> Beispiel: <% String s = request.getQueryString(); out.println( "GET data: " + s ); if( boolVar ) { %> <jsp:forward page='<%= Second.jsp %%>' /%> <% } %> |
JSP Scriptlets stellen innerhalb der service-Methode implementierten Code dar. Wichtig: Eine geschweifte Klammer ('{ ... }'), die in einem '<% ... %>'-Block beginnt, kann im nächsten '<% ... %>'-Block geschlossen werden, wie das Beispiel links zeigt. |
<%= ... %> Beispiele: Date: <%= new java.util.Date() %> Host: <%= request.getRemoteHost() %> |
JSP Expressions sind einzelne Ausdrücke (ohne abschließendes Semikolon), die ausgegeben werden (Abkürzung für out.println()). |
<jsp:... ... /> Beispiele: <jsp:include page="relativeUrl" /> <jsp:useBean att="val" /> <jsp:forward page='<%= Second.jsp %%>' /%> |
JSP Actions starten zusätzliche Funktionalität zur Laufzeit. |
Actions |
|
<jsp:include page="relativeUrl" flush="true"/> |
Einfügen einer HTML- oder JSP-Seite zur Laufzeit. (<%@ include file="..." %> dagegen fügt zu Compilierzeit ein.) |
<jsp:useBean id="myName" class="myPackage.MyClass"/> | Aufruf einer JavaBean. Bei class=... muss der komplette Pfad angegeben werden. Weiteres zu JavaBeans unter: Java-Basics-JavaBean. |
<jsp:useBean id="myName" class="myPackage.MyClass"> ... </jsp:useBean> |
Aufruf einer JavaBean im Container-Format. Die Anweisungen im Body werden nur bei erster Instanziierung ausgeführt und nicht, wenn die Bean bereits in Benutzung ist. |
<jsp:useBean id="myName" class="myPackage.MyClass" scope="..." type="..." beanName="..."/> |
Aufruf einer JavaBean mit zusätzlichen Parametern. scope definiert den Kontext: page, request, session oder application. type definiert den Variablentyp. beanName übergibt den Name der Bean für die instantiate-Methode. |
<jsp:getProperty name="myName" property="someProperty"/> <jsp:setProperty name="myName" property="someProperty" value="someValue"/> <jsp:setProperty name="myName" property="someProperty" param="someRequestParam"/> |
Ermitteln und Ändern von Eigenschaften einer JavaBean. |
<jsp:setProperty name="myName" property="*"/> | Übertragung aller gleichnamiger Request-Parameter zur JavaBean. |
<jsp:forward page="errorReport.jsp"/> <jsp:forward page="<%= ... %>"/> |
Weiterleiten auf andere Seite. |
<jsp:plugin type="applet" code="NervousText.class" codebase="/applets/NervousText" height="50" width="375"/> <params> <param name=text value="..." > </params> <fallback>Error</fallback> </jsp:plugin> |
Web-Browser-spezifischen Code (OBJECT bzw. EMBED) für Java-Plug-in. |
URL-Rewriting statt Cookies |
|
<form action='<%= response.encodeURL("my.jsp") %>'> <% response.sendRedirect( response.encodeRedirectURL("my.jsp"));%> |
Normalerweise funktioniert die Wiedererkennung des Clients per im Client-Webbrowser gesetzten temporären Cookies. Für den Fall, dass der Benutzer nicht nur permanente, sondern unnötigerweise auch temporäre Cookies verbietet, kann URL-Rewriting eingesetzt werden, wie es die nebenstehenden Beispiele zeigen. |
Threads |
|
Falls Objekte von mehreren Threads benutzt werden können, muss auf Thread-Sicherheit geachtet werden. Dies gilt insbesondere für Objekte in JSP Declarations (<%! ... %>), JavaBeans und für Datenbankverbindungen, aber auch für andere Objekte. Andererseits sollte Serialisierung nur erzwungen werden, wo nötig, um die Performance nicht zu beeinträchtigen. |
|
<%@ page isThreadSafe="false" %> |
Mit der JSP Directive <%@ page isThreadSafe="false" %> kann die gesamte .jsp-Seite als nicht multithread-fähig gekennzeichnet werden, damit der Webserver entweder mehrere Instanzen der JSP-Klasse erzeugt oder wartet, bis die vorherige Instanz beendet ist. |
synchronized (this) { seitenZugriffsZaehler++; if( 0 == seitenZugriffsZaehler % 30 ) seitenZugriffsZaehlerSpeichern(); } public synchronized void myCriticalFunction() { ...; } |
Mit synchronized können sowohl Objekte als auch Methoden geschützt werden. |
<html><body> <%@ page import = "java.util.*" %> <b>Parameters:</b><br> <% Enumeration parameterList = request.getParameterNames(); while( parameterList.hasMoreElements() ) { String sName = parameterList.nextElement().toString(); String[] sMultiple = request.getParameterValues( sName ); if( 1 >= sMultiple.length ) out.println( sName + " = " + request.getParameter( sName ) + "<br>" ); else for( int i=0; i<sMultiple.length; i++ ) out.println( sName + "[" + i + "] = " + sMultiple[i] + "<br>" ); } %> </body></html>
<%@ page import = "java.util.*" %> <% final String s1 = "<tr bgcolor='#EBEEEE'><td>"; final String s2 = "</td><td>"; final String s3 = "</td></tr>\n"; StringBuffer sb = new StringBuffer(); Enumeration parameterList = request.getParameterNames(); while( parameterList.hasMoreElements() ) { String sName = parameterList.nextElement().toString(); String[] sMultiple = request.getParameterValues( sName ); if( 1 >= sMultiple.length ) sb.append( s1 + sName + s2 + request.getParameter( sName ) + s3 ); else for( int i=0; i<sMultiple.length; i++ ) { sb.append( s1 + sName + "[" + i + "]" + s2 + sMultiple[i] + s3 ); } } if( 0 < sb.length() ) sb.insert( 0, "<table border=0 cellspacing=3 cellpadding=3>\n" + "<tr bgcolor='#EBEEEE'><th colspan='2'>" + "<big>Erhaltene Parameter</big></th></tr>\n" ) .append( "</table>\n" ); %> <html> <body> <form action="FormShow.jsp?urlParm=seeUrl#Scroll" method="post"> <input type="hidden" name="hidden" value="hid"> <table border=0 cellspacing=3 cellpadding=3> <tr bgcolor='#EBEEEE'><th colspan='2'> <big>Formular</big><br> Bitte Eingaben ändern und Submit betätigen</th></tr> <tr bgcolor="#EBEEEE"><td>SelectDropDown</td> <td> <select name="SelectDropDown" size=1> <option value="1">Opt. 1</option> <option value="2" selected>Opt. 2</option> <option value="3">Opt. 3</option> <option value="4">Opt. 4</option> </select> </td></tr> <tr bgcolor="#EBEEEE"><td>SelectMultiple</td> <td> <select name="SelectMultiple" size=3 multiple> <option value="1">Opt. 1</option> <option value="2">Opt. 2</option> <option value="3" selected>Opt. 3</option> <option value="4" selected>Opt. 4</option> </select> </td></tr> <tr bgcolor="#EBEEEE"><td>Textarea</td> <td> <textarea name="Textarea" cols=20 rows=3>Text ...</textarea> </td></tr> <tr bgcolor="#EBEEEE"><td>Textfeld</td> <td> <input type="text" name="Textfeld" value="Text ..." size=20 maxlength=50> </td></tr> <tr bgcolor="#EBEEEE"><td>Passwort</td> <td> <input type="password" name="Passwort" value="xx" size=20 maxlength=10> </td></tr> <tr bgcolor="#EBEEEE"><td>Checkboxen cb1...cb3</td> <td> <input type="checkbox" name="cb1"> <input type="checkbox" name="cb2" checked> <input type="checkbox" name="cb3"> </td></tr> <tr bgcolor="#EBEEEE"><td>Radiobuttons ra</td> <td> <input type="radio" name="ra" value="1"> <input type="radio" name="ra" value="2" checked> <input type="radio" name="ra" value="3"> </td></tr> <tr bgcolor="#EBEEEE"><td>Submit</td> <td> <button type="submit" name="Submit" value="SubmitImg"> <img src="http://www.torsten-horn.de/logo.gif" alt="Submit"> </button> <input type="submit" name="Submit" value="Submit1"> <input type="submit" name="Submit" value="Submit2"> </td></tr> </table> </form> <a name="Scroll"></a> <%= sb.toString() %> </body> </html>
Mögliche Beispiele für JDBC-Type-4-Treiber und die Strings sDbDrv und sDbUrl für die Datenbanken MySQL, PostgreSQL und Oracle:
JDBC-Type-4-Treiber | sDbDrv sDbUrl |
|
---|---|---|
MySQL | mysql-connector-java-5.1.16-bin.jar | com.mysql.jdbc.Driver jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName |
PostgreSQL | pgjdbc2.jar | org.postgresql.Driver jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName |
Oracle | classes12.zip | oracle.jdbc.OracleDriver jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL |
<html> <body> <%@ page import = "java.sql.*" isThreadSafe="false" %> <% String sDbDrv = "com.mysql.jdbc.Driver"; String sDbUrl = "jdbc:mysql://localhost:3306/test"; String sUsr = ""; String sPwd = ""; String sTable = "TestTabelle"; String sSql = ""; if( request.getParameterNames().hasMoreElements() == true ) { sDbDrv = request.getParameter( "prmDbDrv" ); sDbUrl = request.getParameter( "prmDbUrl" ); sUsr = request.getParameter( "prmUsr" ); sPwd = request.getParameter( "prmPwd" ); sTable = request.getParameter( "prmTab" ); sSql = request.getParameter( "prmSql" ); if( null != sTable && 0 < sTable.length() && (null == sSql || 0 == sSql.length()) ) sSql = "SELECT * FROM " + sTable; } %> <form method="post"><pre> Db-Treiber <input type="text" name="prmDbDrv" value='<%= sDbDrv %>' size=60><br> Db-URL <input type="text" name="prmDbUrl" value='<%= sDbUrl %>' size=60><br> Benutzer <input type="text" name="prmUsr" value='<%= sUsr %>' size=60><br> Kennwort <input type="password" name="prmPwd" value='<%= sPwd %>' size=60><br> Tabellenname <input type="text" name="prmTab" value='<%= sTable %>' size=60><br> SQL-Kommando <input type="text" name="prmSql" value='<%= sSql %>' size=60> (nach Änderung anderer Parameter muss SQL-Kommando gelöscht werden)<br> <input type="submit" name="submit" value="Datenbanktabelle anzeigen"> </pre></form> <% if( request.getParameterNames().hasMoreElements() == true && null != sDbDrv && 0 < sDbDrv.length() && null != sDbUrl && 0 < sDbUrl.length() && null != sSql && 0 < sSql.length() ) { Connection cn = null; Statement st = null; ResultSet rs = null; try { Class.forName( sDbDrv ); cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd ); st = cn.createStatement(); rs = st.executeQuery( sSql ); ResultSetMetaData rsmd = rs.getMetaData(); int n = rsmd.getColumnCount(); out.println( "<table border=1 cellspacing=0><tr>" ); for( int i=1; i<=n; i++ ) // Achtung: erste Spalte mit 1 statt 0 out.println( "<th>" + rsmd.getColumnName( i ) + "</th>" ); while( rs.next() ) { out.println( "</tr><tr>" ); for( int i=1; i<=n; i++ ) // Achtung: erste Spalte mit 1 statt 0 out.println( "<td>" + rs.getString( i ) + "</td>" ); } out.println( "</tr></table>" ); } finally { try { if( null != rs ) rs.close(); } catch( Exception ex ) {/*ok*/} try { if( null != st ) st.close(); } catch( Exception ex ) {/*ok*/} try { if( null != cn ) cn.close(); } catch( Exception ex ) {/*ok*/} } } %> </body> </html>
<html><body> <%@ page import = "torstenhorn.meinpackage.*" %> <h1>Mein JSP- und JavaBeans-Test</h1> <form action="MeinJspUndJavaBeansTest.jsp"> Bitte Zahl eingeben: <input type="text" name="EingabeZahl" size=5 maxlength=5><br> </form> <% String s1 = request.getParameter( "EingabeZahl" ); if( null != s1 ) out.println( "Das Quadrat von '" + s1 + "' ist: '" + MeineBean.meineFunktion( s1 ) + "'." ); %> </body></html>
package torstenhorn.meinpackage; public class MeineBean { public static String meineFunktion( String s ) { try { int i = Integer.parseInt( s ); return "" + (i * i); } catch( Exception ex ) { return "Fehler, bitte Zahl eingeben!"; } } }
Manchmal kann es etwas schwierig sein, die absoluten Pfadangaben im Dateisystem des JSP-Servers zu ermitteln. Dann sollten Sie mit folgender JSP-Datei die Pfade ermitteln:
<html> <body> Absolute Pfade im Dateisystem des JSP-Servers:<br> <pre> <%= getServletConfig().getServletContext().getRealPath( "/" ) %><br> <%= getServletConfig().getServletContext().getRealPath( request.getRequestURI() ) %><br> </pre> </body> </html>