25.Okt. JavaServerPages als View

Werbung
Web 2.0
Software-Architekturen
JavaServerPages als dynamische View einer MVC Anwendung
Prof. Dr. Nikolaus Wulff
Von Servlets zu JSP's
• Die Erstellung der HTML Ausgabe in einem Servlet
endete in uneffektiven „out.println Orgien“.
• JSPs sollen die Servlets als Controller von dieser
Aufgabe entlasten.
• Ziel ist die Trennung der Datenverarbeitung von der
Darstellung der Daten.
• Beim ersten Laden eine JSP wird aus dieser ein
Web-Container internes Servlet generiert, das die
HTML Ausgabe ermöglicht, ohne dies explizit
selber zu codieren...
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
2
Java Server Pages
• Ermöglichen Aufgabenverteilung (Design und Codierung)
bei der Entwicklung
• Trennung nach dem Model-View-Controller-Pattern
• Plattformunabhängig
• Alle Bibliotheken des JDK stehen zur Verfügung
• Sehr gute Unterstützung von Multithreading
• Strukturiertes Exception-Handling
• Gute bis sehr gute Performance:
– Kompilierung der Seite erfolgt nur beim ersten Aufruf
– Java auf Server-Seite ist schnell!
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
3
Andere Technologien
• Viele Techniken unterstützen keine Trennung der
Datenverarbeitung und Darstellung (z.B. Perl, PHP).
• CGI-Skripte starten bei jedem Aufruf einen Prozess auf
dem Server, dies führt zur schlechten Performance.
• Häufig aufwendiges Session-Management (z.B. Perl)
• Servlets erlauben kein normales Design einer Webseite.
• Active Server Pages sind konzeptionell sehr ähnlich:
– Ist meist auf Microsoft-Plattformen beschränkt
– Basiert auf .Net (meist Visual Basic oder C#).
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
4
Architektur-Überblick
Application-Server
Browser
Browser
Web-Container
Web-Container
JavaScript
Servlet
RMI
IIOP
EJB
DB
JNDI
JDBC
JAF
JMS
JTA
JSP
JNDI
JDBC
JAF
JMS
JTA
AJAX
HTTP
EJB-Container
EJB-Container
Präsentation
Präsentation
Geschäftslogik
• Darstellung
von HTML, XML
• Session Verwaltung
• Use Cases
• HTML Generierung
• Business Objects
• ggf. Scripting
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
5
Hello World!
Eine einfache Java Server Page:
<HTML>
<BODY>
<% out.println(„Hello JSP World!“); %>
</BODY>
</HTML>
<% ... %> beschreibt ein Java Scriplet: Java Code
direkt eingebettet in eine HTML Seite.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
6
Prinzip der Java Server Pages
• HTML-Design mit Tool nach Wahl (z.B. Dreamweaver)
• Einfügen des Java-Codes mit geeignetem Editor,
Dateiendung *.jsp
• Bereitstellen der Datei im entsprechenden Verzeichnis
auf dem Webserver
• Beim ersten Aufruf durch einen Client kompiliert der
Webserver die JSP in ein Servlet
• Bei einem erneuten Abruf der Seite prüft der Webserver,
ob sich die Seite geändert hat. Falls nein, wird das zuvor
kompilierte Servlet ausgeführt.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
7
Beispiel
• Es soll eine einfache HTML-Seite erstellt werden,
welche analog zum HelloWorld-Servlet die aktuelle
Uhrzeit anzeigt.
• Schreiben einer „normale HTML-Seite“, die lediglich die
Endung „*.jsp“ hat.
• Das einzige Dynamische ist ein Skriplet
<%=new Date() %>
• welches bei jedem Aufruf die aktuelle Zeit in den
Ausgabestrom der Seite schreibt.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
8
Dynamische HelloWorld JSP
<%@ page language="java" import="java.util.*" %>
<HTML><HEAD>
<TITLE>HelloWorld JSP</TITLE>
</HEAD><BODY>
<H1>HelloWorld</H1>
Dieser erste Teil ist statischer Text. <br/>
Hier kommt eine dynamisch erzeugte Ausgabe<br/>
Hier und jetzt ist es: <%=new Date() %>
</BODY></HTML>
HTML und Java gemischt auf einer Seite.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
9
Laufzeitumgebung
• Java SDK muss installiert sein (Compiler!)
• Servlet-Engine des Webservers muss JSPs
verarbeiten können
• Beispiele:
– WebLogic Application Server
– IBM WebSphere
– Apache Webserver mit Tomcat
– Eclipse Jetty Plugin
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
10
Gliederung einer JSP
• JSP-Direktiven
– Voreinstellungen für Seite, Includes usw.
• JSP-Deklarationen
– Block für Definition statischer Variablen
• JSP-Scriptlets
– Blöcke, die Java-Code mit der Seitenlogik enthalten
• JSP-Expression
– Ausdruck, der ausgewertet in den Text eingefügt wird
• JavaScript-Bereich für clientseitigen Code
• HTML-Code
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
11
Beispiel JSP
<%@ page language="java" import="java.util.*" %>
<%! String strText = "<b>Text einer deklarierten Variablen,</b>"; %>
<% strText += " <b><i> dynamisch erweitert!</i></b>"; %>
<html>
<head>
Beachte:
<%! Member Variable oder Funktion,
<% lokales Scriplet.
<title>HelloWorld JSP</title>
</head><body>
<h1>HelloWorld</h1>
Dieser erste Teil ist statischer Text. <br/>
Hier kommt eine dynamisch erzeugte Ausgabe<br/>
Hier und jetzt ist es: <%=new Date() %><br/>
Und hier die Variable strText: <%=strText%>
</body></html>
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
12
Syntax Direktiven 1
• Page-Direktive
<%@ page attribut="value" %>
Definiert Einstellungen, die für die gesamte Seite gültig sind.
Mögliche Attribute sind (Auswahl):
import, extends, errorPage, session
Beispiel:
<%@ page language="java"
import="java.util.*, bookstore.*" %>
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
13
Syntax Direktiven 2
• Include-Direktive
<%@ include file="url" %>
Angegebene Datei wird statisch während der Kompilierung eingebunden. Es
kann sich um eine HTML-Seite oder JSP handeln.
Beispiel:
<%@ include file="mypage.html" %>
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
14
Syntax Actions
•
Jsp:include-Action
<jsp:include page="url" />
Angebene Datei wird bei bei jedem neuen Request der Seite
eingebunden. Inhalt kann statisch oder dynamisch sein.
•
Jsp:usebean-Action
<jsp:usebean attribut="value" />
Mögliche Attribute sind (Auswahl): id, scope, class
•
Jsp:forward-Action
<jsp:forward page="url" />
Weiterleitung auf statische Seite, Servlet oder andere JSP. Prozessierung
der aktuellen Seite wird abgebrochen.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
15
Syntax Deklarationen
• Kennzeichnung mit <%! .... %>
• Im Deklarations-Block werden Variablen definiert.
• Die Initialisierung erfolgt bei der Initialisierung der
Seite.
• Vorsicht: Da es sich um Instanz-Variablen handelt,
können die Werte Session-übergreifend sichtbar sein!
• Beispiel:
<%!
String dummy = "hallo";
int version = 1;
%>
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
16
Implizite Objekte
• Implizite Objekte werden automatisch erzeugt und
können ohne Deklaration verwendet werden.
– request
=> HttpServletRequest
– response => HttpServletResponse
– session
=> HttpSession
– out
=> PrintWriter
– Außerdem: page, pageContext, config,
exception, application
• Die ersten vier Objekte entsprechen denen aus der
Servlet API.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
17
Beispiele Implizite Objekte
•
<% session.putValue("MeinParameter", "Wert"); %>
•
<% String param =
(String)session.getValue("MeinParameter"); %>
•
<% String param2 = request.getParameter("editDatum"); %>
•
<% out.println("Dieser Text wird ausgegeben!"); %>
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
18
Jsp:usebean
• Jsp:usebean
<jsp:usebean <attribut>=<value> />
Mögliche Attribute:
Scope: entweder page, request, session oder
application
Id: Name, unter dem auf die Bean zugegriffen wird
Class: Vollständiger Name der JavaBean-Klasse
Beispiel:
<jsp:useBean id="StoreBean" scope="session"
class=„onlinestore.StoreBean" />
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
19
Error-Handling
• Es gibt zwei Arten von JSP-Fehlern:
– Translation Time Errors: Fehler beim Kompilieren
– Request Time Errors: Fehler zur Laufzeit
• Compile-Errors sind im Logfile des Servers.
• Laufzeit-Fehler werfen eine Exception und können
im JSP-Code abgefangen werden.
• Nicht abgefangene Exceptions werden an eine
optional angegebene Fehler-Seite weitergegeben:
<%@ page language="java" errorPage="/error.jsp" %>
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
20
JSP Vererbungshierarchie
<<Interface>>
Servlet
(from ser vl et)
<<Int erface>>
JspPage
js pInit()
js pDestroy()
<<Int erface>>
HttpJspPage
<<Interface>>
ServletConfig
<<Abstract>>
GenericServlet
(from serv let)
(from serv let)
<<Interface>>
ServletContext
<<Abstract>>
HttpServlet
(from serv let)
(from http)
<<Container>>
HttpJspBase
(from org.apache.j asper.runtime)
abhängig von der
JSPEngine. Hier
Apache Tomcat
_jspService()
MyJavaServerPage
<<generated>>
MyJspServlet
pageContext
PageContext
1
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
21
PageContext
<<Interface>>
ServletRequest
<<Interface>>
ServletResponse
(from serv let)
(from serv let)
1
<<Interface>>
HttpSession +session
(from http)
Writer
(from io)
1
PageContext
(from lang)
0..1
0.. 1
+out
1
JspWri ter
1
<<Interface>>
ServletConfig
(from serv let)
Prof. Dr. Nikolaus Wulff
-attribut Object
name : String
Web 2.0 Software-Architekturen
1
<<Interface>>
ServletContext
(from serv let)
22
PageContext
<<Interface>>
ServletRequest
<<Interface>>
ServletResponse
(from serv let)
(from serv let)
1
<<Interface>>
HttpSession +session
(from http)
Writer
(from io)
1
PageContext
(from lang)
0..1
0.. 1
+out
1
JspWri ter
1
<<Interface>>
ServletConfig
(from serv let)
Prof. Dr. Nikolaus Wulff
-attribut Object
name : String
Web 2.0 Software-Architekturen
1
<<Interface>>
ServletContext
(from serv let)
23
JSP Template Muster
• JSPs lassen sich dynamisch für ein einheitliches
Layout verschachteln:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="
<html>
<jsp:include page="<%=request.getAttribute("HEADER").toString() %>" />
<body>
<div id="content">
<jsp:include page="<%=request.getAttribute("CONTENT").toString() %>" />
</div>
<div id="footer">
<jsp:include page="<%=request.getAttribute("FOOTER").toString() %>" />
</div>
</body>
</html>
• Header, Content und Footer sind kontextsensitiv
vom Servlet Controller entsprechend der Anfrage
im „request Scope“ hinterlegt worden.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
24
Controller → View
• Um ein MVC Muster zu realisieren delegiert das
Controller Servlet die Anfragen an entsprechende
Modell Klassen. Die Ergebnistypen werden dann
meistens im Request oder Session Scope hinterlegt.
• Das Erstellen der HTML Seite wird dann vom
Controller Servlet an die JSP Seite delegiert.
• Hierzu wird wird ein RequestDispatcher parameterisiert und die Kontrolle an die JSP Seite per
include oder forward übergeben.
Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
25
JSP Page include
/**
* Does an include for a jsp page.
* @param page String the page url to include
* @param req HttpServletRequest the request instance
* @param res HttpServletResponse the response object
* @throws ServletException
* @throws IOException
*/
protected void doInclude(String page, HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
RequestDispatcher dispatcher = req.getRequestDispatcher(page);
dispatcher.include(req, res);
}
Ressourcen (Servlets, JSPs...) lassen sich einfach
per include oder forward vom Servlet aus rufen und
in die Seite einbauen.
Prof. Dr. Nikolaus Wulff
eCommerce
26
Herunterladen