J0
Marco Ronchetti -ronchet@altavista.it
Applets, Servlets e JSP
J0 2
Marco Ronchetti -ronchet@altavista.it
Applets
Special Java programs (without a “main”) callable from HTML and executed in a graphic context.
They can be executed by:
a Java enabled Web Browser;
ad-hoc programs (e.g. Sun AppletViewer).
J0
Marco Ronchetti -ronchet@altavista.it
Applets
Every applet is implemented by creating a subclass of the Applet class.
The hierarchy determines much of what an
applet can do and how.
J0 4
Marco Ronchetti -ronchet@altavista.it
Applet Lifecycle
An applet can react to major events in the following ways:
It can initialize itself. init() It can start running. start() It can draw some graphics. paint()
It can respond to user-generated events (Mouse, keyboard, menus…). handleEvent()
It can stop running. stop()
It can perform a final cleanup, in preparation for
being unloaded. destroy()
J0
Marco Ronchetti -ronchet@altavista.it
Applet Lifecycle
Whenever it’s needed, at lower priority
init()
stop() destroy()
start()
handleEvent()
Multithreading!
Actually, more threads are active behind the scenes.
paint()
J0 6
Marco Ronchetti -ronchet@altavista.it
handleEvent()
This code is part of the AWT (1.0 Event Model)
public boolean handleEvent(Event evt) { switch (evt.id) {
case Event.MOUSE_ENTER: return mouseEnter(evt, evt.x, evt.y);
case Event.MOUSE_EXIT: return mouseExit(evt, evt.x, evt.y);
case Event.MOUSE_MOVE: return mouseMove(evt, evt.x, evt.y);
case Event.MOUSE_DOWN: return mouseDown(evt, evt.x, evt.y);
case Event.MOUSE_DRAG: return mouseDrag(evt, evt.x, evt.y);
case Event.MOUSE_UP: return mouseUp(evt, evt.x, evt.y);
J0
Marco Ronchetti -ronchet@altavista.it
handleEvent()
case Event.KEY_PRESS:
case Event.KEY_ACTION: return keyDown(evt, evt.key);
case Event.KEY_RELEASE:
case Event.KEY_ACTION_RELEASE: return keyUp(evt, evt.key);
case Event.ACTION_EVENT: return action(evt, evt.arg);
case Event.GOT_FOCUS: return gotFocus(evt, evt.arg);
case Event.LOST_FOCUS: return lostFocus(evt, evt.arg);
}
return false;
}
J0 8
Marco Ronchetti -ronchet@altavista.it
Applets-Event handling
To react to an event, an applet must override either the appropriate event-specific method or the
handleEvent method.
For example, adding the following code to the
Simple applet makes it respond to mouse clicks.
import java.awt.Event;
. . .
public boolean mouseDown(Event event, int x, int y) { addItem("click!... ");
return true;
}
J0
Marco Ronchetti -ronchet@altavista.it
Applets
Le applets sono uno scheletro di applicazione che gira nello spazio concesso loro da un browser.
Il programmatore ha la responsabilita’ di implementare i seguenti metodi (che possono anche essere lasciati vuoti):
NOTA: il programmatore puo’ notificare la necessita’ di ridisegnare la applet tramite la chiamata repaint().
Tuttavia, l’effettivo ridisegno verra’ fatto dal sistema SOLO quando vi saranno risorse disponibili! (vedi Threads).
init() viene eseguito quando la applet viene creata start() viene eseguito quando la applet (ri)parte
stop() viene eseguito quando la applet viene fermata destroy() viene eseguito quando la applet viene distrutta
paint() viene eseguito quando la applet viene (ri)disegnata
J0 10
Marco Ronchetti -ronchet@altavista.it
Applet methods - 1a
import java.awt.Graphics;
import java.util.Date;
public class ShowAppletMethods extends java.applet.Applet { Date d;
int count=0;
public void init() {
System.out.println((count++)+" Init Executed");
}
public void start() {
System.out.println((count++)+" Start Executed");
}
public void stop() {
System.out.println((count++)+" Stop Executed");
}
public void destroy() {
System.out.println((count++)+" Destroy Executed");
}
public void paint(Graphics g) {
System.out.println((count++)+" Paint Executed");
d=new Date();
g.drawString("Time now is "+d.getHours() +":” +d.getMinutes() +":” +d.getSeconds(), 5, 25);
} }
<HTML><HEAD>
<TITLE>Another Applet</TITLE>
</HEAD>
<BODY>
<APPLET
CODE="ShowAppletMethods.class"
WIDTH=200 HEIGHT=75>
</APPLET>
</BODY></HTML>
J0
Marco Ronchetti -ronchet@altavista.it
Elementi Grafici
import java.awt.*;
import java.awt.event.*;
public class TestPattern extends java.applet.Applet { int theta = 45;
public void paint( Graphics g ) { int Width = size().width;
int Height = size().height;
int width = Width/2;
int height = Height/2;
int x = (Width - width)/2;
int y = (Height- height)/2;
int [] polyx = { 0, Width/2, Width, Width/2 };
int [] polyy = { Height/2, 0, Height/2, Height };
Polygon poly = new Polygon( polyx, polyy, 4 );
g.setColor( Color.black );
g.fillRect( 0, 0, size().width, size().height );
g.setColor( Color.yellow );
g.fillPolygon( poly );
g.setColor( Color.red );
g.fillRect( x, y, width, height );
g.setColor( Color.green );
g.fillOval( x, y, width, height );
g.setColor( Color.blue );
int delta = 90;
g.fillArc( x, y, width, height, theta, delta );
g.setColor( Color.white );
g.drawLine( x, y, x+width, x+height );
}
public void init() { addMouseListener(
new MouseAdapter() {
public void mousePressed(
MouseEvent e ) {
theta= theta+10)%360;
repaint();
} } );
} }
J0 12
Marco Ronchetti -ronchet@altavista.it
Metodi grafici di Graphics
draw3DRect() Draws a highlighted, 3D rectangle drawArc() Draws an arc
drawLine() Draws a line drawOval() Draws an oval
drawPolygon() Draws a polygon, connecting endpoints drawPolyline() Draws a line connecting a polygon's points drawRect() Draws a rectangle
drawRoundRect() Draws a rounded-corner rectangle
fill3DRect() Draws a filled, highlighted, 3D rectangle fillArc() Draws a filled arc
fillOval() Draws a filled oval fillPolygon() Draws a filled polygon fillRect() Draws a filled rectangle
fillRoundRect() Draws a filled, rounded-corner rectangle
J0
Marco Ronchetti -ronchet@altavista.it
Text & Fonts
import java.awt.Font; import java.awt.Graphics; import java.awt.FontMetrics;
public class ManyFonts extends java.applet.Applet { public void paint(Graphics g) {
Font f = new Font("TimesRoman", Font.PLAIN, 18);
FontMetrics fm = getFontMetrics(f);
g.setFont(f);
String s = "This is a plain font";
int xstart = (size().width - fm.stringWidth(s)) / 2;
//int ystart = (size().height + fm.getHeight()) / 2;
g.drawString(s, xstart, 25);
Font fb = new Font("TimesRoman", Font.BOLD, 18);
Font fi = new Font("TimesRoman", Font.ITALIC, 18);
Font fbi = new Font("TimesRoman", Font.BOLD + Font.ITALIC, 18);
g.setFont(fb);
g.drawString("This is a bold font", 10, 50);
g.setFont(fi);
g.drawString("This is an italic font", 10, 75);
g.setFont(fbi);
g.drawString("This is a bold italic font", 10, 100);
} }
J0 14
Marco Ronchetti -ronchet@altavista.it
Colore
import java.awt.Graphics;
import java.awt.Color;
public class ColorBoxes extends java.applet.Applet {
public void paint(Graphics g) { int rval, gval, bval;
for (int j = 30; j < (this.size().height -25); j += 30) for (int i = 5; i < (this.size().width -25); i+= 30) { rval = (int)Math.floor(Math.random() * 256);
gval = (int)Math.floor(Math.random() * 256);
bval = (int)Math.floor(Math.random() * 256);
g.setColor(new Color(rval,gval,bval));
g.fillRect(i,j,25,25);
g.setColor(Color.black);
g.drawRect(i-1,j-1,25,25);
} } }
J0
Marco Ronchetti -ronchet@altavista.it
Applet methods - 2
import java.awt.Graphics;
import java.util.Date;
public class ShowAppletMethods extends java.applet.Applet { Date d;
int count=0;
int seconds;
public void init() {
System.out.println((count++)+" Init Executed");
seconds=Integer.parseInt(this.getParameter("Secondi"));
}
public void start() {
System.out.println((count++)+" Start Executed");
while (true) { try {
Thread.sleep(seconds*1000);
}
catch (InterruptedException e) {}
System.out.println("==> calling repaint");
repaint();
} }
public void stop() {
System.out.println((count++)+" Stop Executed");
}
public void destroy() {
System.out.println((count++)+" Destroy Executed");
}
public void paint(Graphics g) {
System.out.println((count++)+" Paint Executed");
d=new Date();
g.drawString("Time now is ” +d.getHours() +":”
+d.getMinutes() +":” +d.getSeconds(), 5, 25);
} }
<HTML><HEAD>
<TITLE>Another Applet</TITLE>
</HEAD><BODY>
<APPLET CODE="ShowAppletMethods.class"
WIDTH=200 HEIGHT=75>
<PARAM name=secondi value=10>
</APPLET>
</BODY></HTML>
J0 16
Marco Ronchetti -ronchet@altavista.it
Multithreading per la paint()
La versione precedente del codice non disegna MAI lo schermo!
Il problema e’ che il programma ha una singola thread,
che e’ sempre occupata: nessuno quindi puo’ eseguire la paint().
La soluzione e’ di creare una nuova thread che faccia il lavoro
vero e proprio, lasciando alla applet meno compiti.
J0 17
Marco Ronchetti -ronchet@altavista.it
Applet methods - 3
import java.awt.Graphics;
import java.util.Date;
public class ShowAppletMethods extends java.applet.Applet { Date d;
int count=0;
simpleThread t;
public void init() {
System.out.println((count++)+" Init Executed");
int seconds=Integer.parseInt(this.getParameter(
"Secondi"));
t=new simpleThread(this,seconds);
t.start();
}
public void start() {
System.out.println((count++)+" Start Executed");
}
public void stop() {
System.out.println((count++)+" Stop Executed");
}
public void destroy() { t.stop();
System.out.println((count++)+" Destroy Executed");
}
public void paint(Graphics g) {
System.out.println((count++)+" Paint Executed");
d=new Date();
g.drawString("Time now is "+d.getHours() +":” +d.getMinutes() +":” +d.getSeconds(), 5, 25);
}
class simpleThread extends Thread { ShowAppletMethods a;
int seconds;
simpleThread(ShowAppletMethods a, int s) { this.a=a;
seconds=s*1000;
}
public void run() { while (true) {
try {
sleep(seconds);
}
catch (InterruptedException e) {}
System.out.println("==> THREAD: calling repaint");
a.repaint();
} } }
J0 18
Marco Ronchetti -ronchet@altavista.it
Double buffering
Le animazioni vengono effettuate cancellando l’immagine presente e ridisegnando la nuova. Questo da’ origine ad un fastidioso sfarfallio.
Per evitare questo effetto, la nuova immagine viene disegnata in memoria anziche’ a video: quando l’immagine e’ pronta, quella presente a video viene sostituita con la nuova (tecnica di double buffering).
La tecnica si basa sulla ridefinizione del metodo “update()” che viene chiamato dalla repaint(), e che a sua volta schedula la paint(). La versione standard di update e’ :
public void update(Graphics g) { g.setColor(getBackground());
g.fillRect(0,0,width,height);
g.setColor(getForeground());
paint(g);
}
J0
Marco Ronchetti -ronchet@altavista.it
Animazione con flickering
/* simple applet to show very basic startup and animation stuff */
import java.awt.Graphics;
import java.awt.Color;
public class Checkers extends java.applet.Applet implements Runnable {
Thread runner;
int xpos;
public void start() { if (runner == null); {
runner = new Thread(this);
runner.start();
} }
public void stop() { if (runner != null) {
runner.stop();
runner = null;
} }
public void run() { while (true) {
for (xpos = 5; xpos <= 105; xpos+=4) { repaint();
try { Thread.sleep(100); }
catch (InterruptedException e) { } }
xpos=5;
} }
public void update(Graphics g) { paint(g);
}
public void paint(Graphics g) { // Draw background
g.setColor(Color.black);
g.fillRect(0,0,100,100);
g.setColor(Color.white);
g.fillRect(100,0,100,100);
// Draw checker
g.setColor(Color.red);
g.fillOval(xpos,5,90,90);
} }
J0 20
Marco Ronchetti -ronchet@altavista.it
Animazione senza flickering
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
public class Checkers2 extends java.applet.Applet implements Runnable {
Thread runner;
int xpos;
Image offscreenImg;
Graphics offscreenG;
public void init() {
offscreenImg = createImage(this.size().width, this.size().height);
offscreenG = offscreenImg.getGraphics();
}
public void start() { if (runner == null); {
runner = new Thread(this);
runner.start();
} }
public void stop() { if (runner != null) {
runner.stop();
runner = null;
} }
public void run() { while (true) {
for (xpos = 5; xpos <= 105; xpos+=4) { repaint();
try { Thread.sleep(100); }
catch (InterruptedException e) { } }
xpos = 5;
} }
public void update(Graphics g) { paint(g);
}
public void paint(Graphics g) { // Draw background
offscreenG.setColor(Color.black);
offscreenG.fillRect(0,0,100,100);
offscreenG.setColor(Color.white);
offscreenG.fillRect(100,0,100,100);
// Draw checker
offscreenG.setColor(Color.red);
offscreenG.fillOval(xpos,5,90,90);
g.drawImage(offscreenImg,0,0,this);
}
public void destroy() { offscreenG.dispose();
} }
NOTA: I contesti grafici non vengono liberati dalla garbage collection, vanno rilasciati esplicitamente! (Vedi destroy)
J0 21
Marco Ronchetti -ronchet@altavista.it
Launching Applets as Apps
class AppletFrame extends Frame implements ActionListener { public AppletFrame (String title, Applet applet,
int width, int height) { //create Frame with specified title
super(title);
//add a Menubar
MenuBar menubar=new MenuBar();
Menu file = new Menu("File",true);
menubar.add(file);
MenuItem mExit=new MenuItem("Exit");
file.add(mExit);
mExit.addActionListener(this);
this.setMenuBar(menubar);
import java.awt.*;
import java.applet.*;
public class ShowAppletMethodsAsApplication extends ShowAppletMethods { public static void main(String args[]) {
Applet applet=new ShowAppletMethodsAsApplication();
Frame frame=new AppletFrame("ShowAppletMethodsAsApplication",applet,300,300);
} }
// add the applet to the window, // set window size, show it
this.add("Center",applet);
this.resize(width,height);
this.show();
//Start the applet applet.init();
applet.start();
}
public void actionPerformed(ActionEvent e) System.exit(0);
}
J0 22
Marco Ronchetti -ronchet@altavista.it
Applets and the status line
Applets display status lines with the showStatus method.
showStatus("MyApplet: hello!");
The status line is not usually very prominent, and it can be overwritten by other applets or by the browser. For these reasons, it's best used
for incidental, transitory information.
Note: Please don't put scrolling text in the status line. Browser users
find such status line abuse highly annoying!
J0
Marco Ronchetti -ronchet@altavista.it
Applets and HTML text
With the AppletContext showDocument method, an applet can tell the browser which URL to show and
in which browser window.
public void showDocument(java.net.URL url, String targetWindow)
For a full example, see
http://java.sun.com/docs/books/tutorial/applet/appletsonly/browser.html
J0 24
Marco Ronchetti -ronchet@altavista.it
Interaction among applets
Applets can find other applets and send messages to them, with the following security restrictions:
Many browsers require that the applets originate from the same server.
Many browsers require that the applets originate from the same directory on the server (the same code base).
The Java API requires that the applets be running on the same page, in the same browser window.
For a full example, see
http://java.sun.com/docs/books/tutorial/applet/appletsonly/iac.html
J0
Marco Ronchetti -ronchet@altavista.it
Servlets (JDK 1.2)
Servlets are modules that extend Java-enabled web servers. For example, a servlet might be responsible for taking data in an HTML
order-entry form and applying the business logic used to update a company's order database.
Servlets are to servers what applets are to browsers. Unlike applets, however, servlets have no graphical user interface.
For a full tutorial, see
http://java.sun.com/docs/books/tutorial/servlets/overview/index.html
J0 26
Marco Ronchetti -ronchet@altavista.it
Other uses of servlets
Allowing collaboration between people.
A servlet can handle multiple requests concurrently, and can synchronize requests. This allows servlets to support systems such
as on-line conferencing.
Forwarding requests.
Servlets can forward requests to other servers and servlets. Thus servlets can be used to balance load among several servers that mirror the same content, and to partition a single logical service
over several servers, according to task type or organizational
boundaries.
J0
Marco Ronchetti -ronchet@altavista.it
Applets vs. Servlets
NO SI
Grafica
javax.servlet.http.
HttpServlet java.applet.Applet
Estende:
service() handleEvent()
Cuore:
NO NO
Ha un main:
Server Client
Gira:
Applet Servlet
J0 28
Marco Ronchetti -ronchet@altavista.it
Servlet Lifecycle
init()
destroy()
service(HttpServletRequest r, HttpServletResponse p)
Chiamato solo la prima volta che la Servlet viene caricato in memoria!
doGet() doPost() doXXX()
Solo quando serve scaricare dalla memoria!
Se la Servlet implements SingleThreadModel non
ci saranno esecuzioni simultanee di codice
J0 29
Marco Ronchetti -ronchet@altavista.it
service()
This code is part of the class HttpService
protected void service (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
String method = req.getMethod ();
if (method.equals ("GET")) {
long ifModifiedSince; long lastModified; long now;
ifModifiedSince = req.getDateHeader ("If-Modified-Since");
lastModified = getLastModified (req);
maybeSetLastModified (resp, lastModified);
if (ifModifiedSince == -1 || lastModified == -1) doGet (req, resp);
else {
now = System.currentTimeMillis ();
if (now < ifModifiedSince || ifModifiedSince < lastModified) doGet (req, resp);
else
resp.sendError (HttpServletResponse.SC_NOT_MODIFIED);
}
J0 30
Marco Ronchetti -ronchet@altavista.it
service()
} else if (method.equals ("HEAD")) { long lastModified;
lastModified = getLastModified (req);
maybeSetLastModified (resp, lastModified);
doHead (req, resp);
} else if (method.equals ("POST")) { doPost (req, resp);
} else if (method.equals ("PUT")) { doPut(req, resp);
} else if (method.equals ("DELETE")) { doDelete(req, resp);
} else if (method.equals ("OPTIONS")) { doOptions(req,resp);
} else if (method.equals ("TRACE")) { doTrace(req,resp);
} else {
resp.sendError (HttpServletResponse.SC_NOT_IMPLEMENTED,
"Method '" + method + "' is not defined in RFC 2068");
} }
J0
Marco Ronchetti -ronchet@altavista.it
A taste of servlet programming-1
public class SimpleServlet extends HttpServlet {
/** Handle the HTTP GET method by building a simple web page. */
public void doGet (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out;
String title = "Simple Servlet Output";
J0 32
Marco Ronchetti -ronchet@altavista.it
A taste of servlet programming-2
// set content type and other response header fields first
response.setContentType("text/html");
// then write the data of the response
out = response.getWriter();
out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");
out.println("<P>This is output from SimpleServlet.");
out.println("</BODY></HTML>");
out.close();
}
}
J0 33
Marco Ronchetti -ronchet@altavista.it
Esempio: ShowParameters
package coreservlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class ShowParameters extends HttpServlet {
public void doGet(HttpServletRequest request HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading All Request Parameters";
out.println(“<HEAD><TITLE>”+title + “</TITLE> </HEAD>”)+
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=CENTER>" + title + "</H1>\n" +
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
"<TH>Parameter Name<TH>Parameter Value(s)");
J0 34
Marco Ronchetti -ronchet@altavista.it
Esempio: ShowParameters
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<TR><TD>" + paramName + "\n<TD>");
String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0) out.println("<I>No Value</I>");
else out.println(paramValue);
} else {
out.println("<UL>");
for(int i=0; i<paramValues.length; i++) {out.println("<LI>" +paramValues[i]);
}
out.println("</UL>");
} }
out.println("</TABLE>\n</BODY></HTML>");
}
J0
Marco Ronchetti -ronchet@altavista.it
Esempio: ShowParameters
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response);
} }
J0 36
Marco Ronchetti -ronchet@altavista.it
Esempio: ShowParameters
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>A Sample FORM using POST </TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">A Sample FORM using POST</H1>
<FORM ACTION="/servlet/coreservlets.ShowParameters“ METHOD="POST”>
Item Number: <INPUT TYPE="TEXT" NAME="itemNum"><BR>
Quantity: <INPUT TYPE="TEXT" NAME="quantity"><BR>
Price Each: <INPUT TYPE="TEXT" NAME="price" VALUE="$"><BR>
<HR>
First Name: <INPUT TYPE="TEXT" NAME="firstName"><BR>
Last Name: <INPUT TYPE="TEXT" NAME="lastName"><BR>
Middle Initial: <INPUT TYPE="TEXT" NAME="initial"><BR>
Shipping Address:
<TEXTAREA NAME="address" ROWS=3 COLS=40></TEXTAREA><BR>
J0 37
Marco Ronchetti -ronchet@altavista.it
Esempio: ShowParameters
Credit Card:<BR>
<INPUT TYPE="RADIO" NAME="cardType“
VALUE="Visa">Visa<BR>
<INPUT TYPE="RADIO" NAME="cardType"
VALUE="Master Card">Master Card<BR>
<INPUT TYPE="RADIO" NAME="cardType"
VALUE="Amex">American Express<BR>
<INPUT TYPE="RADIO" NAME="cardType“
VALUE="Discover">Discover<BR>
<INPUT TYPE="RADIO" NAME="cardType"
VALUE="Java SmartCard">Java SmartCard<BR>
Credit Card Number:
<INPUT TYPE="PASSWORD" NAME="cardNum"><BR>
Repeat Credit Card Number:
<INPUT TYPE="PASSWORD" NAME="cardNum"><BR><BR>
<CENTER><INPUT TYPE="SUBMIT" VALUE="Submit Order"></CENTER>
</FORM>
</BODY>
</HTML>
J0 38
Marco Ronchetti -ronchet@altavista.it
Cookies: perché?
Identificazione di un utente in una sessione di e-commerce.
Customizzazione di un sito Pubblicità mirata
Eliminazione di username e password
J0
Marco Ronchetti -ronchet@altavista.it
Cookies: i metodi
public void setComment(String c) public String getComment()
public void setVersion(int c) public int getVersion ()
Version 0: Netscape standard
Version 1: RFC 2109
J0 40
Marco Ronchetti -ronchet@altavista.it
Cookies: i metodi
public void setMaxAge(int c) public int getMaxAge()
Positive value: secondi di vita 0: delete cookie
Negative value: finchè dura la sessione del browser
J0
Marco Ronchetti -ronchet@altavista.it
Cookies: i metodi
public void setDomain(String c) public String getDomain()
public void setPath(int c)
public int getPath()
J0 42
Marco Ronchetti -ronchet@altavista.it
Cookies: esempio
Cookie userCookie = new Cookie(“user”,”uid1234”);
userCookie.setMaxAge(60*60*24*365);
response.addCookie(userCookie);
J0
Marco Ronchetti -ronchet@altavista.it
SetCookies
import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
/** Sets six cookies: three that apply only to the current session
* (regardless of how long that session lasts) and three that persist for an hour
* (regardless of whether the browser is restarted).
*/
public class SetCookies extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
for(int i=0; i<3; i++) {
// Default maxAge is -1, indicating cookie // applies only to current browsing session.
Cookie cookie = new Cookie("Session-Cookie-" + i,
"Cookie-Value-S" + i);
response.addCookie(cookie);
J0 44
Marco Ronchetti -ronchet@altavista.it
cookie = new Cookie("Persistent-Cookie-" + i,"Cookie-Value-P" + i);
// Cookie is valid for an hour, regardless of whether // user quits browser, reboots computer, or whatever.
cookie.setMaxAge(3600);
response.addCookie(cookie);
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Setting Cookies";
out.println (ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +"<H1 ALIGN=\"CENTER\">"
+ title + "</H1>\n" +"There are six cookies associated with this page.\n" +
"</BODY></HTML>");
} }
SetCookies
J0
Marco Ronchetti -ronchet@altavista.it
import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
/** Creates a table of the cookies associated with the current page. */
public class ShowCookies extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Active Cookies";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
" <TH>Cookie Name\n" + " <TH>Cookie Value");
ShowCookies
J0 46
Marco Ronchetti -ronchet@altavista.it
Cookie[] cookies = request.getCookies();
Cookie cookie;
for(int i=0; i<cookies.length; i++) { cookie = cookies[i];
out.println("<TR>\n" +
" <TD>" + cookie.getName() + "\n" +
" <TD>" + cookie.getValue());
}
out.println("</TABLE></BODY></HTML>");
} }
ShowCookies
J0
Marco Ronchetti -ronchet@altavista.it
String sessionID = makeUniqueString();
Hashtable sessionInfo = new Hashtable();
Hashtable globalTable = getTableStoringSession();
globalTable.put(sessionID,sessionInfo);
Cookie sessionCookie=new Cookie(“SessionID”,sessionID);
sessionCookie.setPath(“/”);
response.addCookie(sessionCookie);
Session tracking using cookies
J0 48
Marco Ronchetti -ronchet@altavista.it
HttpSession session = request.getSession(true);
ShoppingCart cart =
(ShoppingCart)session.getValue(“carrello”); // 2.1 // 2.2 (ShoppingCart)session.getAttribute(“carrello”);
if (cart==null) {
cart=new ShoppingCart();
session.putValue(“carrello”,cart); //2.1 //2.2 session.putValue(“carrello”,cart);
}
doSomeThingWith(cart);
Session tracking API
J0
Marco Ronchetti -ronchet@altavista.it
public void removeValue(String name); //2.1
public void removeAttribute(String name); //2.2
public String[] getValueNames() //2.1 public Enumeration getAttributeNames() //2.2
Session tracking API
J0 50
Marco Ronchetti -ronchet@altavista.it
public long getCreationTime();
public long getLastAccessdTime();
Secondi dal 1.1.1970, mezzanotte
public void removeAttribute(String name);
public int getMaxInactiveInterval();
public void setMaxInactiveInterval(int sec);
public void invalidate();
Session tracking API
J0
Marco Ronchetti -ronchet@altavista.it
import java.io.*; import javax.servlet.*; import javax.servlet.http.*;
import java.net.*; import java.util.*;
/** Simple example of session tracking. */
public class ShowSession extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Session Tracking Example";
HttpSession session = request.getSession(true);
String heading;
// Use getAttribute instead of getValue in version 2.2.
Integer accessCount = (Integer)session.getValue("accessCount");
ShowSession
J0 52
Marco Ronchetti -ronchet@altavista.it
if (accessCount == null) {
accessCount = new Integer(0);
heading = "Welcome Newcomer";
} else {
heading = "Welcome Back";
accessCount = new Integer(accessCount.intValue() + 1);
}
// Use setAttribute instead of putValue in version 2.2.
session.putValue("accessCount", accessCount);
ShowSession
J0
Marco Ronchetti -ronchet@altavista.it
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + heading + "</H1>\n" +
"<H2>Information on Your Session:</H2>\n" +
"<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
" <TH>Info Type<TH>Value\n" +
"<TR>\n" +" <TD>ID\n" +" <TD>" + session.getId() + "\n" +
"<TR>\n" +" <TD>Creation Time\n" +
" <TD>" + new Date(session.getCreationTime()) + "\n" +
"<TR>\n" +" <TD>Time of Last Access\n" +
" <TD>" +new Date(session.getLastAccessedTime()) + "\n" +
"<TR>\n" +" <TD>Number of Previous Accesses\n" +" <TD>" + accessCount + "\n" + "</TABLE>\n" +"</BODY></HTML>");
}
ShowSession
J0 54
Marco Ronchetti -ronchet@altavista.it
/** Handle GET and POST requests identically. */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response);
} }
ShowSession
J0
Marco Ronchetti -ronchet@altavista.it
<html>
<body>
<% out.println(“Hello World”); %>
</body>
</html>
Simple.jsp
J0 56
Marco Ronchetti -ronchet@altavista.it
JSP Lifecycle
Browser Servlet generato
Servlet compilato
Pagina JSP
Server Web
J0
Marco Ronchetti -ronchet@altavista.it
<%@ DIRETTIVA {attributo=valore} %>
Esempi:
<%@ page language=java %>
<%@ page import=java.awt.*,java.util.* session=true
%>
Direttive
J0 58
Marco Ronchetti -ronchet@altavista.it
<%! DICHIARAZIONE %>
Esempi:
<%! String nome=pippo %>
<%! public String getName() {return nome} %>
Dichiarazioni
J0
Marco Ronchetti -ronchet@altavista.it
<%= ESPRESSIONE%>
Esempi:
<%= getName() %>
<%@ page import=java.util.* %>
Sono le <%= new Date().toString(); %>
Espressioni
J0 60
Marco Ronchetti -ronchet@altavista.it
<html><body>
<%! String nome=pippo %>
<%! public String getName() {return nome} %>
<H1>
Buongiorno
<%= getName() %>
</H1>
</body></html>
Esempio
J0
Marco Ronchetti -ronchet@altavista.it
<jsp:AZIONE>
Esempi:
<jsp:forward page=URL>
<jsp:include page=URL flush=true>
<jsp:useBean>
Azioni
J0 62
Marco Ronchetti -ronchet@altavista.it
<% SCRIPTLET %>
Esempi:
<% z=z+1; %>
<%
// Get the Employee's Name from the request out.println("<b>Employee: </b>" +
request.getParameter("employee"));
// Get the Employee's Title from the request out.println("<br><b>Title: </b>" +
request.getParameter("title"));
%>
Scriptlet
J0
Marco Ronchetti -ronchet@altavista.it
out Writer
request HttpServletRequest
response HttpServletResponse
session HttpSession
page this nel Servlet
application servlet.getServletContext area condivisa tra i servlet
config ServletConfig
exception solo nella errorPage
pageContext sorgente degli oggetti, raramente usato
Oggetti predefiniti
J0 64
Marco Ronchetti -ronchet@altavista.it
<%@ page errorPage="errorpage.jsp" %>
<html>
<head>
<title>UseRequest</title>
</head>
<body>
<%
// Get the User's Name from the request
out.println("<b>Hello: " + request.getParameter("user") +
"</b>");
%>
</body>
</html>
request
J0
Marco Ronchetti -ronchet@altavista.it
<%@ page errorPage="errorpage.jsp" %>
<html> <head> <title>UseSession</title> </head>
<body>
<%
// Try and get the current count from the session
Integer count = (Integer)session.getAttribute("COUNT");
// If COUNT is not found, create it and add it to the session if ( count == null ) {
count = new Integer(1);
session.setAttribute("COUNT", count);
}
session
J0 66
Marco Ronchetti -ronchet@altavista.it
else {
count = new Integer(count.intValue() + 1);
session.setAttribute("COUNT", count);
}
// Get the User's Name from the request
out.println("<b>Hello you have visited this site: "
+ count + " times.</b>");
%>
</body>
</html>
session
J0
Marco Ronchetti -ronchet@altavista.it
include file=“URL”
taglib uri=“URL” prefix=“prefisso”
definisce un meccanismo di estensione delle tag esistenti!
Direttive
J0 68
Marco Ronchetti -ronchet@altavista.it