Desenvolvimento de aplicações Web Java Server Pages Hamilton Lima - athanazio@pobox.com 2003
Como funciona? Servidor web 2 Internet 1 Browser 3 Arquivo jsp 4 JSP Compilado 2
Passo a passo 1 browser envia requisição ao servidor http://servidor:8080/projeto/login.jsp 2 servidor recebe requisição Verifica se o contexto projeto existe 3 procura pelo arquivo solicitado Procura pelo arquivo login.jsp 4 verifica se já foi compilado Caso não tenha sido compila Executa o arquivo e transmite resposta ao browser 3
O que retorna... O que retorna do servidor para o browser na maioria dos casos é HTML mas podemos retornar qualquer conteúdo imagens, arquivos pdf, planilhas, textos, ou qualquer conteúdo desejado qualquer conteúdo Protocolo HTTP 4
Como funciona o JSP Java Server Pages, permite mesclar HTML e código Java, fazendo com que o código Java inserido seja executado no servidor. <html><body> <h3>pagina de Teste</h3> <% String nome = request.getparameter( nome ); if( nome == null ){ %>Nenhum nome foi informado<% } else { %>O nome informado é <b><%= nome %></b> <hr> </body> </html> 5
Primeiro exemplo <html><body> <h3>pagina de Teste</h3> <% String nome = request.getparameter( nome ); if( nome == null ){ %>Nenhum nome foi informado<% } else { %>O nome informado é <b><%= nome %></b> <hr> </body> </html> O texto em verde é html, os trechos em azul são código Java inserido no html 6
Mesclando html com java Arquivo JSP Retorno HTML JAVA HTML Executa! HTML HTML HTML 7
Elementos de JSP Scriplets Expressões Variáveis pré-definidas Tratando requisições Mantendo dados entre páginas Declarações Diretivas de página Javabeans 8
Scriplets Scriplets, são trechos de código java iniciados por <% e terminados por %> Neles escrevemos o código que será executado no servidor Todas instruções devem ser terminadas com ponto e virgula Quando houverem estruturas de controle que possuem bloco, for, while, if ou outras os blocos podem iniciar em uma parte da tag do scriplet e terminar em outra 9
Scriplet com bloco <html><body> <h3>caixa de selecao</h3> <form method= POST > <select name= numero > <% for( int n = 0; n < 10; n ++ ){ %> <option><%= n +1 %></option> <% } %> </select> </form> </body> </html> Início do bloco do for em um scriplet Fim do bloco do for em outro scriplet 10
Gerando html no codigo <html><body> <h3>pagina da margarida</h3> <% if (Math.random() < 0.5) { out.println("<b>bem</b> me quer"); } else { out.println("<b>mal</b> me quer"); } %> </body> </html> Trechos de html também podem gerados no código Java usando os métodos print( ) ou println( ) do objeto já instanciado out 11
Expressões Uma expressão em JSP inicia com <%= e termina com %> Não possue ponto e virgula no final É executada quando a página é chamada, ou seja em tempo de execução Transforma o resultado de uma expressão Java válida em String e exibe na posição indicada Funciona semelhanto ao out.println( ) 12
Exemplos de expressões <%= (int)(math.random( ) * 10) %> numero randomico entre 0 e 10 <%= request.getparameter( nome ) %> parametro nome recebido pela pagina <%= nome == null? : nome.trim() %> conteudo da variavel String nome (previamente declarada) se for nulo exibirá caso contrário exibirá o conteúdo da veriável sem espaços em branco antes e depois 13
Variáveis pré-definidas request requisições recebidas do cliente response objeto com a resposta a ser enviada ao cliente out permite adicionar conteúdo na resposta a ser enviada ao cliente session mantém dados entre as páginas de uma mesmo browser aberto application mantém dados disponíveis para todas as sessões abertas 14
request Request, objeto do tipo HttpServletRequest que oferece por exemplo os seguintes métodos getparameter( nome ) - onde uma informação submetida para a página pode ser recuperada getattribute( nome ) - onde um objeto pode ser atribuido ao request antes de repassa-lo a outra página 15
Request exemplo <html><body> <h3>pagina de Teste</h3> <% String nome = request.getparameter( nome ); if( nome == null ){ %>Nenhum nome foi informado<% } else { %>O nome informado é <b><%= nome %></b> <hr> </body> </html> O parametro nome pode ter sido enviado através de um um formulário ou através de um link 16
envio de dados - POST POST envio dos dados através de um formulário HTML onde o atributo method do formulário é igual a POST para cada objeto contido no formulário será criado um parâmetro a ser recuperado pelo metodo getparameter() do objeto request Não existe limite de atributos a serem enviados através do método POST É o mais comum a ser usado em formulários 17
envio de dados - GET Os dados são enviados junto do endereço da página, normalmente é usado em links, podendo também ser usado para formulários, alterando o atributo method do form Usa o seguinte formato: http://host/pagina.jsp?var_1=valor_1&var_n=valor_n http://localhost:8080/teste/pagina.jsp?nome=joao A? separa a pagina dos parametros e cada parametro é separado por um & 18
mantendo dados entre as páginas Por diversas vezes precisamos manter um conjunto de informações disponíveis entre páginas, visto que cada página é executada do início ao fim sem se manter na memória, algumas estratégias são indicadas para manter os dados entre páginas Re-escrita de url Uso da sessão Input hidden 19
exemplo de fluxo Página de login informa usuário Dados pessoais do usuário alteração consulta alteração Servidor web Consulta agenda do usuário consulta alteração sessão usuário 20
re-escrita de URL Todo link envolvido no fluxo da aplicação passa a receber como parâmetros informações que devem passar de página em página Se deseja passar por exemplo o código de um produto passar a adicionar em toda URL produto=codigo http://localhost:8080/teste/pagina.jsp?poduto=23 É um recurso muito trabalhoso, porém consome pouco recurso do servidor 21
input hidden Esta estratégia é muito semelhante a reescrita de URL, contudo pela diferença que todos os formulários deverão possuir <input type= hidden > para os parâmetros que desejamos manter entre as páginas Deve ser tomado o cuidado de atualizar os valores a cada exibição da página Exige muito esforço de programação para manter os campos em todos os formulários 22
input hidden exemplo <html><body> <form method= post action= teste.jsp > <% String codigo = request.getparameter( codigo ); if (codigo == null) codigo = 0 ; int valor = Integer.parseInt( codigo ) +1; %> <h3>formulario de teste</h3> <input type= hidden name= contador value= <%= valor %> > <input type= submit value= Enviar > <h3>contador <%= valor %></h3> </body> </html> Coloca o valor no value do input para que o valor seja propagado 23
Uso da sessão Objeto do tipo HttpSession que permite adicionar e/ou recuperar qualquer objeto através de uma nome identificador Para cada navegador aberto é criada uma sessão no servidor e através deste objeto é possível manter informações entre as páginas Deve ser usado com cuidado para evitar deixar informações na sessão que possam causar confusão em outras páginas 24
session exemplo <html><body> <% Integer numero = (Integer) session.getattribute( contador ); %> <h3>contador <%= numero.intvalue() %></h3> <% numero = new Integer( numero.intvalue() +1 ); session.setattribute( contador, numero ); %> <hr> </body> </html> Observe o molde de tipo pois o método getattribute() retorna Object Atualiza o objeto e coloca de volta na sessão, ficando o objeto disponível para a própria página ou outras durante a navegação 25
Declarações Uma declaração em JSP inicia com <%! e termina com %> Pode ser usada para declarar variáveis Pode ser usada para declarar métodos Segue as mesmas regras de sintaxe do scriplet 26
Exemplos de declarações <%! int n = 0; %> declara variável inteira n <%! int a, b; double c; %> faz diversas declarações ao mesmo tempo <%! Circle a = new Circle(2.0); %> declara e inicializa uma variável da classe Circle 27
Diretivas de páginas As diretivas de página seguem o formato <%@ diretiva atributo1=... atributo2=... atributon=... %> As diretivas permitem configurar diversos comportamentos das páginas JSP Veremos as seguintes diretivas: page include 28
Diretiva page Como o próprio nome já diz permite configurações do comportamento da pagina, tendo os seguintes atributos import contenttype isthreadsafe session buffer language - autoflush - extends - info - errorpage - iserrorpage 29
Atributo import <%@ page import="pacote.classe" %> <%@ page import="pacote.classe1,...,pacote.classn" %> Funciona como o import de uma classe Java permite o uso de uma classe em um trecho de programa sem referenciar o nome completo da mesma, podendo usar Vector ao invés de java.util.vector por exemplo se realizar o <%@ page import="java.util.*" %> 30
Atributo contenttype Indica o MIME-TYPE do conteúdo que a página vai gerar <%@ page contenttype="text/plain" %> indica que o contéudo gerado pela página será texto puro e nao html <%@ page contenttype="application/vnd.ms-excel" %> indica que conteúdo será de uma planilha excel (o conteúdo deverá ser um html com uma tabela que será lida na planilha com cada <td> em uma célula) 31
isthreadsafe, session, buffer <%@ page isthreadsafe="true" %> define que esta página não deve ser acessada simultaneamente <%@ page session="false" %> desabilita a sessão automática,neste caso se o objeto session for usado ocorrerá um erro <%@ page buffer="32kb" %> <%@ page buffer="none" %> define quantos bytes serão armazenados antes de enviar a resposta ao client 32
autoflush, extends <%@ page autoflush="false" %> define que caso o buffer alcance o seu limite não deve ser enviado automaticamente uma resposta ao client, e sim ocorrer um erro de buffer overflows <%@ page extends="pacote.classe" %> define uma classe personalizada para ser a superclasse do JSP compilado 33
info, language <%@ page info="descrição" %> adiciona um texto que pode ser recuperado através do metodo getservletinfo( ) <%@ page language="java" %> define a linguagem usada na página, sendo javaa única opção disponível 34
errorpage, iserrorpage <%@ page errorpage="url relativa" %> define que página deve ser chamada caso algum erro ocorra <%@ page iserrorpage="true" %> define que a pagina atual é uma pagina de erro recebendo o objeto exception contendo a exceção ocorrida em outra página 35
Exemplo de página de erro <%@ page iserrorpage="true" %> <html><body> <h3>ocorreu um erro</h3> <b><%= exception %></b> <pre> <% exception.printstacktrace(new PrintWriter(out)); %> </pre> </body> </html> Usa o objeto de saída padrão do jsp para exibir Exibe a pilha de chamadas do erro 36
Diretiva include <%@ include file="topo.html" %> inclui em tempo de compilação o conteúdo da URL fornecida, caso haja alteração nas páginas incluídas deve ser recompilado o arquivo JSP <jsp:include page="url" flush="true" /> inclui a URL em tempo de execução, não podendo ser um JSP 37
Javabeans São objetos que podem ser usados para facilitar a manipulação de dados nas páginas Para uma classe poder ser usada como JavaBean ela precisa obedecer alguns requisitos: Implementar a interface java.io.serializable Para cada atributo que se deseja oferecer acesso possuir metodos set/get de acesso 38
Exemplo de classe Javabean public class Usuario implements java.io.serializable{ private String nome; private boolean administrador; public String getnome(){ return nome;} public void setnome( String nome ){ this.nome = nome; } } public String isadministrador(){ return administrador;} public void setadministrador( String administrador ){ this.administrador = administrador; } 39
Usando Javabeans sem Javabeans... <% Usuario user = (Usuario) session.getattribute( usuario ); if( user == null ){ user = new Usuario(); user.setnome( request.geetparameter( nome )); session.setattribute( usuario, user ); } %> COM Javabeans! <jsp:usebean class= Usuario id= user scope= session /> <jsp:setproperty name="user" property="nome" /> 40
Entendendo javabeans Indica a classe do objeto a ser criado <jsp:usebean class= Usuario id= user scope= session /> Indica o nome da variável a ser criada Indica o escopo do objeto a ser criado 41
escopos de javabeans O escopo dos javabeans definem a abrangência ou visibilidade dos objetos criados, e são as seguintes: page, o objeto somente é visível na própria página, muito útil para formulários e uso de atribuição automática com muitos atributos session, visivel por toda a navegação das páginas daquela janela aberta application, visível por todas as sessões, permitindo compartilhar informações entre usuários 42
atribuições automáticas <jsp:setproperty name="user" property="nome" /> A tag jsp:setproperty permite a atribuição de valores passados como parâmetro (GET ou POST) diretamente para um JavaBean No atributo name vai o nome do bean, e no property o nome do atributo Desejando atribuir para todos possiveis use property= * 43
fim "Direi do SENHOR: Ele é o meu Deus, o meu refúgio, a minha fortaleza, e nele confiarei." Salmo 91.2 44