Advanced   Java   Services Scriptlets Back Next Up Home

Scriptlets

Von Scriptlets wird mittlerweile aus guten Gründen abgeraten, siehe weiter unten. Trotzdem soll hier aus historischen Gründen mit einer Übersicht über die verschiedenen Scripting-Elemente begonnen werden.

Die Scripting-Elemente werden hier an Hand von Beispielen vorgestellt.

Code-ElementScripting in HTML
Importanweisung
(Spezialfall einer Direktive)
<%@ page import = "java.util.*" %>
<%@ page import = "java.util.*, java.io.*" %>
Deklaration/Definition
<%! StringBuilder sb = new StringBuilder("Hallo");%>
<%! int i = 17;%>
Statement
<% i = (int)(49*(Math.random()+1)); %>
Ausdruck
<%= (int)(49*(Math.random()+1)) %>  (kein Leerzeichen zwischen % und =)
if/else
<% if (user.name().equals("Max")) { %>
    <p>Welcome, Max!</p>
<% } else { %>
    <p>Welcome, guest!</p>
<% } %>
for
<%
for ( int i = 0; i < n; i++ )
{
  %>
  Number: <%= i+1 %><br/>
  <%
}
%>
Kombination mehrerer Scriptlets
<%!
class Authors
{
   String[] authors = {"Anatole France", "Guy de Maupassant"};


   public String[] getAuthors()
   {
      return authors;
   }
}
%>
<%
Authors aut = new Authors();
%>
<%
  String[] authors = aut.getAuthors();
  if (authors != null)
  {
%>
<br/>
<b>You selected the following authors:</b>
<ul>
<%
    for (String author : authors)
    {
%>
    <li><%= author %></li>
<%
    }
  }
%>
</ul>


Implizite Objekte

Es gibt in JSP acht implizite Objekte, auch vordefinierte Variablen genannt, die aufgrund ihrer Namen den direkten Bezug zu Servlets zeigen: application, config, out, page, pageContext, request, response, session.

Implizite Objekte und ihre Superklassen
Implizites
Objekt
Klasse Superklasse Supersuperklasse Implementiertes Interface
(Es gibt höchstens eines)
application org.apache.catalina.core.ApplicationContextFacade java.lang.Object no superclass javax.servlet.ServletContext
config org.apache.catalina.core.StandardWrapperFacade java.lang.Object no superclass javax.servlet.ServletConfig
out org.apache.jasper.runtime.JspWriterImpl javax.servlet.jsp.JspWriter java.io.Writer no interface
page org.apache.jsp.predefined_jsp org.apache.jasper.runtime.HttpJspBase javax.servlet.http.HttpServlet org.apache.jasper.runtime.JspSourceDependent
pageContext org.apache.jasper.runtime.PageContextImpl javax.servlet.jsp.PageContext no superclass no interface
request org.apache.catalina.connector.RequestFacade java.lang.Object no superclass javax.servlet.http.HttpServletRequest
response org.apache.catalina.connector.ResponseFacade java.lang.Object no superclass javax.servlet.http.HttpServletResponse
session org.apache.catalina.session.StandardSessionFacade java.lang.Object no superclass javax.servlet.http.HttpSession


JSP Directiven

JSP Direktiven geben Anweisungen und Informationen an den Servlet/JSP Container.

Die page-Direktive und ihre Verwendung wurde bereits erwähnt. Direktiven können auch Attribute haben. Die allgemein Form einer Direktive ist wie folgt.

Form einer Direktive
Scriptlet-Stil XML-konformer Stil
<%@ directiveName attribute1="value1" attribute2="value2"%> <jsp:directive.directiveName attribut1="value1" attribut2="value2" />

Die Attribute sind key-value Paare die durch ein Leerzeichen oder einen Zeilenumbruch nicht aber durch ein Komma getrennt werden. Es kann auch mehr als zwei Attribute geben. Das Leerzeichen nach @ ist optional, ebenso das Leerzeichen nach dem letzten Attribut.

Es gibt nur drei verschiedene Direktiven. In der XML-Form steht der Name der Direktive nach dem Punkt nach "directive".

Direktive (Script-Form) Direktive (XML-Form) Beschreibung
<%@ include ... %> <jsp:directive.include ... /> Fügt beim Parsen der JSP die angegebene Datei ein.
<%@ page ... %> <jsp:directive.page ... /> Vereinbart seitenspezifische Attribute, etwa welche Skriptsprache, welches Encoding, welche Fehlerseite verwendet werden soll.
<%@ taglib ... %> <jsp:directive.taglib ... /> Deklariert eine tag library


Die include Direktive

Mit der include-Direktive kann man externe Dateien einbinden. Diese Direktive kann überall stehen und die angegebene Datei wird dann an dieser Stelle während des Übersetzungsvorgangs eingefügt. Es gibt nur das Attribut file.

include Direktive (Script-Form) include Direktive (XML-Form)
<%@ include file="relative-url"> <jsp:directive.include file="relative url" />


Die page Direktive

Die page-Direktive verfügt über dreizehn verschiedene Attribute.
autoFlush, buffer, contentType, errorPage, isErrorPage, extends, import, info, isELIgnored, isScriptingEnabled, isThreadSafe, language, session.

page Direktive (Script-Form) page Direktive (XML-Form) Werte Beschreibung
<%@ page autoFlush="true"%> <jsp:directive.page autoFlush="false" /> true (default)
false
true = Ausgabepuffer wird automatisch geleert, wenn notwendig.
false = Falls der Ausgabepuffer voll ist wird eine Exception geworfen.
<%@ page buffer="none"%> <jsp:directive.page buffer="16kb" /> none
XXkb
Angabe von "none" bedeutet, daß Daten sofort zum response-Objekt geschickt werden. Andernfalls werden Sie in einem Ausgabepuffer der angegebenen Größe zwischengespeichert. Wird meist zusammen mit dem autoFlush-Attribut verwendet.
<%@ page contentType="text/html"%> <jsp:directive.page contentType="text/html:charset=ISO-8859-1" /> text/html (default)
bel. mimetype
Setzt den Texttyp und das Encoding.
<%@ page errorPage="myerrorpage.html"%> <jsp:directive.page errorPage="myerrorpage.html" /> relative URL Setzt die Seite, die angezeigt wird, wenn auf der aktuellen Seite eine Exception geworfen wird, die nicht auf der Seite abgefangen wird.
<%@ page isErrorPage="myerrorpage.html"%> <jsp:directive.page isErrorPage="myerrorpage.html" /> false (default)
true
Zeigt an, daß diese Seite aufgrund eines errorPage-Atrributs einer anderen Seite aufgerufen wird.
<%@ page extends="aPackage.aClass"%> <jsp:directive.page extends="aPackage.aClass" /> false (default)
true
Gibt eine Superklasse an, von der das generierte Servlet erben muß.
<%@ page import="java.util.*"%> <jsp:directive.page import="java.util.*" /> Importattribut (siehe erste Tabelle).
<%@ page info="InfoText"%> <jsp:directive.page info="InfoText" /> String Definiert einen String den die Methode getServletInfo() liefert.
<%@ page isELIgnored="true"%> <jsp:directive.page isELIgnored="false" /> false
true
Gibt an, ob EL (expression language) ignoriert wird oder nicht. EL wurde mit JSP 2.0 eingeführt und wird im nächsten Kapitel besprochen. true bedeutet, daß die EL Ausdrücke wie Text behandelt werden.
The default value varies depending on the version of the web application deployment descriptor. The default mode for JSP pages delivered using a Servlet 2.3 or earlier descriptor is to ignore EL expressions; this provides backward compatibility. The default mode for JSP pages delivered with a Servlet 2.4 descriptor is to evaluate EL expressions; this automatically provides the default that most applications want. (siehe)
<%@ page isScriptingEnabled="true"%> <jsp:directive.page isScriptingEnabled="false" /> true (default)
false
Bestimmt ob Scriptelemente zulässig sind. Steht der Schalter auf false, so werden Scriptelemente vom JSP-Parser nicht mehr akzeptiert, EL-Ausdrücke (expression language) dürfen jedoch verwendet werden.
<%@ page isThreadSafe="true"%> <jsp:directive.page isThreadSafe="false" /> true (default)
false
Gibt an, ob eine Seite thread-safe ist. Wird diese Option auf false gesetzt, so stellt die JSP-Engine sicher, daß diese Seite nur von einem einzigen Thread ausgeführt wird.
<%@ page language="java"%> <jsp:directive.page language="java" /> java (default) Gibt die Programmiersprache an, die auf der JSP-Seite verwendet wird.
<%@ page session="true"%> <jsp:directive.page session="false" /> true (default)
false
Gibt an, ob die JSP-Seite eine HTTPSession verwendet. true bedeutet, daß die JSP-Seite auf das implizite Objekt session zugreifen kann.


Die taglib Direktive

Die JSP-Spezifikation stellt mittlerweile die Existenz einer Library von Standard Tags sicher (JSTL). es können aber auch eigene Tags eingeführt werden. Diese werden mit einer taglib Direktive dem Parser bekanntgemacht. Die JSTL wird im übernachsten Kapitel besprochen.

taglib Direktive (Script-Form) taglib Direktive (XML-Form)
<%@ taglib uri="uri" prefix="prefixOfTag" > <jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

Nachteile von Scriptelementen

Scriptelemente wurden 2001 mit der ersten Version von JSP eingeführt. Bei der Vorstellung der Scriptelemente zeigt besonders das letzte Beispiel Kombination mehrerer Scriptlets die Mängel dieses Konzepts. Ständig wird zwischen HTML und Java hin- und hergesprungen. Der Javacode enthält oft nur Schnipsel und nicht einmal vollständige Statements. Daraus resultiert sofort ein ganzes Bündel von Problemen.

Mit den nächsten JSP Versionen wurden deshalb zwei Neuerungen eingeführt, die Scriptelemente ablösen können.

Valid XHTML 1.0 Strict top Back Next Up Home