Exemplo completo com JSP JSTL Servlet JDBC PostGreSQL.pdf
-
Upload
gustavo-henrique -
Category
Documents
-
view
59 -
download
13
Transcript of Exemplo completo com JSP JSTL Servlet JDBC PostGreSQL.pdf
Java HomeAprender Java
Home IDE Eclipse Exemplo completo com JSP JSTL Servlet JDBCPostGreSQL
Exemplo completo com JSP JSTL Servlet JDBCPostGreSQL
5
Posted by André Félix | Sunday, 16 March, 2014 | No Comments
Exemplo completo com JSP JSTL Servlet JDBC
PostGreSQL
Olá Amigos,
Hoje criaremos um projeto completo com as tecnologias java: JSP + JSTL + Servlet + JDBC + PostgreSQL.
Claro que iniciaremos com uma breve descrição de cada uma delas.
Tecnologias utilizadas no exemploJSP (Java Server Page) é a tecnologia Java para construção de páginas dinâmicas.JSTL (JSP Stantard Tag Library) é uma biblioteca de tags que nos ajudam na construção de página dinâmica sem utilizarmos a scriplet (código Java diretamente
na página)Servlet são classes especiais java que recebem e respondem a requisições do protocolo HTTP.JDBC (Java Database Connectivity) é a forma padrão de acesso a Banco de dados em JavaPostgreSQL é um banco de dados relacional gratuito e de grande aceitação no mercado e com características muito boas para sistemas na InternetPadrão MVC – Model View Controller é um padrão de projeto que divide nossa aplicação em várias camadas
1. IntroduçãoEste exemplo começa uma página inicial index.jsp que exibe as informações de funcionamento do projeto. Ao clicar na imagem principal é exibido o menu.jsp.
Esta página tem a opção de listagem de alunos ou realizar a manutenção (Inclusão, alteração, consulta ou exclusão de um Aluno). Se escolhermos a opção de
cadastro será exibida a tela de manutenção.
Veja os campos disponíveis.
S S S S M
img 1 – Visão macro do nosso projeto
Para maior facilidade as classes e páginas também foram comentadas para auxiliar no entendimento e estudo do código.
Você deverá ter conhecimento prévio de Aplicação Web Java e utilização do Tomcat. Caso ainda não tenha, acesse os links informados no final deste artigo.
2 . Criação da tabela no banco de dados
Script de criação da tabela no Banco de dados:
12345678
CREATE TABLE IF NOT EXISTS tbaluno( matricula bigint NOT NULL, nome character varying(255), telefone character varying(255), email character varying(255), datacadastro date, CONSTRAINT tbaluno_pkey PRIMARY KEY (matricula));
É criado o comando que gera a tabela caso ela ainda não exista.
3 . Construção do projeto
Para começar vamos construir a estrutura do nosso projeto. Ao final deste tutorial o seu projeto deve estar como mostrado na imagem abaixo:
Cursos online Java – Moodle Sobre Tutoriais
+
Nela temos o nome do projeto (AcademicNetWeb)
Abaixo os nós mais importantes são:
-> Java Resources (src) (Aqui teremos os códigos fontes arquivos .java)
-> WebContent (Aqui ficam os arquivos web JSPs, imagens, JavaScript).
Para criar o projeto, no Eclipse, acesse o menu File >> Other…>> Na tela que aparece escolha Web >> Dynamic Web Project.
Dê o nome de “AcademicNetWeb” … Next >> Next … Na última tela Selecione a opição “Generate web.xml deployment descriptor”. >> Finish
Para saber mais sobre criação de projeto web no Eclipse Clique Aqui
Vamos criar a classe de entidade Aluno. O conteúdo deve ser o seguinte:
123456789101112131415161718192021222324252627282930313233
package br.com.feltex.entidade; import java.io.Serializable;import java.util.Date; /** * * Classe de entidade que possui os atributos do aluno * */public class Aluno implements Serializable { private static final long serialVersionUID = ‐309513637403441918L; private Long matricula; private String nome; private String telefone; private String email; private Date dataCadastro; public Aluno() {} public Aluno(Long matricula) { super(); this.matricula = matricula; } public Aluno(Long matricula, String nome) { super(); this.matricula = matricula;
3435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
this.nome = nome; } public Date getDataCadastro() { return dataCadastro; } public String getEmail() { return email; } public Long getMatricula() { return matricula; } public String getNome() { return nome; } public String getTelefone() { return telefone; } public void setDataCadastro(Date dataCadastro) { this.dataCadastro = dataCadastro; } public void setEmail(String email) { this.email = email; } public void setMatricula(Long matricula) { this.matricula = matricula; } public void setNome(String nome) { this.nome = nome; } public void setTelefone(String telefone) { this.telefone = telefone; } @Override public String toString() { return "Aluno [matricula=" + matricula + ", nome=" + nome + ", telefone=" + telefone + ", email=" + email + ", dataCadastro=" + dataCadastro + "]"; }}
A Classe DAO é a classe que utilizamos para conectar como Banco de Dados PostgreSQL.
12345678910111213141516171819202122232425262728
package br.com.feltex.dao; import java.sql.Connection;import java.sql.DriverManager; /** * Classe responsável pela Conexão com o Banco de dados. É utilizada por outras * classes de persistência de dados. * */public class DAO { public Connection getConexao() { Connection conexao = null; String usuario = "postgres"; String senha = "teco01"; String nomeBancoDados = "bdacademicnet"; try { Class.forName("org.postgresql.Driver"); conexao = DriverManager.getConnection("jdbc:postgresql://localhost:5432/" + nomeBancoDados, usuario, senha); } catch (Exception e) { e.printStackTrace(); } return conexao; }}
A classe AlunoDAO é responsável por realizar todas as operações com Banco de dados.
Nela encontramos os métodos de persistência (
alterar – alteração de um registro no banco de dados
excluir – exclui um registro no banco de dados
existe – Verifica a existência de uma matrícula informada no banco de dados
inserir – incluirá os dados de um aluno no banco de dados
listar – retorna todos os registros existentes no banco de dados
consultar – retorna um registro identificado com a matrícula informada
)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
package br.com.feltex.dao; import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import java.util.ArrayList;import java.util.List; import br.com.feltex.entidade.Aluno; /** * * Classe de Persistência de dados dos objetos de Aluno * é "filha" da Classe DAO. * */ public class AlunoDAO extends DAO { public void alterar(Aluno aluno) { try { Connection conexao = getConexao(); PreparedStatement pstmt = conexao .prepareStatement("Update tbaluno SET nome = ?, telefone = ?, email = ?, datacadastro = ?" + " WHERE matricula = ? "); pstmt.setString(1, aluno.getNome()); pstmt.setString(2, aluno.getTelefone()); pstmt.setString(3, aluno.getEmail()); pstmt.setDate(4, new java.sql.Date(aluno.getDataCadastro().getTime())); pstmt.setLong(5, aluno.getMatricula()); pstmt.execute(); pstmt.close(); conexao.close(); } catch (Exception e) { e.printStackTrace(); } } public void excluir(Aluno aluno) { try { Connection conexao = getConexao(); PreparedStatement pstm = conexao .prepareStatement("Delete from tbaluno where matricula = ? "); pstm.setLong(1, aluno.getMatricula()); pstm.execute(); pstm.close(); conexao.close(); } catch (Exception e) { e.printStackTrace(); } } public boolean existe(Aluno aluno) { boolean achou = false; try { Connection conexao = getConexao(); PreparedStatement pstm = conexao .prepareStatement("Select * from tbaluno where matricula = ?"); pstm.setLong(1, aluno.getMatricula()); ResultSet rs = pstm.executeQuery(); if (rs.next()) { achou = true; } pstm.close(); conexao.close(); } catch (Exception e) { e.printStackTrace(); } return achou; } public void inserir(Aluno aluno) { try { Connection conexao = getConexao(); PreparedStatement pstm = conexao .prepareStatement("Insert into tbaluno (matricula, nome, telefone, email, datacadastro) values (?,?,?,?,?)" pstm.setLong(1, aluno.getMatricula()); pstm.setString(2, aluno.getNome()); pstm.setString(3, aluno.getTelefone()); pstm.setString(4, aluno.getEmail()); pstm.setDate(5, new java.sql.Date(aluno.getDataCadastro()
858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
.getTime())); pstm.execute(); pstm.close(); conexao.close(); } catch (Exception e) { e.printStackTrace(); } } public List<Aluno> listar() { List<Aluno> lista = new ArrayList<>(); try { Connection conexao = getConexao(); Statement stm = conexao.createStatement(); ResultSet rs = stm.executeQuery("Select * from tbaluno"); while (rs.next()) { Aluno aluno = new Aluno(); aluno.setMatricula(rs.getLong("matricula")); aluno.setNome(rs.getString("nome")); aluno.setTelefone(rs.getString("telefone")); aluno.setEmail(rs.getString("email")); aluno.setDataCadastro(new java.util.Date(rs.getDate("datacadastro").getTime())); lista.add(aluno); } stm.close(); conexao.close(); } catch (Exception e) { e.printStackTrace(); } return lista; } public Aluno consultar(Aluno aluno) { try { Connection conexao = getConexao(); PreparedStatement pstm = conexao .prepareStatement("Select * from tbaluno where matricula = ?"); pstm.setLong(1, aluno.getMatricula()); ResultSet rs = pstm.executeQuery(); if (rs.next()) { aluno.setMatricula(rs.getLong("matricula")); aluno.setNome(rs.getString("nome")); aluno.setTelefone(rs.getString("telefone")); aluno.setEmail(rs.getString("email")); aluno.setDataCadastro(new java.util.Date(rs.getDate("datacadastro").getTime())); } pstm.close(); conexao.close(); } catch (Exception e) { e.printStackTrace(); } return aluno; }}
138
AlunoServlet a principal classe do nosso projeto. Ela é a controladora da navegação. Todas as requisições de acesso ao banco de dados, controle de navegação,
leitura de dados da tela ou envio para o destino de erro ou sucesso é responsabilidade desta classe. Seguindo o padrão MVC ela é o Contoller.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
package br.com.feltex.servlet; import java.io.IOException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List; import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import br.com.feltex.dao.AlunoDAO;import br.com.feltex.entidade.Aluno; @WebServlet("/AlunoServlet")public class AlunoServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String acao = request.getParameter("acao"); String destino = "sucesso.jsp"; String mensagem = ""; List<Aluno> lista = new ArrayList<>(); Aluno aluno = new Aluno(); AlunoDAO dao = new AlunoDAO(); try { //Se a ação for DIFERENTE de Listar são lidos os dados da tela if (!acao.equalsIgnoreCase("Listar")) { aluno.setMatricula(Long.parseLong(request.getParameter("matricula"))); aluno.setNome(request.getParameter("nome")); aluno.setTelefone(request.getParameter("telefone")); aluno.setEmail(request.getParameter("email")); //Faz a leitura da data de cadastro. Caso ocorra um erro de formatação // o sistema utilizará a data atual try { DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); aluno.setDataCadastro(df.parse(request.getParameter("dataCadastro"))); } catch (Exception e) { aluno.setDataCadastro(new Date()); } } if (acao.equalsIgnoreCase("Incluir")) { // Verifica se a matrícula informada já existe no Banco de Dados // Se existir enviar uma mensagem senão faz a inclusão if (dao.existe(aluno)) { mensagem = "Matrícula informada já existe!"; } else { dao.inserir(aluno); } } else if (acao.equalsIgnoreCase("Alterar")) { dao.alterar(aluno); } else if (acao.equalsIgnoreCase("Excluir")) { dao.excluir(aluno); } else if (acao.equalsIgnoreCase("Consultar")) { request.setAttribute("aluno", aluno); aluno = dao.consultar(aluno); destino = "aluno.jsp"; } } catch (Exception e) { mensagem += e.getMessage(); destino = "erro.jsp"; e.printStackTrace(); }
8384858687888990919293949596979899100101102103
// Se a mensagem estiver vazia significa que houve sucesso! // Senão será exibida a tela de erro do sistema. if (mensagem.length() == 0) { mensagem = "Aluno Cadastrado com sucesso!"; } else { destino = "erro.jsp"; } // Lista todos os registros existente no Banco de Dados lista = dao.listar(); request.setAttribute("listaAluno", lista); request.setAttribute("mensagem", mensagem); //O sistema é direcionado para a página //sucesso.jsp Se tudo ocorreu bem //erro.jsp se houver algum problema. RequestDispatcher rd = request.getRequestDispatcher(destino); rd.forward(request, response); }}
4. Criação das páginasindex.jsp Página inicial do nosso projeto. Utilizamos aqui conteúdo HTML5 puro. Uma página simples, sem conteúdo dinâmico e que possui os links para o menu da
aplicação quando clicamos na imagem.
123456789101112131415161718
<!DOCTYPE html><html lang="pt"><head><title>Página Inicial</title></head><body> <div align="center"> <H1> Seja bem vindo ao sistema AcademicNet!</H1> <H2> Nesta versão utilizaremos as tecnologias: JSP + JSTL + Servlet + JDBC + PostGreSQL. </H2> <a href="menu.jsp"> <img src="imagem/AcemicNet.png"> </a> </div> <a href="http://www.feltex.com.br" target="_blank"> http://www.feltex.com.br</a> </body></html>
menu.jsp Página que conterá as opções de cadastros no nosso sistema. Também uma página simples, sem conteúdo dinâmico e que possui os links para o menu da
aplicação quando clicamos nos links. O primeiro chamará a página aluno.jsp. O Segundo chamará o Servlet AlunoServlet com a opção de listar todos os usuários
cadastrados no Banco de Dados.
12345678910111213
<!DOCTYPE html><html lang="pt"><head><title>Página Inicial</title></head><body> <div align="center"> <H1>Seja bem vindo ao sistema AcademicNet!</H1> <a href="aluno.jsp">Manter Aluno</a><br> <a href="AlunoServlet?acao=Listar">Listar Alunos</a><br> </div></body></html>
aluno.jsp Página que contém código dinâmico. Quando encontramos a marcação “${…}” significa que é um conteúdo que deve ser recebido pela página e que será
exibido. Nos campos de texto recebemos os dados de aluno, veja o exemplo: value=”${aluno.nome}” que recebe o campo nome do aluno.
Nesta página utilizamos HTML5. Então podemos ver no campo matrícula a palavra required. Isso informa que este campo é obrigatório. Não será possível enviar os
dados ao servidor sem o preenchimento dele.
Na linha abaixo definimos que o método de envio dos dados para o servidor será “post” e o destino no servidor será a nossa Classe Servlet: “AlunoServlet”
1 <form method="post" action="AlunoServlet">
O Atributo “autofocus” no campo nome determina que este campo receberá o cursor assim que a página for carregada no seu browser.
O atributo “placeholder” é o valor que será exibido nos campos quando eles estiverem vazios. Isso serve para informar ao usuário um valor possível a ser utilizado.
As linhas
12
<input type="submit" value="Enviar"> <input type="reset" value="Limpar"> <br />
Informam que temos um botão “submit” que envia os dados ao servidor e também um botão “reset” que limpa os valores exibidos nos campos do formulário.
12345678910111213141516171819202122232425262728293031323334
<!DOCTYPE html><html lang="pt"><head><title>Cadastro de Aluno</title></head><body> <div align="center"> <form method="post" action="AlunoServlet"> <fieldset> <legend>Cadastro de Alunos</legend> <label>Matrícula: </label><input name="matricula" required value="${aluno.matricula}" placeholder="2236541" /><br /> <label>Name:</label><input name="nome" autofocus="autofocus" placeholder="Nome" value="${aluno.nome}"/><br /> <label>Telefone:</label><input type="tel" name="telefone" placeholder="9999‐9999" value="${aluno.telefone}" /><br /> <label>Email:</label><input type="email" name="email" placeholder="[email protected]" value="${aluno.email}"/><br /> <label>Data Cadastro:</label><input type="date" name="dataCadastro" value="${aluno.dataCadastro}" placeholder="10/10/2014" /><br /> <label>Ação</label> <select name="acao" required> <option selected value="Incluir">Incluir</option> <option value="Alterar">Alterar</option> <option value="Excluir">Excluir</option> <option value="Consultar">Consultar</option> </select><br /> <input type="submit" value="Enviar"> <input type="reset" value="Limpar"> <br /> </fieldset> </form> </div></body></html>
alunoLista.jsp É uma página dinâmica que utilizamos vários recursos de JSTL. Nas primeiras linhas são declaradas as tags que serão utilizadas. Isso é feito com as
marcações
“@ taglib” para cada linha dessa há um “prefix” que será utilizado como abreviação no uso da TagLib.
A tag a seguir realiza um loop. Neste caso é lido o atributo “listaAluno” que foi enviado do AlunoServlet e será realizado um loop adicionando cada elemento a
variável “aluno”.
Já na linha ““ utilizamos TagLib para realizar a formatação de data no padrão dia/mês/ano (10/10/2014).
123456789101112131415161718192021222324252627282930313233
<!DOCTYPE html><%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><html lang="pt"><head><meta http‐equiv="Content‐Type" content="text/html; charset=ISO‐8859‐1"><title>Lista de Alunos</title></head><body> <div align="center"> <P>Lista de Alunos</P> <table border="1"> <tr> <td>Matricula</td> <td>Nome</td> <td>Telefone</td> <td>Data Cadastro</td> <td>Comandos</td> </tr> <c:forEach var="aluno" items="${listaAluno}"> <tr> <td>${aluno.matricula}</td> <td>${aluno.nome}</td> <td>${aluno.telefone}</td> <td><fmt:formatDate value="${aluno.dataCadastro}" type="both" pattern="dd/MM/yyyy"/> <td><a href="AlunoServlet?acao=Excluir&matricula=${aluno.matricula}">Excluir</a></td> </tr> </c:forEach> </table> <c:if test="${fn:length(listaAluno) > 0}"> Existem ${fn:length(listaAluno)} alunos! </c:if><br>
3435363738
</div> <a href="menu.jsp">Voltar</a> </body></html>
sucesso.jsp Esta página é exibida quando há uma atualização bem sucedida no banco de dados. É feito o uso de JSTL aqui.
Temos o uso do que é usado para exibir o atributo mensagem que recebido do AlunoServlet. Na linh “”
é realizado um include dinâmico da página de lista de alunos. Isso significa que será exibida a listagem de alunos ao carregar esta página.
1234567891011
<!DOCTYPE html><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><html lang="pt"><head><title>Página de Sucesso</title></head><body><H1>Mensagem JSTL: <c:out value="${mensagem}" /></H1> <jsp:include page="alunoLista.jsp"/></body></html>
A página erro.jsp é responsável por receber a variável “mensagem” e exibi-la. Esta página é mostrada sempre que há um problema de atualização de dados dos no
Banco de dados.
1234567891011
<!DOCTYPE html><html lang="pt"><head><title>Mensagens de Erro</title></head><body>Verifique o erro: ${mensagem} <a href="menu.jsp">Voltar</a></body></html>
Por fim temos o nosso arquivo web.xml que é bem simples para o nosso projeto. Ele apenas define qual será a página inicial da nossa aplicação. Atualmente é
index.jsp. Caso você queira uma página diferente, por exemplo, a de login. basta alterar a linha “index.jsp” para menu.jsp
123456789
<?xml version="1.0" encoding="UTF‐8"?><web‐app xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web‐app_3_0.xsd" id="WebApp_ID" version="3.0"> <welcome‐file‐list> <welcome‐file>index.jsp</welcome‐file> </welcome‐file‐list></web‐app>
Observe que temos também, nas pasta WEB-INF\lib os arquivos:
jstl.jar e standard.jar (Contém as tags que precisamos para uso de JSTL)
postgresql-9.3-1100.jdbc4.jar (Driver para realizar a conexão como Banco de dados PostgreSQL)
Esses arquivos são necessário para que o nosso projeto funcione.
Deixei disponível o projeto completo com o código fonte para auxiliar a todos no processo de aprendizado. Para baixar: Clique aqui
ConclusãoEste é um projeto simples que explica os conceitos necessários para construção de um aplicativo completo para Java Web.
Ele pode ser utilizado em qualquer Servidor Web (JBoss, Tomcat, Websphere, Weblogic), pois não há nenhuma configuração específica para uma implementação de
servidor.
Para utilizar este projeto com outros bancos de Dados (MySQL, SQL Server, Oracle, DB2) basta alterar a forma de conexão na classe “DAO”.
Links relacionadosRecomendo que leia: Como gerenciar a transação JPA com Hibernate via Filtro em projeto Web
Leia também: Exemplo completo com JSF Primefaces + EJB + Hibernate + MySQL + JMS (Topic)
Você irá gostar:Bean Transaction Management
Java Web
5
JDBC
Abraços e bons estudos.
Não esqueça de curtir este post nas rede sociais. Dê a sua contribuição social e
ajude o autor:
This entry was posted in Eclipse, Java, JavaEE, JSF, WildFly
S S S S M
Copyright Text Here.Biznez Theme by SketchThemes