JSP (Java Server Pages) André Tavares da Silva andre.silva@udesc.br
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 é <%= 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 é <%= 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 é <%= 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 é + 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.