Engenharia de Aplicações – Sistemas Interactivos 2010/11! Aula 8 Programação Web 2:! Introdução a JSP! Mestrado em Engenharia Informática – Universidade do Minho! 289! Engenharia de Aplicações – Sistemas Interactivos 2010/11! First principles (7) “Deliver information, not just data” !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(Johnson, 2008) ! ! Design displays cerfully, get professional help! - ! The screen belongs to the user! - ! Visual order and user focus; scannability; match the medium; attention to detail.! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! Programação Web! JSP Mestrado em Engenharia Informática – Universidade do Minho! 291! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! Application Servers Mestrado em Engenharia Informática – Universidade do Minho! 294! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! JSP – Expressões ! <%= expressão Java %>! <HTML> <BODY> Hello! The time is now <%= new java.util.Date() %> </BODY> </HTML> ! Expressão avaliada em run time ! Mestrado em Engenharia Informática – Universidade do Minho! 298! Engenharia de Aplicações – Sistemas Interactivos 2010/11! JSP – Scriptlets ! <% bloco de código Java %>! <HTML> <BODY> <% System.out.println( "Evaluating date now" ); java.util.Date date = new java.util.Date(); %> Hello! The time is now <%= date %> </BODY> </HTML> ! Por si só uma Scriptlet não produz HTML! - mas podemos programá-la para isso…! Mestrado em Engenharia Informática – Universidade do Minho! 299! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! JSP: Declarações ! <%! declarações Java %>! <%@ page import="java.util.*" %> <HTML> <BODY> <%! Date theDate = new Date(); Date getDate() { System.out.println( "Evaluating date now" ); return theDate; } %> Hello! The time is now <%= getDate() %> </BODY> </HTML> ! Mas agora não funciona!! Mestrado em Engenharia Informática – Universidade do Minho! 302! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! JSP – request example OlaMundo.jsp! <HTML> <BODY> <FORM METHOD=POST ACTION="dizOla.jsp"> Como se chama? <INPUT TYPE=“TEXT” NAME=“username” SIZE=“20”> <BR /> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> dizOla.jsp! <%@ page contentType="text/html;charset=utf-8"%> <HTML> <BODY> Olá, <%= request.getParameter("username"); %> <br /> <a href="OlaMundo.jsp">back</a> </BODY> </HTML> Mestrado em Engenharia Informática – Universidade do Minho! 305! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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"); %> <HTML> <BODY> Olá, <%= nome %> <br /> <a href="OlaMundo.jsp">back</a> </BODY> </HTML> erro.html! <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> </HEAD> <BODY> Ops! Não se esqueça do nome... <br /> <a href="OlaMundo.jsp">back</a> </BODY> </HTML> Mestrado em Engenharia Informática – Universidade do Minho! 307! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! JSP – session example erro.jsp! <%@ page contentType="text/html; charset=utf-8"%> <HTML> <BODY> <% 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 /> dizOla.jsp! <a href="OlaMundo.jsp">back</a> </BODY> <%@ page contentType="text/html; charset=utf-8"%> </HTML> <% String nome = request.getParameter ("username"); if (nome==null || nome.equals("")) response.sendRedirect("erro.jsp"); else session.removeAttribute("erro"); %> <HTML> <BODY> Olá, <%= nome %> <br> <a href="OlaMundo.jsp">back</a> </BODY> </HTML> Mestrado em Engenharia Informática – Universidade do Minho! 309! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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); } %> <HTML> <BODY> Olá, <%= nome %> (é o <%= c %>. a passar por cá) <br /> <a href="OlaMundo.jsp">back</a> </BODY> </HTML> Mestrado em Engenharia Informática – Universidade do Minho! 311! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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”%> <HTML> <BODY> Hello! The time is now <%= new Date() %> </BODY> </HTML> Mestrado em Engenharia Informática – Universidade do Minho! 313! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! JSP: Beans e Forms <HTML> <BODY> <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> </BODY> </HTML> <jsp:useBean id="user" class="user.UserData" scope="session"/> <jsp:setProperty name="user" property="*"/> <HTML> <BODY> You entered<BR> Name: <%= user.getUsername() %><BR> Email: <%= user.getEmail() %><BR> Age: ${user.age} <BR> </BODY> </HTML> Mestrado em Engenharia Informática – Universidade do Minho! 318! Engenharia de Aplicações – Sistemas Interactivos 2010/11! 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! Engenharia de Aplicações – Sistemas Interactivos 2010/11! JSP: Arquitecturas ! ! Model 1 architecture! Model 2 architecture (MVC-like)! Mestrado em Engenharia Informática – Universidade do Minho! 320! Engenharia de Aplicações – Sistemas Interactivos 2010/11! Links Úteis ! http://www.jsptutorial.net/! ! http://java.sun.com/products/jsp/pdf/card11.pdf! Mestrado em Engenharia Informática – Universidade do Minho! 321!