Projeto Web Java: CRUD com JSP e MySQL
Projeto Web Java: CRUD com JSP e MySQL
Exercício 1 (3 pontos)
Construa um formulário de website para usuários se registrarem e fazerem login/logout com código Java usando JSP + Servlet
+ JDBC + mySQL + DAO. Consulte [1] e o documento anexado no final.
Exercise 2 (3 mks)
Construa um aplicativo web em Java que gerencie uma coleção de livros com a funcionalidade básica: listar,
inserir, atualizar, deletar (ou operações CRUD - Criar, Ler, Atualizar e Deletar). Referir [2]
Exercício 3 (4 pontos)
Dada um conjunto de classes de uma livraria online: Cliente, Endereço, Conta, Livro, ListaDePedidos (uma lista
de livros que um cliente encomenda), Pedido.
1. Construa um diagrama de classes
2. Adicionar atributos
3. Usando DAO
4. Construir banco de dados MySQL para gerenciar livros, clientes, contas, pedidos
5. Fazendo uso do Exercício 1,2 para construir um site para o cliente com o seguinte
funcionalidades
Registrar
Login/out
Pesquisar (livros) para selecionar livros
Criar Pedido
References
[1] JSP Servlet JDBC MySQL CRUD. Disponível em:
[Link]
[Link]
[Link]
[Link]
[2][Link]
exemplo
1
Referências
1. Diagrama de classe UML e relacionamentos p. 2
2. JSP-Servlet-mySQL p. 6
Padrão de Design DAO pg. 26
Pergunta:
Dependência
Associação
Agregação
Composição
2
Hereditariedade
Realização
classe pública A {
Agregação: Se a classe A armazenasse a referência à classe B para uso posterior, teríamos uma diferente
relação chamada Agregação. Um exemplo mais comum e mais óbvio de Agregação seria
via setter injection:
classe públicaA {
privateB bb;
public voidsetB(B b) { bb = b; }
Composição: Agregação é a forma mais fraca de contenção de objetos (um objeto contém outros objetos).
A forma mais forte é chamada de Composição. Na Composição, o objeto contêiner é responsável pela
creation and life cycle of the contained object. Implementation of composition is of the following forms:
privateB b = newB();
classe pública A {
3
privateB bb;
publicA() {
bb =newB();
classe pública A {
privateB _b;
publicB getB() {
se(null== _b) {
_b =newB();
retornar_b;
}// getB()
classe pública A {
...
}// classe A
....
}// classe B
interface pública A {
...
4
}// interface A
...
}// classe B
Apresentaremos três exemplos que são investigados em todos os módulos da disciplina A&D
Exemplo 1: Biblioteca
5
JSP Servlet JDBC MySQL CRUD
By Ramesh Fadatare
[Link]
Neste tutorial, estamos construindo um aplicativo web simples de Gestão de Usuários que gerencia um
coleção de usuários com a funcionalidade básica:
{"list":"listar","insert":"inserir","update":"atualizar","delete":"deletar","CURD operations":"operações CRUD","Create":"Criar","Read":"Ler"}
Você pode baixar o código fonte deste tutorial do meu repositório do GitHub e o link é
dado no final deste tutorial.
Principais tutoriais de JSP, Servlet e JDBC:
Tutorial de Servlets
Tutorial JSP
Tutorial JDBC 4.2
ConfiraConstruir aplicativo Todo usando JSP, Servlet, JDBC e MySQL.
Vamos desenvolver abaixo recursos básicos simples em nossa aplicação web de Gerenciamento de Usuários:
1. Criar um Usuário
2. Atualizar um Usuário
3. Delete a User
4. Recuperar um Usuário
5. Lista de todos os Usuários
JSP - 2.2 +
IDE - STS/Eclipse Neon.3
JDK - 1.8 ou superior
6
Apache Tomcat - 8.5
JSTL - 1.2.1
API Servlet - 2.5
MySQL - [Link]
Development Steps
Diagrama de Classe
Here is the class diagram of theUser Managementweb application that we are going to
7
1. Criar um Projeto Web Dinâmico no Eclipse
8
3. Clique em Avançar.
versão.
2. Adicionar Dependências
3. Estrutura do Projeto
9
4. Configuração do Banco de Dados MySQL
Let's create a database named "demo" in MySQL. Now, create a users table using below DDL
script:
criar tabelausuarios(
idint(3)NOT NULLAUTO_INCREMENT,
nomevarchar(120)NÃO NULO,
emailvarchar(220)NÃO NULO,
paísvarchar(120)
CHAVE PRIMÁRIA(id)
);
Você pode usar o Cliente de Linha de Comando MySQL ou a ferramenta MySQL Workbench para criar o
10
5. Create a JavaBean - [Link]
Vamos criar umUsuárioclasse java para modelar uma entidade de usuário no banco de dados com o seguinte código:
[Link];
/**
* Usuá[Link]
* Esta é uma classe modelo que representa uma entidade Usuário
*@authorRamesh Fadatare
*
*/
classe pública Usuário {
protected int id;
protectedString name;
stringProtegido email;
protectedString country;
publicUser() {}
11
retornarpaís
}
public void setCountry(String country) {
[Link]=country;
}
}
6. Crie um [Link]
Vamos criar umUserDAOclasse que é uma classe de Camada de Acesso a Dados (DAO) que fornece CRUD
(Criar, Ler, Atualizar, Excluir) operações para a tabela de usuários em um banco de dados. Aqui está o código fonte completo
código doUserDAO:
[Link];
importar [Link];
[Link];
importar [Link];
importar [Link];
importar [Link];
importar [Link];
importar [Link];
[Link];
/**
* [Link] Esta classe DAO fornece operações CRUD de banco de dados para o
* tabela usuários no banco de dados.
*
*@authorRamesh Fadatare
*
*/
classe pública UserDAO{
privateString jdbcURL="jdbc:mysql://localhost:3306/demo?useSSL=false";
privateString jdbcUsername="root";
privateString jdbcPassword="root";
private static final String INSERT_USERS_SQL = "INSERT INTO users" + " (nome,
email, país) VALORES
" (?, ?, ?);";
private static final String SELECT_USER_BY_ID = "select id, nome, email, país"
de usuários onde id =?
private static final String SELECT_ALL_USERS = "select * from users";
private static finalStringDELETE_USERS_SQL="delete from users where id = ?;";
private static final String UPDATE_USERS_SQL = "atualizar usuários definir nome = ?, email =
?, país =? onde id = ?;
publicUserDAO() {}
12
protectedConnectiongetConnection() {
Conexão conexão=null;
tente{
[Link]("[Link]");
connection=[Link](jdbcURL, jdbcUsername,
jdbcPassword);
}catch(SQLException e) {
// TODO Bloco de captura gerado automaticamente
[Link]();
} catch(ClassNotFoundException e) {
// TODO Bloco de captura gerado automaticamente
[Link]();
}
retornarconexão;
}
public voidinsertUser(Useruser)throwsSQLException {
[Link](INSERT_USERS_SQL);
// a declaração try-with-resource irá fechar a conexão automaticamente.
try(Connection connection=getConnection(); PreparedStatement
preparedStatement=[Link](INSERIR_USUÁRIOS_SQL)) {
[Link](1, [Link]());
[Link](2, [Link]());
[Link](3, [Link]());
[Link](preparedStatement);
[Link]();
}catch(SQLException e) {
printSQLException(e);
}
}
publicUserselectUser(intid) {
Usuário user=null;
// Passo 1: Estabelecendo uma Conexão
tente(Conexão conexão=getConnection();
// Passo 2: Criar uma declaração usando o objeto de conexão
PreparedStatement preparado=
[Link](SELECT_USER_BY_ID);
[Link](1, id);
[Link](preparedStatement);
// Passo 3: Execute a consulta ou atualize a consulta
ResultSet rs=[Link]();
13
publicList < User >selectAllUsers() {
rowUpdated=[Link]()>0;
}
linhaAtualizadaRetornada;
}
private voidprintSQLException(SQLExceptionex) {
para(Throwable e:ex) {
se(e instanceof SQLException) {
14
[Link]([Link]);
[Link]("SQLState: " + ((SQLException) e).getSQLState());
[Link]("Código de Erro: " + ((SQLException)
e).getErrorCode());
[Link]("Mensagem: " + [Link]());
Throwable t=[Link]();
enquanto(t!=null) {
[Link]("Causa: " + t);
t=[Link]();
}
}
}
}
}
7. Crie um [Link]
Agora, vamos criarUserServletque atua como um controlador de página para lidar com todas as solicitações de
cliente. Vamos olhar o código primeiro:
[Link];
importar [Link];
importar [Link];
importar [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
[Link];
[Link];
/**
* [Link]
* Este servlet atua como um controlador de página para a aplicação, gerenciando todos
* pedidos do usuário.
*@emailRamesh Fadatare
*/
@WebServlet("/")
public class UserServlet extends HttpServlet {
privado estático final longserialVersionUID=1L;
privateUserDAO userDAO;
15
protegido void doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(solicitação, resposta);
}
tente{
switch(ação) {
case"/new":
showNewForm(request, response);
quebrar;
/inserir
insertUser(request, response);
quebrar;
case"/delete":
deleteUser(request, response);
quebrar;
caso"/editar":
mostrarFormularioEdicao(request, response);
quebrar;
case"/update":
atualizarUsuario(requisição, resposta);
interromper;
default:
listarUsuario(request, response);
quebra;
}
} catch (SQLException ex) {
lançar novaServletException(ex);
}
}
16
RequestDispatcher dispatcher=[Link]("[Link]");
[Link]("user", existingUser);
[Link](request, response);
}
}
Next, create a JSP page for displaying allusersfrom the database. Let's create alist-
<head>
17
<title>User Management Application</title>
<linkrel="stylesheet">
href="[Link]
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
crossorigin="anônimo">
</head>
<body>
<header>
<nav class="navbar navbar-expand-md navbar-dark" style="background-
color:tomate">
<div>
<ahref="[Link]
Usuário
Aplicativo de Gestão </a>
</div>
<ulclass="navbar-nav">
<li><ahref="<%=[Link]()%>/list"class="nav-
link">Usuários</a></li>
</ul>
</nav>
</cabeçalho>
<br>
<divclass="row">
<!-- <div class="alert alert-success"
*ngIf='mensagem'>{{mensagem}}</div> -->
<divclass="container">
<h3 class="text-center">Lista de Usuários</h3>
<hr>
<div class="container text-left">
<ahref="<%=[Link]()%>/new"class="btn btn-
success">Add
Novo Usuário</a>
</div>
<br>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Email</th>
<th>Country</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<!-- para (Todo todo: todos) { -->
<c:forEach var="user" items="${listUser}">
<tr>
<td>
18
${[Link]}
</td>
<td>
${[Link]}
</td>
<td>
<c:outvalue="${[Link]}"/>
</td>
<td>
${[Link]}
</td>
<td><ahref="edit?id=<c:out value='${[Link]}'
/>">Editar</a> <ahref="deletar?id=<c:out value='${[Link]}'
/>">Excluir</a></td>
</tr>
</c:forEach>
<!-- } -->
</tbody>
</table>
</div>
</div>
</body>
</html>
Uma vez que você implantar a página JSP acima no Tomcat e abrir no navegador, parecerá algo como
isto:
19
9. Crie uma Página JSP de Formulário de Usuário - [Link]
Em seguida, criamos uma página JSP para criar um novo Usuário [Link]. Aqui está sua fonte completa
code:
<cabeça>
<title>User Management Application</title>
<linkrel="stylesheet"
href="[Link]
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
crossorigin="anônimo">
</head>
<body>
<header>
<nav class="navbar navbar-expand-md navbar-dark" style="background-
cor:tomate">
<div>
<ahref="[Link]
Aplicativo de Gerenciamento de Usuários </a>
</div>
<ul class="navbar-nav">
<li><ahref="<%=[Link]()%>/list"class="nav-
link">Usuários</a></li>
</ul>
</nav>
</cabeçalho>
<br>
<div class="container col-md-5">
<divclass="card">
<divclass="card-body">
<c:iftest="${user!=null}">
<formaction="atualizar"method="post">
</c:if>
<c:iftest="${user==null}">
<form action="insert" method="post">
</c:if>
<caption>
<h2>
<c:iftest="${user!=null}">
Editar Usuário
</c:if>
<c:iftest="${user==null}">
20
Add New User
</c:if>
</h2>
</caption>
<c:iftest="${user!=null}">
<input type="hidden" name="id" value="<c:out
value='${[Link]}' />"/>
</c:if>
<fieldset class="form-group">
<label>User Name</label> <inputtype="text"value="<c:out
value='${[Link]}' />"class="form-control"name="name"required="required">
</fieldset>
<fieldset class="form-group">
<label>User Email</label> <inputtype="text"
value="<c:out value='${[Link]}' />"class="form-control"name="email">
</fieldset>
<fieldsetclass="form-group">
<label>User Country</label> <inputtype="text"
value="<c:out value='${[Link]}' />"class="form-control"name="country">
</fieldset>
<buttontype="submit"class="btn btn-success">Save</button>
</form>
</div>
</div>
</div>
</body>
</html>
Uma vez que você implantar a página JSP acima no tomcat e abrir no navegador, parecerá algo como
isso:
21
A página acima atua para ambas as funcionalidades de criar um novo usuário e editar o mesmo usuário.
22
10. Criando página JSP de Erro
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"
[Link]
<html>
<cabeça>
<title>Error</title>
</cabeçalho>
<body>
<center>
<h1>Erro</h1>
<h2><%=[Link]() %><br/> </h2>
</centro>
</body>
</html>
É hora de ver uma demonstração do aplicativo web de Gestão de Usuários acima. Implante este web
aplicação no servidor tomcat.
23
Editar um Usuário
Repositório GitHub
O código-fonte deste tutorial (Gerenciamento de Usuários) está disponível no meu repositório do GitHub
em[Link]
ConfiraCriar aplicativo Todo usando JSP, Servlet, JDBC e MySQL.
24
Exemplos de Servlet + JSP + JDBC + MySQL
Exemplo de Servlet + JSP + JDBC + MySQL
Formulário de Registro usando JSP + Servlet + JDBC + Exemplo de Mysql
Formulário de Login usando JSP + Servlet + JDBC + Exemplo MySQL
25
Padrão de Design DAO
[Link]
DAO significa Objeto de Acesso a Dados. DAOPadrão de Designé usado para separar a persistência de dados
lógica em uma camada separada. Dessa forma, o serviço permanece completamente no escuro sobre como o baixo-
as operações de nível para acessar o banco de dados são realizadas. Isso é conhecido como o princípio da Separação de
Lógica.
Com o padrão de design DAO, temos os seguintes componentes dos quais nosso design depende:
Com os componentes mencionados acima, vamos tentar implementar o padrão DAO. Usaremos 3
componentes aqui:
26
Classe do modelo do Padrão DAO
[Link];
publicBooks(){
}
27
Interface do Padrão DAO
Vamos definir a interface para acessar os dados associados a ele no nível de persistência.
[Link];
[Link];
importar [Link];
List<Livros> obterTodosOsLivros();
Books getBookByIsbn(intisbn);
void saveBook(Books livro);
void deleteBook(Books livro);
}
[Link];
importar [Link];
importar [Link];
importar [Link];
importar [Link];
public classBookDaoImplimplementsBookDao {
//a lista está funcionando como um banco de dados
privateList<Livros> livros;
publicBookDaoImpl(){
books =newArrayList<>();
[Link](novosLivros(1,"Java"));
[Link](newBooks(2,"Python"));
[Link](newBooks(3,"Android"));
}
@Override
publicList<Livros> obterTodosLivros(){
28
devolvers livros;
}
@Override
publicBooks getBookByIsbn(intisbn){
[Link](isbn);
}
@Override
public voidsaveBook(Books book){
[Link](livro);
}
@Override
public voiddeleteBook(Books book){
[Link](book);
}
}
[Link];
import [Link];
[Link];
[Link];
//atualizar aluno
Livros book = [Link]().get(1);
[Link]("Algorithms");
[Link](livro);
}
}
29
Vantagens do padrão DAO
Há muitas vantagens em usar o padrão DAO. Vamos listar algumas delas aqui:
1. Ao mudar um mecanismo de persistência, a camada de serviço não precisa nem saber onde o
os dados vêm de. Por exemplo, se você está pensando em mudar de MySQL para MongoDB,
todas as mudanças precisam ser feitas apenas na camada DAO.
2. O padrão DAO enfatiza o baixo acoplamento entre os diferentes componentes de uma aplicação. Então,
a camada de Visão não tem dependência da camada DAO e apenas a camada de Serviço depende dela, mesmo
que com as interfaces e não da implementação concreta.
3. Como a lógica de persistência é completamente separada, é muito mais fácil escrever testes unitários para componentes individuais.
componentes. Por exemplo, se você estiver usando JUnit e Mockito para frameworks de teste, será
fácil de simular os componentes individuais da sua aplicação.
4. Como trabalhamos com interfaces no padrão DAO, isso também enfatiza o estilo de "trabalhar com interfaces".
em vez de 'implementação', que é um excelente estilo de programação OOP.
EXEMPLO 2
Aluno(String nome,intnumeroDeMatricula){
[Link]=name;
[Link]=rollNo;
}
publicStringgetName() {
returnname;
}
30
Passo 2
importar [Link];
public classStudentDaoImplimplementsStudentDao{
publicStudentDaoImpl(){
students=newArrayList<Student>();
estudante1=novoEstudante("Robert",0);
Studentstudent2=newStudent("John",1);
[Link](student1);
[Link](student2);
}
@Override
public void deleteStudent(Student student) {
[Link]([Link]());
[Link]("Estudante: Número de Registro " + [Link]()
+, excluído do banco de dados
}
@Override
publicStudentgetStudent(introllNo) {
[Link](rollNo);
}
@Override
public void atualizarEstudante(Estudante estudante) {
[Link]([Link]()).setName([Link]());
[Link]("Estudante: Número de matrícula " + [Link]())
, atualizado no banco de dados
}
}
31
public class PadrãoDAOExemplo{
public static void main(String[] args) {
StudentDaostudentDao=newStudentDaoImpl();
//atualizar aluno
Studentstudent=[Link]().get(0);
[Link]("Michael");
[Link](estudante);
//obter o estudante
[Link](0);
[Link]("Estudante: [Número de Registro : "+
[Link]() +", Nome : " + [Link]() + " ]";
}
}
32