Este é um post disponível para assinantes MVPVRaptor 3 - Revista Java Magazine 96 - Parte 3
No terceiro artigo da série daremos sequência ao estudo sobre o VRaptor 3 durante o desenvolvimento de uma aplicação web. Veremos aqui como implementar o controle de acesso através do login e permissões e como melhorar a interação do usuário com
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Java Magazine 96
Na segunda parte deste minicurso, vimos como deixar o sistema desacoplado utilizando interfaces e como reaproveitar funcionalidades com classes Genéricas. Além disso, aprendemos como é possível facilitar o desenvolvimento da parte visual do sistema utilizando templates e a biblioteca visual jQuery UI.
Qualquer sistema que preze por seus dados e pela integridade da informação necessita de um controle rígido de segurança. No entanto, é comum encontrarmos aplicações web que não possuem um bom controle de acesso ou que apresentam falhas que possibilitam o uso indevido por pessoas mal intencionadas. Diante deste fato surgiram diversos mecanismos de segurança, e com a evolução das tecnologias se torna cada vez mais fácil implementar este controle.
Este será um dos objetivos desta terceira parte da série: demonstrar como implementar um controle de acesso e permissão às ações do sistema. O controle será feito baseando-se no privilégio de cada um dos usuários, que por sua vez poderão ter mais ou menos direito de acesso às funcionalidades de acordo com suas tarefas dentro da organização. A partir disso, iremos possibilitar uma maior interação entre o usuário e a aplicação, deixando-o livre para enviar as capas dos filmes, fotos dos artistas e a do seu perfil, tudo com ajuda do VRaptor.
Como fazer download e upload de arquivos
O VRaptor, através de alguns componentes, facilita bastante a manipulação de arquivos em formato stream. Sem nenhum componente para nos auxiliar nesta tarefa, o trabalho fica um tanto quanto desgastante, e foi pensando nisso que estes componentes foram criados. Com eles não temos a necessidade de movimentar cada byte do arquivo, já que esta tarefa é feita automaticamente através de simples métodos. Assim, tirando proveito destes recursos, será criado um formulário para fazer o upload das capas dos filmes para o servidor, bem como a opção de apresentação destas imagens.
Fazendo upload da capa de um filme
Para iniciarmos a codificação da funcionalidade de upload de imagens, devemos adicionar na entidade Filme um atributo do tipo String (neste caso, imagem) que será responsável por manter o nome do arquivo. Em seguida é necessário criar um formulário com um campo de envio de arquivos, de acordo com a Listagem 1.
Listagem 1. exibir.jsp:
formulário de envio da imagem do filme.
<form action="${pageContext.request.contextPath}/filme/${filme.id}/imagem"
enctype="multipart/form-data"
method="post">
<input type="file"
name="file"/>
<input type="submit"
value="enviar"/>
</form>
Neste formulário, estamos fazendo um POST do arquivo escolhido incluindo o ID do filme na URI. Observe que o formulário deve estar configurado como enctype=“multipart/form-data” para suportar o envio de arquivos anexados, que em nosso caso será uma imagem. Após a configuração da view, devemos configurar o método que receberá esta imagem, como pode ser observado na Listagem 2.
Listagem 2. FilmeController.java:
método que recebe a imagem do filme em formato stream.
@Post("/filme/{filme.id}/imagem")
public
void uploadImage(UploadedFile file, Filme filme) {
try {
repository.uploadImage(file, filme);
} catch (Exception e) {
result.include("error",
e.getMessage());
}
result.redirectTo(this).exibir(filme);
}
No método uploadImage() é recebido como argumento a classe UploadedFile, que faz parte do VRaptor. Esta classe abstrai a manipulação do arquivo enviado facilitando seu transporte entre diferentes localidades. Após receber esta imagem, algumas validações são feitas na camada de negócios para garantir que o arquivo enviado possui a extensão adequada. Passando por esse teste, o nome da imagem é setado usando o ID do filme mais a extensão recuperada. A decisão de utilizar o ID como nome da imagem foi feita pelo fato deste nunca se repetir, sendo assim, cada imagem possuirá um nome único. Além disso, também é feita a verificação da existência do caminho no qual a imagem deverá ser enviada. Se o mesmo não existir, então será criado. Veja toda a lógica na Listagem 3.
Listagem 3. FilmeBusiness.java:
método que valida e faz a cópia da imagem para o servidor em formato stream.
public
void uploadImage(UploadedFile file, Filme filme) throws Exception {
"
ATENÇÃO! A exibição deste artigo foi interrompida.
Este é um post disponível para assinantes MVP
16 COMENTÁRIOS
Infelizmente não será abordado esta parte de relacionamento que diz respeito mais ao Hibernate que ao VRaptor. Porém em meu blog já publiquei o primeiro de 3 posts sobre Hibernate, só você acompanhar.
Se quiser aprender um pouco de como manipular a lista para o controller, este [1] post com jQuery mostra um pouco disso.
Abraço.
[1] http://www.wbotelhos.com.br/2010/12/06/manipulando-listas-com-jquery-e-vraptor-3

O que pode ser ?
Você precisa criar no mínimo o schema, pois o HBM só cria as tabelas. Você fez isso?
Só serão criada as tabelas após você acessar a aplicação web. Só iniciar o servidor não ativa o HBM.
Tem algo errado, pois o VRator nem sobe se não houver o schema criado e a JPA conseguir se conectar. Se você acessou a aplicação esta tudo criado.
Verifique se você deu refresh no schema e se esta olhando no lugar correto.
descobri o erro era simplesmente o InnoBD do mysql que não estava abilitado ai aplicação rodava e não sicronizava com banco.
O erro ficava meio camuflado nos logs.
Valeu pelo artigo, muito detalhado e fácil.
Obrigado.
Bons estudos. (:
Qual seria o persistence.xml para substituir para funcionar com esta versão do mysql.
Procurei em listas de discursão ainda niguém conseguiu resolver.
Se puder ajudar agradeço.
O persistence é o mesmo, o que pode mudar talvez seja no Hibernate.properties, onde ficam as configurações da conexão.
Essa versão do MySQL creio que tenha algumas peculiaridades quanto ao InnoDB. Tente trocar essa [1] linha por essa [2].
[1] hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
[2] hibernate.dialect=org.hibernate.dialect.MySQLDialect
Dessa forma será utilizado o Dialeto default do seu banco.
Me parece que um bug com hibernate para essa versão do mysql 5.5?
Vou continuar procurando alguma solução, pois este novo mysql 5.5 é bastante rápido.
Obrigado.
Space do autor



1
0
