Webentwicklung - Web-FrontendsHochschule für Technik und Wirtschaft Berlin, Dipl.-Inform. Thomas Ziemer |
|
|
Dipl.-Inform. Thomas Ziemer
%messages.pagePresentation.showMaximized%Viele der in JSP verwendeten Konzepte werden auch in modernen Frameworks verwendet:
<html>
<head>
<title>Meine tolle Webseite mit einem Datum</title>
</head>
<body>
Es ist: <%= new java.util.Date().toString() %>
</body>
</html>
Das angezeigte Datum mit Uhrzeit ist bei jedem Seitenaufruf aktuell.
<%= auswertbarer Java-Ausdruck %>
<%= new java.util.Date().toString() %>
Der ermittelte Wert des Ausdrucks wird textuell in die Webseite eingefügt und damit angezeigt.
<% beliebiger ausführbarer Java-Code %>
Der Code wird ausgeführt.
<%! Deklaration einer Methode oder eines Instanzattributs %>
<%! String datetime = new java.util.Date().toString(); %>
Die deklarierten Methoden und Instanzattribute können an beliebiger anderer Stelle in der selben Webseite genutzt werden.
<%-- JSP-Kommentar, im HTML-Code unsichtbar --%>
<!-- HTML-Kommentar, im HTML-Code sichtbar -->
<%@ include file="Datei–Pfad relativ zur JSP-Seite" %>
Die Datei wird vor der HTML-Erzeugung textuell eingebunden.
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html" %>
<%@ page import="java.util.Date" %>
Globale Angaben über die JSP-Seite
<%-- Import-Direktive (globale Angabe) --%>
<%@ page import="java.util.Date" %>
<html>
<body>
<h3>JSP-Uhrzeit</h3>
<%-- JSP-Deklaration (Attr. oder Meth. deklarieren) --%>
<%! String datetime = new Date().toString(); %>
<%-- JSP-Ausdruck (ermittelten Wert einfügen) --%>
Es ist: <%= datetime %>
</body>
</html>
Das sieht erst einmal einfach aus, birgt aber eine große Problematik! Wir kommen gleich darauf zurück.
<html>
<body>
<h3>
<%
String[] valueArray = {"Rather", "dull", "example"};
for (int i = 0; i < valueArray.length; i++) {
%>
<%= valueArray[i] %>
<%
}
%>
</h3>
</body>
</html>
Java-Code steht nicht einfach so kontextlos herum. Er muss stets durch einen Klassenkontext umgeben werden. Jede JSP entspricht genau einer Java-Klasse.
Abb. www.joerg-buchberger.de/jbde/inet2/index.html
Ergo: Dieselbe Instanz beantwortet Anfragen verschiedener Clients!
Instanzattribute machen den Code nicht "reentrant" und nicht "thread-safe"!
<html>
<body>
<h3>JSP-Uhrzeit</h3>
<%-- JSP-Deklaration (Attr. oder Meth. deklarieren) --%>
<%! String datetime = new java.util.Date().toString(); %>
<%-- JSP-Ausdruck (ermittelten Wert einfügen) --%>
Es ist: <%= datetime %>
</body>
</html>
Frage: Wo liegt das Problem?
<html>
<body>
<h3>JSP-Uhrzeit</h3>
<%!
String getDate() {
String datetime = new java.util.Date().toString();
return datetime;
}
%>
Es ist: <%= getDate() %>
</body>
</html>
Bei jedem Aufruf von getDate()
wird das Attribut neu berechnet. Die Antwort lautet "Zeitersparnis".
Im Gegensatz zu Server-Skripten (z.B. in PHP) wird nur einmal Lade- und Instanziierungszeit benötigt.
Bei Bedarf werden JSPs mittels Load-Balancing und zusätzlichen Instanzen skaliert.
HttpServlet
...
javax.servlet
und Unterpakete (vom Web-Container)doGet(HttpServletRequest, HttpServletResponse);
doPost(HttpServletRequest, HttpServletResponse);
PrintStream
zu erzeugen
<html>
<body>
<%-- JSP-Ausdruck (ermittelten Wert einfügen) --%>
Ihr Browser ist: <%= request.getHeader("User-Agent") %><br/>
Ihre IP-Adresse ist: <%= request.getRemoteAddr() %>
</body>
</html>
Und wie sieht das daraus entstehende Java-Servlet aus?
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// 1. Process request-parameters and -headers
String browser = request.getHeader("User-Agent");
String ipAddress = request.getRemoteAddress();
// 2. Prepare the response
response.setContentType("text/html");
// 3. Write to Response-PrintWriter
...
}
}
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
...
// 3. Write to Response-PrintWriter
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("Ihr Browser ist: " + browser + "<br/>" +
"Ihre IP-Adresse ist: " + ipAddress);
out.println("</body></html>");
}
}
Geeignet für Attribute, ... | |
---|---|
Page context | ...die nur während der Seitengenerierung benötigt werden; nach etwaigem Redirect kann darauf nicht mehr zugegriffen werden |
Request context | ...die vom Eintreffen des HTTP-Requests bis zum Senden des HTTP-Response verfügbar sein sollen (inkl. Redirect) |
Session context | ...die über die Dauer der Benutzer-Session erhalten bleiben sollen |
Application context | ...die während der gesamten Laufzeit der Webanwendung erhalten bleiben sollen |
Bedeutung | |
---|---|
pageContext | javax.servlet.jsp.PageContext |
request | javax.servlet.http.HttpServletRequest |
session | javax.servlet.http.HttpSession |
application | javax.servlet.http.ServletContext |
scope
-Angaberequest.getCookies()
und response.addCookie(Cookie)
setAttribute(String, Object)
undgetAttribute(String)
in pageContext, request, session und application
package beans;
public class UserBean {
private String firstName; // das ist ein Property
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
<jsp:useBean id="myUser"
class="beans.UserBean"
scope="session"/>
myUser
vom Typ UserBean
im Package beans
benutzen, das im Kontext session
liegt.String
GET
-Methode mit ? und & an die URL angehangenPOST
-Methode im Content eingefügt, "unsichtbar"
<html>
<body>
<form action="nextPage.jsp" method="POST">
<label for="firstName">Vorname</label>
<input name="firstName" type="text" placeholder="Hein"/>
<input value="Speichern" type="submit"/>
</form>
</body>
</html>
name
korrespondiert mit id
aus dem Tag<jsp:useBean ...>
. Der Wert des Propertys firstName wird explizit gesetzt:
<jsp:setProperty name="myUser"
property="firstName"
value="Hein"/>
<jsp:setProperty name="myUser"
property="firstName"
param="firstName"/>
<jsp:setProperty name="myUser"
property="firstName"/>
<jsp:getProperty name="myUser"
property="firstName"/>
<jsp:setProperty ...>
werden sie in einer Bean-Property gespeichert.jsessionid
mitgegeben
<jsp:forward page="nextPage.jsp">
<%-- optionale Angaben --%>
<jsp:param name="firstName" value="Hein"/>
</jsp:forward>
nextPage.jsp
übernommen.
<% response.sendRedirect(
"https://domain.tld/nextPage.jsp?firstName=Hein") %>