Trabalho prático da disciplina de Linguagem de Programação II do CEFET-MG, voltado ao uso do framework SpringBoot integrado a Java. Atividade feita utilizando como referência o curso de Spring Boot de Autoria de Michelli Brito.
Os resultados foram positivos, condizentes com aquilo que era esperado tendo em vista o tutorial utilizado como base de estudos.
As configurações iniciais do projeto foram feitas e concluídas com sucesso, permitindo a criação da tabela associada à prática em um banco de dados MySQL.
Dando continuidade ao projeto em desenvolvimento, inicialmente é feita a configuração para a persistência de dados no banco previamente criado, usando uma interface a qual extendia a classe "CrudRepository", da qual se utilizou o método "save". O armazenamento dos dados de um evento de teste ocorreu corretamente, conforme exposto na figura a seguir.
Em sequência, é feita uma busca no banco de dados também utilizando métodos da interface que estende CrudRepository, de modo a recolher todos os eventos salvos no banco de dados e realizar sua listagem. Para tanto, cria-se na view 'index.html' a extrutura necessária para a passagem dos parâmetros dos eventos e sua exibição. Na classe "EventoController", cria-se uma função "listarEventos" a qual utilizando do método findAll() armazena um array de eventos cadastrados. Esse iterable é passado para a view mencionada usando de uma instância da classe "ModelAndView". Os resultados foram satisfatórios, atendendo às expectativas, conforme ilustrado abaixo.
Como última atividade realizada neste questionário, tem-se o ajuste das páginas HTML em Templates para que as mesmas possuam um layout mais agradável. O processo é feito com o acréscimo do diretório "Materialize" no diretório "Static" em resources, tal como a adaptação dos arquivos para se ajustarem ao framework. O resultado é exibido abaixo.
De modo a tornar o CSS das páginas anteriormente desenvolvidas ainda mais harmônico, são utilizadas classes já prontas do Materialize CSS as quais delimitam contêiners dentro dos quais as tabelas e formulários já apresentados foram inseridos para não ficarem tão próximos às margens das páginas. O resultado é apresentado em sequência.
No sistema em desenvolvimento, é importante ter acesso à página individual de cada evento, a qual conterá detalhes do mesmo, além de uma lista com os seus convidados. De modo a criar e acessar tais páginas de maneira automatizada e efetiva são feitas requisições no EventoController usando uma variável do tipo @PathVariable. Utiliza-se também de urls mvc automatizadas associadas à função implementada no Controller mencionado. O resultado é exposto nas figuras adiante.
Conforme mencionado no item anterior, os eventos cadastrados no sistema devem possuir uma lista de convidados. Esta deve conter instâncias de convidados, cada qual com nome e RG. De modo a representar estes indivíduos no código, é criada a classe Convidado, a qual tem a notação @Entity de modo a ser identificada como uma tabela no banco de dados, sendo o RG a chave primária (ID) da mesma. De modo a associar a entidade em questão com a entidade evento, são criadas dois objetos, um na classe Convidado, do tipo evento, o qual é identificado com a notação @ManyToOne, e outro na classe Evento, que corresponde a uma lista do tipo convidado a qual é classificada como @OneToMany. A primeira notação identifica que existem vários convidados associados à um só evento, ao passo que a segunda demonstra que existe um evento com muitos convidados. A tabela criada é apresentada abaixo.
Com a tabela e os relacionamentos devidamente estruturados, é criado um formulário para o recebimento dos dados de RG e Nome dos convidados na página do evento, conforme mostrado pela figura.
Uma vez criado o formulário de inserção de convidados no Banco de Dados, sua inserção propriamente dita pode ser feita utilizando uma instância de uma interface que extende a classe CrudRepository, de maneira bastante similar ao que foi feito durante o cadastramento de eventos. A interface criada é a ConvidadoRepository, a qual tem a instância cr no EventoaController. Cria-se uma requisição associada ao código do evento e o convidado, passados por post. Através do código, utiliza-se a função findByCodigo para encontrar o evento desejado. Através da função setEvento(), o evento em questão é vinculado ao convidado recebido por parâmetro. Por fim, usa-se a instância cr para efetivar o salvamento no banco. O resultado é exposto em sequência.
Conforme descrito no item anterior, os convidados já estão sendo adicionados ao banco de dados além de associados à diferentes eventos. De modo a fazer a exibição da lista associada à cada evento, utiliza-se de uma metodologia similar àquela usada na exibição de eventos. Inicialmente, cria-se uma função denominada findByEvento na interface ConvidadoRepository, a qual recebe um evento como parâmetro e retorna uma lista iterável de convidados. A lista retornada é armazenada no EventoController e então adicionada à view através do método addObject da instância ModelAndView utilizada. A lista é então recebida no template em uso e exibida através de configurações feitas usando divs e spans. O resultado é apresentado em sequência.
Embora o cadastro de eventos e convidados esteja ocorrendo de maneira satisfatória, percebe-se que caso se tente cadastrar algo com um dos campos vazios, a inserção no banco de dados acontece sem problemas, algo que não deveria ser feito. De modo a corrigir tal falha, modificaremos um pouco as funções associadas aos formulários, inserindo a anotação @valid nos campos que precisam ser verificados. Ademais, nas entidades, colocaremos os campos como @NotBlanck, indicando que o dado a ser inserido não pode ser nulo e precisa ter tamanho maior do que zero. Adicionamos ainda nas funções os "BindingResults" que indicarão a existência de erros e os "ReddirectAttributes" que indicarão as mensagens de retorno. Conforme a ausência ou presença de erros, é retornada uma mensagem de sucesso ou erro à View em cheque. Os resultados são expostos abaixo.
A conexão com o banco de dados pode ser passar por problemas devido ao período de tempo passado após o lançamento do vídeo, logo, podem ser implementadas as soluções descritas nos comentários abaixo.