Documente Academic
Documente Profesional
Documente Cultură
ANT-ul abordeaza problema intr-un mod diferit. In loc sa apeleze direct utilitare
ale sistemului de operare, el apeleaza obiecte Java cu diverse functionalitati.
Descrierea operatiunilor este realizata intr-un fisier XML. Aici este implementat
arborele de sarcini pe care ANT trebuie sa-l execute. Fiecarei sarcini ii corespunde
un obiect Java predefinit. Fisierul XML creat care contine toata logica de compilare
a proiectului poate fi apelat pe orice platforma care suporta o masina virtuala
Java.
Utilizare
Fisierele ANT sunt scrise folosind meta-limbajul XML. Numele standard al fisierului
XML este build.xml. Fiecare fisier descrie un singur proiect si contine cel putin
un target. Un target contine unul sau mai multe task-uri. Task-ul este o
secventa de cod care se executa.
<project>
<target>
In cadru cuvantului cheie <project> se pot defini unul sau mai multe target-uri.
Un target este o colectie de unul sau mai multe task-uri prin intermediul carora se
construieste proiectul. La apelarea ANT-ului, se poate specifica care din target-
urile definite in build.xml va fi executat. Daca nu este specificat nici un target,
atunci, in mod automat, va fi executat targetul definit de atributele cuvantului
cheie <project> [vezi A1].
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
<task>
<property>
Un proiect poate avea una sau mai multe proprietati. O proprietate este o pereche
nume - valoare. De exemplu putem defini directorul sursa pentru fisierele de
imagini ca o proprietate in felul urmator:
1: <classpath>
2: <pathelement path="${classpath}"/>
3: <pathelement location="lib/helper.jar"/>
4: </classpath>
Avantajul arhivelor .war este evident: o aplicatie web extrem de complexa poate
fi livrata clientului sub forma unui singur fisier. Acesta, printr-o simpla operatie de
copiere in directorul de aplicatii al TOMCAT, activeaza aplicatia web. Spre
exemplu, serverul EXIST, de baze de date native XML, este livrat ca un fisier Web
Archive, acesta incepand sa functioneze imediat ce este copiat in cadrul TOMCAT.
In figura de mai sus se remarca separarea clara a arhitecturii de directoare a
continutului sursa de arhitectura de directoare a continutului executabil. Practic,
modalitatea de organizare a continutului sursa nu intereseaza, deoarece serverul
nu lucreaza cu acesta. Conform recomadarii TOMCAT, pentru a putea obtine
arhive .war coerente cu specificatia, arhitectura de directoare a continutului
executabil trebuie sa indeplineasca urmatoarele:
In continuare este prezentata pas cu pas crearea unei aplicatii web si instalarea
acesteia in TOMCAT. Aplicatia este un convertor valutar simplu.
Pasul 1
Pasul 2
</project>
Pasul 3
In acest moment aplicatia noastra este gata. Urmeaza apelarea utilitarului ANT
pentru construirea efectiva a proiectului si testarea intr-un browser web a
functionalitatii acesteia.
Intr-un terminal schimbati directorul curent in /conv si dati comanda : ant install
Pentru a verifica daca aplicatia a fost instalata cu succes in TOMCAT, vom apela la
un utilitar al acestuia, numit MANAGER. In browserul Mozzila introducem
urmatoarea adresa URL : http://atlas.stud.ugal.ro:8080/manager/list. In lista
afisata trebuie sa regasim si aplicatia noastra cu specificatia running .
Laborator 2
Tehnologia Java ofera posibilitatea realizarii a trei categorii mari de aplicatii:
A o aplicatii stand-alone - ruleaza independent
o appleturi - ruleaza in browser-ul clientului
o servleturi - ruleaza pe server
Prezentare generala
Exercitiu
/ex1
o /src
/java
PrimulServlet.java
o build.xml
o web.xml
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.net.*;
out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");
out.println("<P>Acesta este primul servlet");
out.println("</BODY></HTML>");
out.close();
}
}
<!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>
</web-app>
Interactiunea cu clientii
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.net.*;
out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");
out.println("<P>Aceasta este cererea clientului servlet"
+ om);
out.println("</BODY></HTML>");
out.close();
}
}
Exercitiu
/ex1
o /src
/java
Analiza.java
/jsp
index.jsp
formular.jsp
o build.xml
o web.xml
Metoda init este apelata doar atunci cand servletul este creat. Servletul
poate fi creat in mod dinamic, atunci cand clientul il invoca sau in mod
static, atunci cand serverul este pornit. Modalitatea de initializare a
servletului este setata in configurarile serverului. Metoda init poate fi
scrisa in doua moduri: in prima varianta, metoda nu primeste nici un
argument - este folosita in cazul in care servletul nu citeste configurarile
serverului pe care se afla; a doua varianta primeste ca argument
obiectul ServletConfig prin intermediul caruia are acces la diferiti
parametri ai serverului.
De fiecare data cand un servlet este invocat, serverul creaza un nou fir
de executie si transfera apelul metodei service. Aceasta verifica tipul
cererii HTTP si apeleaza una din metodele doGet, doPost etc.
Supradefinirea metodei service se face astfel:
Asa cum spuneam mai sus, serverul creaza o singura instanta pentru un
servlet si cate un nou thread pentru fiecare acces la servlet. Atunci cand
servletul contine campuri sau date partajate, modelul multi-threading nu
este cel mai indicat. Pentru a preveni crearea de thread-uri multiple,
servletul trebuie sa implementeze interfata SingleThreadModel :
<web-app>
<servlet>
<servlet-name>ShowMessage</servlet-name>
<servlet-class>ShowMessage</servlet-class>
<init-param>
<param-name>message</param-name>
<param-value>un exemplu de mesaj</param-value>
</init-param>
<init-param>
<param-name>repeats</param-name>
<param-value>5</param-value>
</init-param>
</servlet>
<!-- Se completeaza in conformitate -->
</web-app>
D Continutul mesajelor HTTP
Un exemplu in care sunt expuse mai multi din parametrii HTTP este
prezentat in continuare:
1:import java.io.*;
2:import javax.servlet.*;
3:import javax.servlet.http.*;
4:import java.util.*;
5:
6:public class ShowHTTPVariables extends HttpServlet {
7:
8:public void doGet(HttpServletRequest
request,HttpServletResponse response)
9: throws ServletException, IOException {
10: response.setContentType("text/html");
11: PrintWriter out = response.getWriter();
12: String[][] variables ={
13: { "AUTH_TYPE", request.getAuthType() },
14: { "CONTENT_LENGTH",
String.valueOf(request.getContentLength()) },
15: { "CONTENT_TYPE", request.getContentType() },
16: {
"DOCUMENT_ROOT",getServletContext().getRealPath("/") },
17: { "PATH_INFO", request.getPathInfo() },
18: { "PATH_TRANSLATED", request.getPathTranslated() },
19: { "QUERY_STRING", request.getQueryString() },
20: { "REMOTE_ADDR", request.getRemoteAddr() },
21: { "REMOTE_HOST", request.getRemoteHost() },
22: { "REMOTE_USER", request.getRemoteUser() },
23: { "REQUEST_METHOD", request.getMethod() },
24: { "SCRIPT_NAME", request.getServletPath() },
25: { "SERVER_NAME", request.getServerName() },
26: { "SERVER_PORT",String.valueOf(request.getServerPort())
},
27: { "SERVER_PROTOCOL", request.getProtocol() },
28: {
"SERVER_SOFTWARE",getServletContext().getServerInfo() }
29: };
30:
31: String title = "Exemplu complex";
32:
33: out.println(title +
34: "<BODY BGCOLOR=\"#FDF5E6\">\n" +
35: "<H1 ALIGN=CENTER>" + title + "</H1>\n" +
36: "<TABLE BORDER=1 ALIGN=CENTER>\n" +
37: "<TR BGCOLOR=\"#FFAD00\">\n" +
38: "<TH>Numele variabilei<TH>Value");
39:
40: for(int i=0; i<variables.length; i++) {
41: String varName = variables[i][0];
42: String varValue = variables[i][1];
43: if (varValue == null) varValue = "<I>Nespecificata</I>";
44: out.println("<TR><TD>" + varName + "<TD>" +
varValue);
45: }//for
46:
47: out.println("</TABLE></BODY></HTML>");
48:}//doGet
49:
50:
51:public void doPost(HttpServletRequest
request,HttpServletResponse response)
52: throws ServletException, IOException {
53: doGet(request, response);
54:}//doPost
55:}//class
O mai buna detailiere a parametrilor continuti intr-un mesaj HTTP
poate fi gasita in specificatia RFC 2616.
Laborator 4
Cookies
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Setare cookie-uri";
out.println(title +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"Pentru a vizualiza cookie-urile > " +
"<A HREF=\"ShowCookies\">\n" +
"aici </A>.\n" +
"</BODY></HTML>");
}//doGet
}
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Cookie-uri trimise de browser";
out.println(title +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
" <TH>Nume\n" +
" <TH>Valoare");
out.println("</TABLE></BODY></HTML>");
}
}
Sesiuni
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
import java.util.*;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Exemplu de Sesiune";
String heading;
Integer accessCount
=(Integer)session.getAttribute("accessCount");
if (accessCount == null) {
accessCount = new Integer(0);
heading = "Prima data ! Bine ati venit !";
} else {
heading = "Ati mai fost ! Bine ati revenit !";
accessCount = new
Integer(accessCount.intValue() + 1);
}//if
session.setAttribute("accessCount", accessCount);
out.println(title +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + heading + "</H1>\n" +
"<H2>Informatii despre sesiune:</H2>\n" +
"<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" +
" <TH>Tip info.<TH>Valoare\n" +
"<TR>\n" +
" <TD>ID sesiune\n" +
" <TD>" + session.getId() + "\n" +
"<TR>\n" +
" <TD>Data crearii\n" +
" <TD>" + new Date(session.getCreationTime()) +
"\n" +
"<TR>\n" +
" <TD>Ultima accesare\n" +
" <TD>" + new
Date(session.getLastAccessedTime()) + "\n" +
"<TR>\n" +
" <TD>Numar de accesari\n" +
" <TD>" + accessCount + "\n" +
"</TABLE>\n" +
"</BODY></HTML>");
}//doGet
Elemente script
<HTML>
<HEAD>
<TITLE>Expresii JSP</TITLE>
</HEAD>
<BODY>
<H2>Expresii</H2>
<UL>
<LI>Timp: <%= new java.util.Date() %>
<LI>Nume computer: <%= request.getRemoteHost() %>
<LI>ID Sesiune: <%= session.getId() %>
<LI>Nume:<%= request.getParameter("nume") %>
<LI>Varsta:<%= request.getParameter("varsta") %>
</UL>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE>JSP</TITLE>
</HEAD>
<%
String bgColor =
request.getParameter("culoareFundal");
boolean culoareSpecificata; // daca culoarea de
fundal
// a fost trimisa
if (bgColor != null) {
culoareSpecificata = true;
} else {
culoareSpecificata = false;
bgColor = "#ff0000"; // in caz ca alta culoare
nu a fost specificata
}
%>
<H2>Expresii si Cod</H2>
<UL>
<LI>Timp: <%= new java.util.Date() %>
<LI>Nume computer: <%= request.getRemoteHost() %>
<LI>ID Sesiune: <%= session.getId() %>
<LI>Nume:<%= request.getParameter("nume") %>
<LI>Varsta:<%= request.getParameter("varsta") %>
</UL>
<%
if (culoareSpecificata) {
out.println("Culoarea de fundal specificata
este " +
bgColor + ".");
} else {
%>
</BODY>
</HTML>
Declaratiile se introduc prin intermediul constructiei <%!
declaratie %>. In cadrul declaratiilor se definesc metodele sau
campurile folosite.
<HTML>
<HEAD>
<TITLE>Declaratii</TITLE>
</HEAD>
<BODY>
<H1>Declaratii</H1>
<%! private int accessCount = 0; %>
</BODY>
</HTML>
Directive
<HTML>
<HEAD>
<TITLE>Tabele</TITLE>
</HEAD>
<BODY>
<CENTER>
<H2>Preturi la mere si portocale</H2>
<%
String format = request.getParameter("format");
if ((format != null) && (format.equals("excel"))) {
response.setContentType("application/vnd.ms-
excel");
}
%>
<TABLE BORDER=1>
<TR><TH></TH><TH>Mere<TH>Portocale
<TR><TH>Primul semestru<TD>2307<TD>4706
<TR><TH>Al doilea semestru<TD>2982<TD>5104
<TR><TH>Al treilea semestru<TD>3011<TD>5220
<TR><TH>Al patrulea semestru <TD>3055<TD>5287
</TABLE>
</CENTER>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE>Calculul vitezei</TITLE>
</HEAD>
<BODY>
<%!
private double toDouble(String value) {
return(Double.valueOf(value).doubleValue());
}
%>
<%
double spatiu =
toDouble(request.getParameter("spatiu"));
double timp = toDouble(request.getParameter("timp"));
double viteza = spatiu/timp;
%>
<UL>
<LI>Spatiu: <%= spatiu %>
<LI>Timp: <%= timp %>
<LI>Viteza: <%= viteza %>
</UL>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE>Pagina erori</TITLE>
</HEAD>
<BODY>
Redirectionarea datelor
gotoPage("/magazin/formular2.jsp?client=2",request,
response);
} else {
gotoPage("/erori/eroareHandler?er=5",request,
response);
}
}//doGet
RequestDispatcher dispatcher
=getServletContext().getRequestDispatcher(address);
dispatcher.forward(request, response);
}//gotoPage
RequestDispatcher dispatcher
=getServletContext().getRequestDispatcher("adresa");
dispatcher.include(request, response);
out.println("...");
<%
String destinatie;
if (Math.random() > 0.5) {
destinatie = "/pagina1.jsp";
} else {
destinatie = "/pagina2.jsp";
}
%>