Sunteți pe pagina 1din 15

Tehnologii WEB

1. Obiectivul lucrrii
Obiectivul lucrrii este de a prezenta tehnologiile Java pentru implementarea de
aplicaii web.

2. Tehnologia Java Servlet


Pe msur ce Web s-a dezvolat i a nceput s fi utilizat pentru oferirea de
servicii, a aprut necesitatea de a construi pagini cu coninut dinamic. Appleturile reprezint un exemplu de tehnologie, ce utilizeaz platforma clientului
pentru a oferi un coninut dinamic.
La nivelul serverelor de web, printre primele tehnologii folosite pentru creare de
coninut dinamic a fost Common Gateway Interface (CGI). Ulterior au aprut i sau dezvoltat tehnologii similare (PHP, ASP) care ofer metode pentru
construirea de pagini ce permit interaciunea cu utilizatorul. Tehnologia propus
de firma SUN pentru construirea de pagini cu coninut dinamic este
tehnologia Servlet. Aceast tehnologie este bazat pe limbajul Java,
componentele de timp servlet fiind implementate n acest limbaj. Bazat pe
tehnologia Servlet s-au dezvoltat ulterior tehnologii ca Java Server Pages (JSP)
i Java Server Faces (JSF) -ambele destinate construirii de pagini cu coninut
dinamic.
Un servlet reprezint o component web , gestionat de un container , care
genereaz coninut dinamic. Servlet-urile sunt clase java, ce ofer independen
de platform i sunt incrcatei executate dinamic de ctre server. Servleturile comunic cu clienii pe baza paradigmei cerere raspuns. Acest model
cerere raspuns se bazeaz de obicei pe protocolul HypertextTransport Protocol
(HTTP).
Containerul de servleturi este o component ce ofer servicii de reea prin
intermediul crora servleturile primesc i transmit cereri i rspunsuri de la i
ctre clieni. Containerul deservleturi nmagazineaz servleturile i este
responsabil pentru gestionarea acestora. Un container poate exista n cadrul
unui server web sau poate fi adugat ulterior utiliznd mecanismul de extensie al
serverului.

Exemplu: Un program client (web browser) acceseaz un server web i transmite


o cerere HTTP (poate fi de exemplu un form completat cu datele unei
persoane). Acceast cerere este preluat de ctre serverul de web i n cazul n
care este destinat unui servlet, este transmis mai departe ctre containerul
de servleturi. Containerul determin crui servlet i este adresat cererea i va
invoca respecivul servlet, transmind-ui ca parametri dou obiecte cerere
(request) i raspuns (response).
Servletul va utiliza obiectul request pentru a determina cererea fcut de
clientul web. Dup realizarea operaiilor necesare (de exemplu scrierea sau
citirea unor date dintr-o baz de date ), servletul va tansmite ctre client
un raspuns prin intermediul obiectului response.
In continuare este prezentat structura de baz a unui servlet.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class UnServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter
out;
String
title = "Simple Servlet ";
//seteaza tipulcontinutului
response.setContentType("text/html");
// trmite rasuns catre client
out = response.getWriter();
out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");

out.println("<P>Raspuns de la UnServlet.");
out.println("</BODY></HTML>");
out.close();
}
}

Pentru a construi un servlet care lucreaz prin protocolul HTTP trebuie extins
clasa HttpServlet. In continuare este suprascris metoda doGet() pentru
a prelucara cereri GET. De asemenea poate fi rescris i metoda doPost pentru
a prelucra cereri POST.
Metodele doGet()
i doPost()
primesc
ca
argumente
doua
obiecte: HttpServletRequest i HttpServletRespons.
Obiectul HttpServletRequest este utilizat pentru a determina cererea pe care a
fcut-o clientul (datele din FORM , header HTTP etc.). Pentru aceasta clasa
pune
la
dispoziie
metode
cum
ar
fi: getHeaders(), getMethod(), getPathInfo(), getParameter(),getInputStream(), ge
tReader().
Obiectul HttpServletResposn este utizat pentru a transmite raspunsul ctre client.
Acesta conine metodele necesare pentru a stabili headerul, tipul de raspuns i
pentru a obine fluxul de ieire prin intermediul cruia rspunsul este transmis
ctre client.Clasa pune
la
dispoziie
metode
cum
ar
fi: setHeader(), setStatus(), getWriter, getOutputStream() etc.
Observaie: Metodele doGet() i doPost() sunt apelate de ctre metoda service(),
i exist posibilitatea s se rescrie metoda service(), prin intermediul acesteia
fiind prelucrate att cererile POST ct i cererile GET.
Diferenta dintre metodele doGet() si doPost():
DoGet
In doGet Method the parameters are
appended to the URL and sent along with
header information
Maximum size of data that can be sent using
doget is 240 bytes
Parameters are not encrypted
DoGet method generally is used to query or
to get some information from the server
DoGet is faster if we set the response content
length since the same connection is used.
Thus increasing the performance
DoGet should be idempotent. i.e. doget
should be able to be repeated safely many
times

DoPost
In doPost, parameters are sent in separate
line in the body
There is no maximum size for data
Parameters are encrypted
Dopost is generally used to update or post
some information to the server
DoPost is slower compared to doGet since
doPost does not write the content length
This method does not need to be idempotent.
Operations requested through POST can have
side effects for which the user can be held
accountable, for example, updating stored

DoGet should be safe without any side


effects for which user is held responsible

data or buying items online.


This method does not need to be either safe

Ciclul de viata a unui servlet cuprinde urmtoarele etape:


1. creare i iniializare servlet. In momentul n care un servlet este ncrcat n memorie
va fi apelat metoda init(ServletConfig cfg)
2. preluare si deservire cereri sosite de la clienti
3. distrugere servlet si eliberare memore. In momentul n care un servlet este distrus
va fi apelat metoda destroy()

In momentu n care un servlet este invocat pentru prima dat containerul


de servleturi va ncrca o instan a acestui servlet n memorie. Aceast instan
va prelua i deserv toate cererile ce sosesc de la clieni pentru acest servlet.
Existena unei singure instane a unui servlet n memorie, ce deserveste toi
clienii prezint avantaje prin faptul c:

reduce memoria ocupat de servlet-uri


micoreaz timpul de rspuns i resursele de procesor cerute pentru
deservirea unui client de ctre un servlet, deoarece nu trebuie construit cte
o instan a servletului pentru fiecare cerere a unui client
La iniializare, un servlet poate iniializa toate resursele de care are nevoie,
acestea persistnd pe parcursul apelurilor de la diveri clieni. Un exemplu
este iniializarea unei conexiuni la baza de date ce mai apoi poate
fi reutilizat pentru a deservi toi clienii

Pentru a demonstra persistena unui servlet se construiete urmtorul servlet:


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SimpleCounter extends HttpServlet {
int count = 0;

public void doGet(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;
out.println("Since loading, this servlet has been accessed " +
count + " times.");
}
}

Servletul va fi ncrcat n memorie la prima invocare a acestuia de ctre un


client, dup care aceast instan creat va deservi toi clienii. Din punctul de
vedere al programatorului unuiservlet, fiecare client poate fi vzut ca un
nou thread ce apeleaz metodele service(), doGet() sau doPost().
Marea majoritatea a containerelor de servleturi permit comunicarea ntre servleturile ncrcate n memorie, astfel nct o cerere transmis ctre un servlet poate
fi redirectat ctre un altservlet, pagina de rspuns fiind transmis ctre client de
ultimul servlet din lan.

3. Compilarea i instalarea unui servlet


Modul de instalarea a unui servlet variaz n funcie de containerul
de servleturi folosit. n cadrul acestui laborator se va folosi containerul
de servleturi Apache Tomcat 5.5. Deoarece n cadrul laboratorului se lucreaz cu
mediul de dezvoltare Eclipse, n cadrul acestuia a fost instalat pluginul Sysdeo Tomcat Launcher (http://www.sysdeo.com/sysdeo/eclipse/tomcatplugi
n).
Acest plugin ofere
posibilitatea
de startare\restartare a
serverului Tomcat direct din mediul Eclipse, de asemenea ofer wizard pentru
construirea de proiect pentru aplicaie cu Servleturi i permite testarea servleturilor direct din mediul Eclipse.
Paii necesati pentru a construi un proiect de tip Tomcat
1. Se creeaz un proiect in eclipse de tip Tomcat. Se selecteaz File > New > Project.
Se alege opiunea Tomcat Project.

2. La pasul urmtor se seteaz numele proiectului ServletTest.


3. La pasul urmtor se seteaz in campul Context Name: /ServletTest. Se las bifat
csua Can update server.xml file. Se apas butonul Finish. In acest moment un
proiect de tipTomcat este creat in cadrul mediului Eclipse.
4. Se adaug in cadrul proiectului urmtoarea clas
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class UnServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
PrintWriter
out;
String
title = "Simple Servlet ";
//seteaza tipulcontinutului
response.setContentType("text/html");
// trmite rasuns catre client
out = response.getWriter();
out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");
out.println("<P>Raspuns de la UnServlet.");
out.println("</BODY></HTML>");
out.close();
}
}

5. In directorul WEB-INF din cadrul proiectului se adaug fiierul web.xml cu urmtorul


coninut
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>UnServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

6. Se compileaz aplicaia
7. Click dreapta pe numele proiectului si din meniul contextual se selecteaz
opiunea Tomcat > Update context definition
8. Se starteaz Tomcat. Din meniul Tomcat se selecteaz opiunea Start Tomcat
9. Se verifica funcionarea servletului. Dintr-un browser se incarc pagina
http://localhost:8080/ServletTest/hello

4. Aplicaie cu servlet-uri
In cadrul acestei seciuni este prezentat o aplicaie simplificat, bazat
pe servleturi pentru
realizarea
unui
magazin online.
Sunt
construite
dou servleturi, acestea fiind descrise nlistingul urmtor. Pe lng servleturi,
aplicaia mai conine o baz de date i o pagin html.
Baza de date conine un tabel ce are campurile produs, cantitate i pret. In cadrul
acestei baze de date sunt memorate produsele ce sunt disponibile n cadrul
magazinului online.
Pagina html conine dou formuri. Primul dintre ele conine dou cpuri text, i un
buton submit , i este utilizat pentru a transmite comenzi produs cantitate
ctre servletul ServletChek. Cel de al doile form conine un singur buton submit,
ce este utilizat pentru a transmite ctre ServletBuy comanda final.
Servlet 1
import
import
import
import
import
/**
*
*/

javax.servlet.*;
javax.servlet.http.*;
java.io.*;
java.util.*;
java.sql.*;

public class ServletChek extends HttpServlet {


private static final String CONTENT_TYPE = "text/html";
private String dburl="jdbc:odbc:dbShop";
private Connection con;
private ArrayList cos;
private Statement st;
//metoda este apelata automat la prima apelare a servletului
public void init() throws ServletException {
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(dburl);
st = con.createStatement();
}catch(Exception e){e.printStackTrace();}
}
//Procesare cereri primite de la form-uri
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(true);//.1
ArrayList cos = (ArrayList)session.getValue(session.getId());
if(cos==null) {
cos = new ArrayList();
session.setAttribute(session.getId(),cos); //.2

}
String r = null;
try{
String prod = request.getParameter("produs");
int cant =Integer.parseInt(request.getParameter("cantitate"));
if(comandaProdus(prod,cant)) {
r = "Comanda primita";
cos.add(prod+" "+cant);
}
else r = "Eroare receptionare comanda";
}catch(Exception e){r = "Eroare receptionare comanda";}
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>ServletChek</title></head>");
out.println("<body>");
out.println("<p>"+r+"</p>");
out.println("</body></html>");
}
boolean comandaProdus(String prod, int cant){
ResultSet rs=null;
try{
rs = st.executeQuery("SELECT
CANTITATE
FROM
PRODUSE
WHERE
PRODUS
=
'"+prod+"'");
//verific daca produsul exista
if(rs.next()==false) return false;
int exista = rs.getInt("cantitate");
//cantiatea dorita este insuficienta
if((exista-cant)<0) return false;
//daca cantitatea este suficienta atunci se modifica cantitatea din baza de
date
int cantNoua=exista-cant;
st.executeUpdate("UPDATE PRODUSE SET CANTITATE="+cantNoua+" WHERE PRODUS=
'"+prod+"'");
}catch(Exception e){e.printStackTrace();return false;}
return true;
}
//Stergere resurse
public void destroy() {
try{
con.close();
con=null;
}catch(Exception e){e.printStackTrace();}
}
}

Servlet 2
import javax.servlet.*;
import javax.servlet.http.*;

import java.io.*;
import java.util.*;
public class ServletBuy extends HttpServlet implements SingleThreadModel {
private static final String CONTENT_TYPE = "text/html";
//Process the HTTP Get request
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(true);
ArrayList cos = (ArrayList)session.getAttribute(session.getId()); //.3
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>ServletBuy</title></head>");
out.println("<body>");
if((cos==null)||(cos.size()==0)){
out.println("<p>Cosul este gol.</p>");
}
else
{
for(int i=0;i<cos.size();i++){
out.println("<p>Produs: "+(String)cos.get(i)+"</p>");
}
session.invalidate(); //.4
}
out.println("</body></html>");
}
}

Primul servlet are rolul de a prelua comenzile de la clieni. Un client poate fi :


un applet, un alt program java (care comunic cu servletul utiliznd protocolul
HTTP sau un form din cadrul unei pagin html.
In momentul n care servletul ServletChek primete o cerere POST sau GET,
este executat metoda service() care va prelucra respectiva cerere. O variant
alternativ este de a implementa n cadrul servletului metodele doGet()
i doPost() pentru a prelucra separat cererile GET i POST.
In cadrul servletului ServletChek se utilizeaz un mecanism pentru memorarea
unui set cereri pe care un client le-a fcut (session tracking). Acest mecanism
poart numele de memorarea sesiunii. Acest mecanism permite servletului s
memoreze toate comenzile pe care clientul le-a fcut pe parcursul unei seiuni de
cumprturi.
Pentru urmrirea comenzilor unui client prima operaie este de obinerea a
obiectului HttpSession ( 1.) . Dac clientul a accesat pentru prima

dat servletul atunci getSession(true) creeaz un nou obiect sesiune


este returnat (daca parametrul este false atunci metoda returneaz null).

Obiectul sesiune ofer posibilitatea de a aduga in cadrul acestuia perechi nume


valoare, unde nume este un String iar valoare este un obiect java (2.).
Memorarea sesiunii este un mecanism prin care servleturile din cadrul aceluiai
container pot comunica ntre ele pentru un anumit client . In linia (3) se observ
modul n care pe baza unui obiect sesiune, un servlet poate obine o valoarea
ataat unui nume ( adugarea s-a fcut n (2) ).
O sesiune poate fi invalidat automat sau manual. Invalidarea automat se
realizeaz de ctre serverul de web cnd pentru o anumit perioad de timp un
client nu a mai fcut nici o cerere. Invalidarea manual se realizeaz de
ctre servlet cnd, de exemplu clientul a terminat sesiunea de cumprturi.
Invalidarea unei sesiuni nseamn eliminarea obiectuluiHttpSession i a
perechilor nume valoare asociate cu acesta. Acest lucru se realizeaza in cadrul
programului pe linia (4).
Observaie: Mecanismul de memorare a sesiunii utilizeaz cookies pentru
asocierea unui utilizator cu un obiect sesiune. Dac clientul nu
suport cookies sau are dezactivat acest mecanism atunci exemplul anterior nu
va mai funciona. In acest caz trebuie utilizat mecanismul de rescriere a URLurilor.
Cel de al doilea servlet (ServletBuy) realizeaz operaiile finale n momentul n
care un client decide terminarea sesiunii de cumprturi. In cazul de
fa servletul verific dac clientul are produse n co sau nu are, dup care
realizeaz invalidarea sesiunii.
Pentru verificarea aplicaiei prezentate anterior adiional pe lng cele
dou servleturi trebuie construit baza de date ce va fi localizat pe acelai
calculator cu servleturile i vor trebui realizate setrile necesare pentru
ca servleturile sa se poat conecta la baza de date (vezi lucrarea 6).
Listingul urmtor prezint pagina html necesar pe partea de client.
<html>
<head>
<title>Magazin Online</title>
</head>
<body>
<p><font face="Courier">Magazin Online</font></p>
<form method="POST" action="servlet/ServletChek">
<p><b>
Produs: <input type="text" name="produs" size="20">

Cantitate:<input type="text" name="cantitate" size="20">


</b></p>
<p><input type="submit" value="Adauga Produs" name="B1"></p>
</form>
<form method="POST" action="servlet/ServletBuy">
<p><input type="submit" value="Trimite Comanda" name="B1"></p>
</form>
</body>
</html>

5. Java Server Pages (JSP)


Tehnologia JSP are la baz tehnologia servlet-urilor i replic ntr-o mare
msur tehnologia Active Server Pages (ASP) de la Microsoft.
n esen este vorba de posibilitatea de inserare de cod java n cadrul paginilor
HTML. Codul java este inclus ntre tagurile speciale <% i %> .
O pagin HTML cu secvene de cod JSP arat astfel:
<HTML>
<HEAD><TITLE>Hello</TITLE></HEAD>
<BODY>
<H1>
<%
if (request.getParameter("name") == null) {
out.println("Hello World");
}
else {
out.println("Hello, " + request.getParameter("name"));
}
%>
</H1>
</BODY></HTML>

n momentul n care paginile JSP sunt ncrcate, serverul (care gzduiete


paginile JSP) va genera automat, compila, ncrca i rula servleturi speciale
pentru a genera coninutul dinamic al paginii.

Servletul generat n fundal ca urmare a realizrii cererii de ncrcare a paginii


prezentate n listingul anterior arat astfel:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class _hello1_xjsp extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
BufferedReader in = request.getReader();
out.println("<HTML>");
out.println("<HEAD><TITLE>Hello</TITLE></HEAD>");
out.println("<BODY>");
out.println("<H1>");
if (request.getParameter("name") == null) {
out.println("Hello World");
}
else {
out.println("Hello, " + request.getParameter("name"));
}
out.println("</H1>");
out.println("</BODY></HTML>");
}
}

Prima ncrcare a paginii JSP va dura mai mult deoarece serverul va trebui s
genereze, compileze i s ncarce servletul corespunztor.
Elementele unei pagini JSP

Codul JSP poate fi inserat n cadrul paginilor n trei moduri.

1. <%= expression %> n acest caz expresia este evaluat i rezultatul este trimis ctre ieire
(afiare).

2. <% code %> acest cod este inserat n cadrul metodei service() corespunztoare servletului ce va fi
generat pe baza paginii JSP.

3. <%! code %> astfel de declaraii sunt folosite pentru a insera cod n cadrul servletului dar n afara
oricrei metode.

Expresii JSP

Dup cum s-a precizat expresiile sunt evaluate, convertite n ir de caractere i


trimise ctre ieire. De exemplu urmtoarea secven va trimite ctre ecran
timpul curent al sistemului.
Current time: <%= new java.util.Date() %>

Pentru lucrul cu expresii sunt cteva expresii care sunt predefinite i pot fi
folosite n cadrul acestora. Cele mai importante sunt urmtoarele:

request, reprezint obiectul de tip HttpServletRequest;


response, reprezint obiectul de tip HttpServletResponse;
session, reprezint obiectul de tip HttpSession asociat cu obiectul request;
out, reprezint un obiect de tip PrintWriter ce poate fi folosit pentru trimiterea

datelor ctre ieire.

Un alt exemplu:
Your hostname: <%= request.getRemoteHost() %>

Scripturi JSP

Paginile JSP permit inserarea de cod complex java prin intermediul tagurilor <%
%>. Cteva exemple:
<%
String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData);
%>
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
if (Math.random() < 0.5) {
out.println("Have a <B>nice</B> day!");
} else {
out.println("Have a <B>lousy</B> day!");
}

Folosind tagurile <% %> se poate scrie cod mixt HTML i java.
Declaraii JSP

Declaraiile permit definirea de metode sau atribute ce vor fi inserate n


codul servletului ce va fi generat pe baza paginii JSP ( n afara
metodei service()).
Inserarea declaraiilor se face cu tagurile <%! %>. Declaraiile nu pot fi utilizate
pentru a genera direct text ctre ieire standard. Exemplu:
<%! private int accessCount = 0; %>
Accesses to page since server reboot:
<%= ++accessCount %>

Directive JSP

Exist dou tipuri importante de directive ce pot fi utilizate n cadrul unei aplicaii.
Directiva page permite definirea de importuri de pachete i setarea a diferii
parametri ai clasei servlet ce va fi generate pe baza paginii JSP.
Directiva include permite includerea de fiiere n momentul n care este
generat servletul asociat paginii JSP.
Ca i exemplu directiva include poate fi folosite pentru a include o bar de
navigaie n cadrul paginilor unui site:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Servlet Tutorial: JavaServer Pages (JSP) 1.0</TITLE>
<META NAME="author" CONTENT="webmaster@somesite.com">
<META NAME="keywords" CONTENT="...">
<META NAME="description" CONTENT="...">
<LINK REL=STYLESHEET
HREF="Site-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<%@ include file="/navbar.html" %>
<!-- Part specific to this page ... -->
</BODY>
</HTML>

Exemplu pagina JSP


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Using JavaServer Pages</TITLE>
<META NAME="author" CONTENT="content xxx yyy zzz">
<META NAME="keywords"
CONTENT="JSP,JavaServer Pages,servlets">
<META NAME="description"
CONTENT="A quick example of the four main JSP tags.">
<LINK REL=STYLESHEET
HREF="My-Style-Sheet.css"
TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE">
Using JavaServer Pages</TABLE>
</CENTER>
<P>
Some dynamic content created using various JSP mechanisms:
<UL>
<LI><B>Expression.</B><BR>
Your hostname: <%= request.getRemoteHost() %>.
<LI><B>Scriptlet.</B><BR>
<% out.println("Attached GET data: " +
request.getQueryString()); %>
<LI><B>Declaration (plus expression).</B><BR>
<%! private int accessCount = 0; %>
Accesses to page since server reboot: <%= ++accessCount %>
<LI><B>Directive (plus expression).</B><BR>
<%@ page import = "java.util.*" %>
Current date: <%= new Date() %>
</UL>
</BODY>
</HTML>

S-ar putea să vă placă și