BELM 2003
1. INTRODUO
Muito se fala em novos paradigmas de programao, como a orientao a objetos e a programao utilizando componentes, como tornar o trabalho em informtica mais produtivo e geral possvel sem se preocupar com o tipo de mquina utilizada por um cliente. Em aplicaes comerciais ou cientficas envolvendo banco de dados cada vez mais se aplicam conceitos desta tecnologia com a seguinte filosofia: Compile uma vez e rode em qualquer lugar. A maioria das empresas, de qualquer porte, tm seus clientes cadastrados em algum tipo de banco de dados. Com a popularizao da internet, empresas, escolas universidades, querem dispor uma quantidade de informao pela rede, porm estas informaes devem possuir qualidade e veracidade. Nada melhor do que dispor estar informaes em pginas dinmicas que mostrem o atual estado de cada situao a cada modificao, facilitando a tomada de deciso. Java uma linguagem de programao que possui todos os pr-requisitos para soluo de problemas desta natureza. Por ser robusta, multiplataforma, orientada a objetos, despertam cada vs mais o interesse em desenvolver software de qualidade utilizando banco de dados. Definir formas de utilizao, tecnologias emergentes que podem facilitar o desenvolvimento destas solues foco de interesse.Dentro deste contexto, dispor informaes pela internet, com qualidade e baixo custo o que prope a linguagem Java com Java Server Page-JSP. Padres abertos de tecnologia como XML, Java, HTML fazem com que JSP ganhe especial importncia na integrao, utilizao e reutilizao dentro de um projeto. Assim, este trabalho procura mostrar uma parte da tecnologia Java que pode estar acessvel a todos.
1.1. OBJETIVOS
Mostrar como Java se comunica com banco de dados, suas vantagens e desvantagens. API JDBC Caracterizar uma pgina para internet com Java Server Page. Tipos de servidores e instalaes Mostra a sintaxe bsica de uma pgina dinmica. Mostrar como pginas JSP podem usar JavaBeans. Exemplos de aplicao
Os programas Java so divididos em grupos: Applets, Aplicaes, Servlets e Pginas Java Server Pages. Applet -Programa dinmico e interativo que pode rodar dentro de uma pgina web via um browser compatvel com Java, tais como Netscape e Internet Explorer. Possui restries de segurana para mquina cliente. Aplicaes (Frame)- So programas com interface grfica que so executados na mquina cliente como aplicativos desktop. Para que um Frame possa ser utilizado deve ser totalmente descarregado na memria local do usurio e seu acesso aos recursos de mquina deve ser completo. Servlets -So aplicaes que so executadas no console e que retornam uma pgina como resposta a um cliente, trabalham de forma semelhante a um CGI. Mantm as regras de negcio em uma camada parte, sendo a sua criao um pouco mais complexa que a simples criao de uma aplicao.
Java Server Page(JSP)- uma extenso de Servlets, um melhoramento. A diferena bsica que seu cdigo se integra ao HTML de uma pgina do navegador. Todas as operaes que so realizadas com Servlets podem tambm fazer parte de operaes de pginas JSP, mas o inverso no ocorre. Esta diferena existe devido ao fato de que nem todos os servidores de pginas que suportam Java rodam as TAGs do JSP. Toda aplicao Java sempre executada em um interpretador de comando chamado JVM (Java Virtual Machine), o que garante que a mesma aplicao feita em plataforma Windows possa ser executada da mesma forma em uma plataforma Linux e vice-versa. A figura 1.2 mostra a construo do cdigo binrio feito pelo compilador Java.
Variveis - So os dados dos objetos. Atributos Dados contidos em uma classe, cada qual tendo um tipo. Mtodos - Operaes realizadas. Agregao(ou composio)- a idia de que o estado de um objeto formado por outros objetos. A relao de agregao chamada de tem um, como em um carro tem um motor. Mtodos As operaes contidas em uma classe, so chamadas mtodos de uma classe. Argumentos mtodos podem opcionalmente receber argumentos. Retorno de valores mtodos podem retornar valores ou instancias de classes. Encapsulamento-Capacidade de um objeto possui uma parte privada, acessvel somente atravs dos mtodos definidos na sua classe. Herana- o mecanismo que permite a uma classe herdar todo o comportamento e os atributos de outra classe, adquirindo imediatamente toda a funcionalidade de uma classe existente. Uma classe que herda de outra classe chamada de subclasse e a classe que fornece a herana chamada de superclasse.
Comparaes entre linguagens imperativas e OO -Paradigma Procedural: Varivel, Funo/Procedimento, Chamada de funo. -Paradigma Orientao a Objetos: Classes, Objeto / Instncia, Operao / Mtodo, Envio de Mensagem.
Quando
executada pelo servidor, e ento gerada uma pgina HTML que ser enviada de volta ao navegador do cliente. Permite ao desenvolvedor de sites produzir aplicaes que permitam o acesso a banco de dados, o acesso a arquivos-texto, a captao de informaes a partir de formulrios, a captao de informaes sobre o visitante e sobre o servidor, o uso de variveis e loops entre outras coisas. Quem conhece Servlets ver que o JSP no oferece nada que voc no possa conseguir com os Servlets puros. O JSP, entretanto, oferece a vantagem de ser facilmente codificado, facilitando a elaborao e manuteno de uma aplicao. Alm disso, essa tecnologia permite separar a programao lgica (parte dinmica) da programao visual (parte esttica), facilitando o desenvolvimento de aplicaes mais robustas, onde programador e designer podem trabalhar no mesmo projeto, mas de forma independente. Outra caracterstica do JSP produzir contedos dinmicos que possam ser reutilizados. Como a lgica JSP envolve Java Beans, para tirar um bom proveito de JSP preciso entender a linguagem Java. bom que se tenha tambm algum conhecimento de HTML e criao de formulrios para web.
Tomcat(http://jakarta.apache.org) e Resin(http://www.caucho.com). A instalao do Resin bem simples, basta descompactar os arquivos e uma pasta, e executar o arquivo httpd.exe que encontra-se em sua pasta bin. J as configuraes do Tomcat, alm da instalao de seus arquivos em um diretrio, deve-se adicionar uma configurao a mais no classpath. Da seguinte forma: SET CATALINA_HOME= C:\tomcat Para iniciar o servidor, no diretrio bin escreve-se startup. Para visualizar suas pginas a chamada dever ser da seguinte forma: http://localhost:8080. 9
Todas as pastas web ficam em webapps, logo, se for criar um diretrio de testes e quiser visualizar seus arquivos JSP, a chamada ser da seguinte forma: http://localhost:8080/teste/teste.jsp A figura 2.3 mostra a estrutura de diretrios para um servidor web de pginas JSP.
Figura 2.3.-Estrutura de diretrios para o aplicativo teste. Para que possa correr tudo bem necessrio verificar se sua instalao do compilador est perfeitamente indicada nas variveis de ambiente. A tabela abaixo apresenta um exemplo de configurao em ambiente Windows e Linux. S.O. Local e arquivo Configurao SET JAVA_HOME=C:\java2 SET JDK_HOME=%JAVA_HOME% SET PATH=%JAVA_HOME%\bin;%JAVA_HOME% \jre\bin SET CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\jre\l ib;C:\drives\meudriver.jar Linux /etc/profile JAVA_HOME=/usr/java/j2sdk1.4.1_01 JDK_HOME=$JAVA_HOME PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_ HOME/jre/lib:.:/drives export JAVA_HOME JDK_HOME PATH CLASSPATH Tabela 2.3-Exemplo de configurao de varivel de ambiente
Windows C:\autoexec.bat
10
Arquivo teste.jsp <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %> <html> <head> <title>Pgina de teste JSP</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <% String msg="Teste de aplicao JSP"; out.print(msg); %> ou <%=msg %> </body> </html>
11
Comando Switch Pode-se utilizar este comando para substituir o comando if. switch(atributo){ case valor1: comando_para_valor1; break; case valor2: comando_para_valor2; break; ... case valorn: comandos_para_valorn; break; default: comando_para_valor1; } Comandos de repetio Todos os comandos sero repetidos de acordo com uma condio. o nico que termina com (;). do{ comandos_a_repetir }while(condio);
O comando de repetio while difere do anterior pela posio em que a condio testada. while(condio){ comandos_a_repetir; }
O comando for difere dos demais pelo controle mais direto do numero ocorrncia. O tipo pode ser definido no corpo de lao. for(atibuto_inicial ;condio; incremento){ comandos_a_repetir; }
12
3- SINTAXE JSP
3.1 OBJETOS IMPLCITOS Podemos criar novas instncias de uma classe Java dentro de scriptlets de pgina JSP para a produo de um contedo dinmico. Podemos, por exemplo, criar uma classe que realiza uma consulta em uma base de dados, e atravs de uma pginas JSP acessar seus mtodos que realizam a conexo ou consulta. Desta forma, os objetos gerados ficam todos sob controle do programador. Quando o servidor recebe uma solicitao de uma pgina JSP, gerado um Servlet, e durante esta transformao alguns objetos so gerados automaticamente sem a interveno do programador. Esses objetos so chamados de objetos implcitos. A tabela 5.3.9 mostra alguns objetos implcitos e suas APIs. Objeto Page Config Request Classe ou Interface javax.servlet..jsp.HttpJspPage javax.servlet.ServletConfig javax.servlet.http.HttpServletRequest Descrio Instncia de um servlet da pgina Dados de configurao de um servlet Dados de solicitao, podendo possuir parametros Dados de resposta Fluxo de sada para o contedo da pgina 13
response out
javax.servlet.http.HttpServletResposnse javax.servlet.jsp.JspWriter
session
application
exception pageContext
contedo da pgina javax.servlet.http.HttpSession Dados de sesso especficos de cada usurio javax.servlet.ServletContext Dados compartilhados por todas as pginas de aplicao javax.lang.Throwable Excees ou erros desconhecidos javax.servlet.Jsp.PageContext Dados de contexto para execuo da pgina Tabela 5.3.9-Objetos implcitos JSP
Cada um possui um conjunto de mtodos para tratar, validar ou mostrar algo atravs de uma pgina JSP. Sendo que para objetos relacionados ao servlet da pgina temos page e config. Objetos relacionadas a entrada e sada de dados de uma pgina temos request, response e out. Os objetos contextuais so applictaion, session, request e pageContext. Os objetos resultantes de erros podem ser encontrados em exception para o tratamento e identificao de erros na pgina. Desta forma se fosse necessrio construir uma pgina de validao usurios, onde os dados de nome e senha fossem passados como parmetros para uma consulta em um banco de dados teramos: No exemplo, por meio de uma pgina inicial e enviado a requisio da pgina com o mtodo POST, especificando a pgina de autenticao e passando como parmetros os valores de duas caixas de texto. Da mesma forma poderamos redirecionar para uma outra pgina com response.sendRedirect(http://sig.ufpa.br).
9. 10. 11. 12. 13. 14. 1. 2. 3. 4. 5. 6. 7. 8. <%@page language="java"%> <html> <head> <title>Autenticao</title> </head> <body> <% String nome=request.getParameter(nome); String senha=request.getParameter(senha); %> <p>Nome = <%=nome%></p> <p>Senha =<%=senha%></p> </body> </html>
14
3.2- DIRETIVAS BSICAS Uma diretiva da informaes especiais sobre pgina que ser gerada. A tabela 3.2 mostra as diretivas e seu comportamento em JSP. Atributo language extends import Tipo de valor Nome da linguagem de script Nome de classe Serve para importar uma classe ou pacote d classes. Permite que a pgina JSP faa uso de outras classes Booleano Tamanho do buffer. Se no for declarado o padro ser de 8kb Booleano Booleano, gera mltiplos servlets Usado para colocar delcarao de informao da pgina, como autor, empresa. do tipo String Endereo de uma pagina de erro. Boolenao Tipo MIME, conjuto de caracteres Valor padro <%@ page laguage=java%> Nenhum <%@ page import=java.util.*% <%@page import =teste.*%>
true <%@ page buffer=none%> <%@ page autoFlush=true%> true <%@page info=ufpa.br pgina de testes 2003%> Nenhum false text/hml;chatset=ISO8859-1
A diretiva page tem a seguinte sintaxe: <%@ page attribute1=valor1 attribute2=valor2 attribute3=... %> Abaixo relacionamos os atributos mais utilizados nas diretivas page: Atributo import import="package.class" ou import="package.class1,...,package.classN". Permite que seja especificado qual o pacote a ser importado. Por exemplo: <%@ page import="java.util.*" %> O atributo import o nico que pode aparecer vrias vezes. Atributo isThreadSafe isThreadSafe="true|false". O valor de true (default) indica o processamento normal do servlet quando mltiplas requisies podem ser acessadas simultaneamente na mesma instncia de servlet. O valor false indica que o servlet deve implementar SingleThreadModel, como requisio para cada requisio sinalizada ou com requisies simultneas sendo uma em cada instncia.
15
Atributo session session="true|false". O valor de true (default) indica que a varivel predefinida session (do tipo HttpSession) deve estar ligada a sesso existente, caso no exista uma sesso, uma nova sesso deve ser criada para lig-la. O valor false indica que sesses no devem ser usadas. Atributo buffer buffer="sizekb|none" Especifica o tamanho do buffer para o JspWriter out. O buffer padro definido pelo servidor.
Atributo autoFlush autoflush="true|false" O valor de true (default) indica se o buffer deve ser esvaziado quando estive cheio. O valor false, indica que uma exceo deve ser mostrada quando ocorrer overflows.
Atributo extends extends="package.class" Define se a super classe do servlet deve ser gerada. Atributo info info="message" Define uma string que pode ser recuperada pelo mtodo getServletInfo. Com esse atributo o autor pode adicionar uma cadeia de documentao pgina que sumariza sua funcionalidade. O valor padro para o atributo info a cadeia vazia.
Atributo errorPage errorPage="url" Especifica que a pgina JSP deve processar algum Throwables, mas no carreg-lo na pgina corrente.
16
Atributo isErrorPage isErrorPage="true|false" Define se uma pgina pode atuar como uma pgina de erro para uma outra pgina JSP. O default false.
Atributo language language="java" Especifica a linguagem que est sendo usada. Por enquanto o JSP suporta somente Java. include A diretiva include permite que sejam includos arquivos na hora em que a pgina JSP traduzida no servlet. Exemplo: <%@ include file="menu.jsp" %>
TIPOS DE TAGS <%! %> -Utilizadas por definir atributos e mtodos, podendo depois ser transformado em um Bean. <% JSP @taglib-Utilizada para habilitar uma biblioteca de Tags personalizadas. <%= %>-Utilizada impresso de dados em uma pgina dinmica.Equivale a out.print(variavel). <%<jsp: -%>- Utilizado para documentar trechos de cdigo. />-Tags utilizadas dentro do HTML que modificam o comportamento %>-Usadas para escrever trechos de cdigo Java dentro de pginas
de um pgina JSP.
17
CONTROLE DE FORMULRIOS (TAG FORM) O mais importante sobre HTML a tag form presente em todos os formulrios de cadastro.Basicamente podemos destacar: <input type=text> - Caixa de texto padro para entrada de dados <input type=hidden> - Objetos de tipos de texto ficam ocultos <input type=password> - Caixa de texto padro para campos com senha < input type=radio> - Objetos de escolha ,apenas um pode ser escolhido. < input type=checkbox> - Objeto de escolha, apenas um pode ser escolhido < input type=button> - Botes de ao < input type=submit>- Boto utilizado para submeter o formulrio. < input type=reset>- Boto para apagar os dados de um formulrio. < textarea rows=n cols=n></textarea>- Caixa de texto com vrias linhas(rows) e colunas(cols). <select><option></option></select>- So as listas de seleo. value- Armazena o valor digitado pelo usurio. name- Nome de uma tag.
Exemplo de utilizao da sintaxe: <form action="index.jsp" method="post" name="frmCad" target="_self" id="frmCad"> </form>
18
rquest.getParameter(nome_do_campo). Podem tambm ser feita atravs de coockies e sesses. 1. Atravs de cookies-So pequenos arquivos de texto que ficam armazenados na mquina cliente, podendo ser guardado valores de variveis para posterior recuperao. Deve ser feito com a declarao de uma varivel do tipo Cookie. Exemplo:Cookie c = new Cookie(nome_do_campo,valor_do_campo); Podem ser utilizados os respectivos mtodos: a. setValue()-Atribui um novo valor b. setDomain()-Define o servidor ou domnio onde o cookie pode ser acessado c. setMaxAge(int)-Tempo de vida do cookie(em segundos) d. response.addCookie(nome)-Envia um objeto para a mquina cliente a grava como um cookie. Exemplo: Cookie1.jsp <HTML> <BODY> <FORM action="Cookie2.jsp" method="post"> Informe seu nome: <INPUT name=edNome> <BR><BR> <INPUT type="submit" value=" Enviar "> </FORM> </BODY> </HTML>
19
Cookie2.jsp <HTML> <BODY> <% Cookie nomeCok = new Cookie("nome", request.getParameter("edNome")); response.addCookie(nomeCok); %> Cookie Gravado <INPUT type=button onClick="JavaScript:window.location.href='Cookie3.jsp'" value=" Prxima "> </BODY> </HTML>
Cookie3.jsp <HTML> <BODY> <% Cookie acheiCookie = null; Cookie[] meusCookies = request.getCookies(); for (int i = 0; i < meusCookies.length; i++) if (meusCookies[i].getName().equals("nome")) acheiCookie = meusCookies[i]; if (acheiCookie == null) out.println("Cookie no localizado"); else out.println("Cookie encontrado. Seu nome " + acheiCookie.getValue()); %> </BODY> </HTML>
2. Atravs de sesses- mais fcil de trabalhar porque nada gravado no cliente, porm levam mais tempo. O comando bsico o seguinte: session.putValue(nome_Sessao,valor_Sessao);
20
Exemplo:
Session1.jsp <HTML> <BODY> <FORM action="Sessao2.jsp" method="post"> Informe seu nome: <INPUT name=edNome> <BR><BR> <INPUT type="submit" value=" Enviar "> </FORM> </BODY> </HTML> Session2.jsp <HTML> <BODY> <% session.putValue("nome",request.getParameter("e dNome")); %> Sesso Gravada <INPUT type=button onClick="JavaScript:window.location.href='Sessa o3.jsp'" value=" Prxima "> </BODY> </HTML> Session3.jsp <HTML> <BODY> <% String acheiSessao = (String)session.getValue("nome"); if (acheiSessao == null) out.println("Sesso no localizada"); else out.println("Sesso encontrada. Seu nome " + acheiSessao); %> </BODY> </HTML>
21
22
Assim, o trabalho com JavaBeans pode ser realizado com qualquer tipo de classe fazendo uso de suas propriedades e disponibilizando em um segmento. Desta forma, a estrutura de seu projeto ficaria segundo a figura 4.
J a pgina JSP, que faria acesso aos seus mtodos, faria a construo de um novo objeto Dobro, passando como parmetro para numero um valor definido com corpo da pgina.
<jsp:useBean id="d" class="teste.Dobro"> <html> <body> <% int x = 10; int y = d.dobrar(x); %> <p>O valor de <%=x %> vezes 2 <%=y %> </p> </body> </html>
ACESSO A PROPRIEDADES As propriedades de um JavaBean podem ser acessadas atravs de instrues JSP, chamadas de elementos de ao: jsp:getProperty e jsp:setProperty. Usados
respectivamente para obter ou modificar a propriedade de u Bean. A sintaxe pode ser: <jsp:getProperty name=nome do Bean property= mtodo /> <jsp:setProperty name=nome do Bean property=mtodo />
23
Em ambas as formas sempre referencia-se que objeto deseja manipular e que propriedade ser chamada. O exemplo a seguir demonstra as propriedades jsp:getProperty e jsp:setProperty para uma classe chamada Soma.java. package teste; public class Soma{ int num1=0,num2=0; public void setNum1(int valor){ this.num1=valor; } public int getNum1(){ return this.num1; } public void setNum2(int valor){ this.num2=valor; } public int getNum2(){ return this.num2; } public int getResultado(){ if(num1==0 || num2==0) return 0; return num1+num2; } }
A classe foi definida para receber dois valores num1 e num2. Os valores de num1 e num2 sero modificado em um segmento JSP da seguinte forma: <html><head><title>Soma dois numeros</title></head> <body> <jsp:useBean id="sm" class="teste.Soma"/> <jsp:setProperty name="sm" property="*"/> <form><input type=text name="num1" size="5" value="<jsp:getProperty name="sm" property="num1"/>" > + <input type=text name="num2" size="5" value="<jsp:getProperty name="sm" property="num2"/>" > = <jsp:getProperty name="sm" property="resultado"/> <input type=submit value="Calcular" name="btn_calc"> </form></body></html>
24
interface de acesso a Banco de Dados padro SQL, o JDBC API que vem a ser Java Database Conectivity. Esta API fornece uma interface uniforme acesso a de Banco de Dados Relacionais. De maneira geral as principais tarefas realizadas so: estabelecer uma conexo com um banco de dados, enviar instrues SQL e processar os resultados recebidos. A idia do JDBC : O cliente com o seu browser chama uma pgina web, que permite entrada de dados, o qual carregado junto com a pgina a partir do Servidor Web e executado a conexo com o banco desejado. Este aplicao tem uma chamada interface JDBC Driver que permite a conversa com o Banco de Dados Relacional em um Servidor Remoto, permitindo a troca de dados entre o Cliente e o Servidor. A vantagem que estamos usando um padro aberto, no precisamos nos preocupar com distribuio de verses, a manuteno se d apenas no Servidor Web e principalmente, independente de plataforma.
25
tipo 2-JDBC-Java Partial Driver, converte chamadas feitas a API JDBC e chamadas internas a API do banco de dados. Tambm necessitam instalao na mquina em que a aplicao faz parte. tipo 3-Pure-Java JDBC Driver, a comunicao da API feita com uma aplicao intermediria com a finalidade de traduzir as chamadas JDBC e envia-las ao banco. Pode utilizado na internet e intranets. tipo Pure Java JDBC Driver, converte diretamente as chamadas JDBC para protocolos nativos do banco de dados, tornando-se um acesso nativo aos dados.
O pacote java.sql oferece a API para acessar e processar dados e uma base de dados. Todo o trabalho que ser realizado co as classes em seu projeto iro utilizar os seguintes elementos: A classe DriverManager A interface Driver A interface Connetcion A iterface Statement A interface ResultSet A interface PreparedStatement A interface ResultSetMetaData A tabela 5.1 mostra um resumo das principais classes da Interface da API JDBC. API JDBC java.sql.DriverManager Exemplo try{ Class.forName("org.firebirdsql. jdbc.FBDriver"); Descrio DriverManager uma classe. Sua principal funo manter uma lista de drivers de diferentes
}catch(ClassNotFoudException fornecedores e associar uma e ){ } aplicao-cliente com um driver que corresponda ao URL requerido. java.sql.Connection Connection A classe Connection representa
conexao=DriverManager.getCo uma nica transao da base nnection("jdbc:fabricante:porta: dados. Usa-se Connection para caminho, "usuario", "senha"); enviar uma serie de statements SQL base de dados e gerenciar a realizao completa da transao. 26
SQL base de dados e gerenciar a realizao completa da transao. java.sql.Statement Statement st = conexao.createStatement(); Executa a consulta SQL e retorna o ResultSet com o resultado da consulta. java.sql.ResultSet ResultSet rs=st.executeQuery(sql); while(rs.next()) rs.getString(1) ou rs.getString(campo) java.sql.SQLExeception catch(SQLException e){ } A classe SQLException herda da classe geral java.lang.Exception, que prov informao extra sobre erros nos acessos base de dados. Especfica o tipo de um campo de uma tabela. Retorna o valor do campo com ndice igual ao ndice da coluna ou o nome da coluna.
Para demonstrar a utilizao de consultas em pginas JSP, ser criado uma pgina contendo apenas as configuraes de comunicao com o banco de dados.Esta pgina atravs das diretivas descritas ser includa em ouras pginas para diferentes operaes de SELECT, INSERT, UPDATE e DELETE.
27
Linux
/etc/profile
Configurao SET JAVA_HOME=C:\java2 SET PATH=%JAVA_HOME%\bin;%JAVA_HOME% \jre\bin SET CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_H OME%\jre\lib;C:\drives\meudriver.jar JAVA_HOME=/usr/java/j2sdk1.4.1_01 JDK_HOME=$JAVA_HOME PATH=$PATH:$JAVA_HOME/bin:$JAVA_HO ME/jre/bin CLASSPATH=.:$CLASSPATH:$JAVA_HOME/li b:$JAVA_HOME/jre/lib:.:/drives export JAVA_HOME JDK_HOME PATH CLASSPATH
28
Para este modelo ser utilizado apenas scripts jsp, portanto no haver maiores dificuldades na reproduo deste modelo. A estrutura das janelas ser dividida em quatro etapas: gerenciadorUsuarios.jsp- Tela inicial da aplicao contendo instrues de include das demais. relusuarios.jsp Tela apresentao de resultados contendo a instruo select do banco de dados. rscadusuario.jsp Apresenta a resposta realizada por um cadastro de um novo usurios editausuario.jsp Apresnta a resposta para atualizao de registro rsexcluiusuario.jsp efetua a operao de excluso de um registro erro.jsp- Pgina padro de erro, contendo a instruo exception. topo.html Pgina padro que ser utilizada no topo das pginas.Mostra como devem ser construdas pginas HTML para posterior operao da diretiva include.
29
topo.html <table width="86%" height="104" border="0" align="center"> <tr valign="top"> <td width="18%" height="100"> <div align="right"><img src="../../imagens/logoufpa.gif" alt="http://www.ufpa.br" name="ufpa" width="82" height="97" align="texttop" id="ufpa"></div></td> <td width="56%"> <div align="left"> <p><strong>UNIVERSIDADE FEDERAL DO PARÁ<br> CENTRO DE CIÊNCIAS EXATAS E NATURAIS<br> SEMINF-2003<br> Curso:Java Server Page Prof.Armando Hage</strong></p> </div></td> <td width="26%"><div align="left"><img src="../../imagens/JavaJSPBD.jpg" width="99" height="86"></div></td> </tr> </table> relusuarios.jsp
<% //Nada ser gravado no cache do cliente response.setDateHeader("Expires", 0); response.setHeader("Pragma", "no-cache"); if (request.getProtocol().equals( "HTTP/1.1" )) { response.setHeader("Cache-Control","no-cache"); } %> <% String cor="";//Ser utilizado para manipular as cores das celulas int contador=0; ResultSet rs = stm.executeQuery("select * from usuario order by LOGIN"); %> <blockquote><blockquote> <p><strong>.: Usuários cadastrados :.</strong></p></blockquote></blockquote><table width="87%" border="0" align="center"> <tr><td width="48%" bgcolor="#66CCFF"><strong>Nome</strong></td> <td width="23%" bgcolor="#66CCFF"><strong>Login</strong></td> <td colspan="2" bgcolor="#66CCFF"> <div align="center"><strong>Manutenção</strong></div></td> </tr> <% while(rs.next()){ contador++; if(contador%2==0) cor="#FFFFCC"; else cor=""; %> <tr bgcolor="<%=cor%>"> <td><%=rs.getString("NOME")%></td> <td><%=rs.getString("LOGIN")%></td> <td width="10%"><div align="center"><a href="editausuario.jsp?codigo=<%=rs.getString("LOGIN")%>"><img src="../../imagens/alterar.gif" width="24" height="24" border="0"></a></div></td> <td width="19%"> <div align="center"><a href="rsexcluiusuario.jsp?codigo=<%=rs.getString("LOGIN")%>"><img rc="../../imagens/excluir.gif" width="24" height="24" border="0" onClick='javaScript:exclui("codigo");'></a></div></td> </tr> <%}%> </table><blockquote> <blockquote> <p><a href="cadastrousuario.jsp" target="_self">Adicionar suáiro</a> </p> </blockquote> </blockquote> 30
gerenciadorUsuarios.jsp Esta a tela inicial do formada pela incluso da tela padro erro, e a pgina que contm as configuraes de conexo. A chamada a operao de excluso feita por um JavaScript que repassa o cdigo para rsexcluiusuario.jsp que realiza a operao de excluo. <%@page errorPage="erro.jsp" %> <%@ include file="conexao.jsp"%> <html> <head> <title>Gerenciador de usuários</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <script language="JavaScript"> function exclui(codigo){ if(confirm("Deseja realmente excluir o usuairo ?")) document.location.href="rsexcluiusuario.jsp?codigo="+codigo; } </script> </head> <body><div align="center"> <%@ include file="topo.html"%> <strong><font size="5">.:: Gerenciador de Usuários ::.</font></strong> <%@ include file="relusuarios.jsp"%> </div></body></html>
conexao.jsp Contm dados de configurao com o banco de dados,classe JDBC do fabricante e a importao do pacote adequado sql.*. <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*"%> <% Class.forName("org.firebirdsql.jdbc.FBDriver"); Connection con = DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:C:\\resin2.1.10\\webapps\\hage\\WEB-INF\\dados\\Banco.GDB","SYSDBA","masterkey"); Statement stm = con.createStatement(); %>
31
erro.jsp
<%@ page isErrorPage="true"%> <%@ page import="java.util.*"%> <html><head><title>Erro na página</title><base target="_self"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head> <body bgcolor="#FFFFFF"><table border="0" width="98%"> <tr> <td width="100%" height="74" colspan="2"> <h1 align="center"><b><font color="#000000">Ocorreu um erro durante a execução o de um serviço !</font></b></h1> </td> </tr> <tr> <td width="32%" height="105"><span style="z-index: -1"><img src="../../imagens/policia.gif" name="erro" width="171" height="103" border="0" align="right" id="erro"></span></td> <td width="68%" valign="top" align="left"> <div align="left"> <dt id="textSection1" style="font-style: normal; font-variant: normal; font-weight: normal; line-height: 15pt; font-size: 13pt; font-family: verdana; color: black"><span id="errorText"><font face="Times New Roman, Times, serif">A página não pode ser exibida</font></span><font face="Times New Roman, Times, serif">.</font></dt> </div> <div align="left"> <dt id="textSection1" style="font-style: normal; font-variant: normal; font-weight: normal; line-height: 15pt; fontsize: 13pt; font-family: verdana; color: black"><font face="Times New Roman, Times, serif">Verifique sua permissão de acesso ou informe o seguinte erro ao analista.<br> Erro:<font color="#FF0000"><strong><%=exception.getMessage()%></strong></font></font></dt> <font face="Times New Roman, Times, serif"><br> <a target="_self" href="javaScript:history.go(-1);">Voltar</a> </font></div> </td> </tr> </table> </body> </html>
32
cadastrousuario.jsp <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*"%> <%@include file="conexao.jsp" %> <html><head><title>Cadastro de Usuários</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head><body> <form action="rscadusuario.jsp" method="post" name="frmCadastro" target="_self" id="frmCadastro"> <strong>Nome:</strong><input name="nome" type="text" id="nome"> <br><strong>Login: </strong><input name="login" type="text" id="login"> <br><strong>Senha:<input name="senha" type="password" id="nome3"> <br><input name="Eviar" type="submit" id="Eviar" value="Enviar"> <input name="limpar" type="submit" id="limpar" value="Limpar"> </strong> </form> <p><a href="gerenciadorUsuarios.jsp">Votar para a tela inicial</a></p> </body> </html> rscadusuario.jsp <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="erro.jsp" %> <%@include file="conexao.jsp" %> <% //Nada ser gravado no cache do cliente response.setDateHeader("Expires", 0); response.setHeader("Pragma", "no-cache"); if (request.getProtocol().equals( "HTTP/1.1" )) { response.setHeader("Cache-Control","no-cache"); } %> <% out.println("<SCRIPT language='JavaScript'>"); try{ stm.executeUpdate("insert into usuario(nome,login,senha) values('"+ request.getParameter("nome") + "','"+ request.getParameter("login") + "','"+ request.getParameter("senha")+ "');"); out.println("alert('O usuario "+ request.getParameter("nome")+" foi includo no sistema !.Pressione F5 para atualizar a pgina de relatrio.');"); }catch(Exception e ){ out.println("alert('Registro no includo');"); }finally{ out.println("history.go(-2);");out.println("</SCRIPT>"); } %>
33
rseditausuario.jsp <% String nome=request.getParameter("nome"); String login=request.getParameter("login"); String senha=request.getParameter("senha"); out.println("<SCRIPT language='JavaScript'>"); try{ stm.executeUpdate("update usuario set nome='" + nome + "', login='"+ login + "',senha='" + senha + "' where login='" + login + "'"); out.println("alert('Dados alterados com xito !. Pressione F5 para atualizar a pgina de relatrio.');"); }catch(Exception e ){ out.println("alert('Registro no atualizado !');"); }finally{ out.println("history.go(-2);"); out.println("</SCRIPT>"); } %> rsexcluiusuario.jsp <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="erro.jsp" %> <%@include file="conexao.jsp" %> <% //Nada ser gravado no cache do cliente response.setDateHeader("Expires", 0); response.setHeader("Pragma", "no-cache"); if (request.getProtocol().equals( "HTTP/1.1" )) { response.setHeader("Cache-Control","no-cache"); } %> <% String login=request.getParameter("codigo"); out.println("<SCRIPT language='JavaScript'>"); try{ stm.executeUpdate("delete from usuario where login='"+login+ "'"); out.println("alert('O usuario "+ login +" foi excludo do sistema.Pressione F5 para atualizar.');"); }catch(Exception e ){ out.println("alert('Registro no excluido');"); }finally{ out.println("history.go(-1);"); out.println("</SCRIPT>"); } %>
34
35
Tela de cadastro de administradores As notcias que sero apresentadas sero capturadas do banco de dados e mostradas apenas as que forem liberadas pelo administrador com o status de A(ativas) Toda notcia ser cadastrada pelo administrador, ter o status de ativa e posteriormente poder ser excluda. A estrutura de diretrios ser a seguinte:
36
Tela de cadastro de notcias DEFININDO O PADRO DE PROJETO COM JAVABEANS FACADE- A inteno do padro facade prover uma interface nica para um conjunto de interfaces de um subsistema. Torna a aplicao mais fcil j que toda a comunicao entre as classes ser a partir de uma nica interface.
Faade
37
O padro deve ser utilizado quando se deseja construir um interface mais simples de acesso as classes.Tornar o sistema mais reutilizvel. Para encapsular o acesso aos dados de SGBD. Auxiliam os clientes que necessitam de maior customizao disponibilizando o acesso atravs de uma nica interface de comunicao entre as classes.
Arquitetura proposta para projeto com JavaBeans Com a utilizao desta arquitetura pretende-se obter: Reduo do acoplamento do cliente-subsistema. o Ocorre tornando o Faade uma classe abstrata com subclasses concretas. Classe de subsistemas: pblicas ou privadas ? o A classe Faade deve ser naturalmente pblica. As classes envolvidas no processo podem ser privadas, mas por conveno de padronizao independente de linguagem de programao devem ser pblicas.
Abaixo segue o cdigo proposto, para um Banco de dados que tenha suporte a Stored Procedures, para a classe Usurio.
38
Conexao.java package teste; /** * * @author Armando Hage */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; /** Classe que realiza conexo com o banco de dados */ public class Conexao{ /** Para Windows.*/ String jdbc="jdbc:firebirdsql:localhost/3050:C:\\resin2.1.10\\webapps\\teste\\WEB-INF\\dados\\teste.GDB"; /** Para Linux.*/ // String jdbc="jdbc:firebirdsql:localhost/3050:/Bancos/teste.GDB"; String usuario = "SYSDBA"; String senha = "masterkey"; Statement st=null; Connection conexao=null; String msg=""; String sql=null; ResultSet rs=null; ResultSetMetaData rsmd=null; /** Construtor default */ public Conexao() { try{ Class.forName("org.firebirdsql.jdbc.FBDriver"); conexao = DriverManager.getConnection(jdbc,usuario,senha); st = conexao.createStatement(); } catch(ClassNotFoundException e) { msg="Driver JDBC-ODBC no encontrado!"; getmsg(); } catch(SQLException e) { this.msg="Problemas na conexao com a fonte de dados"; getmsg(); }} public void getmsg(){ System.out.println("Ateno Administrador o seguinte erro:" + this.msg+"\n"); } public void fecharConexao()throws SQLException{ try{ this.st.close(); this.rs.close(); this.conexao.close(); }catch(SQLException e){ this.msg="No foi possvel fechar a conexao"; getmsg(); e.printStackTrace();} } } 39
Usurio.Java /**@author Armando Hage */ package teste; /** Classe que gera novos objetos Usurio */ public class Usuario { private String login; private String senha; private String nome; /**Construtor default padro*/ public Usuario() { } public Usuario(String login,String senha,String nome){ this.login=login; this.senha=senha; this.nome=nome; } /**Mtodo para retornar o login de usurio * @return login*/ public String getLogin(){ return this.login; } /** Mtodo para modificar o valor de login de usurio * @param login Entra uma varivel do tipo login */ public void setLogin(String login){ this.login = login; } /**Mtodo para retornara senha de usurio * @return senha*/ public String getSenha(){ return this.senha; } /** Mtodo para modificar a senha de usurio * @param senha Entra com uma senha */ public void setSenha(String senha){ this.senha = senha; } /** Mtodo para retornar o nome de usurio * @return Nome do usurio */ public String getNome(){ return this.nome; } /** Mtodo para modificar o nome de usurio * @param nome Entra com o nome */ public void setNome(String nome){ this.nome = nome; } }
40
UsuarioBD.Java package teste; import java.sql.*; import java.util.Vector; public class UsuarioBD { private String sql=null; private String msg=null; private Conexao c; private Usuario u=null; Vector vetUsuario; /** Cria uma nova instancia de UsuarioBD */ public UsuarioBD() { this.c=new Conexao(); } public boolean autenticaUsuario(String login,String senha)throws SQLException{ this.sql="SELECT * FROM USUARIO WHERE LOGIN='" + login + "' AND SENHA='" + senha +"'"; try{ this.c.rs=c.st.executeQuery(this.sql); if(this.c.rs.next()) return true; else return false; }catch(SQLException e){ this.msg="Nao foi possivel recuperar o usurio " + login + ".\nErro:"+e.getMessage(); return false; }finally{ this.c.fecharConexao(); } } public boolean setUsuario(String operacao,Usuario u)throws SQLException{ String login=u.getLogin(); String senha=u.getSenha(); String nome=u.getNome(); this.sql="EXECUTE PROCEDURE SP_USUARIO('" +operacao+ "','" + login + "','" + senha +"','"+ nome +"');"; try{ this.c.st.executeUpdate(this.sql); return true; }catch(Exception e){ this.msg="No foi possvel executar a procedure no usurio " + login; return false; }finally{this.c.fecharConexao(); }} public Usuario getUsuario(String login,String senha)throws SQLException{ this.sql="SELECT * FROM USUARIO WHERE LOGIN='" + login + "' AND SENHA='" + senha +"'"; try{ this.c.rs=this.c.st.executeQuery(this.sql); while(this.c.rs.next()){ this.u = new Usuario(this.c.rs.getString(1),this.c.rs.getString(2),this.c.rs.getString(3)); } }catch(SQLException e){ this.msg="Nao foi possivel recuperar o usuario " + login + ".\nErro:"+e.getMessage(); getMsg(); }finally{this.c.fecharConexao(); } return this.u; } .....
41
Fachada.Java package teste; import java.sql.*;import java.util.Vector; public class Fachada { private String msg=null; private ResultSet rs=null; private UsuarioBD ubd; private NoticiaBD ntbd; public Fachada() { } //--------------Trabalho com a classe Usuario------------------------------public boolean autenticaUsuario(String login,String senha)throws SQLException{ this.ubd=new UsuarioBD(); if(this.ubd.autenticaUsuario(login, senha)) return true; else return false; } public boolean setUsuario(String operacao,Usuario u)throws SQLException{ this.ubd=new UsuarioBD(); if(this.ubd.setUsuario(operacao, u)) return true; else return false; } public Usuario getUsuario(String login)throws SQLException{ this.ubd=new UsuarioBD(); Usuario u= new Usuario(); u=this.ubd.getUsuario(login); return u; } public Vector getUsuario()throws SQLException{ this.ubd=new UsuarioBD(); Vector vetUsuario=this.ubd.getUsuario(); return vetUsuario; } public Vector getUsuarioINI(String inicial)throws SQLException{ this.ubd=new UsuarioBD(); Vector vetUsuario=new Vector(); vetUsuario=this.ubd.getUsuarioINI(inicial); return vetUsuario; } .....
42