java server pages - rti.etf.bg.ac.rs · ©si1p1– koristiti “throws ioexception” ya metode...

184
Java Server Pages Java Server Pages © SI1P1 2004 1/15

Upload: buikhuong

Post on 28-Feb-2019

223 views

Category:

Documents


1 download

TRANSCRIPT

Java Server PagesJava Server Pages

© SI1P1 – 2004 1/15

Servlet tehnologija

Pomoću servleta je jednostavnoPomoću servleta je jednostavno– čitati podatke sa forme– čitati header-e HTTP zahtevačitati header e HTTP zahteva– postavljati HTTP status kod i header odgovora– koristiti cookie-ije i rad sa sesijom– deliti podatke između servleta– zapamtiti podatke između različitih zahtevaAli je naporno– koristiti println naredbe da bi se generisao HTML kod

održavati i menjati generisani HTML– održavati i menjati generisani HTML

© SI1P1 – 2004 2/15

JSP realizacija

© SI1P1 – 2004 3/15

JSP realizacija

© SI1P1 – 2004 4/15

JSP realizacijapackage jsp;import javax.servlet.*;import javax.servlet.http.*;i t j l t j *

_jspxFactory = JspFactory.getDefaultFactory();response.setContentType("text/html");pageContext = _jspxFactory.getPageContext(this,request response "" true 8192 true);import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;import java.io.PrintWriter;import java.io.IOException;import java.io.FileInputStream;import java.io.ObjectInputStream;import java.util.Vector;

request,response, , true, 8192, true);application = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();// beginout.write("\r\n<html>\r\n<body>\r\n");import java.util.Vector;

import org.apache.jasper.runtime.*;import java.beans.*;import org.apache.jasper.JasperException;import java.text.*;import java.util.*;public class _0005cjsp_0005cjsptest_0002ejspjsptest_jsp_0

( y );// end// begin [file="E:\\jsp\\jsptest.jsp";from=(3,2);to=(5,0)]Date d = new Date();String today = DateFormat.getDateInstance().format(d);// end// beginout write("\r\nToday is: \r\n<em> ");extends HttpJspBase {

static {}public _0005cjsp_0005cjsptest_0002ejspjsptest_jsp_0( ) {}private static boolean _jspx_inited = false;public final void jspx init() throws JasperException {

out.write("\r\nToday is: \r\n<em> ");// end// begin [file="E:\\jsp\\jsptest.jsp";from=(7,8);to=(7,13)]out.print(today);</b>// end// beginout.write(" </em>\r\n</body>\r\n</html>\r\n");public final void _jspx_init() throws JasperException {

}public void _jspService(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {JspFactory _jspxFactory = null;PageContext pageContext = null;

out.write( /em \r\n /body \r\n /html \r\n );// end} catch (Exception ex) {if (out.getBufferSize() != 0)out.clear();pageContext.handlePageException(ex);} finally {

fl h()HttpSession session = null;ServletContext application = null;ServletConfig config = null;JspWriter out = null;Object page = this;String _value = null;try {

out.flush();_jspxFactory.releasePageContext(pageContext);}}}

© SI1P1 – 2004 5/15

try {if (_jspx_inited == false) {_jspx_init();_jspx_inited = true;}

Prednosti JSP tehnologije

Iako pomoću JSP se ne može uraditi ništa novo što seIako pomoću JSP se ne može uraditi ništa novo što se ne može postići i pomoću servleta, korišćenje JSP tehnologije olakšava:– pisanje samog HTML koda– čitanje i održavanje HTML kodaPomoću JSP tehnologije moguće je:Pomoću JSP tehnologije moguće je:– koristiti standardne HTML alate kao što je Macromedia DreamWeaver.– Podeliti posao između dizajne (koji koriste HTML)i Java programeraJSP ohrabruje– odvajanje (Java) kod koji predstavlja sam sadržaj, od koda (HTML) pomoću koga se sadržaje prezentuje

© SI1P1 – 2004 6/15(HTML) pomoću koga se sadržaje prezentuje

Prednosti JSP tehnologije

U odnosu na ASP ili ColdFusionU odnosu na ASP ili ColdFusion– moćniji jezik za dinamički deo aplikacije– izvršavanje na većem broju servera i operativnih sistemaU odnosu na PHP– moćniji jezik za dinamički deo aplikacije– bolja podrška alata– bolja podrška alataU odnosu na korišćenje samo servleta– jednostavnije kreiranje HTML koda– korišćenje standardnih alata (n.p., DreamWeaver)– podeli i vladaj

JSP programeri i dalje moraju poznavati servlet– JSP programeri i dalje moraju poznavati servlet programiranje

© SI1P1 – 2004 7/15

Podešavanje okruženja

Postavljanje CLASSPATH NePostavljanje CLASSPATH. Ne.Kompajliranje koda. Not.Korišćenje paketa da bi se izbegao konflikt sa j p gimenima. Ne.Postavljenje JSP stranica u specijalne direktorijume. NeNe.– install_dir\webapps\ROOT\ (HTML and JSP -- Tomcat)Korišćenje specijalnih URLs za poziv JSP stranice NeKorišćenje specijalnih URLs za poziv JSP stranice. Ne.– Koriste se ista imena kao za HTML stranice (izuzev ekstenzije fajla)Izuzeci– Ptavila oko CLASSPATH, install dirs, ..., i dalje se primenjuju na regularne Java klase koje se koriste u okviru

© SI1P1 – 2004 8/15primenjuju na regularne Java klase koje se koriste u okviru JSP stranice

Primer<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>JSP Expressions</TITLE><META NAME="keywords"<META NAME keywordsCONTENT="JSP,expressions,JavaServer Pages"><META NAME="description"CONTENT="A quick example of JSP expressions.">LINK REL STYLESHEET<LINK REL=STYLESHEETHREF="JSP-Styles.css"TYPE="text/css"></HEAD><BODY><H2>JSP Expressions</H2><UL><LI>Current time: <%= new java util Date() %><LI>Current time: <%= new java.util.Date() %><LI>Server: <%= application.getServerInfo() %><LI>Session ID: <%= session.getId() %><LI>The <CODE>testParam</CODE> form parameter:

© SI1P1 – 2004 9/15<%= request.getParameter("testParam") %></UL></BODY></HTML>

Primer

Ako je lokacija fajlaAko je lokacija fajla– C:\jakarta-tomcat-xx\webapps\ROOT\jsp-scripting\Expressions.jsp URL je– http://localhost/jsp-scripting/Expressions.jsp

© SI1P1 – 2004 10/15

Životni ciklus JSP stranice

© SI1P1 – 2004 11/15

Mogućnosti JSP tehnologije

Scripting elementi pozivaju kod servletaScripting elementi pozivaju kod servleta direktnoScripting elementi pozivaju kod servleta indirektno (korišćenjem pomoćnihindirektno (korišćenjem pomoćnih klasa)JavaBeansServlet/JSP aplikacija (MVC)MVC sa JSP expression jezikomPosebni tagoviPosebni tagoviMVC sa beans, pomoćnim tagovima, i frameworcima kao što su Struts ili JSF

© SI1P1 – 2004 12/15

Mogućnosti JSP tehnologije

Postoje dve opcijePostoje dve opcije– Upisati 25 linija Java koda direktno u JSP stranice– Upisati ovih 25 linija u odvojenu Java klasu i 1 liniju u JSP stranicu koja poziva novu klasustranicu koja poziva novu klasuZašto je druga opcija mnogo bolja?– Razvoj. Odvojena klasa se piše u Java okruženju (editor ili j j p j (IDE), ne u HTML okruženju– Debagovanje. Ako postoje syntaksne greške, primetiće se odmah tokom procesa kompajliranja Jednostavne printodmah tokom procesa kompajliranja. Jednostavne print naredbe se mogu videti.– Testiranje. Može se napisati test rutina sa petljom koja 10 000 puta testira i ponvalja se nakon svake promene10,000 puta testira i ponvalja se nakon svake promene.– Višestruko korišćenje. Može se koristiti ista klasa za više stranica

© SI1P1 – 2004 13/15

Osnovna JSP sintaksa

HTML TekstHTML Tekst– <H1>Blah</H1>– Šalje se dalje klijentu. Prevodi si u servlet kod koji je sličan sledećemsledećemout.print("<H1>Blah</H1>");HTML Komentari<!-- Komentar -->– Isto kao u HTMLu: šalje se dalje klijentuJSP K iJSP Komentari<%-- Komentar --%>– Ne šalje se klijentuNe šalje se klijentu

© SI1P1 – 2004 14/15

Vrste dinamičkih elemenata

izrazi (expressions):( p )<%= java_izraz %><%= new java.util.Date() %>skriptleti (scriptlets):<% j k d %><% java_kod %><% for (int i = 0; i < 10; i++) ... %>deklaracije (declarations):<%! java deklaracija %><%! java_deklaracija %><%! int a; %>direktive (directives)<%@ direktiva attr="..."%><%@ page contentType="text/plain" %>

© SI1P1 – 2004 15/15

JSP izrazi

d kl<html>...

<h4>Dobrodošli, <%= username %></h4>

u pitanju je izraz, daklene završava se sa ;

Danas je <%= new java.util.Date() %>.

...</html></html>

za izraze koji nisu tipa Stringautomatski se poziva toString()automatski se poziva toString()

© SI1P1 – 2004 16/15

JSP skriptleti

<ht l><html>...

<% if (Math random() < 0 5) { %><% if (Math.random() < 0.5) { %>Dobar dan!<% } else { %>Dobro veče!Dobro veče!<% } %>...</html>

© SI1P1 – 2004 17/15

JSP skriptleti<html>

skriptlet se ugrađuje direktno u kodgenerisanog servleta; tako je brojač

tlj i idlji i k i d k i tl t...

<table border=1><tr><td>R.br.</td>

petlje i vidljiv i u okviru drugog skriptleta(on se nalazi “unutar” for petlje)

<td>Ime</td></tr><%String names[] = {"Marko", "Nikola", "Igor", "Vladimir", "Dejan"};for (int i = 0; i < names length; i++) {for (int i = 0; i < names.length; i++) {%><tr><td><%= i %></td><td><%= names[i] %></td>

</tr><% } %></table>

...</html>

© SI1P1 – 2004 18/15

JSP deklaracije

definisanje metoda ili atributa servlet klase – izvan metode za obradudefinisanje metoda ili atributa servlet klase izvan metode za obradu zahteva

<%! int hitCount = 0; %>

<%! private int getRandom() {return (int)(Math.random()*100);

}%>

atribut servlet klase; samim timdostupan je u višestrukim doGet()ili doPost() pozivima

© SI1P1 – 2004 19/15

JSP direktiveOmogućavaju kontrolu strukture generisanog g j g gservleta.Dva osnovna tipa direktiva:• page direktivepage direktive

• import – za import paketa• contentType – podešava ContentType odgovora

• include direktive• uključuje zadatu stranicu u postojeću• uključuje zadatu stranicu u postojeću

© SI1P1 – 2004 20/15

JSP direktive

• page direktive

text/html; charset=utf-8

• page direktive<%@ page contentType="text/html" %><%@ page import="java.util.Vector" %>

• include direktive<jsp:include page “asd html”/><jsp:include page=“asd.html”/>

– uključuje stranicu u momentu zahtjevanja strane<%@ include file=“asd.jsp” %>

– uključuje stranicu u momentu kada se stranica prevodi u servlet

© SI1P1 – 2004 21/15

Predefinisane promjenljive

HttpServletResponse povezan sa odgovorom klijentu Dozvoljeno je postavljanje HTTP statusnih kodova i zaglavlja odgovora (response headers)PrintWriter koji se koristi za slanje odgovora klijentuj j g jout je baferovana verzija PrintWriter pod nazivom JspWriterMoguće je podešavanje veličine bafera, kao i njegovo potpuno isključivanje pomoću buffer atributa page direktiveisključivanje pomoću buffer atributa page direktiveout se koristi skoro isključivo u skriptletima, jer se JSP izrazi automatski smeštaju u izlazni tokHttpSession objekt povezan sa zahtevomHttpSession objekt povezan sa zahtevomSesije se kreiraju automatski, tako da je ova varijabla već povezana čak iako nema ulazne reference na sesiju. • izuzetak je ako se koristi session atribut page direktive kako bi se isključilo praćenje• izuzetak je ako se koristi session atribut page direktive kako bi se isključilo praćenje

sesija. U tom slučaju pokušaj pristupanja session varijabli rezultuje generisanjem poruke o grešci od strane servera u momentu prevođenja JSP strane u servlet

© SI1P1 – 2004 22/15

Predefinisane promjenljive

application objekat klase ServletContext koji služiapplication - objekat klase ServletContext koji služi za komunikaciju servleta i aplikacionog serveraUobičajena upotreba je za smeštanje globalnih j p j j gpromenljivih uz pomoć metoda setAttribute()/getAttribute()page sinonim za ključnu reč thispage - sinonim za ključnu reč this

© SI1P1 – 2004 23/15

Predefinisane promenljive

<html>

...

<% if (request.getParameter("username") != null) { %>Vrednost parametra: <%=

( )request.getParameter("username") %><% } %>

...

</html>

© SI1P1 – 2004 24/15

jspInit and jspDestroy Metodi

• Kod JSP stranica, kao i kod regularnihKod JSP stranica, kao i kod regularnih servleta, ponekad postoji potreba za korišćenjem init i destroy metoda• Problem: servlet koji napravljen od JSP stranice možda već koristi svoje init i destroy metodemetode– Njihovo preklapanje može da prouzrokuje probleme.– pa je nelegalno koristiti JSP deklaracije da bi se p j g jdeklarisali init ili destroy metodi.• Rešenje: koristiti jspInit i jspDestroy.A i i l j d ć i i–Auto-generisani servlet garantuje da će pozivati ove

metode u okvriu svojih init i destroy metoda, ali je standardna verzija jspInit i jspDestroy metoda prazna

© SI1P1 – 2004 25/15standardna verzija jspInit i jspDestroy metoda prazna (sa mogućnošću preklapanja)

JSP deklaracija

• ProblemProblem– Predefinisane promenljive (request, response, out, session,...) su lokalne u okviru _jspService metoda. - Tako da nisu dostupne u metodama koji su definisani u okviru JSP deklaracije ili u metodama u pomoćnim klasamaklasama. • Rešenje: proslediti ih kao argumente.<%! Private void nekiMetod(HttpSession s){( p ){

uradiNestoSa(s);}%>

% kiM t d( i ) %<% nekiMetod(session); %>• Treba primetiti da println metod od JspWriterbaca IOException

© SI1P1 – 2004 26/15baca IOException– Koristiti “throws IOException” ya metode koji koristeprintln naredbu

Korišćenje page direktive

Pruža informacije na visokom nivou o samomPruža informacije na visokom nivou o samom servletu koji se izvršava nakon JSP straniceMože kontrolisati– Koje se klase importuju– Koju klasu servlet nasleđuje

š– Koji MIME tipovi se generišu– Kako se obrađuje multithread

Da li servlet pripada sesiji– Da li servlet pripada sesiji– Veličinu i ponašanje izlaznog bafera– Koja stranica obrađuje neočekivane greškeKoja stranica obrađuje neočekivane greške

© SI1P1 – 2004 27/15

import atribut

SintaksaSintaksa– <%@ page import="package.class" %>– <%@ page import="package.class1,...,package.classN" @ p g p p g , ,p g

%>Upotreba– Generisanje import naredbu na vrhu definicije servletaNapomene

JSP stranice se mogu nalaziti bilo gde na serveru ali– JSP stranice se mogu nalaziti bilo gde na serveru, ali klase koje se koriste u okviru JSP stranica moraju biti u uobičajenim servlet direktorijumima…/WEB-INF/classes ili…/WEB-INF/classes/directoryMatchingPackage

k d k k k kl k© SI1P1 – 2004 28/15Preporuka je da se uvek koriste paketi za klase koje se koriste u okviru JSP stranice!

Paketi

public class SomeClass {public class SomeClass {public String someMethod(...) {SomeHelperClass test = new SomeHelperClass(...);String someString =SomeUtilityClass.someStaticMethod(...);...}}

I<%SomeHelperClass test new SomeHelperClass( );SomeHelperClass test = new SomeHelperClass(...);String someString =SomeUtilityClass.someStaticMethod(...);

© SI1P1 – 2004 29/15

y ( );%>

Primer<H2>The import Attribute</H2><%@ page import="java.util.*,coreservlets.*" %><%!private String randomID() {int num = (int)(Math.random()*10000000.0);return("id" + num);}private final String NO_VALUE = "<I>No Value</I>";%><%String oldID =CookieUtilities.getCookieValue(request, "userID",NO_VALUE);if (oldID.equals(NO_VALUE)) {String newID = randomID();Cookie cookie = new LongLivedCookie("userID", newID);response.addCookie(cookie);}}%>This page was accessed on <%= new Date() %> with a userIDcookie of <%= oldID %>.

/ O /© SI1P1 – 2004 30/15

</BODY></HTML>

Primer

© SI1P1 – 2004 31/15

contentType i pageEncoding atributi

SintaksaSintaksa– <%@ page contentType="MIME-Type" %>– <%@ page contentType="MIME-Type; @ p g yp yp ;charset=Character-Set" %>– <%@ page pageEncoding="Character-Set" %>Upotreba– Specificiraju MIME tip stranice generisane od strane servleta koji je nastao od JSP straniceservleta koji je nastao od JSP straniceNapomene– Vrednost atributa se ne može izračunati u vreme zahteva

© SI1P1 – 2004 32/15

Uslovno generisanje Excel stranice

Za ovaj problem ne može se koristiti atributZa ovaj problem ne može se koristiti atribut contentType, jer on ne može da bude uslovljen.

- Sledećim kodom se uvek dobija Excel MIME tip<% boolean usingExcel = checkUserRequest(request); %><% if (usingExcel) { %><%@ page contentType="application/vnd.ms-excel" %><% } %>

Rešenje: koristiti regularne JSP skriptlete saRešenje: koristiti regularne JSP skriptlete sa response.setContentType

© SI1P1 – 2004 33/15

Uslovno generisanje Excel stranice…<BODY><CENTER><H2>Comparing Apples and Oranges</H2><%String format = request.getParameter("format");if ((format != null) && (format.equals("excel"))) {response setContentType("application/vnd ms excel");response.setContentType("application/vnd.ms-excel");}%><TABLE BORDER=1><TABLE BORDER=1><TR><TH></TH> <TH>Apples<TH>Oranges<TR><TH>First Quarter <TD>2307 <TD>4706<TR><TH>Second Quarter<TD>2982 <TD>5104TR TH Second Quarter TD 2982 TD 5104<TR><TH>Third Quarter <TD>3011 <TD>5220<TR><TH>Fourth Quarter<TD>3055 <TD>5287</TABLE>

© SI1P1 – 2004 34/15</CENTER></BODY></HTML>

Uslovno generisanje Excel stranice

© SI1P1 – 2004 35/15

session atribut

SintaksaSintaksa– <%@ page session="true" %> <%-- Default --%>– <%@ page session="false" %>@ p gUpotreba– Da se označi da neka stranica ne pripada sesijiNapomena– Ako se ništa ne navede, stranica je deo sesije

S j j k liči t b ij– Smanjuje se količina potrebne memorije na serveru, ako je sajt visokog inteziteta

© SI1P1 – 2004 36/15

isELIgnored atribut

SintaksaSintaksa– <%@ page isELIgnored="false" %>– <%@ page isELIgnored="true" %>@ p g gUpotreba– Kontrola da li se JSP 2.0 Expression Language (EL)

šignoriše (true) ili normalno obrađuje (false).Napomena

Ako web xml specificira verziju servleta 2 3 (JSP 1 2) ili– Ako web.xml specificira verziju servleta 2.3 (JSP 1.2) ili raniju, default je true- I dalje je moguće menjati default vrednostij j g j– Ako web.xml specificira verziju servleta 2.4 (JSP 2.0) ili raniju, default je false

© SI1P1 – 2004 37/15

errorPage atribut

SintaksaSintaksa– <%@ page errorPage="Relative URL" %>Upotrebap– Specificira JSP stranicu koja obrađuje bilo koji izuzetak koji se dogodio na tekućoj straniciNapomene– Izuzetak koji se dogodio je automatski dostupan dizajniranoj error stranici u obliku "exception“dizajniranoj error stranici u obliku exception promenljive– web.xml fajl dozvoljava definisanje error stranica na nivou aplikacija

© SI1P1 – 2004 38/15

isErrorPage atribut

SintaksaSintaksa– <%@ page isErrorPage="true" %>– <%@ page isErrorPage="false" %> <%-- Default --@ p g g%>Upotreba

ž š– Specificira da li se trenutna stranica može izvršavati kao error stranica za neku drugu JSP stranicuNapomenaNapomena– Nova predefinisana promenljiva exception se kreira i dostupna je u okviru error stranica– Ovakav rad treba koristiti samo za hitan backup; trebalo bi eksplicitno obraditi što je moguće više izuzetaka

© SI1P1 – 2004 39/15izuzetaka- Uvek treba proveriti unete podatke

isErrorPage primer…<BODY><%@ page errorPage="/WEB-INF/SpeedErrors.jsp" %><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Computing Speed</TABLE><%!<%!private double toDouble(String value) {return(Double.parseDouble(value));}%><%double furlongs = toDouble(request.getParameter("furlongs"));doutbolDeo ufbolret(nriegqhutess t=. getParameter("fortnights"));doutbolDeo ufbolret(nriegqhutess t . getParameter( fortnights ));double speed = furlongs/fortnights;%><UL>

LI Di t % f l % f l<LI>Distance: <%= furlongs %> furlongs.<LI>Time: <%= fortnights %> fortnights.<LI>Speed: <%= speed %> furlongs per fortnight.</UL>

© SI1P1 – 2004 40/15

/</BODY></HTML>

isErrorPage primer

<BODY>…<BODY><%@ page isErrorPage="true" %><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Error Computing Speed</TABLE><P><P>ComputeSpeed.jsp reported the following error:<I><%= exception %></I>. This problem occurred in thefollowing place:<PRE><%@ page import "java io *" %><%@ page import= java.io.* %><% exception.printStackTrace(new PrintWriter(out)); %></PRE>

© SI1P1 – 2004 41/15

/</BODY></HTML>

isThreadSafe atribut

SintaksaSintaksa– <%@ page isThreadSafe="true" %> <%-- Default --%>– <%@ page isThreadSafe="false" %>@ p g

Upotreba– Da se naglasi sistemu da kod nije threadsafe, tako da

ž čsistem može da spreči konkurentne pristupe kodu- U stvari, servletu se prenosi da implementira SingleThreadModelSingleThreadModelNapomene- Može prouzrokovati lošije prefomanse u nekim p j psituacijama- Može prouzrokovati nekorektan rezultat u drugim

© SI1P1 – 2004 42/15

isThreadSafe primer

<%! private int idNum = 0; %><%! private int idNum = 0; %><%String userID = "userID" + idNum;g ;out.println("Your ID is " + userID + ".");idNum = idNum + 1;%>

ID biti j di tID mora biti jedinstven

© SI1P1 – 2004 43/15

Da li je isThreadSafe potreban

Nije potreban! Moguća je sinhronizacija:Nije potreban!. Moguća je sinhronizacija:<%! private int idNum = 0; %><%synchronized(this) {String userID = "userID" + idNum;out.println("Your ID is " + userID + ".");idNum = idNum + 1;}}%>

Dobijaju se bolje perfomanse u okruženju saDobijaju se bolje perfomanse u okruženju sa velikim saobraćajeisThreadSafe="false" se neće korektno izvršiti,

© SI1P1 – 2004 44/15ako server koristi pristup sa pool-of-instances

extends atribut

SintaksaSintaksa– <%@ page extends="package.class" %>Upotrebap– Da specificira klasu roditelja servleta koji se dobija od JSP straniceNapomene– Koristiti sa ekstremnom pažnjom

Uobičajena upotreba je da bi se nasledile klase koje– Uobičajena upotreba je da bi se nasledile klase koje prezentuje proizvođač servera (različite vryste podrške), a ne da bi se nasleđivale sopstvene klase.

© SI1P1 – 2004 45/15

Korišćenje fajlova

Pomoću jsp:include mogu se uključiti spoljnePomoću jsp:include mogu se uključiti spoljne stranice u trenutku prihvatanja zahtevaPomoću <%@ include ... %> (include direktive) se mogu uključiti spoljne stranice u trenutku prevođenja stranicePostoje razlozi zašto je u većem broju slučajaPostoje razlozi zašto je u većem broju slučaja bolje koristiti jsp:includePomoću jsp:plugin mogu se uključiti apleti za izvršavanje pomoću Java Plug-in

© SI1P1 – 2004 46/15

jsp:include

SintaksaSintaksa– <jsp:include page="Relative URL" />Upotreba– Više puta koristiti iste JSP, HTML, ili obične tekst dokumente– Dozvoliti promene uključenog sadržaja bez promeneDozvoliti promene uključenog sadržaja bez promene osnovnih JSP stranaNapomene

JSP d ž j ž d j t i– JSP sadržaj ne može da menja osnovne stranice: koristi se samo izlaz uključenih JSP stranica– Ne treba zaboraviti simbol / na kraju taga– Relativne URL adrese koje počinju sa znakom / se intrpretiraju relativno u odnosu na Web aplikaciju, a ne relativno u odnosu na root servera.

© SI1P1 – 2004 47/15

relativno u odnosu na root servera.– Moguće je uključiti fajlove iz WEB-INF direktorijuma

jsp:include primer

……<BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS "TITLE"><TR><TH CLASS="TITLE">What's New at JspNews.com</TABLE><P>Here is a summary of our threemost recent news stories:<OL><OL><LI><jsp:include page="/WEB-INF/Item1.html" /><LI><jsp:include page="/WEB-INF/Item2.html" /><LI><jsp:include page "/WEB INF/Item3 html" /><LI><jsp:include page="/WEB-INF/Item3.html" /></OL></BODY></HTML>

© SI1P1 – 2004 48/15

jsp:include primer Item1.html

<B>Bill Gates acts humble </B> In a startling<B>Bill Gates acts humble.</B> In a startlingand unexpected development, Microsoft big wigBill Gates put on an open act of humilityp p yyesterday.<A HREF="http://www.microsoft.com/Never.html">More details...</A>

Može se primetiti da stranice nije celokupan HTML dokument;dokument;Postoje samo tagovi koji treba da se pojave na osnovnoj strani

© SI1P1 – 2004 49/15

jsp:include primer rezultat

© SI1P1 – 2004 50/15

jsp:param element

PrimerPrimer <jsp:include

page="/fragments/StandardHeading.jsp"><jsp:param name="bgColor" value="YELLOW" /></jsp:include>

Dobijeni URL– http://host/path/MainPage.jsp?fgColor=REDOsnovna stranicaOsnovna stranica– fgColor: RED– bgColor: nullbgColor: nullUključena stranica– fgColor: RED

© SI1P1 – 2004 51/15– bgColor: YELLOW

include

SintaksaSintaksa– <%@ include file="Relative URL" %>Upotrebap– Upotreba više puta istog JSP sadržajaNapomene– Serveri ne proveravaju da li postoje promene uključenih fajlova.

Zato je potrebno promeniti i osnovne JSP fajlove svaki– Zato je potrebno promeniti i osnovne JSP fajlove svaki put kada su i uključeni fajlovi promenjeni.– Mogu se koristiti i specifični mehanizmi operativnih g p psistema, na primer na Unix-u<%-- Navbar.jsp modified 12/1/03 --%>

l d f l " b "© SI1P1 – 2004 52/15<%@ include file="Navbar.jsp" %>

include i jsp:include

© SI1P1 – 2004 53/15

Kada šta upotrebiti

Koristiti jsp:include Uvek kada je mogućeKoristiti jsp:include Uvek kada je moguće– Promene uključenih stranica ne zahtevaju nikakvu ručnu obradu– Postoji razlika u brzini primene ovih naredbiIpak i include naredba (<%@ include …%>) ima i dodatna svojstva kao što sui dodatna svojstva kao što su

– Osnovna stranica<%! int accessCount = 0; %><%! int accessCount = 0; %>– Uključena stranica<%@ include file="snippet.jsp" %>pp j p<%= accessCount++%>

© SI1P1 – 2004 54/15

Primer<%@ page import="java.util.Date" %>p g p j<%-- The following become fields in each servlet thatresults from a JSP page that includes this file. --%><%!private int accessCount = 0;private Date accessDate = new Date();private String accessHost = "<I>No previous access</I>";%>%><P><HR>This page &copy; 2006This page &copy; 2006<A HREF="http//www.my-company.com/">my-company.com</A>.This page has been accessed <%= ++accessCount %>times since server reboot. It was most recentlytimes since server reboot. It was most recentlyaccessed from<%= accessHost %> at <%= accessDate %>.<% accessHost = request.getRemoteHost(); %>

© SI1P1 – 2004 55/15<% accessDate = new Date(); %>

Primer

<BODY><BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Some Random Page</TABLE>Some Random Page</TABLE><P>Information about our products and services.<P>Blah, blah, blah.<P><P>Yadda, yadda, yadda.<%@ include file="/WEB-INF/ContactSection.jsp" %></BODY></HTML></BODY></HTML>15 J2EE training: http://courses.coreservlets.comReusing Footers: Result

© SI1P1 – 2004 56/15

Primer

© SI1P1 – 2004 57/15

Kada šta upotrebiti

Footer definiše polje accessCount kaoFooter definiše polje accessCount kao promenljivu instance Ako osnovna stranica koristi accessCount, trebalo bi da se koristi naredba @include– U drugim slučajevima accessCount će biti undefinedU ovom primeru osnovna stranica ne koristiU ovom primeru osnovna stranica ne koristi accessCount– Zašto se onda koristi naredba @include?@

© SI1P1 – 2004 58/15

Poziv apleta

AKo je aplet realizovan sa JDK 1 1 ili 1 02 (da biAKo je aplet realizovan sa JDK 1.1 ili 1.02 (da bi ga izvršavali i veoma stari čitači).– Izvršava se u skoro svakom čitaču– Koristi se APPLET tagAko je aplet realizovan sa JDK 1.5.– Zahteva IE 5 ili kasnije verzije ili Netscape 6 kasnije verzije– Koristi se APPLET tagKoristi se APPLET tag

• Ako je aplet realizovan sa Java 2 okruženjem.– Izvršava se u skoro svakom čitaču– Koriste se OBJECT i EMBED tagovi– Ova opcija je pojednostavljena pomoću jsp:plugin taga

© SI1P1 – 2004 59/15

Poziv apleta

Koristi se sintaksa slična APPLET taguKoristi se sintaksa slična APPLET tagu– Dobijaju se OBJECT i EMBED tagoviAPPLET Tag

<APPLET CODE="MyApplet.class“ WIDTH=475 HEIGHT=350>

</APPLET></APPLET>jsp:plugin

<jsp:plugin type=“applet” width=“475” h i ht “350">height=“350">

</jsp:plugin>Napomenaapo e a– JSP element i imena atributa su case sensitive– Sve vrednosti atributa moraju biti između ‘’ ili “”

l č© SI1P1 – 2004 60/15– Slično XMLu, a ne HTMLu

Dobijeni HTML kod

<object classid=<object classid"clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"width="300" height="200"codebase "http //ja a s n com/p od cts/pl gin/1 2codebase="http://java.sun.com/products/plugin/1.2.2/jinst all-1_2_2-win.cab#Version=1,2,2,0"><param name="java_code" value="SomeApplet.class"><param name="type" value="application/x-java-applet;"><COMMENT><embed type="application/x-java-applet;" width="300"<embed type application/x java applet; width 300height="200"pluginspage="http://java.sun.com/products/plugin/"java code "SomeApplet class">java_code="SomeApplet.class"><noembed></COMMENT>

© SI1P1 – 2004 61/15</noembed></embed></object>

Primer

…<BODY><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE">Using jsp:plugin</TABLE><P>

j l i t " l t"<jsp:plugin type="applet"code="PluginApplet.class"width="370" height="420">width= 370 height= 420 ></jsp:plugin></CENTER></BODY></HTML>

© SI1P1 – 2004 62/15

/CENTER /BODY /HTML

Dobijeni Java kod

import javax swing *;import javax.swing. ;/** An applet that uses Swing and Java 2D* and thus requires the Java Plug-in.q g*/public class PluginApplet extends JApplet {public void init() {WindowUtilities.setNativeLookAndFeel();

tC t tP ( T tP l())setContentPane(new TextPanel());}}}

© SI1P1 – 2004 63/15

Atributi jsp:plugin elementa

typetype– Za aplete mora imati vrednost "applet".- Koristi se "bean" da bi se ubacili JavaBeans elementi u k i W b t iokviru Web stranice.

code– Upotreba je ista kao CODE atributa u okviru APPLETUpotreba je ista kao CODE atributa u okviru APPLET taga, specificira klasu apleta na najvišem nivouwidth, height

U t b j i t k WIDTH HEIGHT k i APPLET– Upotreba je ista kao WIDTH, HEIGHT u okviru APPLET tagacodebase– Upotreba je ista kao CODEBASE u okviru APPLET tagaalign

Upotreba je ista kao ALIGN u okviru APPLET i IMG© SI1P1 – 2004 64/15

– Upotreba je ista kao ALIGN u okviru APPLET i IMG taga

Atributi jsp:plugin elementa

hspace vspacehspace, vspace– Upotreba je ista kao HSPACE, VSPACE u okviru APPLET tagaarchive– Upotreba je ista kao ARCHIVE u okviru APPLET taga, specificira JAR fajl iz koga se klase i slike učitavajuspecificira JAR fajl iz koga se klase i slike učitavajuname– Upotreba je ista kao NAME u okviru APPLET tagaUpotreba je ista kao NAME u okviru APPLET taga, specificira ime koje se koristi u okviru komunikacije između apleta ili za pristup apletu iz skript jezika kao što j J S i tje JavaScript.title– Upotreba je ista kao TITLE atributa

© SI1P1 – 2004 65/15Upotreba je ista kao TITLE atributa

Atributi jsp:plugin elementa

jreversionjreversion– Identifikuje verziju Java Runtime Environment (JRE) koje se zahteva. Default je 1.2.iepluginurl– Definiše URL sa koga se plug-in za Internet Explorer može dobiti Korisnici koji nemaju instaliran ovaj plug inmože dobiti. Korisnici koji nemaju instaliran ovaj plug-in, biće upitani da izvrše njegov download sa navedene lokacije. Podrazumevana vrednost je Sun-ov, ali za intranet korisnike je bolje rešenje lokalna kopijanspluginurl

D fi iš URL k l i N t ž– Definiše URL sa koga se plug-in za Netscape može dobiti. Podrazumevana vrednost je Sun-ov, ali za intranet korisnike je bolje rešenje lokalna kopija

© SI1P1 – 2004 66/15

Atributi jsp:plugin elementa

PARAM TagoviPARAM Tagovi– <APPLET CODE="MyApplet.class“ WIDTH=475

HEIGHT=350><PARAM NAME "PARAM1" VALUE "VALUE1"><PARAM NAME="PARAM1" VALUE="VALUE1"><PARAM NAME="PARAM2" VALUE="VALUE2"></APPLET></APPLET>

Ekvivalentan jsp:param kod<jsp:plugin type="applet“ code="MyApplet.class"width="475" height="350"><jsp:params><jsp:param name="PARAM1" value="VALUE1" /><jsp:param name= PARAM1 value= VALUE1 /><jsp:param name="PARAM2" value="VALUE2" /></jsp:params>

© SI1P1 – 2004 67/15</jsp:plugin>

jsp:fallback elementa

APPLET TagAPPLET Tag<APPLET CODE="MyApplet.class"WIDTH=475 HEIGHT=350><B>Error: this example requires Java.</B></APPLET>

Ekvivalent jsp:plugin kod sa jsp:fallback<jsp:plugin type="applet“ code="MyApplet.class"

idth "475" h i ht "350"width="475" height="350"><jsp:fallback><B>Error: this example requires Java </B><B>Error: this example requires Java.</B></jsp:fallback></jsp:plugin>

© SI1P1 – 2004 68/15

</jsp:plugin>

Rad sa bean-ovima

Potrebno je razumeti prednosti korišćenja bean-Potrebno je razumeti prednosti korišćenja beanovaKreiranje bean-ovaInstaliranje bean klasa na serveruPristup bean property-ijimaEksplicitno postavljanje bean property-ijaAutomatsko postavljanje bean property-ija iz parametaraparametaraDeljenje bean-ova između više servleta i JSP stranica

© SI1P1 – 2004 69/15

Rad sa bean-ovima

To su Java klase koje moraju ispunjavati nekolikoTo su Java klase koje moraju ispunjavati nekoliko pravila– Moraju imati zero-argument (prazan) konstruktor- Ovaj zahtev se može ispuniti eksplicitnim definisanjem takvog konstruktora ili izostavljanjem svih konstruktora

Ne bi trebalo da ima public promenljive instanci (polja)– Ne bi trebalo da ima public promenljive instanci (polja)– Neposredne vrednosti bi trebale da se dobijaju pomoću metoda nazvanih getXxx i setXxxg- Ako klasa ima metod getTitle koji kao rezultat vraća String, kaže se da klasa poseduje String property

titlnazvanu title- Boolean properties koriste Xxx umesto getXxx– Više informacije na http://java sun com/beans/docs/

© SI1P1 – 2004 70/15Više informacije na http://java.sun.com/beans/docs/

Rad sa bean-ovima

Da bi se napisao bean, ne smeju postojati publicDa bi se napisao bean, ne smeju postojati public poljaZnači sledeći kod

bli d bl dpublic double speed;treba zameniti sa

private double speed;private double speed;public double getSpeed() {return(speed);}public void setSpeed(double newSpeed) {speed = newSpeed;speed = newSpeed;}

I ovo treba uraditi u celokupnom Java kodu na k© SI1P1 – 2004 71/15svakom mestu

Osnovna sintaksa

jsp:useBeanjsp:useBean– U najjednostavnijem slučaju, ovaj element pravi novibean.- Način korišćenja:

<j B id "b N " l " k Cl " /><jsp:useBean id="beanName" class="package.Class" />jsp:getProperty– Ovaj element čita i prikazuje vrednosti definisanih bean property-ija.- Način korišćenja:<jsp:getProperty name="beanName“ property="propertyName" />j p g p y p p y p p yjsp:setProperty– Ovaj element menja vrednost bean property-ija- Način korišćenja:- Način korišćenja:

<jsp:setProperty name="beanName“ property="propertyName“ value="propertyValue" />

© SI1P1 – 2004 72/15

jsp:useBean

SintaksaSintaksa– <jsp:useBean id="name" class="package.Class" />Upotreba– Dozvoljava instanciranje Java klasa bez eksplicitnog Java programiranja (XML-kompatibilna sintaksa)NapomeneNapomene–Interpretacija:<jsp:useBean id="book1" class="coreservlets.Book" />

ž ćMože se dobiti i pomoću skriptleta<% coreservlets.Book book1 = new coreservlets.Book();

%>%ali jsp:useBean ima dve prednosti:Jednostavnije je dobijati vrednosti objekata iz zahtevanih parametera

© SI1P1 – 2004 73/15parameteraJednostavnije je deliti objekte između stranica ili servleta

jsp:getProperty

SintaksaSintaksa<jsp:getProperty name="name" property="property" />

Upotrebap– Dozvoljava pristup bean property-ijima bez eksplicitnog Java programiranjaNapomene<jsp:getProperty name="book1" property="title" />Je ekvivalntno sa sledećim JSP izrazomJe ekvivalntno sa sledećim JSP izrazom<%= book1.getTitle() %>

© SI1P1 – 2004 74/15

jsp:setProperty

SintaksaSintaksa<jsp:setProperty name="name“ property="property“

value="value" />Upotreba– Dozvoljava postavljanje bean property-ija bez eksplicitnog Java programiranjaeksplicitnog Java programiranjaNapomene

<jsp:setProperty name="book1“ property="title“<jsp:setProperty name= book1 property= title value="Core Servlets and JavaServer Pages" />Je ekvivalntno sa sledećem skriptletu

<% book1.setTitle("Core Servlets and JavaServer Pages"); %>

© SI1P1 – 2004 75/15

Primer

Beanovi se postavljaju u uobičajeni Java direktorijumdirektorijum

…/WEB-INF/classes/directoryMatchingPackageNameBeanovi (i pomoćne klase) moraju uvek biti u

© SI1P1 – 2004 76/15okviru paketa!

Primer

<jsp:useBean id="stringBean“ class="coreservlets.StringBean" /><jsp:useBean id stringBean class coreservlets.StringBean /><OL><LI>Initial value (from jsp:getProperty):<I><j tP t " t i B “ t " “ /></I><I><jsp:getProperty name="stringBean“ property="message“ /></I><LI>Initial value (from JSP expression):<I><%= stringBean.getMessage() %></I><LI><jsp:setProperty name="stringBean“ property="message"value="Best string bean: Fortex" />Value after setting property with jsp:setProperty: <I> <jsp:getPropertyValue after setting property with jsp:setProperty: <I> <jsp:getProperty

name="stringBean“ property="message" /></I><LI><% stringBean.setMessage ("My favorite: Kentucky Wonder");

%>%Value after setting property with scriptlet:<I><%= stringBean.getMessage() %></I></OL>

© SI1P1 – 2004 77/15</OL>

Primer

© SI1P1 – 2004 78/15

Postavljanje property-ija

<!DOCTYPE ><!DOCTYPE ...>...<jsp:useBean id="entry"j p yclass="coreservlets.SaleEntry" /><%-- setItemID expects a String --%><jsp:setPropertyname="entry"

t "it ID"property="itemID"value='<%= request.getParameter("itemID") %>' />

© SI1P1 – 2004 79/15

Postavljanje property-ija

<%<%int numItemsOrdered = 1;try {y {numItemsOrdered =Integer.parseInt(request.getParameter("numItems"));} catch(NumberFormatException nfe) {}%>

% tN It t i t %<%-- setNumItems expects an int --%><jsp:setPropertyname="entry"name= entryproperty="numItems"value="<%= numItemsOrdered %>" />

© SI1P1 – 2004 80/15

value % numItemsOrdered % /

Postavljanje property-ija

<%<%double discountCode = 1.0;try {String discountString =request.getParameter("discountCode");discountCode =discountCode =Double.parseDouble(discountString);} catch(NumberFormatException nfe) {}%><%-- setDiscountCode expects a double --%><jsp:setProperty<jsp:setPropertyname="entry"property="discountCode"

© SI1P1 – 2004 81/15

p p yvalue="<%= discountCode %>" />

Postavljanje property-ija

© SI1P1 – 2004 82/15

Postavljanje property-ija

Pomoću atributa jsp:setProperty može se postićiPomoću atributa jsp:setProperty može se postići da– se vrednosti postavljaju pomoću specificiranog parametra zahteva– Potrebno je izvršiti jednostavnu automatsku konverziju tipova za property-ije koji očekuju vrednosti standardnihtipova za property-ije koji očekuju vrednosti standardnih vrednosti boolean, Boolean, byte, Byte, char, Character, double,Double, int, Integer, float, Float, long, ili Long.

© SI1P1 – 2004 83/15

Ulazni parametri

<jsp:useBean id="entry"<jsp:useBean id entryclass="coreservlets.SaleEntry" /><jsp:setPropertyname="entry"property="itemID"param="itemID" />param= itemID /><jsp:setPropertyname="entry"property="numItems"param="numItems" /><jsp:setProperty<jsp:setPropertyname="entry"property="discountCode"

© SI1P1 – 2004 84/15

p p yparam="discountCode" />

Ulazni parametri

Simbol "*" se može upotrebiti za vrednostSimbol se može upotrebiti za vrednost property-ija atributa jsp:setProperty da bi se postiglo da– se vrednost dobija preko parametara zahteva koji ima isto ime kao i ime property-ija– Jednostavna automatska konverzija tipova se izvršava– Jednostavna automatska konverzija tipova se izvršava

© SI1P1 – 2004 85/15

Ulazni parametri

<jsp:useBean id="entry"<jsp:useBean id= entryclass="coreservlets.SaleEntry" /><jsp:setProperty name="entry" property="*" />j p p y y p p y /

Ovo je ekstremni primer za realizaciju "form čbeans" – objekata čiji se property-iji popunjavaju

prilikom slanja forme.– Može se dati proces podeliti između više formi tako daMože se dati proces podeliti između više formi, tako da svaka forma popunjava određeni deo objekta.

© SI1P1 – 2004 86/15

Deljenje bean-ova

Može se koristiti atribut scope da bi se definisaleMože se koristiti atribut scope da bi se definisale dodatne lokacije gde se može smestiti bean–I dalje ograničenje je lokalne pormenljive u okviru _jspService<jsp:useBean id="…" class="…“ scope="…" />Može se definisati da više servleta ili JSP stranicaMože se definisati da više servleta ili JSP stranica dele podatkeMože se dozvoliti i uslovno kreiranje bean-aj– Kreirati novi objekat samo ako se ne može pronaći postojeći

© SI1P1 – 2004 87/15

Vrednosti atributa scope

pagepage (<jsp:useBean … scope="page"/> ili

<jsp:useBean…>)– Default vrednost. Bean objekat treba da bude smešten u okviru PageContext objekta za vreme trajanja zahteva. Metodi u okviru istog servleta pristupaju bean-uMetodi u okviru istog servleta pristupaju bean-uapplication(<jsp:useBean … scope="application"/>)( j p p pp / )– Bean će biti smešten u ServletContext (dostupan preko promenljivih aplikacije ili pozvan pomoću

tS l tC t t())getServletContext()).- ServletContext je deljen između svih servleta iste Web aplikacije (ili svih servleta na serveru, ako eksplicitno

© SI1P1 – 2004 88/15

aplikacije (ili svih servleta na serveru, ako eksplicitno nijedna Web aplikacija nije definisana).

Vrednosti atributa scope

sessionsession(<jsp:useBean … scope="session"/>)– Bean će biti smešten u HttpSession objektu p jpovezanom sa trenutnim zahtevom, gde mu se može pristupiti iz regularnog servlet koda sa metodama getAttribute i setAttribute kao bilo kom drugom objektugetAttribute i setAttribute, kao bilo kom drugom objektu sesijerequest(<jsp:useBean … scope="request"/>)– Bean objekat treba da bude smešten u ServletRequest bj kt t j j t t ht k dobjektu za vreme trajanja trenutnog zahteva, kada mu

se može pristupiti pomoću getAttribute

© SI1P1 – 2004 89/15

Uslovne operacije sa bean-ovima

Bean se može uslovno kreiratiBean se može uslovno kreirati– Rezultat jsp:useBean je novi bean čija će se instanca formirati samo ako se ne može pronaći bean sa istim id i oblasti važenja.– Ako bean sa istim id i oblasti važenja se pronađe, postojeći bean se jednostavno poveže sa promenljivompostojeći bean se jednostavno poveže sa promenljivom pomoću id.Uslovno postavljanje Bean property-ija– <jsp:useBean ... />Se zamenjuje sa

<jsp:useBean ...>statements</jsp:useBean>–statements (jsp:setProperty elementi) se izvršavaju samo ako se kreira novi bean a ne izvršavaju se kada se

© SI1P1 – 2004 90/15samo ako se kreira novi bean, a ne izvršavaju se kada se pronađe postojeći.

AccessCountBean

public class AccessCountBean {public class AccessCountBean {private String firstPage;private int accessCount = 1;

bli St i tFi tP () {public String getFirstPage() {return(firstPage);}public void setFirstPage(String firstPage) {this.firstPage = firstPage;}}public int getAccessCount() {return(accessCount);}}public void setAccessCountIncrement(int increment) {accessCount = accessCount + increment;

© SI1P1 – 2004 91/15}}

SharedCounts1.jsp<jsp:useBean id="counter"j pclass="coreservlets.AccessCountBean"scope="application"><jsp:setProperty name="counter"property="firstPage"value="SharedCounts1.jsp" /></jsp:useBean>Of Sha edCo nts1 jsp (this page)Of SharedCounts1.jsp (this page),<A HREF="SharedCounts2.jsp">SharedCounts2.jsp</A>, and<A HREF="SharedCounts3.jsp">SharedCounts3.jsp</A>,<jsp:getProperty name="counter" property="firstPage" /><jsp:getProperty name= counter property= firstPage />was the first page accessed.<P>Collectively, the three pages have been accessedCollectively, the three pages have been accessed<jsp:getProperty name="counter" property="accessCount" />times.<jsp:setProperty name="counter"

© SI1P1 – 2004 92/15property="accessCountIncrement"value="1" />

Primer

SharedCounts2 jsp će se prvo posetitiSharedCounts2.jsp će se prvo posetiti.

© SI1P1 – 2004 93/15

MVC

© SI1P1 – 2004 94/15

MVC

Određeni framework se može koristitiOdređeni framework se može koristiti– Ponekada je upotreba frameworka korisna• Struts• JavaServer Faces (JSF)– Ne zahteva se njihovo korišćenje!• Moguće je implementirati MVC pomoću RequestDispatcher i dobiti sasvim zadovoljavajuće rezultate za jednostavne i srednje kompleksne aplikacijerezultate za jednostavne i srednje kompleksne aplikacijeMVC u potpunosti menja dizajn sistema– Moguće je koristiti MVC za pojedinačne zahteveg j p j– Razmišljati kao o MVC pristupu, a ne MVC arhitektura• Još se naziva i Model 2 pristup

© SI1P1 – 2004 95/15

MVC i RequestDispatcher

1 Definisati beanove da bi prezentovali podatke1. Definisati beanove da bi prezentovali podatke2. Koristiti servlet da bi se prihvatio podataka

– Servlet čita parametre zahteva, proverava unete p , ppodatke, itd.

3. Postaviti beanoveč– Servlet realizuje poslovnu logiku (kod specifičan za

aplikaciju) ili kod za pristup podacima da bi došao do rezultata. Resultati se smeštaju u beanove koji su j jdefinisani u okviru koraka 1.

4. Postaviti bean u okviru zahteva, sesije, ili d ž j l tsadržaja servleta

– Servlet poziva setAttribute u okviru objekata zahteva, sesije, ili sadržaja servleta da bi smestio referencu

© SI1P1 – 2004 96/15

sesije, ili sadržaja servleta da bi smestio referencu beanova koji predstavljaju rezultat zahteva.

MVC i RequestDispatcher

5 Proslediti zahtev JSP stranici5. Proslediti zahtev JSP stranici.– Servlet prepoznaje koja JSP stranica odgovara datoj situaciji i koristi metod forward od RequestDispatcher objekta da bi prebacio kontrolu datoj stranici.

6. Preuzeti podatke iz beana.JSP stranica pristupa beanu pomoću jsp:useBean i– JSP stranica pristupa beanu pomoću jsp:useBean i

odgovarajuće oblasti važenja iz koraka 4. Stranica tada koristi jsp:getProperty da bi pristupila beanovim property-ijima.– JSP stranica ne kreira ili modifikuje bean; ona samo prihvata i pokazuje podatke koje servlet kreiraprihvata i pokazuje podatke koje servlet kreira.

© SI1P1 – 2004 97/15

MVC i RequestDispatcherpublic void doGet(HttpServletRequest request,p ( p q q ,HttpServletResponse response)throws ServletException, IOException {String operation = request.getParameter("operation");if (operation == null) {operation = "unknown";}St ing add essString address;if (operation.equals("order")) {address = "/WEB-INF/Order.jsp";} else if (operation equals("cancel")) {} else if (operation.equals( cancel )) {address = "/WEB-INF/Cancel.jsp";} else {address = "/WEB-INF/UnknownOperation.jsp";address /WEB INF/UnknownOperation.jsp ;}RequestDispatcher dispatcher =request.getRequestDispatcher(address);

© SI1P1 – 2004 98/15dispatcher.forward(request, response);}

jsp:useBean i MVC nasuprot samo JSP

JSP stranice ne bi trebale da kreirajuJSP stranice ne bi trebale da kreiraju objekte– Servlet, a ne JSP stranica, trebalo bi da kreira , ,sve objekte koji predstavljaju podatke. Da bi se garantovalo da se u okviru JSP stranice neće kreirati objekti trebalo bi korostitikreirati objekti, trebalo bi korostiti<jsp:useBean ... type="package.Class" />- umestoumesto<jsp:useBean ... class="package.Class" />JSP stranica ne bi trebalo da modifikujeJSP stranica ne bi trebalo da modifikuje objekte– Moguće je koristiti jsp:getProperty ali ne

© SI1P1 – 2004 99/15jsp:setProperty

jsp:useBean i oblasti važenja

requestrequest– <jsp:useBean id="..." type="..." scope="request" />session– <jsp:useBean id="..." type="..." scope="session" />application

– <jsp:useBean id="..." type="..." scope="application" />page

j B id " " t " " " " /– <jsp:useBean id="..." type="..." scope="page" />- ili samo<jsp:useBean id=" " type=" " /><jsp:useBean id= ... type= ... />– Ovakav pristup se ne korsiti u okviru MVC (Model 2) arhitekture

© SI1P1 – 2004 100/15

Request-Based deljenje podataka

ServletServletValueObject value = new ValueObject(...);request.setAttribute("key", value);q ( y , );RequestDispatcher dispatcher =

request.getRequestDispatcher ("/WEB-INF/SomePage jsp");INF/SomePage.jsp");

dispatcher.forward(request, response);JSP 1 2JSP 1.2

<jsp:useBean id="key" type="somePackage.ValueObject"scope="request" />p q /<jsp:getProperty name="key" property="someProperty" />

JSP 2.0© SI1P1 – 2004 101/15${key.someProperty}

Session-Based deljenje podataka

ServletServletValueObject value = new ValueObject(...);HttpSession session = request.getSession();session.setAttribute("key", value);RequestDispatcher dispatcher =

request.getRequestDispatcherrequest.getRequestDispatcher("/WEB-INF/SomePage.jsp");dispatcher.forward(request, response);

JSP 1.2<jsp:useBean id="key" type="somePackage.ValueObject“

scope="session" />scope sess o /<jsp:getProperty name="key" property="someProperty" />

JSP 2.0${k }© SI1P1 – 2004 102/15${key.someProperty}

Session-Based deljenje podataka

Treba koristiti response sendRedirect umestoTreba koristiti response.sendRedirect umesto RequestDispatcher.forwardSituacija sa sendRedirect:– Korisnik vidi URL JSP stranice (ako se koristi RequestDispatcher.forward korisnik vidi URL servleta)Prednosti sendRedirectPrednosti sendRedirect– Korisnik može pristupiti JSP stranici odvojeno- Korisnik može da zapamti adresu JSP straniceKorisnik može da zapamti adresu JSP straniceNedostaci sendRedirect– Korisnik može da poseti JSP stranici bez pristupanja p p p jservletu, pa JSP podaci mogu da budu nedostupni- U okviru JSP stranice trebalo bi detektovati ovu situaciju

© SI1P1 – 2004 103/15situaciju

Application-Based deljenje podataka

ServletServletsynchronized(this) {ValueObject value = new ValueObject(...);getServletContext().setAttribute("key", value);RequestDispatcher dispatcher

=request.getRequestDispatcherrequest.getRequestDispatcher("/WEB-INF/SomePage.jsp");dispatcher.forward(request, response); }

JSP 1.2<jsp:useBean id="key" type="somePackage.ValueObject"scope="application" />scope= application /><jsp:getProperty name="key" property="someProperty" />

JSP 2.0© SI1P1 – 2004 104/15${key.someProperty}

Relativni URL u okviru JSP stranice

Korist:Korist:– Prosleđivanje pomoću request dispatcher-a je transparentno klijentu. Originalni URL je jedini URL za koji čitač znakoji čitač zna.Kakve su posledice?– Šta će čitač uraditi sa sledećim tagovima:g

<IMG SRC="foo.gif" …><LINK REL=STYLESHEETHREF "JSP St l "HREF="JSP-Styles.css"TYPE="text/css"><A HREF="bar.jsp">…</A>ba jsp /

– Odgovor: čitač ih shvata kao relativne u odnosu na URL servleta Najjednostavnije rešenje:

© SI1P1 – 2004 105/15Najjednostavnije rešenje:– Koristiti URL koji počinju sa /

Primer Bank Account Balance

BeanBean– BankCustomerServlet koji popunjava bean i prosleđuje ga j p p j p j godgovarajućoj JSP stranici– Pročitati customer ID, pozvati kod za pristup podacima da bi se popunio BankCustomerda bi se popunio BankCustomer– U zavisnosti od trenutne vrednosti stanja (balance) računa pozvati odgovarajuću rezultujuću stranup g j jJSP stranice koje prikazuju rezultate– Negativno stanje: stranica sa upozorenjem– Regularno stanje: standardna stranica– Veoma pozitivno stanje: stranica koja sadrđi dodatne reklame

© SI1P1 – 2004 106/15reklame– Nepoznat customer ID: stranica sa porukom o grešci

Primer Bank Account Balance

public class ShowBalance extends HttpServlet {p p {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {throws ServletException, IOException {BankCustomer customer

=BankCustomer.getCustomer(request.getParameter("id"));String address;g ;if (customer == null) {address ="/WEB-INF/bank-account/UnknownCustomer.jsp";} else if (customer.getBalance() < 0) {} else if (customer.getBalance() < 0) {address ="/WEB-INF/bank-account/NegativeBalance.jsp";request.setAttribute("badCustomer", customer);}}…RequestDispatcher dispatcher =

request.getRequestDispatcher(address);© SI1P1 – 2004 107/15

request.getRequestDispatcher(address);dispatcher.forward(request, response);

Primer Bank Account Balance negativan JSP 1.2 <BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">We Know Where You Live!</TABLE><P><IMG SRC="/bank-support/Club.gif" ALIGN="LEFT"><jsp:useBean id="badCustomer"t pe "co ese lets BankC stome "type="coreservlets.BankCustomer"scope="request" />Watch out,<jsp:getProperty name="badCustomer"<jsp:getProperty name= badCustomerproperty="firstName" />,we know where you live.<P>PPay us the $<jsp:getProperty name="badCustomer"property="balanceNoSign" />you owe us before it is too late!

© SI1P1 – 2004 108/15</BODY></HTML>

Primer Bank Account Balance negativan JSP 2.0

<BODY><BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">We Know Where You Live!</TABLE><P><IMG SRC="/bank-support/Club.gif" ALIGN="LEFT">Watch out,${b dC t fi tN }${badCustomer.firstName},we know where you live.<P><P>Pay us the $${badCustomer.balanceNoSign}you owe us before it is too late!

© SI1P1 – 2004 109/15

you owe us before it is too late!</BODY></HTML>

Primer Bank Account Balance

© SI1P1 – 2004 110/15

Deljenje podataka: RequestCiljCilj– Prikazati slučajan broj korisnikuTip deljenja podatakap j j p– Svaki zahtev dobija novi broj, tako da je odgovarajuće deljenje podataka na nivou zahteva (request based).

© SI1P1 – 2004 111/15

Deljenje podataka: Request Beanpackage coreservlets;package coreservlets;public class NumberBean {private double num = 0;p ;public NumberBean(double number) {setNumber(number);}public double getNumber() {

t ( )return(num);}public void setNumber(double number) {public void setNumber(double number) {num = number;}

© SI1P1 – 2004 112/15

}}

Deljenje podataka: Request JSP 1.2<BODY><BODY><jsp:useBean id="randomNum"type="coreservlets.NumberBean"ypscope="request" /><H2>Random Number:<jsp:getProperty name="randomNum"property="number" />

/H2</H2></BODY></HTML>

© SI1P1 – 2004 113/15

Deljenje podataka: Request JSP 2.0…<BODY><H2>Random Number:${randomNum.number}</H2></BODY></HTML>

© SI1P1 – 2004 114/15

Deljenje podataka: SessionCiljCilj– Prikazati korisnikovo ime i prezime.– Ako nam korisnik ne definiše svoje ime, želimo da mu j ,prikažemo ime koje nam je prethodno definisao.– Ako nam korisnik ne definiše svoje ime i ne možemo da pronađemo nijedno prethodno definisano imeda pronađemo nijedno prethodno definisano ime, potrebno je prikazati upozorenje.Tip deljenja podatakap j j p– Podatak se smešta za svakog klijenta, tako da je deljenje podataka na nivou sesije (session-based) d j ćodgovarajuće.

© SI1P1 – 2004 115/15

Deljenje podataka: Session Beanpackage coreservlets;package coreservlets;public class NameBean {private String firstName = "Missing first name";private String lastName = "Missing last name";public NameBean() {}public NameBean(String firstName String lastName) {public NameBean(String firstName, String lastName) {setFirstName(firstName);setLastName(lastName);}public String getFirstName() {return(firstName);return(firstName);}…

© SI1P1 – 2004 116/15}

Deljenje podataka: Session – servletpublic class RegistrationServlet extends HttpServlet {public class RegistrationServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)p p p )throws ServletException, IOException {HttpSession session = request.getSession();NameBean nameBean =(NameBean)session.getAttribute("nameBean");if ( B ll) {if (nameBean == null) {nameBean = new NameBean();session setAttribute("nameBean" nameBean);session.setAttribute( nameBean , nameBean);}

© SI1P1 – 2004 117/15

Deljenje podataka: Session – servletString firstName =grequest.getParameter("firstName");if ((firstName != null) &&(!firstName.trim().equals(""))) {nameBean.setFirstName(firstName);}String lastName =eq est getPa amete ("lastName")request.getParameter("lastName");

if ((lastName != null) &&(!lastName.trim().equals(""))) {nameBean setLastName(lastName);nameBean.setLastName(lastName);}String address ="/WEB-INF/mvc-sharing/ShowName.jsp";/WEB INF/mvc sharing/ShowName.jsp ;RequestDispatcher dispatcher =request.getRequestDispatcher(address);dispatcher.forward(request, response);

© SI1P1 – 2004 118/15}}

Deljenje podataka: Session – JSP 1.2<BODY><BODY><H1>Thanks for Registering</H1><jsp:useBean id="nameBean"j ptype="coreservlets.NameBean"scope="session" /><H2>First Name:<jsp:getProperty name="nameBean"

t "fi tN " / /H2property="firstName" /></H2><H2>Last Name:<jsp:getProperty name="nameBean"<jsp:getProperty name= nameBeanproperty="lastName" /></H2></BODY></HTML>

© SI1P1 – 2004 119/15

/BODY /HTML

Deljenje podataka: Session – JSP 2.0<BODY><BODY><H1>Thanks for Registering</H1><H2>First Name:${nameBean.firstName}</H2><H2>Last Name:${nameBean.lastName}</H2></BODY></HTML>

© SI1P1 – 2004 120/15

Deljenje podataka: Session – JSP 2.0

© SI1P1 – 2004 121/15

Deljenje podataka: ApplicationCiljCilj– Prikazati prost broj određene dužine.– Ako korisnik ne defniše željenu dužinu, trebalo bi j ,prikazati bilo koji prost broj koji se koristio za bilo kog korisnika.Tip deljenja podatakaTip deljenja podataka– Podatak se deli između više klijenata, tako da je deljenje podataka na nivou aplikacije (application-based) j j p p j ( pp )odgovarajuće.

© SI1P1 – 2004 122/15

Deljenje podataka: Application - Beanimport java.math.BigInteger;import java.math.BigInteger;public class PrimeBean {private BigInteger prime;public PrimeBean(String lengthString) {int length = 150;try {try {length = Integer.parseInt(lengthString);} catch(NumberFormatException nfe) {}setPrime(Primes.nextPrime(Primes.random(length)));}public BigInteger getPrime() {public BigInteger getPrime() {return(prime);}…

© SI1P1 – 2004 123/15

}}

Deljenje podataka: Application - Servletpublic class PrimeServlet extends HttpServlet {p p {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {throws ServletException, IOException {String length = request.getParameter("primeLength");ServletContext context = getServletContext();synchronized(this) {synchronized(this) {if ((context.getAttribute("primeBean") == null) ||(length != null)) {PrimeBean primeBean = new PrimeBean(length);context setAttribute("primeBean" primeBean);context.setAttribute( primeBean , primeBean);}String address ="/WEB INF/mvc sharing/ShowPrime jsp";/WEB-INF/mvc-sharing/ShowPrime.jsp ;RequestDispatcher dispatcher =request.getRequestDispatcher(address);dispatcher forward(request response);

© SI1P1 – 2004 124/15dispatcher.forward(request, response);}}}

Deljenje podataka: Application – JSP 1.2<BODY><BODY><H1>A Prime Number</H1><jsp:useBean id="primeBean“ j p p

type="coreservlets.PrimeBean“ scope="application" /><jsp:getProperty name="primeBean“ property="prime" /></BODY></HTML>

© SI1P1 – 2004 125/15

Deljenje podataka: Application – JSP 1.2<BODY><BODY><H1>A Prime Number</H1>${primeBean.prime}${p p }</BODY></HTML>

© SI1P1 – 2004 126/15

Prosleđivanje sa JSP stranice<% String destination;<% String destination;if (Math.random() > 0.5) {destination = "/examples/page1.jsp";/ p /p g j p ;} else {destination = "/examples/page2.jsp";}%>

j f d " % d ti ti % " /<jsp:forward page="<%= destination %>" />Dozvoljeno, ali loša ideja– Poslovna i kontrolna logika pripada servletima– Poslovna i kontrolna logika pripada servletima– Zadatak JSP stranice je prezentacija korisniku

© SI1P1 – 2004 127/15

Korišćenje includePomoću metoda forward objektaPomoću metoda forward objekta RequestDispatcher:– Kontrola se nepovratno predaje novoj stranici– Originalna stranica ne može generisati bilo kakav izlazPomoću metoda include objekta RequestDispatcher:RequestDispatcher:– Kontrola se trenutno predaje novoj stranici– Originalna stranica može generisati izlaz pre i posleOriginalna stranica može generisati izlaz pre i posle uključene stranice– Originalni servlet ne vidi izlaz uključene stranice– Korisno za portale: JSP prikazuje delove, ali se delovi uređuju različito za različite korisnike

© SI1P1 – 2004 128/15

Korišćenje includeresponse.setContentType("text/html");String firstTable, secondTable, thirdTable;if (someCondition) {firstTable = "/WEB-INF/Sports-Scores.jsp";secondTable = "/WEB-INF/Stock-Prices.jsp";thirdTable = "/WEB-INF/Weather.jsp";} else if (...) { ... }RequestDispatcher dispatcher =request.getRequestDispatcher("/WEB-INF/Header.jsp");dispatcher.include(request, response);dispatcher =request.getRequestDispatcher(firstTable);dispatcher.include(request, response);dispatcher =request.getRequestDispatcher(secondTable);dispatcher.include(request, response);dispatcher =

i h ( hi d bl )request.getRequestDispatcher(thirdTable);dispatcher.include(request, response);dispatcher =request.getRequestDispatcher("/WEB-INF/Footer.jsp");di h i l d ( )

© SI1P1 – 2004 129/15dispatcher.include(request, response);

Expression jezik (EL)

Zašto ga koristitiZašto ga koristitiOsnovna sintaksaRelacija između expression jezik iRelacija između expression jezik i MVC arhitektureReferenciranje smeštenihReferenciranje smeštenih promenljviihPristup bean property ijimaPristup bean property-ijima, elementima niza, elementima liste i Map ulazimaMap ulazimaUpotreba operatora expression jezika Uslovno izvršavanje izraza© SI1P1 – 2004 130/15Uslovno izvršavanje izraza

Nedostaci MVCGlavni nedostatak je u završnom koraku:Glavni nedostatak je u završnom koraku: prezentovanje rezultata u okviru JSP stranice.– Koriste se jsp:useBean i jsp:getProperty- Nespretno i preopširno- Ne može se pristupiti bean podproperty-ijima– JSP scripting elementi- Rezultat je kod koji se teško otežava

Umanjuje se uticaj MVC arhitekture- Umanjuje se uticaj MVC arhitekture.Cilj– Upotrebiti koncizniji pristupUpotrebiti koncizniji pristup– Omogućiti pristup bean podproperty-ijima– Jednostavnija sintaksa pristupa za Web developere

© SI1P1 – 2004 131/15

Upotreba ELAko se koristi MVC pristup u okviru servera kojiAko se koristi MVC pristup u okviru servera koji podržavaju JSP 2.0 sa trenutnom web.xml verzijom, potrebno je promeniti samo:

<jsp:useBean id="someName"type="somePackage.someClass"scope "request session or application"/>scope="request, session, or application"/><jsp:getProperty name="someName"property="someProperty"/>property= someProperty />

U sledeći kod:${someName.someProperty}${ p y}

© SI1P1 – 2004 132/15

Prednosti upotrebe ELKoncizniji pristup smeštenim objektima.Koncizniji pristup smeštenim objektima.– Da bi se pristupilo “smeštenim promenljivama” (objekti smešteni metodom setAttribute u okviru PageContext, HttpServletRequest, HttpSession, ili ServletContext), na primer nekoj promenljivojHttpSession, ili ServletContext), na primer nekoj promenljivoj saleItem, koristi se ${saleItem}.Skraćena notacija za bean property-ije.– Da bi se pristupilo companyName property-iju (n p rezultat– Da bi se pristupilo companyName property-iju (n.p., rezultat dobijen od metoda getCompanyName) smeštene promenljive pod imenom company, koristi se ${company.companyName}. Da bi se pristupilo property-iju firstName od property-ija president smeštenepristupilo property iju firstName od property ija president smeštene promenljive company, koristi se ${company.president.firstName}.Jednostavniji pristup collection elementima.– Pristup elementima niza (array) List ili Map koristi sePristup elementima niza (array), List, ili Map, koristi se ${variable[indexOrKey]}. Treba primetiti da je potrebno realizovati prikaz indeksa ili ključa u formi legalnoj za imena Java promenljivih.

© SI1P1 – 2004 133/15

Prednosti upotrebe ELJednostavan pristup parametrima zahteva, cookies, i drugih p p p , , gpodataka zahteva.– Da bise pristupilo standardnim tipovima podataka zahteva, moguće je koristiti jedan od nekoliko predefinisanih implicitnih bj k tobjekata.

Mali, ali koristan skup jednostavnih operatora.– Za rad sa objektima u okviru EL izraza, može se koristiti bilo koji od nekoliko a itetičkih elacionih logičkih ili empt testingod nekoliko aritetičkih, relacionih, logičkih, ili empty-testing operatora.Uslovni rezultati

Da bi se izabrao prikaz između nekolikoopcija nije potrebno– Da bi se izabrao prikaz između nekolikoopcija, nije potrebno koristiti Java skriplete.Moguće je koristiti ${test ? option1 : option2}.Automatska konverzija tipova.– EL uklanja potrebu za korišćenjem konverzije tipova i omogućavaEL uklanja potrebu za korišćenjem konverzije tipova i omogućava ovaj proces automatskim.Bez vrednosti, umesto greške.– U većini slučajeva nedefinisana promenljiva ili

© SI1P1 – 2004 134/15

U većini slučajeva, nedefinisana promenljiva ili NullPointerExceptions prikazaće se kao prazni stringovi, a neće se dogoditi izuzetak.

Aktiviranje ELMoguće je upotrebljavati samo u okviru serveraMoguće je upotrebljavati samo u okviru servera koji imaju podršku za JSP 2.0 (servlets 2.4)– Na primer Tomcat 5, a ne Tomcat 4

Z l k li t k tibil ih l d ti– Za celokupnu listu kompatibilnih servera, pogledati http://theserverside.com/reviews/matrix.tssPotrebno je koristiti JSP 2.0 web.xml filej

<?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"

l i "htt // 3 /2001/XMLS h i t "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app 2 4.xsd"ttp //ja a su co / / s/j ee eb app_ _ sdversion="2.4">…

/ b© SI1P1 – 2004 135/15</web-app>

Osnove ELOsnovna forma: ${expression}Osnovna forma: ${expression}– Ovi EL elementi se mogu pojaviti kako u običnom HTML tekstu tako i u okviru JSP tag atributa, i omogućiti izvršavanje regularnih JSP izraza Na primer:izvršavanje regularnih JSP izraza. Na primer:<UL><LI>Name: ${expression1}{ p }<LI>Address: ${expression2}</UL><j i l d "${ i 3}" /><jsp:include page="${expression3}" />EL i tag atributi– Može se koristiti više izraza u okviru jednog atributa o e se o st t še a a u o u jed og at buta(moguće ih je kombinovati i sa statičkim tekstom), tako da se na kraju konvertuju u stringove i izvrši njihova konkatenacija. Na primer:

© SI1P1 – 2004 136/15

konkatenacija. Na primer:<jsp:include page="${expr1}blah${expr2}" />

EL problemScenarioScenario– Koristi se ${something} u okviru JSP stranice– Postoji "${something}" u generisanom izlazuj ${ g} g– Nije promenjen web.xml file da referiše na verziju servleta 2.4– Prenese se Web aplikacija na server i restartuje se– I dalje postoji "${something}" u generisanom izlazuZašto?Zašto?– JSP stranica je prevedena u servlet- I to verziju servleta koji ignorišeELI to verziju servleta koji ignorišeELRešenje– Presnimiti JSP stranicu da izvrši update datuma

© SI1P1 – 2004 137/15promene

Sprečavanje izvršavanja EL izrazaŠta se dešava ako JSP stranica sadrži ${ ?Šta se dešava ako JSP stranica sadrži ${ ?Potrebno je deaktivirati EL u trenutnoj Web aplikaciji.– U okviru web.xml fajla referisati na servlet verziju 2.3 (JSP 1.2) ili raniju.Deaktivirati EL u više JSP stranicaDeaktivirati EL u više JSP stranica.– Koristiti jsp-property-group element u okviru web.xmlDeaktivirati EL u pojedinačnim JSP stranicamaDeaktivirati EL u pojedinačnim JSP stranicama.– Koristiti <%@ page isELIgnored="true" %>Deaktivirati pojedinačne EL elemente.p j– U okviru JSP 1.2 stranica (bez promena web.xml), moguće je zameniti $ sa &#36;, HTML karakterom za $.

k k d ž ${© SI1P1 – 2004 138/15– U okviru JSP 2.0 stranica koje sadrže i EL izraze i ${ moguće je koristiti \${ kada se želi generisati ${

Sprečavanje izvršavanja skripletaDa bi se sprečilo pisanje skripleta moguće jeDa bi se sprečilo pisanje skripleta moguće je koristiti scripting-invalid u okviru web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>b l "htt //j / l/ /j2 "<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"http://www.w3.org/2001/XMLSchema instancexsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"version="2.4"><jsp-property-group><url-pattern>* jsp</url-pattern><url pattern> .jsp</url pattern><scripting-invalid>true</scripting-invalid></jsp-property-group>

© SI1P1 – 2004 139/15</web-app>

Pristup smeštenim promenljivama${varName}${varName}– Rezultat je pretraga objekata tipa PageContext, HttpServletRequest, HttpSession, ServletContext, u navedenom redosledu i prikaz objekta koji sadrži navedeno ime– Upotreba PageContext ne odgovara MVC pristupu– Upotreba PageContext ne odgovara MVC pristupu.Ekvivalentne forme– ${name}${ }– <%= pageContext.findAttribute("name") %>– <jsp:useBean id="name“ type="somePackage.SomeClass"scope="..."><% name %>

© SI1P1 – 2004 140/15<%= name %>

Primerpublic class ScopedVars extends HttpServlet {p p p {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {request.setAttribute("attribute1", "First Value");HttpSession session = request.getSession();session.setAttribute("attribute2", "Second Value");Se letConte t application getSe letConte t()ServletContext application = getServletContext();application.setAttribute("attribute3",new java.util.Date());request setAttribute("repeated" "Request");request.setAttribute( repeated , Request );session.setAttribute("repeated", "Session");application.setAttribute("repeated", "ServletContext");RequestDispatcher dispatcher =RequestDispatcher dispatcher request.getRequestDispatcher("/el/scoped-vars.jsp");dispatcher.forward(request, response);}

© SI1P1 – 2004 141/15}

Primer<!DOCTYPE …><!DOCTYPE …>…<TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS "TITLE"><TR><TH CLASS="TITLE">Accessing Scoped Variables</TABLE><P><UL><LI><B>attribute1:</B> ${attribute1}<LI><B>attribute1:</B> ${attribute1}<LI><B>attribute2:</B> ${attribute2}<LI><B>attribute3:</B> ${attribute3}<LI><B>Source of "repeated" attribute:</B><LI><B>Source of "repeated" attribute:</B>${repeated}</UL>

© SI1P1 – 2004 142/15</BODY></HTML>

Primer

© SI1P1 – 2004 143/15

Pristup bean property-ijima${varName propertyName}${varName.propertyName}– Značenje je pronaći smeštenu promenljivu sa datim imenom i prikazati vrednost navedenog bean property-ijaEkvivalentne forme

– ${customer.firstName}– <%@ page import="coreservlets.NameBean" %><% NameBean person =(NameBean)pageContext findAttribute("customer");(NameBean)pageContext.findAttribute( customer );%><%= person.getFirstName() %><% person.getFirstName() %>

© SI1P1 – 2004 144/15

Pristup bean property-ijimaEkvivalentne formeEkvivalentne forme

– ${customer.firstName}– <jsp:useBean id="customer"j ptype="coreservlets.NameBean"scope="request, session, or application" /><jsp:getProperty name="customer"property="firstName" />

O j i t j b lji k i t th dOvaj pristup je bolji nego skript na prethodnom slajdu.– Ali zahteva da se poznaje oblast važenjaAli zahteva da se poznaje oblast važenja– Ne radi za podproperty-ije.- Nije ne-Java ekvivalent

© SI1P1 – 2004 145/15${customer.address.zipCode}

Primerpublic class BeanProperties extends HttpServlet {p p p {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {throws ServletException, IOException {NameBean name = new NameBean("Marty", "Hall");CompanyBean company =new CompanyBean("coreservlets com"new CompanyBean( coreservlets.com ,"J2EE Training and Consulting");EmployeeBean employee =new EmployeeBean(name company);new EmployeeBean(name, company);request.setAttribute("employee", employee);RequestDispatcher dispatcher =request getRequestDispatcherrequest.getRequestDispatcher("/el/bean-properties.jsp");dispatcher.forward(request, response);}

© SI1P1 – 2004 146/15}}

Primerpublic class EmployeeBean {public class EmployeeBean {private NameBean name;private CompanyBean company;

bli E l B (N B C B ) {public EmployeeBean(NameBean name, CompanyBean company) {setName(name);setCompany(company);}public NameBean getName() { return(name); }public void setName(NameBean newName) {public void setName(NameBean newName) {name = newName;}public CompanyBean getCompany() { return(company); }public CompanyBean getCompany() { return(company); }public void setCompany(CompanyBean newCompany) {company = newCompany;

© SI1P1 – 2004 147/15}}

Primerpublic class NameBean {public class NameBean {private String firstName = "Missing first name";private String lastName = "Missing last name";

bli N B () {}public NameBean() {}public NameBean(String firstName, String lastName) {setFirstName(firstName);setLastName(lastName);}public String getFirstName() {public String getFirstName() {return(firstName);}public void setFirstName(String newFirstName) {public void setFirstName(String newFirstName) {firstName = newFirstName;}…

© SI1P1 – 2004 148/15}

Primerpublic class CompanyBean {public class CompanyBean {private String companyName;private String business;

bli C B (St i N St i b i ) {public CompanyBean(String companyName, String business) {setCompanyName(companyName);setBusiness(business);}public String getCompanyName() { return(companyName); }public void setCompanyName(String newCompanyName) {public void setCompanyName(String newCompanyName) {companyName = newCompanyName;}public String getBusiness() { return(business); }public String getBusiness() { return(business); }public void setBusiness(String newBusiness) {business = newBusiness;

© SI1P1 – 2004 149/15}}

Primer<!DOCTYPE ><!DOCTYPE …>…<UL><LI><B>First Name:</B>${employee.name.firstName}<LI><B>Last Name:</B>${employee.name.lastName}

LI B C N /B<LI><B>Company Name:</B>${employee.company.companyName}<LI><B>Company Business:</B><LI><B>Company Business:</B>${employee.company.business}</UL>

© SI1P1 – 2004 150/15

/UL</BODY></HTML>

Primer

© SI1P1 – 2004 151/15

NotacijaEkvivalentne formeEkvivalentne forme

– ${name.property}– ${name["property"]}${ [ p p y ]}

Razlozi za korišćenje notacije nizova– Zbog pristupa nizovima, listama, i drugim klasama kolekcija– Da bi se dobilo ime property-ija u trenutku zahteva.• {name1[name2]} (nema navodnika oko name2)• {name1[name2]} (nema navodnika oko name2)– Da bi se koristila imena koja su zabranjena kao imena Java promenljivihp j• {foo["bar-baz"]}• {foo["bar.baz"]}

© SI1P1 – 2004 152/15

Pristup kolekcijama${attributeName[entryName]}${attributeName[entryName]}Može se upotrebiti kod– Nizova. Ekvivalentno sa• theArray[index]– Lista. Ekvivalentno sa• theList get(index)• theList.get(index)– Mapa. Ekvivalentno sa• theMap.get(keyName)Ekvivalentne forme (za HashMap)– ${stateCapitals["maryland"]}

${stateCapitals maryland}– ${stateCapitals.maryland}– Sledeći element je nelegalan, jer 2 nije legalno ime promenljive

© SI1P1 – 2004 153/15- ${listVar.2}

Pristup kolekcijamapublic class Collections extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {String[] firstNames = { "Bill" "Scott" "Larry" };String[] firstNames = { Bill , Scott , Larry };ArrayList lastNames = new ArrayList();lastNames.add("Ellison");lastNames.add("Gates");lastNames.add("McNealy");HashMap companyNames = new HashMap();companyNames.put("Ellison", "Sun");companyNames.put("Gates", "Oracle");companyNames.put( Gates , Oracle );companyNames.put("McNealy", "Microsoft");request.setAttribute("first", firstNames);request.setAttribute("last", lastNames);

t tAtt ib t (" " N )request.setAttribute("company", companyNames);RequestDispatcher dispatcher =request.getRequestDispatcher("/el/collections.jsp");dispatcher.forward(request, response);

© SI1P1 – 2004 154/15

p ( q , p );}}

Primer<!DOCTYPE ><!DOCTYPE …>…<BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Accessing CollectionsAccessing Collections</TABLE><P><UL><LI>${first[0]} ${last[0]} (${company["Ellison"]})<LI>${first[1]} ${last[1]} (${company["Gates"]})<LI>${first[1]} ${last[1]} (${company[ Gates ]})<LI>${first[2]} ${last[2]} (${company["McNealy"]})</UL>

© SI1P1 – 2004 155/15

/</BODY></HTML>

Primer

© SI1P1 – 2004 156/15

Predefinisane promenljivepageContext. PageContext objekat.pageContext. PageContext objekat.– ${pageContext.session.id}param i paramValues. Parametri zahteva.

${ tID}– ${param.custID}header i headerValues. Hederi zahteva.–${header.Accept} ili ${header["Accept"]}– ${header["Accept-Encoding"]}cookie. Cookie objekat (a ne cookie vrednost).– ${cookie.userCookie.value} ili ${cookie["userCookie"].value}${cookie.userCookie.value} ili ${cookie[ userCookie ].value}initParam. Sadrži parametre inicijalizacije sadržaja.pageScope, requestScope, sessionScope,applicationScope.

Umesto pretrage oblasti važenja– Umesto pretrage oblasti važenja.Problem– Upotreba implicitnih objekata ne odgovara MVC modelu

© SI1P1 – 2004 157/15

Predefinisane promenljive primer<!DOCTYPE ><!DOCTYPE …>…<P><UL><LI><B>test Request Parameter:</B>${param test}${param.test}<LI><B>User-Agent Header:</B>${header["User-Agent"]}<LI><B>JSESSIONID Cookie Value:</B>${cookie.JSESSIONID.value}<LI><B>Server:</B><LI><B>Server:</B>${pageContext.servletContext.serverInfo}</UL>

© SI1P1 – 2004 158/15

/</BODY></HTML>

Predefinisane promenljive primer

© SI1P1 – 2004 159/15

EL operatoriAritmetičkiAritmetički– + - * / div % modRelacioni– == eq != ne < lt > gt <= le >= geLogički– && and || or ! NotBez vrednosti

B d ti– Bez vrednosti– True za null, prazan string, prazan niz, prazna lista, prazna map.prazna map. Upozorenje– Koristiti veoma retko da bi se zaštitio MVC model

© SI1P1 – 2004 160/15

Primer<TABLE BORDER=1 ALIGN="CENTER"><TABLE BORDER 1 ALIGN CENTER ><TR><TH CLASS="COLORED" COLSPAN=2>Arithmetic Operators<TH CLASS="COLORED" COLSPAN=2>Relational Operators<TR><TH>E i <TH>R lt<TH>E i <TH>R lt<TR><TH>Expression<TH>Result<TH>Expression<TH>Result<TR ALIGN="CENTER"><TD>\${3+2-1}<TD>${3+2-1}<TD>\${1&lt;2}<TD>${1<2}<TR ALIGN="CENTER"><TD>\${"1"+2}<TD>${"1"+2}<TD>\${ 1 +2}<TD>${ 1 +2}<TD>\${"a"&lt;"b"}<TD>${"a"<"b"}<TR ALIGN="CENTER"><TD>\${1 + 2*3 + 3/4}<TD>${1 + 2*3 + 3/4}<TD>\${1 + 2*3 + 3/4}<TD>${1 + 2*3 + 3/4}<TD>\${2/3 &gt;= 3/2}<TD>${2/3 >= 3/2}<TR ALIGN="CENTER">

© SI1P1 – 2004 161/15<TD>\${3%2}<TD>${3%2}<TD>\${3/4 == 0.75}<TD>${3/4 == 0.75}

Primer

© SI1P1 – 2004 162/15

Uslovno izvršavanje${ test ? expression1 : expression2 }${ test ? expression1 : expression2 }–Izvršava se Evaluates test i prikazuje se ili expression1 ili expression2Problems– Relativno slabo

ć• Upotreba c:if i c:choose pomoću JSTL (The JavaServer Pages Standard Tag Library )– Dozvoljava rad sa poslovnom/procesnom logikom uDozvoljava rad sa poslovnom/procesnom logikom u okviru JSP strana.– Trebalo bi da se koristi samo za presentacionu logiku.- I u tim slučajevima postoje alternative

© SI1P1 – 2004 163/15

Primerpublic class Conditionals extends HttpServlet {public class Conditionals extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)th S l tE ti IOE ti {throws ServletException, IOException {SalesBean apples =new SalesBean(150.25, -75.25, 22.25, -33.57);SalesBean oranges =new SalesBean(-220.25, -49.57, 138.25, 12.25);request.setAttribute("apples", apples);request.setAttribute( apples , apples);request.setAttribute("oranges", oranges);RequestDispatcher dispatcher =request getRequestDispatcherrequest.getRequestDispatcher("/el/conditionals.jsp");dispatcher.forward(request, response);

© SI1P1 – 2004 164/15}}

Primerpublic class SalesBean {public class SalesBean {private double q1, q2, q3, q4;public SalesBean(double q1Sales,d bl 2S ldouble q2Sales,double q3Sales,double q4Sales) {q1 = q1Sales; q2 = q2Sales;q3 = q3Sales; q4 = q4Sales;}}public double getQ1() { return(q1); }public double getQ2() { return(q2); }public double getQ3() { return(q3); }public double getQ3() { return(q3); }public double getQ4() { return(q4); }public double getTotal() {

© SI1P1 – 2004 165/15return(q1 + q2 + q3 + q4); }}

Primer

© SI1P1 – 2004 166/15

Primer…<TABLE BORDER=1 ALIGN="CENTER"><TR><TH><TH CLASS="COLORED">Apples<TH CLASS="COLORED">Oranges<TH CLASS= COLORED >Oranges<TR><TH CLASS="COLORED">First Quarter<TD ALIGN="RIGHT">${apples.q1}<TD ALIGN="RIGHT">${oranges.q1}<TR><TH CLASS="COLORED">Second Quarter<TD ALIGN="RIGHT">${apples.q2}<TD ALIGN="RIGHT">${oranges.q2}……<TR><TH CLASS="COLORED">Total<TD ALIGN="RIGHT"BGCOLOR="${(apples.total < 0) ? "RED" : "WHITE" }">${ l t t l}${apples.total}<TD ALIGN="RIGHT"BGCOLOR="${(oranges.total < 0) ? "RED" : "WHITE" }">${oranges.total}

© SI1P1 – 2004 167/15

${ g }</TABLE>…

The JSP Standard Tag Library (JSTL)

Primeri JSTL dokumentacije i kodaPrimeri JSTL dokumentacije i kodaJSTL Expression LanguageTagovi za realizaciju petljiTagovi za realizaciju petlji– Petlje sa tačno određenim brojem iteracijaiteracija– Petlje na osnovu strukture podataka

šTagovi za uslovno izvršavanje– Jedan izbor– Više izboraTagovi za pristup nazi podataka

© SI1P1 – 2004 168/15

g p p pDrugi tagovi

The JSP Standard Tag Library (JSTL)JSTL je baziran na Struts tagovima za kontroluJSTL je baziran na Struts tagovima za kontrolu petlji i logičke operacijeJSTL nije bio deo JSP 1.2 ili 2.0 specifikacije– Zahtevao je posebnu specifikaciju i podešavanje– Moguće samo na serverima koji podržavaju servlets 2 3 i JSP 1 2 ili više verzije2.3 i JSP 1.2 ili više verzijeJSTL expression language je sada deo JSP 2.0JSTL specifikacija se nalazi naJSTL specifikacija se nalazi nahttp://jcp.org/aboutJava/communityprocess/final/jsr052/

© SI1P1 – 2004 169/15

Tagovi za realizaciju petljiPetlje sa eksplicitnim numeričkim vrednostimaPetlje sa eksplicitnim numeričkim vrednostima

<c:forEach var="name" begin="x" end="y" step="z"> Blah, blah <c:out value="${name}"/>

</c:forEach>Petlje koje koriste strukture podataka

ć– Moguće je kretati se po nizovima, stringovima, kolekcijama, mapama

<c:forEach var="name“ items=“niz-kolekcija"> Blah blah<c:forEach var= name items= niz kolekcija > Blah, blah <c:out value="${name}"/>

</c:forEach>Petlje kojekoriste stringove sa delimiterima– forTokens

© SI1P1 – 2004 170/15

Tagovi za realizaciju petljiJSP bez JSTLJSP bez JSTL

<UL><%f (i t i 0 i< l th i++) { St i [i]for(int i=0; i<messages.length; i++) { String message = messages[i];%><LI><%= message %><% } %></UL>

JSP sa JSTLJSP sa JSTL<UL><c:forEach var="message" items="${messages}"><LI><c:out value "${message}"/><LI><c:out value="${message}"/></c:forEach></UL>

© SI1P1 – 2004 171/15

Tagovi za realizaciju petlji<%@ taglib prefix="c"uri="http://java sun com/jstl/core"<%@ taglib prefix= c uri= http://java.sun.com/jstl/core

%><UL><c:forEach var="i" begin="1" end="10"><LI><c:out value="${i}"/></c:forEach></UL>

© SI1P1 – 2004 172/15

Tagovi za realizaciju petlji<%@ taglib prefix="c“ uri="http://java sun com/jstl/core"<%@ taglib prefix= c uri= http://java.sun.com/jstl/core

%><UL><c:forEach var="seconds" begin="0"end="${pageContext.session.maxInactiveInterval}"step="100"><LI><c:out value="${seconds}"/> seconds.</c:forEach></c:forEach><LI>Timeout exceeded.</UL></UL>

© SI1P1 – 2004 173/15

Tagovi za realizaciju petlji<% String[] words = { "foo", "bar", "baz"};g[] { , , };pageContext.setAttribute("words", words); %><%@ taglib prefix="c"uri="http://java.sun.com/jstl/core" %><H2>Key Words:</H2><UL><c:forEach var="word"items "${ o ds}">items="${words}"><LI><c:out value="${word}"/></c:forEach></UL></UL><H2>Values of the test Parameter:</H2><UL><c:forEach var="val"c:forEach var valitems="${paramValues.test}"><LI><c:out value="${val}"/></c:forEach>

© SI1P1 – 2004 174/15</UL>

Tagovi za realizaciju petlji<%@ taglib prefix="c"<%@ taglib prefix= curi="http://java.sun.com/jstl/core" %><UL><c:forEach var="country"items="Australia,Canada,Japan,Philippines,USA"><LI><c:out value="${country}"/></c:forEach>

/UL</UL>

© SI1P1 – 2004 175/15

Tagovi za realizaciju petlji<%@ taglib prefix="c"<%@ taglib prefix= curi="http://java.sun.com/jstl/core" %><UL><c:forTokens var="color"items="(red (orange) yellow)(green)((blue) violet)"delims="()"><LI><c:out value="${color}"/>

/ f T k</c:forTokens></UL>

© SI1P1 – 2004 176/15

Tagovi za realizaciju uslovaJedan izbor: ifJedan izbor: if<c:if test="${someTest}">

Sadrzajj</c:if>Više izbora: choose

<c:choose><c:when test="test1"> Sadrzaj1</c:when>

h t t "t t2" S d j2 / h<c:when test="test2"> Sadrzaj2</c:when>...<c:when test="testN"> SadrzajN</c:when><c:when test= testN > SadrzajN</c:when><c:otherwise>Default Sadrzaj </c:otherwise></c:choose>

© SI1P1 – 2004 177/15

/c:chooseNapomena: realizacija poslovne logike!

Tagovi za realizaciju uslova<%@ taglib prefix="c"<%@ taglib prefix= curi="http://java.sun.com/jstl/core" %><UL><c:forEach var="i" begin="1" end="10"><LI><c:out value="${i}"/><c:if test="${i > 7}">(greater than 7)

/ if</c:if></c:forEach></UL></UL>

© SI1P1 – 2004 178/15

Tagovi za realizaciju uslova<%@ taglib prefix="c"uri="http://java.sun.com/jstl/core" %>g p p //j /j /<UL><c:forEach var="i" begin="1" end="10"><LI><c:out value="${i}"/><c:choose><c:when test="${i < 4}">(small)</c hen></c:when><c:when test="${i < 8}">(medium)</c:when></c:when><c:otherwise>(large)</c:otherwise>/c:otherwise</c:choose></c:forEach></UL>

© SI1P1 – 2004 179/15

Tagovi za pristup bazama podataka<sql:setDataSource><sql:setDataSource>– Specificira se izvor podataka (može se podesiti i pomoću konfiguracionih podešavanja)< l ><sql:query>– Upiti nad bazom podataka i smeštanje ResultSet u okviru promenljivep j– Upozorenje: ovo je suprotno ideji da se poslovna logika odvoji od prezentacione. Bolje je pristupati bazama u okviru servleta i proslediti rezultate u JSP.bazama u okviru servleta i proslediti rezultate u JSP.<sql:update><sql:param><sql:dateParam><sql:transaction>– Izvršava odgovarajuće <sql:query> i <sql:update>

© SI1P1 – 2004 180/15Izvršava odgovarajuće <sql:query> i <sql:update>

akcije kao pojedinačnu transakciju

Tagovi za pristup bazama podataka<%@ taglib prefix="c“ uri="http://java.sun.com/jstl/core"<%@ taglib prefix c uri http://java.sun.com/jstl/core

%><%@ taglib prefix="sql“ uri="http://java.sun.com/jstl/sql"

%>%><sql:setDataSource driver="sun.jdbc.odbc.JdbcOdbcDriver"

url="jdbc:odbc:Northwind“ user="“ password=""/><sql:query var="employees"> SELECT * FROM employees</sql:query><UL><UL><c:forEach var="row" items="${employees.rows}"><LI><c:out value="${row.firstname}"/><c:out value="${row.lastname}"/></c:forEach></UL>

© SI1P1 – 2004 181/15</UL>

Preostali tagovi<c:import><c:import>– Čita se sadržaj sa odgovarajućeg URLa• Ubacuje se u stranicuj• Smešta u promenljivu• ili se omogućava pristup preko čitača– Za razliku od <jsp:include>, ne važi samo za sopstveni sistem<c:redirect><c:redirect>– Redirekcija ka specificiranom URLu<c:param><c:param>– Dodaju se parametri zahteva u URL

© SI1P1 – 2004 182/15

Preostali tagovi<fmt:formatNumber><fmt:formatNumber>– Formatiraju se numeričke vrednosti kao broj, iznos u valuti, ili procenat, u lokalnom formatu<fmt:parseNumber>– Čitaju se string prezentacije broja, iznosa u valuti, ili procentaprocenta<fmt:formatDate><fmt:parseDate><fmt:parseDate><fmt:timeZone><fmt:setTimeZone>

© SI1P1 – 2004 183/15

Preostali tagovi – rad sa XMLomOsnovniOsnovni– <x:parse>XPath– <x:if>– <x:choose>– <x:when>– <x:otherwise>

f E h– <x:forEach>XSLT– <x:transform>– <x:transform>– <x:param>

© SI1P1 – 2004 184/15