Olá desenvolvedores, ainda no contexto de correção de bugs e implementações de melhorias, no tutorial de hoje iremos implementar mais uma correção de bug. Iremos, por exemplo, especificar uma ação na página de cadastro de produtos, porque quando a partir da url uma requisição é feita para a servlet salvarUsuario um erro de NullPointerException é apresentado.
Assim, se tiver algum parâmetro de ação, a resposta a requisição será este parâmetro. Mas se nenhum parâmetro de ação for encontrado, a página será recarregada a partir do parâmetro passado “listartodos”.
Observe na URL – Uniform Resource Locator, o parâmetro de ação sendo recebido pela servlet salvarProduto, dessa forma se nenhum parâmetro for passado, ele permanecerá na mesma página.
FORMATANDO TABELA
Note que não determinamos como requisito obrigatório ao envio da imagem inserir algum anexo, seja arquivo de imagem, ou um pdf. Assim, quando o usuário não seleciona arquivos para serem submetidos, alguns bugs de formatação são apresentados. E isso está ocorrendo porque em nossa validação na página cadastroUsuario.jsp estamos retornando um texto.
O que faremos neste caso é corrigir a validação informando que se o campo de miniatura do objeto for diferente de nulo, então a miniatura deverá ser exibia. Mas se não, se for igual a nulo exibir a imagem padrão. O mesmo vale para o contexto dos arquivos de pdf.
CORRIGINDO ATUALIZAÇÃO DE IMAGEM E PDF
A implementação da sessão anterior resolve somente parte dos bugs. Vocês concordarão que tanto para o arquivo de imagem quanto para o pdf, se nada for informado não há o que ser processado. Assim, no método atualizar() iremos especificar quando os anexos deverão ser atualizados no banco de dados e quando nada precisará ser feito.
E para isso o primeiro passo é excluir na página cadastroUsuario.jsp os campos que havíamos implementados para temporariamente armazenar os arquivos.
Agora entenda, quando inserimos uma imagem, o fluxo de processamento entrará na condição em que, ele transformará a imagem em base64, e então a colocará no objeto usuário, irá inserir o contentType para gravar no banco e ao final do processo gera a miniatura.
Porém o que o sistema estava fazendo era, se nada havia sido informado, ele tentava buscar alguma imagem no armazenamento temporário, quando na verdade só precisaríamos ignorar estes atributos no momento da atualização.
Assim, o que iremos fazer é decidir quando iremos montar o SQL para atualizar a imagem e também o arquivo pdf. Para isso no objeto do usuário BeanCursoJsp.java iremos criar dois atributos booleanos e também os métodos set e get.
private boolean atualizarImage = true;
private boolean atualizarPdf = true;
Desse a modo, se alguma imagem for inserida, a base de dados será atualizada, mas se nada for inserido, apenas ignoraremos. E para que isso aconteça, no momento da atualização “setaremos” o atributo para false. E lembrem-se, estamos trabalhando com o método atualizar.
O mesmo raciocínio se aplicará ao arquivo de pdf, se nenhum arquivo foi anexado, nada precisará ser feito e iremos apenas ignorar.
IMPLEMENTANDO CONDIÇÃO DE ATUALIZAÇÃO
O primeiro passo para implementar a condição de atualização dos arquivos é separar, no método atualizar(), o que é referente a imagens e o que é arquivo de pdf.
Agora é ir trabalhando com o SQL de acordo com as condições. Instanciaremos uma classe StringBuilder que faz parte do pacote java.lang. esta classe nos permite manipular dados de Strings dinamicamente. Isso significa que ela se adapta ao tamanho dos arquivos, armazenando caracteres especificados pela sua capacidade. E quando precisa concatenar dados, não se torna necessário a criação de um novo objeto.
Então o próximo passo é justamente a concatenação das Querys SQL utilizando o append, que é um método utilizado para alocar novas strings concatenadas para o mesmo objeto.
CONDIÇÃO DE ATUALIZAÇÃO | IMAGEM
Agora entra a condição, a imagem e posteriormente o arquivo de pdf só serão concatenados para o objeto em questão, se tiver o anexo correspondente. Faça o mesmo para a miniatura. Atente-se para o posicionamento da vírgula, nós agora a movemos para o início, para não corrermos o risco de “quebrar” o SQL.
E esta mesma condição deverá ser implementada para os atributos da imagem e da miniatura, aqueles mesmos que isolamos dos demais.
CONDIÇÃO DE ATUALIZAÇÃO | ARQUIVO
Assim como procedemos com a imagem, o arquivo de pdf só será concatenado para o objeto em questão se tiver o anexo correspondente.
E esta mesma condição deverá ser implementada para os atributos do arquivo, aqueles que isolamos dos demais.
E finalizamos com a concatenação da condição do SQL para que a atualização do objeto seja concluída.
Sql.append(“WHERE id = + usuario.getId());
É necessário também “setar” o toString para que o objeto StringBuildr possa colocar a string SQL do comando preparedStatement.
PreparedStatement preparedStatement = connection.preparedStatement (sql.toString());
ORGANIZANDO A SEQUÊNCIA
IMPORTANTE: Embora tentamos neste tutorial “desrespeitado” as regras em função de uma melhor apresentação do passo a passo para você, é importante manter a sequência correta dos atributos, para que não surjam outros bugs.
E para que a sequência de imagens seja obedecida, mesmo quando o usuário insere uma imagem, mas não um arquivo de pdf, será necessário implementar mais uma condição. Porque se não o fizermos o preparedStatement não conseguirá fazer a interpretação.
Assim, se tiver uma imagem, mas não tiver o pdf, a imagem deverá ser inserida na sequência que caberia ao pdf.
E se tiver ambos os arquivos segue o fluxo natural de processamento inserido cada qual em sua sequência.
Mas e se o usuário inserir o pdf, porém não inserir uma imagem, ele precisará verificar a existência dessa condição e sequenciar de acordo com ela.
Mas se não, se tiver ambos os arquivos, novamente segue o fluxo natural de processamento inserindo cada qual em sua sequência.
EM POUCAS PALAVRAS
Com a correção de bugs e implementação das condições de lógica, fizemos a montagem do SQL dinâmico, organizando o sequenciamento também por meio de lógica. E este é o caminho para se tornar um programador de destaque no mercado, são esses tipos de sistemas que vocês irão desenvolver, e partir deste ponto as implementações começam a subir o nível de complexidade.
Então, como sempre sugiro, entenda a aula, assista novamente e refaça quantas vezes forem necessárias, só não avance com dúvidas. Eu fico por aqui e nós nos vemos no próximo tutorial.