Programacao WEB
Programacao WEB
ATIVIDADE PRÁTICA
PROGRAMAÇÃO WEB
0
Denis Siqueira Moura RA: 3132898405
ATIVIDADE PRÁTICA
PROGRAMAÇÃO WEB
1
SUMÁRIO
1 INTRODUÇÃO3
2 DESENVOLVIMENTO4
2.1 PROCEDIMENTOS4
3 CONCLUSÃO19
2
1 INTRODUÇÃO
O presente portfólio relata uma aula prática de Programação Web que teve como
objetivo principal criar um projeto Spring Boot Java para o gerenciamento de usuários
em um sistema. O projeto, estruturado como uma Rest API, visa disponibilizar
endpoints para realizar operações de gerenciamento de usuários, seguindo o padrão
CRUD (Create, Retrieve, Update, Delete). Durante a aula prática, foram abordados
diversos aspectos essenciais no desenvolvimento de aplicações web, incluindo a
criação de um modelo de domínio, a estruturação das camadas lógicas (resource,
service, repository), a configuração de um banco de dados de teste (H2), a população
inicial do banco de dados e a implementação de tratamentos de exceções.
Além disso, para testar e validar as operações da API, foi utilizado o Postman, um
aplicativo que se destaca por sua capacidade de testar requisições HTTP, permitindo
obter respostas detalhadas que facilitam a verificação do funcionamento correto dos
endpoints.
Neste portfólio, serão detalhados os passos seguidos durante a aula prática, desde a
criação do projeto até a implementação das funcionalidades essenciais. Também
serão destacados os desafios enfrentados e as soluções encontradas ao longo do
processo de desenvolvimento. A aula prática teve como objetivo proporcionar uma
experiência real no desenvolvimento de uma aplicação web, abordando conceitos
fundamentais e práticos de programação web.
3
2 DESENVOLVIMENTO
2.1 PROCEDIMENTOS
4
O seguinte código foi utilizado:
package entities;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String email;
private String telefone;
private String password;
public User() {
}
public User(Long id, String nome, String email, String telefone, String password) {
this.id = id;
this.nome = nome;
this.email = email;
this.telefone = telefone;
this.password = password;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
6
4) Criação do Controller - UserResource:
package resource;
import entities.User;
import exceptions.ResourceNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import services.UserService;
import java.util.List;
@RestController
@RequestMapping(value = "/users")
public class UserResource {
@Autowired
private UserService userService;
@GetMapping
public ResponseEntity<List<User>> findAll() {
List<User> users = userService.findAll();
return ResponseEntity.ok(users);
}
@GetMapping(value = "/{id}")
public ResponseEntity<User> findById(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
@PostMapping
public ResponseEntity<User> insert(@RequestBody User user) {
user = userService.insert(user);
return ResponseEntity.ok(user);
7
}
@DeleteMapping(value = "/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
@PutMapping(value = "/{id}")
public ResponseEntity<User> update(@PathVariable Long id, @RequestBody
User user) {
try {
user = userService.update(id, user);
return ResponseEntity.ok(user);
} catch (ResourceNotFoundException e) {
return ResponseEntity.notFound().build();
}
}
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
8
6) População do Banco de Dados:
# Configuração da console do H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
9
Os seguintes códigos foram utilizados:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.entities.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import com.example.demo.entities.User;
import com.example.demo.repositories.UserRepository;
@Configuration
@Profile("test")
@Autowired
10
@Override
userRepository.saveAll(Arrays.asList(u1, u2));
import java.util.List;
import com.example.demo.entities.User;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.entities.User;
import com.example.demo.repositories.UserRepository;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
11
@Transactional(readOnly = true)
public List<User> findAll() {
return userRepository.findAll();
}
@Override
@Transactional(readOnly = true)
public User findById(Long id) {
Optional<User> obj = userRepository.findById(id);
return obj.orElse(null);
}
@Override
@Transactional
public User insert(User user) {
return userRepository.save(user);
}
@Override
@Transactional
public void delete(Long id) {
userRepository.deleteById(id);
}
@Override
@Transactional
public User update(Long id, User updatedUser) {
User entity = userRepository.getOne(id);
updateUserEntity(entity, updatedUser);
return userRepository.save(entity);
}
12
8) Na classe UserResource, que injeta o serviço UserService e implementa
as rotas findAll, findById, insert, delete e update:
import java.net.URI;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import com.example.demo.entities.User;
import com.example.demo.services.UserService;
@RestController
@RequestMapping(value = "/users")
public class UserResource {
@Autowired
private UserService userService;
@GetMapping
public ResponseEntity<List<User>> findAll() {
List<User> list = userService.findAll();
return ResponseEntity.ok().body(list);
}
@GetMapping(value = "/{id}")
public ResponseEntity<User> findById(@PathVariable Long id) {
User obj = userService.findById(id);
return ResponseEntity.ok().body(obj);
}
@PostMapping
public ResponseEntity<User> insert(@RequestBody User user) {
User obj = userService.insert(user);
URI uri =
ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(obj
.getId()).toUri();
13
return ResponseEntity.created(uri).body(obj);
}
@DeleteMapping(value = "/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
@PutMapping(value = "/{id}")
public ResponseEntity<User> update(@PathVariable Long id, @RequestBody
User updatedUser) {
User obj = userService.update(id, updatedUser);
return ResponseEntity.ok().body(obj);
}
}
9) Tratamento de Exceções:
package com.example.demo.services.exceptions;
import java.io.Serializable;
import java.time.Instant;
14
private Instant timestamp;
private Integer status;
private String error;
private String message;
private String path;
public StandardError() {
}
import java.time.Instant;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.example.demo.services.exceptions.ResourceNotFoundException;
@ControllerAdvice
public class ResourceExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<StandardError>
resourceNotFound(ResourceNotFoundException e, HttpServletRequest request) {
HttpStatus status = HttpStatus.NOT_FOUND;
StandardError err = new StandardError(
Instant.now(),
status.value(),
"Resource not found",
e.getMessage(),
request.getRequestURI()
);
return ResponseEntity.status(status).body(err);
}
}
16
10) Na classe UserService com os métodos findById, delete e update
modificados para incluir um try/catch que lança a exceção
ResourceNotFoundException:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class UserService {
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
Resumo:
Particularmente este trabalho foi o mais complexo até o presente momento do curso.
Muita lógica envolvida, juntamente com conhecimentos técnicos. As etapas foram
essenciais para a compreensão da estrutura de um projeto Spring Boot, a
configuração do banco de dados, a implementação das camadas lógicas, o tratamento
de exceções e a realização de operações de CRUD em uma aplicação web. A aula
prática proporcionou um ambiente de aprendizado prático e construtivo, preparando
para enfrentar desafios reais no desenvolvimento de aplicações web robustas e
funcionais em que o mercado de trabalho está cada vez mais exigindo do profissional
de desenvolvimento.
18
3 CONCLUSÃO
19