File upload no JSF 2.2

Desde a primeira versão do JSF faz falta um componente par afazer upload de arquivos, para essa tarefa sempre usamos componentes do Tomahowk, RichFaces, Primefaces, etc. Agora, saindo a versão 2.2, que está para sair, teremos um componente nativo para isso.

Como esse não é um assunto novo, apenas a forma de fazer é nova, vamos direto para o exemplo.

<h:form enctype="multipart/form-data">
    <h:panelGrid columns="2">
        Nome: <h:inputText value="#{pessoaBean.pessoa.nome}"/>
        Idade: <h:inputText value="#{pessoaBean.pessoa.idade}"/>
        Fotografia: <h:inputFile value="#{pessoaBean.fotografia}"/>
        <h:commandButton value="Salvar" action="#{pessoaBean.salvar}"/>
    </h:panelGrid>
</h:form>

Agora o código do managed bean

@ManagedBean
@ViewScoped
public class PessoaBean {

    private Pessoa pessoa = new Pessoa();
    private javax.servlet.http.Part fotografia;
    //getters e setters

    public void salvar(){

        try{
            InputStream is = fotografia.getInputStream();
            //código usando Apache Commons IO
            byte[] bytes = IOUtils.toByteArray(is);
            pessoa.setFotografia(bytes);

            entityManager.persist(pessoa);
        }
        catch(IOException e){
            //logar exceção
        }
    }
}

Como podemos ver, esse código usa a interface javax.servlet.http.Part, introduzida na Servlet 3.0. Como já era de se esperar, a versão 2.2 do JSF vem se integrar melhor com as outras especificações do JavaEE. Nesse exemplo a integração é com Servlet 3.0, mas o JSF 2.2 também se integra melhor com CDI e EJB, pois agora é possível injetar recursos em praticamente qualquer componente JSF, como Conversores e Validadores. Até a versão anterior só conseguíamos fazer isso nos managed beans, o que muitas vezes nos “forçava” a usar o seam 3.

Por não ser algo complexo, fiz um post bem curto, mas espero que útil.

2 thoughts on “File upload no JSF 2.2

  1. Olá Gilliard!

    Comprei o seu livro Aplicações Java para web com JSF e JPA.

    É muito bom, e recomendo a todos.

    Eu gravei no banco de dados MySql uma foto em byte[] usando h:inputFile do JSF 2.2, como mostrado assima e tambem em seu livro.

    Agora estou tendo dificuldade em exibi-la na minha página JSF.

    Voce não teria um exemplo de como fazer isso usando o JSF. Em seu livro não encontrei nenhuma referencia nesse sentido.

    Não estou usando nenhum framework como: PrimeFaces e RichFaces…

    Estou usando JPA e Hibernate.

    Estou usando tambem JPAFilter como mostrado abaixo:

    @WebFilter ( servletNames ={“Faces Servlet”})
    public class JPAFilter implements Filter {
    private EntityManagerFactory factory ;

    @Override
    public void init ( FilterConfig filterConfig ) throws ServletException {
    this.factory=Persistence.createEntityManagerFactory (“unit-sgp”);
    }

    @Override
    public void destroy () {
    this.factory.close ();
    }

    @Override
    public void doFilter ( ServletRequest request , ServletResponse response ,
    FilterChain chain ) throws IOException , ServletException {
    // CHEGADA
    EntityManager manager = this.factory.createEntityManager ();
    request.setAttribute(“EntityManager”, manager );
    manager.getTransaction().begin ();
    // CHEGADA

    // FACES SERVLET
    chain.doFilter(request,response );
    // FACES SERVLET
    // SAÍDA

    try {
    manager.getTransaction().commit();
    } catch ( Exception e) {
    manager.getTransaction().rollback();
    } finally {
    manager.close();
    }
    // SAÍDA
    }
    }

    Um abraço, e até mais.

  2. Olá @Nilton Bertoldo
    Como você não está usando nenhum framework, o mais simples é usar uma Servlet como essa
    https://gist.github.com/4170587.
    Desculpa a demora pra responder no blog, mas pelo menos tinha te mandado uma prévia via e-mail… é que eu estava na correria e sem ter como escrever um código de exemplo, por isso mandei alguns links de outras opções.

    E que bom que você gostou do livro, qualquer coisa é só postar.

    Um abraço.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>