ComputerScienceMaster /
Projetos-didaticos
Esse projeto reune projetos didáticos que você pode usar para aprender e combinar tecnologias diferentes
Loading repository data…
tiagotobias2003 / repository
Projeto didático que ensina iniciantes a criar e compreender uma aplicação Spring Boot. Aborda configuração inicial, criação de endpoints REST e estrutura com controladores, serviços e repositórios. Focado na simplicidade e prática, é base para estudos e projetos futuros em Java web.
Este documento apresenta uma análise detalhada de cada fase do desenvolvimento do projeto "Jogo de Dados", uma aplicação web desenvolvida com Spring Boot que demonstra conceitos fundamentais de desenvolvimento Java para iniciantes.
Nesta primeira fase do projeto, foi estabelecida a estrutura fundamental da aplicação através da criação das classes de domínio (Models) e suas respectivas camadas de acesso a dados e serviços.
Localização: com.lunaltas.dicegame.domain.AbstractEntity
Classe abstrata genérica que serve como base para todas as entidades do sistema, implementando funcionalidades comuns:
@Id e @GeneratedValue(strategy = GenerationType.IDENTITY) para geração automática de identificadoreshashCode(), equals() e toString() baseados no IDSerializable para suportar persistência e transmissão de dadosCaracterísticas técnicas:
@MappedSuperclass para permitir herança sem criar tabela própriaID extends Serializable permite flexibilidade no tipo de chave primáriaLocalização: com.lunaltas.dicegame.domain.User
Entidade que representa os usuários do sistema:
Atributos principais:
name (String): Nome do usuário (obrigatório, máximo 60 caracteres)email (String): Email do usuário (obrigatório, validado com @Email, máximo 60 caracteres)password (String): Senha do usuário (obrigatória, será criptografada posteriormente)role (String): Papel do usuário no sistema (padrão: "USER")Validações implementadas:
@NotBlank em todos os campos obrigatórios@Email para validação de formato de emailRelacionamentos:
@OneToMany com Bet: Um usuário pode ter múltiplas apostasLocalização: com.lunaltas.dicegame.domain.Bet
Entidade que representa as apostas realizadas no jogo:
Atributos principais:
name (String): Nome da aposta (obrigatório, máximo 60 caracteres)Relacionamentos:
@ManyToOne com User: Múltiplas apostas pertencem a um usuárioLocalização: com.lunaltas.dicegame.dao.AbstractDao
Classe abstrata genérica que implementa operações CRUD básicas usando JPA:
Métodos implementados:
save(T entity): Persiste uma nova entidadeupdate(T entity): Atualiza uma entidade existentedelete(PK id): Remove uma entidade pelo IDfindById(PK id): Busca uma entidade pelo IDfindAll(): Retorna todas as entidades do tipocreateQuery(String jpql, Object... params): Método auxiliar para consultas JPQL customizadasCaracterísticas técnicas:
EntityManager injetado via @PersistenceContextUserDao e UserDaoImpl:
com.lunaltas.dicegame.dao.UserDaocom.lunaltas.dicegame.dao.UserDaoImplAbstractDao<User, Long>BetDao e BetDaoImpl:
com.lunaltas.dicegame.dao.BetDaocom.lunaltas.dicegame.dao.BetDaoImplAbstractDao<Bet, Long>UserService:
UserDetailsService para integração com Spring Securitysave(), update(), delete(), findById(), findAll(), hasBets()BetService:
save(), update(), delete(), findById(), findAll()UserServiceImpl:
UserServiceUserDao e UserRepositoryPasswordEncoderloadUserByUsername() para autenticaçãoBetServiceImpl:
BetServiceBetDaoAo final desta fase, o projeto possuía:
Nesta segunda fase, foi realizada a integração completa entre as entidades JPA e o banco de dados PostgreSQL, configurando todas as dependências e mapeamentos necessários.
Spring Data JPA:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Driver PostgreSQL:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
Arquivo: src/main/resources/application.properties
Configurações de DataSource:
spring.datasource.url = jdbc:postgresql://localhost:5432/dice_game
spring.datasource.username = TOKA
spring.datasource.password = 123
Configurações JPA/Hibernate:
# Exibe as consultas SQL no console para debug
spring.jpa.show-sql = true
# Mantém a sessão JPA aberta durante o processamento de requisições
spring.jpa.open-in-view = true
Anotações utilizadas:
@Entity: Marca a classe como entidade JPA@Table(name = "users"): Define o nome da tabela no banco@Column: Especifica detalhes das colunas (nullable, length)@OneToMany(mappedBy = "user"): Define relacionamento um-para-muitos com BetEstrutura da tabela users:
id (BIGSERIAL PRIMARY KEY): Gerado automaticamentename (VARCHAR(60) NOT NULL): Nome do usuárioemail (VARCHAR(60) NOT NULL): Email únicopassword (VARCHAR NOT NULL): Senha criptografadarole (VARCHAR NOT NULL): Papel do usuário (padrão: "USER")Anotações utilizadas:
@Entity: Marca a classe como entidade JPA@Table(name = "bet"): Define o nome da tabela@ManyToOne: Define relacionamento muitos-para-um com User@JoinColumn(name = "user_id"): Especifica a coluna de chave estrangeiraEstrutura da tabela bet:
id (BIGSERIAL PRIMARY KEY): Gerado automaticamentename (VARCHAR(60) NOT NULL): Nome da apostauser_id (BIGINT FOREIGN KEY): Referência ao usuárioClasse: AbstractDao
O EntityManager é injetado via @PersistenceContext e utilizado para:
Persistência:
entityManager.persist(entity);
Atualização:
entityManager.merge(entity);
Remoção:
entityManager.remove(entityManager.getReference(entityClass, id));
Consultas:
entityManager.find(entityClass, id);
entityManager.createQuery("from " + entityClass.getSimpleName(), entityClass);
Anotações utilizadas nos serviços:
@Transactional(readOnly = false): Para operações de escrita (padrão)@Transactional(readOnly = true): Para operações de leitura (otimização)Exemplo em UserServiceImpl:
@Service @Transactional(readOnly = false)
public class UserServiceImpl implements UserService {
// Operações de escrita usam transação completa
@Override @Transactional(readOnly = true)
public User findById(Long id) {
return dao.findById(id);
}
}
Validações Bean Validation:
@NotBlank: Campos obrigatórios não podem ser vazios@Email: Validação de formato de emailValidações de Relacionamento:
Ao final desta fase, o projeto possuía:
Nesta terceira fase, foi implementada a camada de apresentação completa, conectando os controllers Spring MVC às views Thymeleaf e integrando tudo com os models e serviços já criados.
Localização: com.lunaltas.dicegame.Controller.UsersController
Rota base: /users
Endpoints implementados:
| Método HTTP | Rota | Descrição |
|---|---|---|
| GET | /users/index | Lista todos os usuários |
| GET | /users/new | Exibe formulário de criação |
| POST | /users/create | Salva novo usuário |
| GET | /users/show/{id} | Exibe detalhes do usuário |
| GET | /users/edit/{id} | Exibe formulário de edição |
| PUT | /users/update/{id} | Atualiza usuário existente |
| DELETE | /users/delete/{id} | Remove usuário |
Funcionalidades especiais:
Validação de Senha Customizada:
if (user.getPassword() != null &&
(user.getPassword().length() < 8 ||
user.getPassword().length() > 20)) {
result.rejectValue("password", "error.password",
"A senha deve ter entre 8 e 20 caracteres.");
}
Proteção contra Exclusão:
if (userService.hasBets(id)) {
redirectAttributes.addFlashAttribute("error",
"Usuário não pode ser deletado porque tem Bets associadas");
return "redirect:/users/show/" + id;
}
Mensagens de Feedback:
RedirectAttributes para mensagens de sucesso/erroLocalização: com.lunaltas.dicegame.Controller.BetsController
Rota base: /bets
Endpoints implementados:
| Método HTTP | Rota | Descrição |
|---|---|---|
| GET | /bets/index | Lista todas as apostas |
| GET | /bets/new | Exibe formulário de criação |
| POST | /bets/create | Salva nova aposta |
| GET | /bets/show/{id} | Exibe detalhes da aposta |
| GET | /bets/edit/{id} | Exibe formulário de edição |
| PUT | /bets/update/{id} | Atualiza aposta existente |
| DELETE | /bets/delete/{id} | Remove aposta |
Funcionalidades especiais:
UserServiceImpl - Método save():
@Override
public void save(User user) {
// Criptografa a senha antes de salvar
if (user.getPassword() != null && !user.getPassword().isEmpty()) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
}
dao.save(user);
}
UserServiceImpl - Método update():
@Override
public void update(User user) {
User existingUser = dao.findById(user.getId());
if (existingUser != null && user.getPassword() != null &&
!user.getPassword().isEmpty() &&
!user.getPassword().equals(existingUser.getPassword())) {
// Verifica se a senha já está criptografada
if (!user.getPassword().startsWith("$2a$") &&
Selected from shared topics, language and repository description—not editorial ratings.
ComputerScienceMaster /
Esse projeto reune projetos didáticos que você pode usar para aprender e combinar tecnologias diferentes
leticiapessoa /
O Seal Books é um projeto produzido para o curso de Desenvolvimento Web - Back End em Linguagem Java, proposto pela START LATAM & Rede Cidadã! Temos como intuito o empréstimo de livros focado em pessoas de baixo poder aquisitivo, que não tem acesso a esses materiais. Fornecemos um cadastro em nosso site, onde é possível realizar a reserva de livros, tanto literário quanto didático. utilizamos tecnologias como: HTML, CSS, JAVA EE, JDBC, JSP e MYSQL.
brunaoOG /
Um projeto que fiz 2 anos atrás, aprendendo "Flexbox" no CSS3. Não é completamente responsivo, material didático passado pela plataforma em que estudo. Um registro do meu progresso...
Rodrigowebdevdesign /
este projeto une duas paixoes para mim que são a musica e a programação! esta é a criação de um piano! que sim é bem simples porém bastante didático!!
Sadlark1993 /
Esse website é didático. É um projeto que foi usado para aprender a usar o Wordpress como CMS.
DevMatheusPontes /
Este projeto, é um exercício que fiz durante o curso da B7Web, onde o objetivo era replicar um layout já existente porém usando somente HTML, CSS E JAVASCRIPT, este projeto não tem fins lucrativos, apenas como exercício e fins didáticos.