(Java Server Pages)

Propaganda
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 é <%= 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.
Download