Sunteți pe pagina 1din 9

St.Gh.Pentiuc - F.I.E.

Suceava - Servlet, Java Server Pages - 1/9




Java ServIet

Servlet-urile sunt clase Java care sunt executate pe serverele web ca urmare a cererii unui client.
Servlet-urile permit dezvoltarea aplicatiilor web server-side si extinderea capacittilor de prelucrare a
serverelor prin oIerirea de noi servicii clientilor cum ar Ii:
modiIicri dinamice ale continutului si a Iormei de prezentare a paginilor web
acces la alte protocoale standard dect HTTP (ex. FTP)
noi protocoale client
Cu ajutorul servlet-urilor dispunem de o tehnologie Java uniIicat att pentru partea de client ct si
pentru cea de server.
client server
scripturi surs incluse n HTML
JavaScript

PHP, JSP (Java Server Page)
ASP (MicrosoIt)
SSI (Server Side
Includes)
clase autonome Applet servlet
programe n Iormat executabil - programe CGI executabile

Principiu de funcJionare

Este descris n Iigura urmtoare (preluat din ,Servlet.pdIde Lionel Seinturier, Universite Pierre &
Marie Curie)

CiIrele de pe Iigur indic etapele executrii unui servlet
cererea de executie din partea clientului care speciIic URLul servlet-ului


St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 2/9

Condi|ii de func|ionare
Servlet-urile pot Ii executate pe majoritatea serverelor web (Apache, IIS etc) pe care s-a instalat un
,motor pentru servlet-uri. n cazul serverelor Apache solutia cea mai simpla o reprezint motorul
Tomcat

Pentru dezvoltarea servlet-urilor este nevoie ca pe server s Iie instalat o platIorm Java adecvat cum
ar Ii JDK1.3 . Pentru JDK 1.1 sau Java 2 trebuie instalat si Java Servlet Development Kit (JSDK).
Puteti descrca gratuit ava 2 Standard Edition de la adresa http://java.sun.com/j2se/1.3/download.html
Pentru a se putea Iolosi utilitarul servletrunner, trebuie ca
- variabila de mediu PATH s indice corect diectorul n care se gseste acest utilitar (ex.
c:\jsdk2.0\bin pe un sistem Windows )
- variabila de mediu CLASSPATH indic Iisierul JAR (ex. pentru Windows
c:\jsdk2.0\lib\jsdk.jar )

Crearea i instaIarea unui servIet
1. Se editeaz codul surs ntr-un Iisier cu extensia java (ex. PrimulServlet.java)
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PrimulServlet extends HttpServlet {

public void service(HttpServletRequest cerere,
HttpServletResponse raspuns) throws IOException {
raspuns.setContentType("text/plain");
ServletOutputStream ies = raspuns.getOutputStream();
ies.write("Catre client: Succes".getBytes());
ies.flush();
}

}
2. Se compileaz servlet-ul (ex. PrimulServlet.java) cu compilatorul java dorit Exemplu:
javac PrimulServlet.java
3. Se execut servletrunner pentru a gzdui servlet-ul pe server.
4. Se lanseaz servlet-ul introducnd URL-ul n bara de adrese a navigatorului. Exemplu
http://soft.eed.usv.ro/servlet/PrimulServlet
Dac totul a Iost corect, n Iereastra navigatorului se va aIisa textul Catre client: Succes
Elemente de programare Java Servlet

Un servlet este un program Java care
St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 3/9

implementeaza interIata javax.servlet.Servlet
prin extinderea claselor:
javax.servlet.GenericServlet
javax.servlet.http.HttpServlet
Clasa HttpServlet deriv din GenericServlet si este special construit pentru protocolul HTTP.

public interface Servlet {

public void init(ServletConfig config)
throws ServletException;

public ServletConfig getServletConfig();

public void service(ServletRequest req,
ServletResponse res)
throws ServletException, IOException;

public String getServletInfo();
public void destroy();
}

Clasele se gsesc n Java Servlet API care este o extensie standard a JDK sub javax si contine
pachetele javax.servlet si javax.servlet.http

Programul rezultat va Ii compilat cu javac. Fi;ierul .class reyultat va Ii plasat ntr-un director care
depinde de instalarea masinii Tomcat. Acest director poate Ii
$TOMCAT_HOME/webapps/test/WEB-INF/classes/
unde variabila de mediu $TOMCAT_HOME a Iost setata la instalare si reprezint directorul unde este
instalat Tomcat.
Suport HTTP
Servlet-urile care utilizeaz protocolul HTTP Iiind Ioarte des utilizate, n pachetul javx.servlet.http
este implementat suportul pentru acest protocol
Metodele HTTP
Metoda GET
GET URL <http version>
Host: <target host>

Exemplu
Este solicitat servlet-ul joc.class aIlat pe server-ul soft.eed.usv.ro cruia i se transmit si 2
parametri (n2003 si numeIonescu Ion):
GET /servlet/joc?n=2003&nume=Ionescu%20Ion HTTP/1.1
Connection: Keep-Alive
User-Agent: Mozilla/4.0 (
compatible;
MSIE 4.01;
Windows NT)
St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 4/9

Host: soft.eed.usv.ro
Accept: image/gif, image/x-xbitmap,
image/jpeg, image/pjpeg
Metoda GET trebuie s Iie implementat pe server ca o metod sigur si idempotent.
Un exemplu de rspuns la metoda GET
HTTP/1.1 200 Document follows
Date: Mon, 20 Jan 2003 12:32:46 GMT
Server: JWS/1.1
Last-modified: Mon, 20 Jan 2003 12:32:46 GMT
Content-type: text/html
Content-length: 109

<html><body><h1>Sa vedem cum s-a jucat</h1>Jucatorul Ionescu Ion a ales 2003<br>Eu aleg
2004<br><h2>Am castigat eu</h2></body></html>
Metoda HEAD este similar cu GET, dar r|spunsul server-ului este un header (data modiIicrii unui
document, lungimea sa etc).
Metoda POST oIer posibilitatea de a trimite mai multe date.
POST /servlet/InregistrareDate HTTP/1.1
User-Agent: Mozilla/4.0 (
compatible;
MSIE 4.01;
Windows NT)
Host: soft.eed.usv.ro
Accept: image/gif, image/x-xbitmap,
image/jpeg, image/pjpeg, */
Content-type: application/x-www-form-urlencoded
Content-length: 93

nume=Ionescu&prenume=Ion&adresa=Suceava,%20str.Universitatii%20nr.1&telefon=216147
&fax=520277
Observatie. Metodei POST nu i se cere s Iie sigur si idempotent, deci repetarea ei nu va produce
acelasi rezultat.
H11P Support Classes
Now that you have been introduced to the HTTP protocol, consider how the javax.servlet.http
package helps you write HTTP servlets. The abstract class javax.servlet.http.HttpServlet provides
an implementation oI the javax.servlet.Servlet interIace and includes a lot oI helpIul deIault
Iunctionality. The easiest way to write an HTTP servlet is to extend HttpServlet and add your own
custom processing.
Clasa HttpServlet

public abstract class HttpServlet extends GenericServlet


St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 5/9

Fiind o clas abstract, deci utilizatorul va trebui s deIineasc cel putin o metod n clasa care o
extinde. Metodele care pot Ii supradeIinite corespund metodelor protocolului HTTP care sunt suportate
de server-ul pe care se execut servlet-ul. :
doGet (HttpServletRequest cerere, HttpServletResponse raspuns)
doPost (HttpServletRequest cerere, HttpServletResponse raspuns),
doOptions (HttpServletRequest cerere, HttpServletResponse raspuns)
doPut (HttpServletRequest cerere, HttpServletResponse raspuns)
doDelete (HttpServletRequest cerere, HttpServletResponse raspuns)
doTrace (HttpServletRequest cerere, HttpServletResponse raspuns)
Toate aceste metode au dou argumente:
un obiect al clasei HttpServletRequest reprezentnd cererea sosit la server
un obiect al clasei HttpServletResponse cu ajutorul cruia n metoda respectiv se poate
construi rspunsul ce va Ii trimis clientului
Metodele vor lansa exceptiile: ServletException, IOException
Alte metode ale clasei HttpServlet : init, destroy si getServletInfo.
Metoda servce() nu trebuie neaprat deIinit. Ea are rolul unui dispecer care interpreteaz cererea
si apeleaz metoda potrivit.

Clasa HttpServlet asigur suplimentar si rspunsul la cererile clientului tinnd seama de care metode
au Iost redeIinite n servlet.
n redeIinirea metodei doGet() vor trebui eIectuate urmtoarele:
- se citesc datele din cerere
- se seteaz header-ul rspunsului
- se scriu datele care vor constitui rspunsul

St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 6/9


Exemplul 2. Urmatorul servlet, clasa PrimaPagina, produce o pagina HTML. Se redeIineste metoda
doGet().

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PrimaPagina extends HttpServlet
{

public void doGet ( HttpServletRequest cerere,
HttpServletResponse raspuns
) throws ServletException, IOException
{
// setare header raspuns
//
raspuns.setContentType( "text/html" );
//
// scriere raspuns
//
ServletOutputStream
out = raspuns.getOutputStream();

out.println( "<html>" );
out.println( "<head><title>Prima pagina</title></head>" );
out.println( "<body>" );
out.println( "<h1>Pagina HTML</h1>" );
out.println( "Aceasta pagina a fost produsa de un servlet<hr>);
out.println( "</body></html>" );
out.close();
}
}
Acest program va Ii compilat:
javac PrimaPagina.java
apoi Iisierul PrimaPagina.class va Ii depus n directorul
$TOMCAT_HOME/webapps/test/WEB-INF/classes/
Pentru a-l testa se va orienta navigatorul ctre adresa
http://soft.eed.usv.ro:8080/servlet/test/PrimaPagina
Exemplul 3. Setare COOKIES
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SetareCookieS extends HttpServlet {

private static final String SUMA_KEY = "suma";
St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 7/9

public void doGet (HttpServletRequest cerere, HttpServletResponse
raspunsponse) throws ServletException, IOException {
int suma = 0;
Cookie cookie_crt = null;
Cookie
tabel_cookie[] = cerere.getCookies();

if (tabel_cookie != null) {
for(int i=0, n=tabel_cookie.length; i < n; i++) {
cookie_crt = tabel_cookie[i];
if (cookie_crt.getName().equals(SUMA_KEY)) {
try {
suma = Integer.parseInt(cookie_crt.getValue());
} catch (NumberFormatException ignored) {
suma = 0;
}
break;
}
}
}

try {
String addendString = cerere.getParameter("Aduna");
int aduna = Integer.parseInt (addendString);
suma += aduna;
cookie_crt = new Cookie (SUMA_KEY, Integer.toString(suma));
} catch (NumberFormatException e) {
if (cookie_crt == null) {
cookie_crt = new Cookie (SUMA_KEY, "0");
}
}
cookie_crt.setMaxAge (10000);


// Generate Output
raspunsponse.setContentType("text/html");
// Save cookie
raspunsponse.addCookie(cookie_crt);
PrintWriter out = raspunsponse.getWriter();
out.println("<html>" +
"<head><title>Cookie Information</title></head>" +
"<body bgcolor=\"#FFFFFF\">" +
"<h1>Cookie Information</h1><table>");
if (tabel_cookie != null) {
for(int i=0, n=tabel_cookie.length; i < n; i++) {
out.println ("<tr><td>" + tabel_cookie[i].getName() + "</td>");
out.println ("<td>" + tabel_cookie[i].getValue() + "</td></tr>");
}
}
out.println("</table></body></html>");
out.close();
}
}
St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 8/9

Cookies sunt transmise de navigatorul clientului mpreun cu cererea. de aceea ele pot Ii obtinute n
doGet().

Java Server Pages

Exetensie standard Java, deyvoltata pe Servlet.

Exemplu.

<html><body>
<H1>The time in seconds is:
<%= System.currentTimeMillis()/1000 %></H1>
</body></html>

Directive JSP

<%@ directive {attr="value"}* %>

Directiva page

Atribute: lungouge extends import session boIIer uotoIlosh isThreudSuIe inIo
errorPuge

Exemple
<%@ page language="java" %>
<%@ page session=true import=java.util.* %>


Obiectele HttpServletReqoest HttpServletResponse Session sunt create automat si
sunt disponibile in JSP.

Elemente script in JSP

<%! declaration %>
<% scriptlet %>
<%= expression %>

Comentarii

<%-- jsp comment --%>
<!-- html comment -->




St.Gh.Pentiuc - F.I.E. Suceava - Servlet, Java Server Pages - 9/9



Prelucrarea unui Iormular (exemplu preluat din Bruce Eckel, Thinking in Java, www.bruceeckel.com)

<%-- Fetching the data from an HTML form. --%>
<%-- This JSP also generates the form. --%>
<%@ page import="java.util.*" %>
<html><body>
<H1>DisplayFormData</H1><H3>
<%
Enumeration flds = request.getParameterNames();
if(!flds.hasMoreElements()) { // No fields %>
<form method="POST"
action="DisplayFormData.jsp">
<% for(int i = 0; i < 10; i++) { %>
Field<%=i%>: <input type="text" size="20"
name="Field<%=i%>" value="Value<%=i%>"><br>
<% } %>
<INPUT TYPE=submit name=submit
value="Submit"></form>
<%} else {
while(flds.hasMoreElements()) {
String field = (String)flds.nextElement();
String value = request.getParameter(field);
%>
<li><%= field %> = <%= value %></li>
<% }
} %>
</H3>
</body>
</html>