JSP (Java Server Pages) André Tavares da Silva [email protected] JSP • A linguagem surgiu por volta de 1995. • JSP foi inicialmente inventado por Anselm Baird-Smith durante um final de semana e depois Satish Dharmaraj (agora na Zimbra) elaborou uma especificação. • O contêiner do lado do servidor Java, concebido pela Netscape, foi feito como um esforço paralelo enquanto outro projeto semelhante estava sendo feito pela Oracle (agora dona do Java). • O material Tomcat veio alguns anos mais tarde, quando estava pronta a primeira especificação do servlet, escrita por James Davidson. JSP • JSP é uma tecnologia utilizada no desenvolvimento de aplicações para Web, similar às tecnologias Active Server Pages (ASP) da Microsoft ou PHP. • Por ser baseada na linguagem de programação Java, tem a vantagem da portabilidade. • Esta tecnologia permite ao desenvolvedor de páginas produzir aplicações que acessem o banco de dados, manipulem arquivos, capturem informações a partir de formulários, entre outras. JSP • Em relação a arquitetura, JSP pode ser visto como uma abstração de alto nível dos Java servlets. • Páginas JSP são carregadas dentro do servidor e processado a partir de uma estrutura especial do servidor Java, chamada Java EE Web Application, muitas vezes como um arquivo “.war” ou “.ear”. Delimitando o código JSP • Declaração de expressão (Expression tag) <%= %> - o resultado é retornado como String Exemplos: O seu endereço IP é: <%= request.getRemoteAddr() %> <%= 2+2%> • Declaração de sintaxe (Scriplet tag) <% %> - declaração livre. Exemplo: <% for( int i= 0; i< 10; i++) { out.println(“ numero: “+ i); }%> Exemplo <TABLE BORDER=2> <TR> <TD>Numero</TD> <TD>Dobro</TD> </TR> <% for ( int i = 1; i <= 10; i++ ) { %> <TR> <TD><%= i %></TD> <TD><%= i*2 %></TD> </TR> <% } %> </TABLE> Delimitando o código JSP • Declarações (Declaration tag) <%! %> Permite declarar variáveis e métodos. Exemplo: <%! private int contador=0; %> • Diretivas (Directive tag) <%@ %> Permite dar informação sobre a página ao motor JSP. Tipos de diretivas • page - processa informação para esta página (existem 11 atributos opcionais). Sintaxe: <%@ page atributo=”valor” %> • include - arquivos a serem incluídos. Sintaxe: <%@ include file=”pagina.jsp” %> • taglib - Define uma biblioteca a ser usada. Precisa de um prefixo e de um url: Sintaxe: <%@ taglib prefix = "prefixo" uri = "mytl.tld" %> Exemplo <%@ page import="java.util.*" %> <HTML> <BODY> <% System.out.println("Verificando a hora do sistema..."); Date date = new Date(); %> Oi! A hora atual &eacute; <%= date %>. </BODY> </HTML> Cuidado! <%@ page import="java.util.*" %> <HTML> <BODY> <%! Date theDate = new Date(); Date getDate() { System.out.println("Em getDate()..."); return theDate; } %> Oi! A hora atual &eacute; <%= getDate() %> </BODY> </HTML> Tags JSP (Action tags) • Elas não usam <% e %>, apenas os caracteres < e > como as tags HTML. • Existem dois tipos: de uma biblioteca externa e predefinidas. • As tags predefinidas começam com as letras "jsp:", por exemplo, <jsp:include ... /> é uma tag predefinida usada para incluir outras páginas. jsp:include • jsp:include é similar à diretiva include vista anteriormente. Mas ao invés de inserir o texto no arquivo original, ela realmente chama o arquivo em tempo de execução. • Na prática, muda a forma com que a página é lida pelo browser. A diretiva include é realizada pelo browser e a interpretação da tag jsp:include é feita pelo servidor JSP. Exemplo <HTML> <BODY> Incluindo hello.jsp...<BR> <jsp:include page="hello.jsp"/> </BODY> </HTML> Exemplos de tags JSP predefinidas • Acessar e alterar propriedades de JavaBeans: jsp:useBean, jsp:getProperty e jsp:setProperty; • Redirecionar a requisição para outra página JSP: jsp:forward; • Uma única tag para a inclusão de applets Java em páginas, independentemente do navegador cliente: jsp:plugin e jsp:fallback. Tags customizadas • Tags customizadas definem elementos JSP. • Quando uma página JSP contém uma tag customizada (geralmente externa), ela é traduzida para um servlet e convertida para operações em um objeto (tag handler). • O contêiner Web invoca então a operação toda vez que a página JSP é executada. Bibliotecas de tags (tag-libraries) • Cada tag-library tem sua própria documentação específica. • A diretiva "taglib" é usada para definir uma biblioteca de tags a ser utilizada na página: <%@ taglib uri="/struts-html" prefix="html" %> • O parâmetro "uri" define onde procurar a biblioteca e "prefix" é único e indica qual o prefixo é utilizado pela biblioteca. Frameworks / Bibliotecas de tags • JSF (JavaServer Faces): framework MVC de aplicações Web baseado em Java que se destina a simplificar o desenvolvimento de interfaces de usuário baseadas em web. • Struts: framework de desenvolvimento da camada controladora, numa estrutura seguindo o padrão Model 2 (uma variante do MVC oficializada pela Sun). • Apache Tapestry: framework open-source para implementar aplicações de acordo com o padrão MVC. Voltando ao exemplo... <%@ page import="java.util.*" %> <HTML> <BODY> <% System.out.println("Verificando a hora do sistema..."); Date date = new Date(); %> Oi! A hora atual &eacute; <%= date %>. </BODY> </HTML> Objetos Instanciados • Uma página JSP possui 9 objetos previamente instanciados: – request – javax. servlet. ServletRequest – response – javax. servlet. ServletResponse – pageContext – javax. servlet. jsp. PageContext – session – javax. servlet. http. HttpSession – application – javax. servlet. servletContext – out – javax. servlet. jsp. JspWriter – config – javax. servlet. ServletConfig – page – java. lang. Object – exception – java. lang. Throwable Exemplo <%@ page import="java.util.*" %> <HTML> <BODY> <% System.out.println("Verificando a hora do sistema..."); Date date = new Date(); out.println("Oi! A hora atual &eacute; “ + date ); %> </BODY> </HTML> Processando dados de formulário • O objeto request busca por valores de parâmetros ou cookies. • O método getParameter recebe como parâmetro o nome do campo de formulário e retorna o valor recebido de um formulário. Formulário de exemplo <HTML> <BODY> <FORM METHOD=POST ACTION="CadPessoa.jsp"> Nome: <INPUT TYPE=TEXT NAME=username><BR> E-Mail: <INPUT TYPE=TEXT NAME=email><BR> Telefone: <INPUT TYPE=TEXT NAME=phone> <INPUT TYPE=SUBMIT VALUE=Enviar> </FORM> </BODY> </HTML> Processando o formulário <HTML> <BODY> Você digitou:<BR> Nome: <%= request.getParameter("username") %><BR> E-mail: <%= request.getParameter("email") %><BR> Telefone: <%= request.getParameter("phone") %><BR> </BODY> </HTML> Lendo todos os parâmetros Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.println("<TR><TD>" + paramName + "<TD>"); String[] paramValues = request.getParameterValues(paramName); if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) out.print("<I>Vazio</I>"); else out.print(paramValue); } else { out.println("<UL>"); for(int i=0; i<paramValues.length; i++) { out.println("<LI>" + paramValues[i]); } out.println("</UL>"); } } Definindo uma classe package user; public class UserData { String username; String email; int phone; public void setUsername( String value ) { username = value; } ... public String getUsername() { return username; } public String getEmail() { return email; } public int getPhone() { return phone; } } Salvando formulário na classe <jsp:useBean id="user" class="user.UserData" scope="session"/> <jsp:setProperty name="user" property="*"/> <HTML> <BODY> <A HREF="NextPage.jsp">Clique para continuar</A> </BODY> </HTML> Recuperando dados do bean <jsp:useBean id="user" class="user.UserData" scope="session"/> <HTML> <BODY> Você digitou:<BR> Nome: <%= user.getUsername() %><BR> E-mail: <%= user.getEmail() %><BR> Telefone: <%= user.getPhone() %><BR> </BODY> </HTML> Seções • Em um mesmo site, normalmente muitos usuário de Internet realizam diversas interações simultaneamente. • Ao programar um site, é extremamente útil associar informações a cada um dos usuários. • As seções são utilizadas para isto em JSP. Os dados são colocados na seção e recuperados dele como em um objeto Hashtable. Formulário <HTML> <BODY> <FORM METHOD=POST ACTION="CadPessoa.jsp"> Nome: <INPUT TYPE=TEXT NAME=username><BR> E-Mail: <INPUT TYPE=TEXT NAME=email><BR> Telefone: <INPUT TYPE=TEXT NAME=phone> <INPUT TYPE=SUBMIT VALUE=Enviar> </FORM> </BODY> </HTML> Salvando na seção <% String name = request.getParameter("username"); session.setAttribute("theName", name); %> <HTML> <BODY> <A HREF="NextPage.jsp">Clique para continuar</A> </BODY> </HTML> Lendo da seção <HTML> <BODY> Oi, <%= session.getAttribute("theName") %> </BODY> </HTML> Seções de aplicação • O uso mais comum de seções é utilizar seções de usuário através dos métodos getAttribute e setAttribute do objeto session mas também é possível utilizar seções de aplicação através do objeto pageContext. • Exemplo: <%= pageContext.getAttribute(”gLogin”, PageContext.APPLICATION_SCOPE) %> Página de login • Alguns tipos de sites necessitam de login usando um usuário e senha. • A partir da especificação 2.2 de Servlet da Sun, isto ficou mais fácil de implementar. • Para isto, a página de login deve possuir (na tag FORM) o método ACTION setado para "j_security_check": <FORM METHOD=POST ACTION=j_security_check> Página de login • O destino j_security_check é feito pela aplicação e não necessita ser codificado. • O formulário deve conter dois campos <INPUT> nomeados como j_username e j_password, para usuário e senha respectivamente. Página de login <form method="POST" action="j_security_check"> <input type="text" name="j_username"> <input type="password" name="j_password"> <\form> Página de login • Após isso, você deve instruir o servidor de aplicativos a proteger suas páginas usando a página de login que você forneceu. • Os detalhes de implementação variam de servidor para servidor, mas uma boa implementação fornece várias facilidades pra, por exemplo, combinar login e senha com uma tabela da base de dados. O que mais aprender? • Java • Especificações de JSP e Servlets • Definição de interfaces – javax.servlet.http.HttpServletRequest – javax.servlet.http.HttpServletResponse – javax.servlet.jsp.JspWriter – javax.servlet.jsp.PageContext • SQL • Frameworks (Struts, JSF, Spring MVC,...) 1. Faça uma página HTML que contenha um formulário com os campos nome, endereço, e-mail, senha e confirmação de senha. Esse formulário deverá ser enviado para um script JSP que irá verificar a existência e a integridade dos dados, mostrá-los e possibilitar ao usuário voltar à página anterior (HTML) caso haja algum erro. 2. Faça uma página em JSP semelhante às páginas anteriores para verificar a integridade dos dados, informe os erros (caso houver) e preencha um formulário com os dados enviados (exceto senha). Insira um contador para exibir o número de tentativas realizadas pelo usuário.