4-Les JSP Java
4-Les JSP Java
Architecture
Les pages JSP sont converties en servlet Java et compiles avant dtre excutes.
Compilation
La traduction et la compilation nont lieu que si cest ncessaire : lors du premier appel de la page ou aprs modification.
Ce fichier helloword.jsp doit tre plac la racine de lapplication Web sur le serveur (au mme endroit que les pages HTML). Pas besoin de modifier le fichier web.xml
5
La servlet gnre :
public final class helloworldjsp_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { HttpSession session = null; ... try { ... _jspx_out = out; out.write("<html>\r\n");out.write("\t<head>\r\n"); out.write("\t\t<title>Bonjour tout le monde</title>\r\n"); out.write("\t</head>\r\n");out.write("\t<body>\r\n"); out.write("\t\t<h1>Bonjour tout le monde</h1>\r\n"); out.write("\t\tNous sommes le "); out.print( new java.util.Date().toString() ); le fragment out.write(" et tout va bien.\r\n");out.write("\t</body>\r\n"); out.write("</html>"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; ... if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); } } } _jspService() est similaire la mthode service() des servlets.
La directive include
La directive include indique au compilateur dinclure un autre fichier :
<%@ include file="unAutreFichier" %>
Ne concerne que les ressources contenues dans le contexte de lapplication Web. La racine du chemin du fichier inclure est la racine du contexte.
La directive page
Dfinit les attributs spcifiques une page.
import : importe un paquetage Java. langage : dfinit le langage de script utilis dans la page. contentType : dfinit le type de contenu de la page gnre (type MIME). errorPage : indique la page afficher si une exception se produit pendant le traitement de la requte HTTP. isErrorPage : vaut true si la page est une erreur et false pour une page normale.
Exemples :
<%@ <%@ <%@ <%@ page page page page import="java.util.*, java.text.*" %> contentType="text/plain" %> errorPage="toto.jsp" %> isErrorPage=false %>
Les dclarations
Utilises pour :
dclarer un attribut de classe, spcifier et implmenter des mthodes.
Ex :
<%! private int count = 0; private int incrementCount() {return count++;} %>
Les attributs et les mthodes dclares dans la page JSP sont utilisables dans toute la page JSP. Possibilit de redfinir les mthodes du cycle de vie des pages comme jspInit() et jspDestroy().
10
Les scriplets
Bloc de code Java. Peut accder :
aux attributs et mthodes dfinis par le tag dclaration, aux objets implicites : request (HttpServletRequest), response (HttpServletResponse), session (HttpSession), out (JspWriter extends PrintWriter), application (ServletContext), page (this) Ex :
... <% for (int i = 0; i < 5 ; i++) { %> HelloWorld<br> <% incrementCount(); } <%-- dfini prcdemment --%> %> <% out.println(request.getServerPort()); %> ...
11
Les expressions
Retourne la valeur de lexpression comme une String. Correspond une scriplet comme <% out.println(); %> Est transform en out.println(""); aprs gnration. Ex :
... <% String[] noms={"mickey","donald"}; for (int i = 0 ; i < noms.length ; i++) { %> Le <%= i %> me nom est <%= noms[i] %> <% } %> ...
12
13
Les actions
Les actions permettent de faire des traitements au moment o la page est demande par le client :
utiliser des Java Beans, rediriger vers une autre page, inclure dynamiquement un fichier.
Linclusion et la redirection fonctionnent sur le mme principe que celui dcrit pour les servlets. Les actions sont ajoutes la page JSP l'aide d'une syntaxe la XML :
Soit : <jsp:balise ... /> Soit : <jsp:balise ... > ... </jsp:balise>
14
En option, un Java Beans implmente l'interface java.io.Serializable permettant la sauvegarde de l'tat du Bean (lensemble de ses proprits).
15
Exemple
Exemple de Java Bean
Constructeur par public class Voiture { dfaut sans paramtre private int puissance; private boolean est_demarree; private double vitesse; public void setDemarree(boolean p) { est_demarree = p; } public boolean getDemarree() { return est_demarree; Proprits visibles } public void setVitesse(double p) { en lecture et criture vitesse = p; } public double getVitesse() { return vitesse; } public int getPuissance() { Proprit visible en return puissance; lecture seulement } }
16
18
Exemple :
<%@ page language="java" contentType="text/html" %> <jsp:useBean id="ma_voiture" class="Voiture"> </jsp:useBean> dans WEB-INF\classes <% ma_voiture.setDemarree(true); ma_voiture.setVitesse(21.2); %> <html> <head> <title>Page pour lecture d'information</title> </head> <body bgcolor="white"> tag expression La voiture a-t-elle dmarr: <%= ma_voiture.getDemarree() %><br> La vitesse de la voiture est de : <jsp:getProperty name="ma_voiture" property="vitesse" /> km/h<br> tag action La puissance de la voiture est de : <jsp:getProperty name="ma_voiture" property="puissance" /> CV </body> 19 </html>
(dans page2.jsp) Pour que le rsultat saffiche il faut appeler page1 avant page2.
21
Il ne faut ni modifier la rponse avant renvoi ni ajouter du code aprs envoi (ignor).
Pour passer des objets et non des String il faut passer par un objet RequestDispatcher et lobjet implicite request.
Exemple pour une inclusion (mme chose pour une dlgation) :
<% RequestDispatcher dispatch = request.getRequestDispatcher("/fichier.jsp");%> <% request.setAttribute("attribut1","bonjour"); %> <% dispatch.include(request,response); %>
22
Architecture MVC
Le modle darchitecture ou pattern MVC (Modle Vue - Contrleur) structure clairement les applications : les modles sont les composants mtiers, les vues sont les composants dinteraction, les contrleurs sont les composants qui organisent les traitements. Dans une application Web J2EE on utilise les Servlets pour les contrleurs, les pages JSP pour les vues, les Java Beans pour les modles. Les Servlets reoivent les requtes, effectuent les contrles et les actions, slectionnent la vue (pas de sortie dans la rponse). Les modles (Java Beans) ne dpendent ni des contrleurs ni des vues. Les vues (pages JSP) nintgrent pas de contrle.
23
Modle MVC
Servlet (contrleur)
1 Navigateur
Donnes
JSP (vue)
Bean 4 (modle)
24
Un exemple simple
a) Un bean
package com.jsp.beans; class User { private String name; public User() { name = ""; } public User(String name) { this.name = name; } public String getName() { return name; } }
b) Une servlet qui utilise ce bean et le passe une page JSP qui prpare le code HTML.
25
package com.jsp.servlets; import com.jsp.beans.User; public class HelloWorldServlet extends HttpServlet implements Servlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doRequest(req,resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doRequest(req,resp); cration du bean } private void doRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { res.setAttribute("monParam",new User("toto")); loadJSP("helloworld.jsp?page=test", req, resp); } public void loadJSP(String url, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (url == null) { return; } if (url.charAt(0) != '/') { url = '/' + url; } ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(url); rd.forward(req, resp); } }
26
Un exemple simple
c) Une page JSP (helloword.jsp)
<%@ page import="com.jsp.beans.User" %> rcupration du bean <% String page = (String)request.getParameter("page"); User monParam = (User)request.getAttribute("monParam"); %> <html> <head> <title>JSP Test</title> </head> <body> HelloWorld<br /> Passage param direct : <%= monParam.getName() %><br /> Passage par url : <%= page %> </body> </html>
27
Autres fonctionnalits
Les tags personnaliss ( custom tags ). Les bibliothques de tags ( tag libraries ) : collections de tags (au format xml) utilisables dans les pages JSP. JSTL ( JSP Standard Tag Library ) est une collection de bibliothques qui implantent les fonctions communes aux pages web :
bibliothque core : itrations, conditions bibliothque format : localisation, internationalisation bibliothque xml : analyse XML, transformation XSLT bibliothque sql : accs au bases de donnes (sans recourir lAPI JDBC).
Grce ces tags, lcriture de code Java (scriplets) doit devenir exceptionnelle dans les pages JSP.
28
FIN
29