| 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.StringGET-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") %>