Diferència entre revisions de la pàgina «NF2 - Llenguatge JSP (15h)»
(→Scriptlets) |
(→Objecte Out) |
||
Línia 483: | Línia 483: | ||
Per a més informació [http://www.tutorialspoint.com/jsp/jsp_server_response.htm tutorial jsp] | Per a més informació [http://www.tutorialspoint.com/jsp/jsp_server_response.htm tutorial jsp] | ||
=== Objecte Out === | === Objecte Out === | ||
− | És un objecte de la classe JspWriter, és el que ens permet accedir a la sortida del navegador des dels | + | És un objecte de la classe JspWriter, és el que ens permet accedir a la sortida del navegador des dels scriptlet. |
Els següents són els mètodes importants que volem utilitzar per escriure Char boolean , int , double , objecte , cordes , etc: | Els següents són els mètodes importants que volem utilitzar per escriure Char boolean , int , double , objecte , cordes , etc: | ||
Revisió del 18:35, 14 nov 2014
Contingut
Java Server Pages (JSP)
JavaServer Pages (JSP) és una tecnologia basada en el llenguatge Java que permet incorporar contingut dinàmic a les pàgines web. Els arxius JSP combinen HTML amb etiquetes especials i fragments de codi Java. El codi font d'una pàgina JSP pot contenir:
- Directives: Indiquen informació general de la pàgina, com pot ser importació de classes, pàgina a invocar davant errors, si la pàgina forma part d'una sessió, etc.
- Declaracions: Serveixen per declarar mètodes o variables.
- Scriptlets: Codi Java embegut.
- Expressions: Expressions Java que s'avaluen i s'envien a la sortida.
- Tags JSP: Etiquetes especials que interpreta el servidor.
Exemple de JSP:
<%@page import="java.util.*"%>
<%! String cadena="Bienvenidos a JSP"; %>
<html>
<body>
<%= cadena %>
<br>
<% out.println(new Date()); %>
</body>
</html>
Directives
Les directives són elements que proporcionen informació al motor JSP, i influiran en l'estructura del servlet generat. Hi ha tres tipus de directives: page, taglib i include.
page
S'indica amb la forma <%@ page atribut="valor">. Té diversos usos, entre els quals destacarem:
- Importar classes. Importar codi, de la mateixa forma que es realitza en un programa en Java,
s'indica amb l'atribut import. Exemple:
<%@page import="java.io.*, miPackage.miClase"%>
- Indicar si la pàgina tindrà accés a la sessió. S'especifica amb l'atribut session. L'ús de sessions es veurà amb més detall a l'apartat d'objectes implícits.
Exemple:
<%@page session="true" import="java.util.ArrayList"%>
- Gestió d'errors. Permet redireccionar a una pàgina quan es produeixi un error, s'indicaamb els atributs errorPage i isErrorPage.
Exemple:
<%@page errorPage="error.jsp">
[...]
<%@page isErrorPage="yes">
<html>
<body>
Error, contacte con el administrador [...]
</body>
</html>
include
Permet incloure un arxiu en el lloc on s'especifiqui, al contrari que amb l'acció <jsp:include> que veurem més endavant, la directiva include simplement copia el contingut de l'arxivo byte a byte, sent el resultat similar a si copiéssim el text de l'arxiu inclòs i ho peguéssim en el JSP. Exemple:
<html>
<head>
<%@ include file="titulo.txt"%>
</head>
<body>
<%@ include file="cuerpoPagina.jsp"%>
</body>
</html>
taglib
S'empra per indicar que es van a emprar llibreries d'etiquetes. Per a mes informació veure JSTL.
Declaracions
Contenen declaracions de variables o mètodes, amb la forma <%! declaració %>. Aquestes variables o mètodes seran accessibles des de qualsevol lloc de la pàgina JSP. Cal tenir en compte que el servidor transforma la pàgina JSP en un servlet, i aquest és usat per múltiples peticions, la qual cosa provoca que les variables conservin el seu valor entre successives execucions. Exemples:
<%-- Exemple 1 --%>
<%! int numeroAccesos=0; %>
<html>
<body>
<%=
"La página ha sido accedida "+(++numeroAccesos)+
" veces desde el arranque del servidor"
%>
</body>
</html>
<%-- Exemple 2 --%>
<%! java.util.Date primerAcceso=new java.util.Date(); %>
<html>
<body>
El primer acceso a la página se realizo en:
<%= primerAcceso %>
</body>
</html>
<%-- Exemple 3 --%>
<%!
private String ahora()
{
return ""+new java.util.Date();
}
%>
<html>
<body>
<%= ahora() %>
</body>
</html>
Es pot utilitzar també l'equivalent a etiquetes XML: <jsp:declaration>codi</jsp:declaration>
<%-- Exemple sense etiquietes xml: --%>
<%!
private String ahora()
{
return ""+new java.util.Date();
}
%>
<html>
<body>
<%= ahora() %>
</body>
</html>
<%-- Exemple amb etiquietes xml: --%>
<jsp:declaration>
private String ahora()
{
return ""+new java.util.Date();
}
</jsp:declaration>
<html>
<body>
<%= ahora() %>
</body>
</html>
Scriptlets
Són fragments de codi Java amb la forma <% codi %>, en general, podem inserir qualsevol codi que poguéssim usar dins d'una funció Java. Per accedir a la sortida del navegador, usem l'objecte implícit out. Exemples:
<%-- Exemple 1 --%>
<table>
<% for (int i=0;i<10;i++)
{
%>
<tr><td> <%=i%> </td></tr>
<% }
%>
</table>
<%-- Exemple 2 --%>
<%
out.println("<table>");
for (int i=0;i<10;i++)
out.println("<tr><td>"+i+"</td></tr>");
out.println("</table>");
%>
<%-- Exemple 3 --%>
<%
String parametro1=request.getParameter("parametro1");
String parametro2=request.getParameter("parametro2");
MiClase miClase=new MiClase();
String salida=miClase.procesa(parametro1, parametro2);
%>
...
<%= salida %>
Es pot utilitzar també l'equivalent a etiquetes XML: <jsp:scriptlet>codi</jsp:scriptlet>
<%-- Exemple sense etiquietes xml: --%>
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
<%-- Exemple amb etiquietes xml: --%>
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<jsp:scriptlet>
out.println("Your IP address is " + request.getRemoteAddr());
</jsp:scriptlet>
</body>
</html>
Expressions
Són fragments de codi Java, amb la forma <%= expressió %> que s'avaluen i es mostren en la sortida del navegador. En general, dins d'una expressió podem usar qualsevol cosa que usaríem dins de un System.out.print(expr); Exemples:
<%= "Tamaño de cadena: "+cadena.length() %>
<%= new java.util.Date() %>
<%= Math.PI*2 %>
Es pot utilitzar també l'equivalent a etiquetes XML: <jsp:expression>codi</jsp:expression>
<%-- Exemple sense etiquietes xml: --%>
<%= "Tamaño de cadena: "+cadena.length() %>
<%= new java.util.Date() %>
<%= Math.PI*2 %>
<%-- Exemple amb etiquietes xml: --%>
<jsp:expression>
"Tamaño de cadena: "+ cadena.length()
</jsp:expression>
<jsp:expression>
new java.util.Date()
</jsp:expression>
<jsp:expression>
Math.PI*2
</jsp:expression>
Accions
Accions JSP utilitzen construccions en la sintaxi XML per controlar el comportament del motor de servlet. Dinàmicament pots inserir un arxiu , reutilitzar components JavaBeans, reenviar a l'usuari a una altra pàgina , o generar HTML per a un pluggin de Java.
Només hi ha una sintaxi per a l'element d'acció , ja que s'ajusta a l'estàndard XML:
<jsp:action_name attribute ="value" />
Sintaxi | Propòsit |
---|---|
jsp:include | Inclou un arxiu a la vegada que se sol·licita la pàgina |
jsp:useBean | Troba o instància un JavaBean |
jsp:setProperty | Estableix la propietat d'un JavaBean |
jsp:getProperty | Obté la propietat d'un JavaBean |
jsp:forward | envia al sol·licitant a una nova pàgina |
jsp:plugin | Genera codi específicament per a un navegador d'un objecte o EMBED tag |
jsp:element | Defineix els elements XML de forma dinàmica |
jsp:attribute | Defineix l'atribut de l'element XML. |
jsp:body | Defineix l'element body XML dinàmicament |
jsp:text | S'utilitza per escriure text de la plantilla en les pàgines i documents JSP |
Exemples:
<%-- Exemple1 --%>
<html>
<head>
<jsp:include page="cabecera.jsp"/>
</head>
<body>
<jsp:include page="cuerpo.jsp">
<jsp:param name="tipo" value="paginaPrincipal"/>
</jsp:include>
</body>
</html>
<%-- Exemple2 --%>
<jsp:forward page="principal.jsp">
<jsp:param name="titulo" value="Principal"/>
</jsp:forward>
Per a més informació tutorial jsp.
Exercicis
System.getProperty
Escriu una JSP per a la sortida dels valors retornats per System.getProperty per a diverses propietats del sistema, com java.version, java.home, os.name, user.name, user.home, user.dir etc.
Dia i hora
Escriu una JSP que mostri el dia que es avui de la següent manera, "Hola! El moment és ara ... " però utilitzant un scriptlet per a la cadena completa, incloent-hi les etiquetes HTML.
Salutació
Crea una JSP que depenent de si una variable s'inicialitza a true o false dona un missatge o un altre. Exemple de missatge true: Bon dia! bon dia! bon dia al de matí
Exemple de missatge a false: Bona tarda! Bona tarda! Bona tarda a tothom
jsp:fordward
Crea una pagina jsp anomenada 'fordward.jsp' que enviï a una altre pàgina anomenada 'mostraparametres.jsp', utilitzant <jsp:fordward>, dos paràmetres.
Objectes implícits
En JSP disposem d'alguns objectes implícits, que ens permetran accedir a diferent informació i realitzar diverses accions. En JSP tenim els següents objectes implícits: request, response, out, session, application, config, pageContext, i page.
JSP suporta nou variables definides de forma automàtica, que també s'anomenen objectes implícits. Aquestes variables són:
Objecte implícit | Propòsit |
---|---|
request | Aquest és l'objecte HttpServletRequest associat amb la petició . |
response | Aquest és l'objecte HttpServletResponse associat amb la resposta al client . |
out | Aquest és l'objecte PrintWriter usat per a enviar la sortida al client . |
session | Aquest és l'objecte HttpSession associat amb la petició . |
application | Aquest és l'objecte ServletContext associat amb el context d'aplicació |
config | This is the ServletConfig object associated with the page. |
pageContext | Això encapsula ús de les característiques específiques del servidor com el més alt JspWriters rendiment . |
page | Això és simplement un sinònim d'aquesta , i s'utilitza per cridar als mètodes definits pel translated servet class |
Exception | L'objecte d'excepció permet que les dades d'excepció per a tenir accés als designats JSP . |
Objecte Request
És un objetode la classe HttpServletRequest, el seu ús principal és l'accés als paràmetres de la petició. Destacarem les següents funcions:
- String getParameter(String name)
- Retorna el valor d'un paràmetre
- Enumeration getParameterNames()
- Retorna una enumeració amb els noms de tots els paràmetres de la petició.
- String[] getParameterValues(String name)
- Els paràmetres poden tenir valor múltiple, amb aquesta funció recuperem un array amb tots els valors per a un nom donat.
- String getRemoteAddr()
- Retorna la IP del host des del qual es realitza la petició
Exemple:
<html>
<body>
<form>
<input type="text" name="parametro"/>
<input type="submit"/>
</form>
<br>
<br>
Su IP: <%=request.getRemoteAddr()%>
<br>
Su nombre de host: <%= request.getRemoteHost() %>
<br>
Valor del parámetro:
<%= request.getParameter("parametro") %>
</body>
</html>
Objecte Response
És un objecte de la classe HttpServletResponse, que vas agafar al servlet en la seva generació de la resposta per al client, conté funcions per a maneig de capçaleres, codis d'estat, cookies i transferència de control.
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<title>Auto Refresh Header Example</title>
</head>
<body>
<center>
<h2>Auto Refresh Header Example</h2>
<%
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 5);
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
out.println("Current Time is: " + CT + "\n");
%>
</center>
</body>
</html>
Per a més informació tutorial jsp
Objecte Out
És un objecte de la classe JspWriter, és el que ens permet accedir a la sortida del navegador des dels scriptlet. Els següents són els mètodes importants que volem utilitzar per escriure Char boolean , int , double , objecte , cordes , etc:
Método | Descripción |
---|---|
out.print(dataType dt) | mprimir una dada. |
out.println(dataType dt) | Imprimir una dada i acaba amb caràcter de nova línia. |
Objecte Session
És un objecte de la classe HttpSession. Ens permet accedir a la sessió associada a la petició. A través d'aquest objecte podem, entre altres coses, guardar objectes que seran accessibles des de qualsevol JSP de la sessió o invalidar-la. Per guardar i recuperar informació usarem:
Object session.getAttribute("clave");
void session.setAttribute("clave", Object objeto);
I per invalidar la sessió:
void session.invalidate();
Exemple:
<%@ page session="true" %>
<%
java.util.ArrayList accesos= (java.util.ArrayList)session.getAttribute("accesos");
if (accesos==null)
accesos=new java.util.ArrayList();
accesos.add(new java.util.Date().toString());
session.setAttribute("accesos", accesos);
if (request.getParameter("invalidaSesion")!=null)
session.invalidate();
%>
<html>
<body>
<form>
<input type="submit" name="invalidaSesion" value="Invalidar sesión"/>
<input type="submit" value="Recargar página"/>
</form>
<br/>
Usted accedió a esta página en los siguientes momentos: <br>
<%
for (int i=0;i<accesos.size();i++)
{
%>
<%= accesos.get(i) %>
<br>
<%
}
%>
</body>
</html>
Per a més informació tutorial jsp
Objecte Application
És un objecte de la classe ServletContext. Aquest objecte és comú per a tota l'aplicació web i, entre altres coses, ens permet emmagatzemar informació que serà accessible des de totes les pàgines de l'aplicació web, independentment de la sessió. Per guardar i recuperar valors:
Object application.getAttribute("clave");
void application.setAttribute("clave", Object objeto);
Exemple:
<%@ page session="true" %>
<%
java.util.Hashtable direcciones = (java.util.Hashtable)application.getAttribute("direcciones");
if (direcciones==null)
direcciones=new java.util.Hashtable();
direcciones.put(request.getRemoteAddr(),"");
application.setAttribute("direcciones", direcciones);
%>
<html>
<body>
El servidor fue accedido desde las siguientes direcciones IP:
<%
java.util.Enumeration e= direcciones.keys();
while (e.hasMoreElements())
{
%>
<%= e.nextElement() %>
<br>
<%
}
%>
<br>
</body>
</html>
Per a més informació tutorial jsp
Objecte Config
És un objecte de la classe ServletConfig. Permet accedir a paràmetres d'inicialització del servlet i al seu context. Aquest objecte permet l'accés de JSP programador per als paràmetres d'inicialització de servlet o JSP motor com ara la camins o ubicacions d'arxius , etc. El següent mètode de configuració és l'únic que pot utilitzar sempre , i el seu ús és trivial :
config.getServletName();
Retorna el nom del servlet, que és la cadena continguda en el element <servlet-name> es defineix en el WEB-INF\web.xml
Objecte PageContext
És un objecte de la classe PageContext. Entre altres coses, ens permet emmagatzemar informació localment a la pàgina. Per guardar i recuperar valors:
Object pageContext.getAttribute("clave");
void pageContext.setAttribute("clave", Object objeto);
També podem usar PageContext per emmagatzemar i recuperar informació en sessió i en aplicació: Emmagatzemar en context de pàgina:
PageContext.setAttribute("clave", obj, PageContext.PAGE_SCOPE);
PageContext.setAttribute("clave", obj);
Emmagatzemar en context de sessió:
PageContext.setAttribute("clave",obj, PageContext.SESSION_SCOPE);
session.setAttribute("clave", objeto);
Emmagatzemar en context de aplicació:
PageContext.setAttribute("clave",obj,PageContext.APPLICATION_SCOPE);
application.setAttribute("clave",objeto);
Un dels mètodes importants és removeAttribute, que accepta un o dos arguments. Per exemple, pageContext.removeAttribute("attrName") elimina l'atribut de tots els àmbits, mentre que el següent codi només l'elimina de l'àmbit pàgina.
pageContext.removeAttribute("attrName", PAGE_SCOPE);
Objecte Page
Aquest objecte és una referència real a la instància de la pàgina. Es pot considerar com un objecte que representa el pàgina JSP sencera. L'objecte de pàgina és realment un sinònim directe per el objecte this.
Exercicis
IP
Escriu una pàgina jsp que ens mostri la IP del PC que ha fet la petició.
Pas de paràmetres
Escriviu una pàgina jsp que passa tres paràmetres a una altre pàgina JSP amb <jsp:include> i <jsp:param>. A més, la pàgina principal pot rebre tres paràmetres via GET (URL) i els mostra. Especifiqueu els tres paràmetres amb els noms: param1 , param2 i param3
Bucle
Escriviu un programa per mostrar els múltiples de dos. Inclou un bucle en el bloc scriptlet i mostrar els números.
Comunicació entre formularis HTML i pàgines JSP
JSP s'encarrega d'analitzar les dades del formulari automàticament utilitzant els mètodes següents depenent de la situació:
Método | Descripción |
---|---|
getParameter() | obtenir el valor d'un paràmetre. |
getParameterValues() | utilitza aquest mètode si el paràmetre apareix més d'una vegada i Retorna múltiple valors , per exemple checkbox. |
getParameterNames() | utilitza aquest mètode si desitges una llista completa de tots els noms dels paràmetres en la petició actual. |
getInputStream(): | utilitza aquest mètode per llegir flux de dades binàries que ve des del client. |
Exemple GET
<html>
<head>
<title>Using GET Method to Read Form Data</title>
</head>
<body>
<center>
<h1>Using GET Method to Read Form Data</h1>
</center>
<ul>
<li><p><b>First Name:</b>
<%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last Name:</b>
<%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>
---------
<html>
<body>
<form action="main.jsp" method="GET">
First Name: <input type="text" name="first_name">
<br />
Last Name: <input type="text" name="last_name" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
Exemple POST
<html>
<body>
<form action="main.jsp" method="POST">
First Name: <input type="text" name="first_name">
<br />
Last Name: <input type="text" name="last_name" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
--------------
<html>
<head>
<title>Using GET and POST Method to Read Form Data</title>
</head>
<body>
<center>
<h1>Using GET Method to Read Form Data</h1>
</center>
<ul>
<li><p><b>First Name:</b>
<%= request.getParameter("first_name")%>
</p></li>
<li><p><b>Last Name:</b>
<%= request.getParameter("last_name")%>
</p></li>
</ul>
</body>
</html>
----------------
Exemple 2:
----------------
<html>
<body>
<form action="main.jsp" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> Maths
<input type="checkbox" name="physics" /> Physics
<input type="checkbox" name="chemistry" checked="checked" /> Chem
<input type="submit" value="Select Subject" />
</form>
</body>
</html>
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<title>HTTP Header Request Example</title>
</head>
<body>
<center>
<h2>HTTP Header Request Example</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Param Name</th><th>Param Value(s)</th>
</tr>
<%
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = ( String )paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
%>
</table>
</center>
</body>
</html>
Exercicis
JSP amb cap i peus
L’objectiu d’aquesta activitat és mostrar el funcionament de la inclusió d’arxius a PHP. Fer servir includes us permet simplificar el codi de les pàgines. Per exemple, podeu afegir un fitxer de capçalera (cap.jsp) i un de peu (peu.jsp) amb els continguts comuns de totes les pàgines del vostre lloc (el bàner, el menú, la informació general). Senzillament incloent aquests fitxers a totes les pàgines, podeu aconseguir una estètica comú. Si heu de canviar en algun moment la capçalera, modificant l’arxiu cap.php ho tindreu modificat a totes les pàgines del web. Feu una pàgina web amb continguts estructurats amb dos fitxers: cap.jsp i peu.jsp
Login
Crea un formulari HTML com el del proxy del institut que utilitzi el mètode GET i un altre que utilitzi el mètode POST. Imprimeix per pantalla el nom d'usuari i la contrasenya codificada en MD5 i en SAH1. A més a més, hi ha la possibilitat d'enviar una imatge (menor d'un 1 mb) com a avatar del usuari.