JSP JavaServer Pages Marco Antonio, Arquiteto de Software – TJDF [email protected] Dezembro/2005 Java Server Pages Tecnologia que permite a criação de páginas html dinâmicas com código Java. As páginas devem ter a extensão “.jsp”. Usada apenas para criação das telas para o sistema. Limitado aos componentes html. Permite a utilização de código Java, por isso, é essencial que se observe as melhores práticas de programação. Conteúdo estático e dinâmico • Estático – Tipicamente uma página HTML. – Mesma visualização para todo mundo. • Dinâmico – Conteúdo gerado baseado em condições. – Varia de acordo com o usuário, o dia ou até mesmo as opções escolhidas nos formulários. Scriptlet A Sun possui a mania de colocar o sufixo 'let' em muitas tecnologias (servlet, scriplet, portlet). Permite que se escreva código Java dentro da sua JSP. Escreva seu código Java entre as tags <% %>. JSP x Servlets JSP é utilizado apenas para apresentação das informações para um usuário final. Servlet é, geralmente, utilizado para fazer redirecionamento de páginas, filtragem de dados, validação de campos, etc. Várias tecnologias surgem a cada dia para ajudar no desenvolvimento de aplicações. Todas utilizam JSP/Servlets, que é o ponto inicial de toda aplicação web. AloMundo.jsp <%@ page language="java" contentType="text/html; charset=ISO-8859-1“ pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Alô mundo, JSP</title> </head> <body> <%=new java.util.Date()%> </body> </html> Rode a página • Com o botão direito sobre a página, selecione a opção Run as... -> Run on Server. O que é JSP • Documento baseado em texto que pode retornar conteúdo estático ou dinâmico. • Conteúdo estático é representado por código HTML. • O conteúdo dinâmico é gerado pelo código java. • A sua página JSP é transformada automaticamente em servlet pelo container. Benefícios do JSP Objetos implícitos • Uma página JSP tem acesso a certos objetos que estão sempre disponíveis. Estrutura da aplicação Vamos analisar a estrutura de diretórios da nossa aplicação. No projeto SistemaBancarioWeb deve existir um diretório WEB-INF com um arquivo chamado web.xml e com os subdiretórios classes e lib. classes: coloque aqui as classes necessárias. lib: coloque aqui os arquivos .jar que sua aplicação necessita. O Tomcat trata de forma semelhante o conteúdo dos diretórios classes e lib. O diretório work é gerado pelo Tomcat. Dentro dele fica o bytecode das páginas JSP. Crie aqui todas as páginas web!!! Contexto Cada aplicação é um contexto, com suas configurações privadas. Quando você tem várias aplicações, cada uma é um mundo diferente, não existe nenhuma integração do ponto de vista do servidor web (Tomcat). As bibliotecas que são comuns podem ser compartilhadas, mas isso não é regra. PrimeiraPagina.jsp 1. <html> 2. <title>Primeira página JSP</title> 3. <% out.println("Primeira Página JSP"); %> 4. </html> Passo-a-passo Linha 1: abre o código HTML. Linha 2: título da página. Linha 3: imprime na saída padrão (browser) a frase Primeira Página JSP. Linha 4: finaliza o código. Objetos implícitos Para ganhar acesso a variáveis cruciais, como parâmetros HTTP, sessões, cookies, etc. as páginas precisam interagir com o servidor web em que estão sendo executadas. Todos esses objetos podem ser acessados a qualquer momento em um arquivo JSP (ou até mesmo em um Servlet). Principais objetos implícitos request – consulta informações de solicitações, como parâmetros do formulário. response – manipula a resposta a uma solicitação. session – acessa informações de uma sessão específica do usuário. application – acessa informações compartilhadas de uma aplicação. out – imprime informações na página de saída. SegundaPagina.jsp <html> <h1>JSP Expressions</h1> <h3>Data atual: <%=new java.util.Date()%></h3> <h3>Dados do servidor: <%=application.getServerInfo()%></h3> <h3>ID da Sessão: <%=session.getId()%></h3> </HTML> Passagem de parâmetros get: a passagem de parâmetros se dá através da url. Tem limite de tamanho e os dados aparecem na tela para o usuário. post: a passagem de parâmetros se dá através do request HTML. Os dados não aparecem para o usuário, apesar disso, não existe nenhuma segurança nesse transporte. Estilo.css A folha de estilos está no link: http://www.marcoreis.net/css/Estilo.css. Copie esse arquivo para o diretório css do seu projeto. Obs: a folha de estilos tem como única finalidade deixar a aplicação mais agradável para o usuário. BemVindo.jsp <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title>Sistema Bancário</title> </head> <body> <h1>Bem-vindo ao Sistema Bancário</h1> <table border=1> <tr> <td> <a href="CadastroDeGerente.jsp">Cadastro de Gerentes <tr> <td> <a href="ConsultaGerentes.jsp">Consulta Gerentes </table> BemVindo.jsp Tela inicial do sistema. Tem apenas os links (menu) para as funcionalidades do SistemaBancario. CadastroDeGerente.jsp <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title>Cadastro de Gerente</title> </head> <body> <h1>Cadastro de Gerente</h1> <table border=1> <form action="CadastroDeGerenteAction.jsp" method="get"> <tr> <td> Nome: </td> <td> <input type="text" name="nome"> </td> </tr> <td> Endereço </td> <td> <input type="text" name="endereco"> </td> CadastroDeGerente.jsp <tr> <td> Telefone</td> <td> <input type="text" name="telefone"> </td> </tr> <tr> <td> <input type="submit" value="Gravar"> </td> <td> <input type="reset" value="Limpar"> </td> </tr> </form> </table> </body> </html> CadastroDeGerente.jsp A tela de cadastro de gerente deve ter todos os campos da classe Gerente, também chamada de JavaBean. Atenção: a chave-primária é automática, por isso não precisamos de um campo de texto para ela. CadastroDeGerente.jsp Essa tela captura as informações que o usuário digitou e as repassa para a página seguinte (CadatroDeGerenteAction.jsp) tratar. Nesse exemplo utilizamos uma caixa de texto (input type=”text”). Em outras situações podem ser utilizados vários outros como caixas de combinação, botões de checagem, áreas de texto. CadastroDeGerenteAction.jsp <%@page import="com.sistemabancario.persistencia.*" %> <%@page import="com.sistemabancario.entidades.*" %> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title>Cadastro de Gerente</title> </head> <body> <h1>Cadastro de Gerente</h1> <table border=1> <tr> <td> <% DAOGerente daoGerente = new DAOGerente(); Gerente g = new Gerente(); g.setNome(request.getParameter("nome")); g.setEndereco(request.getParameter("endereco")); g.setTelefone(request.getParameter("telefone")); daoGerente.inserir(g); out.println("Registro inserido com sucesso"); %> </table> CadastroDeGerenteAction.jsp Essa tela recebe os parâmetros da requisição e faz as atribuições no objeto gerente. No topo da página você verifica que dois pacotes foram importados. Lembre-se: as classes que precisamos nessa tela estão em outro pacote! Parâmetros da requisição: todos os valores dos componentes HTML que foram passados na primeira página JSP. Cada valor digitado em CadastroDeGerente.jsp será passado para seu respectivo atributo no gerente. Por fim, execute o método inserir, passando o gerente que deve ser persistido. Teste Mude a forma de enviar as informações do formulário de cadastro de get para post. Altere a linha para <form action="CadastroDeGerenteAction.jsp" method="get"> <form action="CadastroDeGerenteAction.jsp" method="post"> Grave novos registros e veja a diferença. ConsultaGerentes.jsp <%@page import="java.util.*" %> <%@page import="com.sistemabancario.persistencia.*" %> <%@page import="com.sistemabancario.entidades.*" %> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title>Consulta Gerentes</title> </head> <body> <h1>Consulta Gerentes</h1> <table border=1> <tr> <td>Id<td>Nome<td>Endereço<td>Telefone <% DAOGerente daoGerente = new DAOGerente(); Collection lista = daoGerente.consultarTodos(); Iterator ite = lista.iterator(); while(ite.hasNext()) { Gerente gerente = (Gerente) ite.next(); %> <!-- Isso é código HTML!!! --> <tr> <td><%= gerente.getId() %> <td><%= gerente.getNome() %> <td><%= gerente.getEndereco() %> <td><%= gerente.getTelefone() %> <% } //Fecha o loop do iterator!!! %> </table> ConsultaGerentes.jsp Consultas fornecem informações valiosas para o usuário final, pois só assim ele pode verificar se suas informações estão sendo realmente persistidas. Nossa consulta imprime um cabeçalho com os nomes dos atributos da classe no topo (nome, endereço e telefone). Com a ajuda do DAOGerente, fazemos uma consulta a todos os itens cadastrados e, através de um loop, mostra todos os dados do gerente. Esse loop é padrão em aplicações web. Utilize sempre essa estrutura para resolver problemas semelhantes. Dúvidas? Exercícios Crie os menus de acesso às funcionalidades de consulta e cadastro de clientes. Desafio Crie as telas para exclusão de Gerente/Cliente. Altere as páginas de consulta de forma que o usuário possa editar ou excluir um dos itens mostrados na lista. Sugestão Veja a seguir a sugestão para resolver esse problema. Vale lembrar que é apenas uma das possibilidades. Sistemas web devem ser criados exercitando a criatividade!!! Tente outras abordagens. Todas as informações que você precisa já estão na tela. ConsultaGerentes.jsp <%@page import="java.util.*" %> <%@page import="com.sistemabancario.persistencia.*" %> <%@page import="com.sistemabancario.entidades.*" %> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html><head><title>Consulta Gerentes</title></head> <body> <h1>Consulta Gerentes</h1> <table border=1> <tr><td>Id<td>Nome<td>Endereço<td>Telefone<td>Editar<td>Excluir <% DAOGerente daoGerente = new DAOGerente(); Collection lista = daoGerente.consultarTodos(); Iterator ite = lista.iterator(); while(ite.hasNext()) { Gerente gerente = (Gerente) ite.next(); %> <!-- Isso é código HTML!!! --> <tr> <td><%= gerente.getId() %> <td><%= gerente.getNome() %> <td><%= gerente.getEndereco() %> <td><%= gerente.getTelefone() %> <td><a href="CadastroDeGerente.jsp?id=<%= gerente.getId() %>" > <img src="imagens/edit.gif" border=0></a> <td><a href="ExclusaoDeGerente.jsp?id=<%= gerente.getId() %>" > <img src="imagens/delete.gif" border=0></a> <% } //Fecha o loop do iterator!!! %> </table> CadastroDeGerente.jsp <%@page import="com.sistemabancario.persistencia.*" %> <%@page import="com.sistemabancario.entidades.*" %> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title>Cadastro de Gerente</title> </head> <body> <h1>Cadastro de Gerente</h1> <table border=1> <% DAOGerente daoGerente = new DAOGerente(); Gerente gerente = new Gerente(); String id = request.getParameter("id"); if(id != null) { gerente = daoGerente.consultarPeloId(new Long(id)); } %> <form action="CadastroDeGerenteAction.jsp" method="get"> <tr> <td> Nome: </td> <td> <input type="text" name="nome" value="<%= gerente.getNome() %>"> </td> </tr> CadastroDeGerente.jsp <td> Endereço </td> <td> <input type="text" name="endereco" value="<%= gerente.getEndereco() %>"> </td> <tr> <td> Telefone</td> <td> <input type="text" name="telefone" value="<%= gerente.getTelefone() %>"> </td> </tr> <tr> <td> <input type="submit" value="Gravar"> </td> <td> <input type="reset" value="Limpar"> </td> </tr> </form> </table> </body> </html>