Olá desenvolvedores, hoje iremos implementar algumas atualizações e melhorias na aplicação que estamos desenvolvendo neste módulo. Entre tantas funcionalidades como a utilização de recursos de web service do viaCEP, o formulário de cadastro conta agora também com a opção de upload e download de imagens e outros arquivos.
É válido ressaltar novamente que no dia a dia de programador, provavelmente você jamais implementará um formulário com todas essas funcionalidades. Certamente haverá uma regra de negócio a guiá-lo na implementação, determinado o que deverá constar. O objetivo aqui é apresentar a vocês a lógica que existe na implementação de diferentes funcionalidades comuns a um sistema.
IMPLEMENTANDO UPDATE NA DAO
Assim sendo, a primeira atualização será na classe de conexão DaoUsuario.java onde iremos possibilitar que o usuário possa atualizar também as imagens e o pdf. Desse modo a Query de Update receberá os parâmetros do arquivo em si e o do tipo de arquivo, que então serão iguais aos valores passados no PreparedStatement. Assim de acordo com o código do usuário, todos os campos serão atualizados.
E na sequência iremos passar os valores para o PreparedStatement para que o sistema possa proceder com a atualização. Além do parâmetro o valor de sequência também deverá ser passado. Obviamente todo este bloco de código estará dentro do bloco try do método atualizar().
UPDATE DA IMAGEM E CURRÍCULO
Quando clicamos para atualizar algum dado do sistema, a imagem não é carregada, isto é, perdemos a imagem inserida. Então temos que solucionar este bug, e é o que iremos fazer agora. E o primeiro passo para esta correção é verificar na servlet Usuario.java onde os dados estão sendo perdidos.
O que de fato está acontecendo é que ao editar, não estamos em linha de código, efetivamente colocando o campo de imagem na tela. Assim, mesmo que tenha alguma imagem no objeto usuario, o que será recuperado é um atributo vazio, e é o que será mostrado na tela.
Dessa forma na página de cadastroUsuario.jsp no input que implementa a célula onde a foto é exibida na tabela, iremos inserir um atributo JSP para conseguirmos capturar os dados do objeto. Mas atente-se, serão dois inputs dentro de uma mesma célula.
O novo input carrega o atributo JSP responsável pela exibição da imagem, o fotoBase64 e um readonly, que tem a função de apenas manter o dado em memória temporariamente. Assim, o nome deste novo componente será fotoTemp.
O que estamos fazendo é mostrar o atributo da mesma forma que ele está gravado no banco, isto é, estamos mostrando no momento da edição o mesmo valor de quando o upload foi feito.
Entenda, quando o primeiro upload foi feito o arquivo de imagem foi gravado no banco, assim quando clicamos em editar para atualizar algum dado, buscamos as informações que estão na base de dados. Então se for a inserção de uma nova foto o sistema buscará no componente de foto (1º input). Mas se não, se for uma atualização ele buscará em fotoTemp (2º input), e assim manterá os mesmos dados.
Para esconder o campo do 2º input, visto que seu processamento se dá em segundo plano, recorreremos ao css.
<input type=”text” style=”display:none” ... />
IMPLEMENTANDO UPDATE NA SERVLET
Mas ainda não é o suficiente, o componente imagemFoto.getInputStream() da servlet Usuario.java está, no momento da edição tentando pegar a imagem em tempo de execução. Assim, como não estamos inserindo nenhuma imagem, ele exibe um campo vazio. A solução é encontrar uma forma de manter a mesma imagem que está no banco de dados.
Então, se o campo for diferente de nulo e uma nova imagem estiver sendo inserida, ele entra no if e o fluxo de processamento segue normal.
Mas se não, se uma nova imagem não foi selecionada, recuperaremos o valor do atributo, atualizando o componente recuperando o valor armazenado temporariamente no fotoTemp, mantendo assim o estado anterior do campo. Desse modo o valor será “setado” no objeto via requisição.
Quando estamos editando colocamos na tela os valores que estão no banco de dados, assim, quando clicarmos em salvar, é preciso resgatar o que está na tela, para atribuir novamente ao objeto.
E assim, temos uma forma de manter o dado em segundo plano, escondido, para recuperá-lo se necessário.
IMPLEMENTANDO UPDATE DO DOWNLOAD
Enfim, solucionamos o problema de exibição da imagem quando uma atualização é realizada. Entretanto, no processo em que antes havíamos perdido a imagem, perdemos também a possibilidade de fazer o download.
A correção deste bug é semelhante ao que fizemos nas sessões anteriores para a exibição da imagem, porém agora contemplaremos o atributo contentType. O conteType é o atributo responsável por identificar e resgatar o tipo do arquivo. Assim, começaremos adicionando de um novo input do tipo text onde atribuiremos um novo name para armazenamento temporário e o atributo.
E também igualmente se uma nova imagem não foi selecionada, recuperaremos o valor do atributo que informa o tipo do arquivo e possibilita que o download seja realizado. E o faz recuperando o valor armazenado no contentTypeTemp, mantendo assim o estado anterior do campo. Desse modo o valor será “setado” no objeto via requisição.
IMPLEMENTANDO CORREÇÕES NO UPLOAD DE PDF
No cadastroUsuario.jsp no input que implementa a célula onde a foto é exibida na tabela, iremos inserir dois atributos JSP para conseguirmos capturar os dados do objeto e então fazermos o upload e download do arquivo.
Os novos inputs carregam atributos JSP, onde o primeiro é o responsável pela exibição da imagem, o curriculoBase64 e o segundo é o que possibilitará o download, o contentTypeCurriculo.
Ambos implementam o readonly, que como já vimos tem a função de manter o dado em memória temporariamente. Assim, o name dos novos componentes serão fotoTempPDF e contentTypeTempPDF respectivamente.
E da mesma forma iremos proceder com a correção do upolad de imagens, onde poderemos diminuir um if, passando o argumento para dentro do if que verifica se um novo arquivo foi inserido.
Assim se o componente for diferente de nulo e se um novo arquivo está sendo inserido, o que está no escopo deste laço de decisão será processado.
Mas se não, se não se tratar de um novo arquivo sendo inserido, mas sim de uma atualização, o fluxo exemplificado abaixo será executado.
EM POUCAS PALAVRAS
Se fosse um campo de texto normal, não teríamos todo este trabalho. Mas por se tratar de arquivos, seja de imagem ou de pdf, quando somos redirecionados para editar algum campo os componentes dos arquivos não trabalham da mesma forma que os outros.
Assim, carregamos o valor em memória de um segundo componente e o ocultamos. E na servlet, antes de procedemos com o update é identificado que nenhuma imagem ou nenhum arquivo foi anexado, nesse instante os arquivos que temporiamente estão em seus componentes sendo processados em segundo plano são carregados. E assim podemos mantê-los.Espero que tenham gostado dessa atualização do sistema. Eu fico por aqui.