JAVA - Eigenschaften

Werbung
Dynamische Webseiten
Java servlets
Architektur
Browser
Webserver
ServletEngine
Servlet
Servlet
Servlet
Servlet
Browser
ServletEngine mit
eingebautem
Webserver
Servlet
Servlet
Servlet
Servlet
© [email protected]
Genauer ...
Quelle: http://www.research.ibm.com/journal/sj/373/bayeh1.gif
© [email protected]
Servlet Engines

Java Webserver (SUN)


Websphere (IBM)





Apache module + Servlet Engine
Tomcat (Apache)



Application Server
komplex
Load Balancing
....
Jserv (Apache)


Referenzimplementierung
standalone oder Apache module
einfach und schnell
und viele andere
© [email protected]
Servlet

javax.servlet


javax.servlet.http


generisch
http
Java Klasse





abgeleitet von HttpServlet
keine main() Methode
Überschreiben von doGet() und/oder doPost()
ServletRequest
 Parameter, input Stream
ServletResponse
 Session, outputStream
© [email protected]
Lebenszyklus eines Servlets

Servlet wird vom Anwender kompiliert

beim ersten Aufruf von der engine geladen


bei jedem weiteren Aufruf wird nur die
entsprechende Methode ausgeführt





Klasse wird dynamisch geladen
genauer: ausgeführt wird service()
die doHeader() ... ausführt und je nach Methode
doGet() oder
doPost()
kaum Overhead
© [email protected]
Hello World

mit GET
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
// Hier: ASCII Text, kein HTML
response.setContentType("text/plain");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
pw.println("Hello World");
pw.close();
}
}
© [email protected]
Hello World

mit POST
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
// Hier: ASCII Text, kein HTML
response.setContentType("text/plain");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
pw.println("Hello World");
pw.close();
}
}
© [email protected]
Hello World

beide ?
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
// Hier: ASCII Text, kein HTML
response.setContentType("text/plain");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
pw.println("Hello World");
pw.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doGet(request,response);
}
© [email protected]
}
Initialisierung

Zur Initialisierung kann die init-Methode
überschrieben werden
public void init(ServletConfig conf)
throws ServletException {
super.init(conf);
count = 0;
}

z.B. Verbindung zur DB herstellen




evtl. schlechte Idee (Fehlerbehandlung)
Verbindungen zu factories,... aufsetzen
Konfigurationsinformationen lesen
...
© [email protected]
Parameter

HttpServletRequest.getParameter(name)
String par = request.getParameter("ID");

liefert den Wert des Parameters (hier ID) als String

Ggf. Konvertierung, z.B.
int value = Integer.parseInt(par)
double value = Double.parseDouble(par)

bei GET und POST

Problem: Parameter mit Sonderzeichen

Lösung: URL-encoding

z.B. ' ' (blank) als +
© [email protected]
Beispiel: Parameter
public class HelloWorldPar extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
// Hier: ASCII Text, kein HTML
response.setContentType("text/plain");
String par = request.getParameter("ID");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
pw.println("Hello World");
pw.println(par);
pw.close();
}
© [email protected]
Session

Wie werden Informationen von einer Seite zur
anderen transportiert ?

etwa Benutzername, DB Verbindung,...

z.B. Cookies, URL-rewriting,... manuell

oder automatisch: Session Objekt



HttpServletRequest.getSession() liefert HttpSession
Methoden
 getAttribute(name)/setAttribute(name,Wert)
liefert/setzt beliebiges Object
 cast nötig
HttpSession session = request.getSession();
count =(Integer)session.getAttribute("COUNT");
© [email protected]
Beispiel: Session
public class HelloWorldSession extends HttpServlet {
private Integer count;
public void init(ServletConfig conf) throws ServletException
{
super.init(conf);
count = new Integer(0);
}
....
pw.println("Hello World");
HttpSession session = request.getSession();
count = (Integer) session.getAttribute("COUNT");
if (count == null)
count = new Integer(0);
pw.println(count);
count=new Integer(count.intValue()+1);
session.setAttribute("COUNT",count);
© [email protected]
Header modifizieren
public class Uhr extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException
{
// Was liefern wir zurueck ?
response.setHeader("Refresh","5");
response.setContentType("text/html");
// Output liefern wir ueber "normale" Java IO
PrintWriter pw = response.getWriter();
Date D = new Date();
pw.println("<HTML><BODY><h1>");
pw.println(D);
pw.println("</h1></BODY></HTML>");
pw.close();
}
© [email protected]
Zugriff auf Datenbank
public class TestEmpServlet extends HttpServlet {
...
out.println("<html><body>");
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn =
DriverManager.getConnection
("jdbc:mysql://localhost/ba","till","haenisch");
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery (
"select empno,ename from EMP");
while (rset.next())
{
out.println(rset.getInt(1) + " " +
rset.getString(2) + "<br>");
}
}
catch (Exception e) {
out.println(e.getMessage());
}
© [email protected]
Herunterladen