Aula 8 Programação Web 2:! Introdução a JSP! Mestrado em Engenharia Informática Universidade do Minho! 289! First principles (7) Deliver information, not just data!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(johnson, 2008)!! Design displays cerfully, get professional help! - Visual order and user focus; scannability; match the medium; attention to detail.!! The screen belongs to the user! - minimise interference with the GUI controls (mouse, )!! Preserve display inertia! - small, incremental changes to the display! Mestrado em Engenharia Informática Universidade do Minho! 290!
Programação Web! JSP Mestrado em Engenharia Informática Universidade do Minho! 291! Common Gateway Interface (CGI)! Early form of server side scripting!! Protocol for interfacing external applications with a web server!! When request received, corresponding program called!! The protocol defines! - how information about the server and the request is passed to the command (arguments and environment variables)! - how the command can pass back extra information about the output (headers)!! Low-tech approach! - inefficient from time and memory perspective! - if CGI used often, can quickly overwhelm web servers! Mestrado em Engenharia Informática Universidade do Minho! 292!
Direct execution! Applications run on web server instead of OS! - Apache modules (PHP, )! - ASP.NET! - Internet Server Application Programming Interface (ISAPI)!! Application servers! - Move back towards mainframe computing! - Server stores business logic and user interface! - Client side runs on a browser! Mestrado em Engenharia Informática Universidade do Minho! 293! Application Servers Mestrado em Engenharia Informática Universidade do Minho! 294!
Servlets! Tecnologia Java!! Geração de HTML on the fly!! Nova vista (página) gerada a cada pedido! - Vista é programada, não desenhada! - Não encorajam separação entre apresentação e negócio/conteúdo! Mestrado em Engenharia Informática Universidade do Minho! 295! Servlets example import java.io.*;! import javax.servlet.http.*;! import javax.servlet.*;! public class HelloServlet extends HttpServlet {!!public void doget (HttpServletRequest req, HttpServletResponse res)!!!!!!!!!!throws ServletException, IOException {!!!PrintWriter out = res.getwriter();!!!out.println("hello, world!");!!!out.close();!!}! }! <web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4!! xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"!!! xsi:schemalocation="http:/java.sun.com/dtd/web-app_2_3.dtd">!!<servlet>!!!!<servlet-name>hello</servlet-name>!!<servlet-class>test.helloservlet</servlet-class>!!</servlet>!!<servlet-mapping>!!!<servlet-name>hello</servlet-name>!!!<url-pattern>/hello</url-pattern>!!</servlet-mapping>! <web-app>! Mestrado em Engenharia Informática Universidade do Minho! 296!
JSP (Java Server Pages)! Um salto de abstracção em relação às Servlets!! Permite incluir código Java nas páginas HTML!! Ficheiros.jsp compilam para Java! - ou directamente para bytecode! - on interpretados on the fly!! Código Java compilado e executado para gerar HTML! Mestrado em Engenharia Informática Universidade do Minho! 297! JSP Expressões! <%= expressão Java %>! Hello! The time is now <%= new java.util.date() %>! Expressão avaliada em run time! Mestrado em Engenharia Informática Universidade do Minho! 298!
JSP Scriptlets! <% bloco de código Java %>! <% System.out.println( "Evaluating date now" ); java.util.date date = new java.util.date(); %> Hello! The time is now <%= date %>! Por si só uma Scriptlet não produz HTML! - mas podemos programá-la para isso! Mestrado em Engenharia Informática Universidade do Minho! 299! JSP Gerar HTML <% out.println("<table border=1>"); for ( int i = 1; i <= 5; i++ ) { out.println("<tr>"); out.println("<td>número</td>"); out.println("<td>"+i+"</td>"); } out.println("</table>"); %>! o mesmo que uma servlet?!! Mestrado em Engenharia Informática Universidade do Minho! 300!
JSP Misturar HTML e Java! Melhor que utilizar out é misturar HTML e Java! <table border=2> <% for ( int i = 1; i <= 5; i++ ) { %> <tr> <td>number</td> <td><%= i %></td> </tr> <%}%> </table> Mestrado em Engenharia Informática Universidade do Minho! 301! JSP: Declarações! <%! declarações Java %>! <%@ page import="java.util.*" %> <%! Date thedate = new Date(); Date getdate() { System.out.println( "Evaluating date now" ); return thedate; } %> Hello! The time is now <%= getdate() %>! Mas agora não funciona!! Mestrado em Engenharia Informática Universidade do Minho! 302!
JSP Algumas variáveis (out)! out: javax.servlet.jsp.jspwriter! - subclasse de java.io.writer! - permite escrever na página! out.print( Evaluating date now ); out.println("evaluating date now ); out.newline(); Mestrado em Engenharia Informática Universidade do Minho! 303! JSP Algumas variáveis (request)! request: javax.servlet.http.httpservletrequest! - informação sobre o pedido enviado pelo browser! request.getremotehost(); request.getparameter( parametername ); request.getparameternames(); request.getparametervalues(); request.getrequesturi(); request.getattribute( attributename ); request.setattribute(); request.removeattribute( attributename ); request.getcookies(); Mestrado em Engenharia Informática Universidade do Minho! 304!
JSP request example OlaMundo.jsp! <FORM METHOD=POST ACTION="dizOla.jsp"> Como se chama? <INPUT TYPE= TEXT NAME= username SIZE= 20 > <BR /> <INPUT TYPE=SUBMIT> </FORM> dizola.jsp! <%@ page contenttype="text/html;charset=utf-8"%> Olá, <%= request.getparameter("username"); %> <br /> <a href="olamundo.jsp">back</a> Mestrado em Engenharia Informática Universidade do Minho! 305! JSP Algumas variáveis (response)! response: javax.servlet.http.httpservletresponse! - manipulação da resposta a enviar ao browser! response.setcontenttype( text/html ); response.addcookie(acookie); response.containsheader( headername ); response.setheader( headername, value ); response.sendredirect( anurl ); Mestrado em Engenharia Informática Universidade do Minho! 306!
JSP response example dizola.jsp! <%@ page contenttype="text/html; charset=utf-8"%> <% String nome = request.getparameter("username"); if (nome==null nome.equals("")) response.sendredirect("erro.html"); %> Olá, <%= nome %> <br /> <a href="olamundo.jsp">back</a> erro.html! <HEAD> <META http-equiv="content-type" content="text/html; charset=utf-8"> </HEAD> Ops! Não se esqueça do nome... <br /> <a href="olamundo.jsp">back</a> Mestrado em Engenharia Informática Universidade do Minho! 307! JSP Algumas variáveis (session)! session: javax.servlet.http.httpsession! - um(a espécie de) Map! - permite guardar informação de página para página! session.isnew(); session.invalidate(); session.setattribute("thename", name); session.getattribute("thename ); session.getattributenames(); session.removeattribute( thename ); Mestrado em Engenharia Informática Universidade do Minho! 308!
JSP session example erro.jsp! <%@ page contenttype="text/html; charset=utf-8"%> <% if (session.getattribute("erro")==null) { %> Ops! Não se esqueça do nome... <% session.setattribute("erro", ""); %> <% } else { %> Tem que indicar um nome na caixa de texto antes de premir o botão submit. <br /> Tente novamente. <% } %> <br /> <a href="olamundo.jsp">back</a> dizola.jsp! <%@ page contenttype="text/html; charset=utf-8"%> <% String nome = request.getparameter ("username"); if (nome==null nome.equals("")) response.sendredirect("erro.jsp"); else session.removeattribute("erro"); %> Olá, <%= nome %> <br> <a href="olamundo.jsp">back</a> Mestrado em Engenharia Informática Universidade do Minho! 309! JSP Algumas variáveis (application)! session: javax.servlet.servletcontext! - um(a espécie de) Map! - permite guardar informação global a todas as sessões! application.log( amessage ); application.setattribute("thename", name); application.getattribute("thename ); application.getattributenames(); application.removeattribute(); Mestrado em Engenharia Informática Universidade do Minho! 310!
JSP application example dizola.jsp! <%@ page contenttype="text/html; charset=utf-8"%> <%@ page import="java.util.*"%> <% String nome = request.getparameter("username"); int c=0; if (nome==null nome.equals("")) { response.sendredirect("erro.jsp"); } else { session.removeattribute("erro"); if (application.getattribute("conta")!= null) c = (Integer)application.getAttribute("conta"); application.setattribute("conta", ++c); } %> Olá, <%= nome %> (é o <%= c %>. a passar por cá) <br /> <a href="olamundo.jsp">back</a> Mestrado em Engenharia Informática Universidade do Minho! 311! JSP resumo de objectos implícitos Objecto Classe/Interface Descrição out jsp.jspwriter out stream para a página request http.httpservletrequest os dados enviados com o pedido response http.httpservletresponse a resposta http session http.httpsession dados da sessão do utilizador application ServletContext dados partilhados por todas as sessões page jsp.httpjsppage a servlet da página (atributos, namespaces) pagecontext jsp.pagecontext o contexto da página config ServletConfig configuração da servlet Mestrado em Engenharia Informática Universidade do Minho! 312!
JSP Directivas! <%@ tipo atributo%>! - tipo: page/include/taglib/!! Directiva page: informação sobre a servlet a gerar! - import/contenttype/pageencoding/session/errorpage/! <%@ page import="java.util.*" errorpage= error.jsp %> Hello! The time is now <%= new Date() %> Mestrado em Engenharia Informática Universidade do Minho! 313! JSP tags (ctd.)! Directiva include:! <%@ include file="relativeurl" %>! Directiva taglib! - tags de bibliotecas externas (taglibs)! <%@ taglib uri="uriforlibrary" prefix="tagprefix" %> Mestrado em Engenharia Informática Universidade do Minho! 314!
JSP acções! tags pré-definidas! - <jsp:tag> </jsp:tag>! - text/include/forward/usebean/getproperty/ setproperty/plugin!! include! <jsp:include page="url" flush= true /> <jsp:include page="url" flush="true" > <jsp:param name= param" value= valor" /> </jsp:include> Mestrado em Engenharia Informática Universidade do Minho! 315! JSP include: directiva vs. acção! acção (<jsp:include />)! - inclusão do resultado (recompilação automática)! - classes mais pequenas! - flexível (parâmetros/qualquer fonte)!! directiva (<%@ include %> )! - inclusão do texto! - páginas partilham variáveis! - um pouco melhor em termos de desempenho! Mestrado em Engenharia Informática Universidade do Minho! 316!
JSP acções (ctd.)! forward! - semelhante a sendredirect! - o browser não é notificado!! include! <jsp:include page="url" flush= true /> <jsp:include page="url" flush="true" > <jsp:param name= param" value= valor" /> </jsp:include> Mestrado em Engenharia Informática Universidade do Minho! 317! JSP: Beans e Forms <FORM METHOD=POST ACTION= ShowName.jsp"> What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR> What's your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR> What's your age? <INPUT TYPE=TEXT NAME=age SIZE=4> <P><INPUT TYPE=SUBMIT> </FORM> <jsp:usebean id="user" class="user.userdata" scope="session"/> <jsp:setproperty name="user" property="*"/> You entered<br> Name: <%= user.getusername() %><BR> Email: <%= user.getemail() %><BR> Age: ${user.age} <BR> Mestrado em Engenharia Informática Universidade do Minho! 318!
JSP cliclo de vida http://www.myhomepageindia.com/index.php/2009/04/15/jsp-life-cycle.html Mestrado em Engenharia Informática Universidade do Minho! 319! JSP: Arquitecturas! Model 1 architecture!! Model 2 architecture (MVC-like)! Mestrado em Engenharia Informática Universidade do Minho! 320!
Links Úteis! http://www.jsptutorial.net/!! http://java.sun.com/products/jsp/pdf/card11.pdf! Mestrado em Engenharia Informática Universidade do Minho! 321!