Documente Academic
Documente Profesional
Documente Cultură
1. Obiectivul lucrrii
Obiectivul lucrrii este de a prezenta tehnologiile Java pentru implementarea de
aplicaii web.
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
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.*;
}
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>");
}
}
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
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
Pentru lucrul cu expresii sunt cteva expresii care sunt predefinite i pot fi
folosite n cadrul acestora. Cele mai importante sunt urmtoarele:
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
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>