Icefaces 2 Beta 2. FileEntry [ACTUALIZADA]

por | diciembre 3, 2010

En la beta 1 de Icefaces 2, existe un Issue en el componente FileInput, lo que impide su uso habitual. Al actualizar a la Beta 2 me llevé la sorpresa de que el componente FileInput había desaparecido <ice:inputFile>. Las notas de lanzamiento de la Beta 2 indican que este componente ha sido reemplazado por FileEntry que es parte de los nuevos componentes que está siendo desarrollada llamada “Advanced Components Showcase”.

A continuación explico como habilitar este componente para su uso.

Lo que necesitarás para seguir este documento es lo siguiente:

  • Netbeans 6.9.1
  • Icefaces 2 Beta 2
  • JSF 2

 

Para empezar declararemos el tag para acceder a los componentes ace(Advanced Components Showcase) en nuestro archivo xhtml

xmlns:ace="http://www.icefaces.org/icefaces/components"

Con el tag ace declarado podemos acceder a los nuevos componentes, entre los cuales se encuentra el FileEntry

<ice:form>
        <ace:fileEntry useOriginalFilename="true"
                       relativePath="files/"
                       fileEntryListener="#{user.listener}">
            <h:commandButton value="Cargar" />

        </ace:fileEntry>
 </ice:form>

Declaramos el form(<ice:form>) y el componente que reemplaza el inputFile  <ace:fileEntry>.

  • useOriginalFilename=”true” usa el nombre original del archivo cuando lo guarda en el servidor.
  • relativePath=”files/” aquí definimos una carpeta donde se guardará los archivos subidos, esta carpeta debe existir en el root del proyecto.
  • fileEntryListener=”#{user.listener}” definimos el bean me maneja el evento cuando damos clic en el botón para proceder a la carga.
  • h:commandButton value=”Cargar” actualmente es el único elemento que soporta la acción para subir los archivos, los desarrolladores manifiestan que en la versión final se podrá usar los componentes de botón de icefaces.

A continuación la clase del bean que controla la cargada del archivo:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.icefaces.component.fileentry.FileEntry;
import org.icefaces.component.fileentry.FileEntryEvent;
import org.icefaces.component.fileentry.FileEntryResults;

/**
 *
 * @author alejo
 */
@ManagedBean
@RequestScoped
public class User {

    /** Creates a new instance of User */
    public User() {
    }

    public void listener(FileEntryEvent event) {
        FileEntry fileEntry = (FileEntry) event.getSource();
        FileEntryResults results = fileEntry.getResults();
        for (FileEntryResults.FileInfo fileInfo :
            results.getFiles()) {
            if (fileInfo.isSaved()) {
                // Procesando el archivo
            }
        }
    }
}

Podemos apreciar las anotaciones que indican que es un bean de ámbito de Petición, las nuevas características de JSF 2. Y la forma de procesar el archivo cambia drásticamente a como se hacia con Icefaces 1.8. Podemos ver instancias a FileEntry y FileEntryResults.

Las expectativas son buenas con los nuevos componentes, gran expectativa han generado, esperemos entonces la liberación final.

Espero haya sido de su ayuda.

ACTUALIZACIÓN: 1/04/2011

La versión final de Icefaces2 esta lista, y esta actualización consta de ciertos cambios en los archivos de la vista y el controlador que se expusieron al inicio de este post, probado en producción se puede decir que esto es lo que se tiene que hacer para que el componente FileEntry funcione correctamete:

Primeramente la vista:

<ace:fileEntry id="fileEntryBuzon"
           useOriginalFilename="true"
           useSessionSubdir="true"
           absolutePath="/Documentos/files"
           fileEntryListener="#{controlador.listener}" >

           <h:commandButton value="Cargar Imagen"
                 styleClass="boton-cargar-imagen" />
</ace:fileEntry>

Ahora el controlador:

public void listener(FileEntryEvent event) {
       FileEntry fileEntry = (FileEntry) event.getSource();
       FileEntryResults results = fileEntry.getResults();
       for (FileEntryResults.FileInfo fileInfo : results.getFiles()) {
            if (fileInfo.isSaved()) {
                  path = fileInfo.getFile().getPath();
            }
            //aqui podemos guardar el path
             miDao.setImagenPath(path);
      }
}

Y para finalizar si al estar en producción les da algunos errores cuando el archivo es almacenado prueben agregando esto en el archivo web.xml:

<context-param>
     <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
     <param-value>false</param-value>
</context-param>

7 pensamientos en “Icefaces 2 Beta 2. FileEntry [ACTUALIZADA]

  1. James

    Ya esta la version final actualiza esta nota y pon un ejemplo que funcione, jaja

  2. pedro

    Hola amigo tengo un problema con este componente no se si me puedas ayudar ya que sube perfectamente el fichero pero cuando intento manejar el file info lanza una excepcion

    GRAVE: Error Rendering View[/nuevoTemplate.xhtml]
    java.lang.NullPointerException
    at javax.faces.context.ResponseWriterWrapper.writeText(ResponseWriterWrapper.java:289)
    at com.sun.faces.facelets.compiler.LiteralXMLInstruction.write(LiteralXMLInstruction.java:74)
    at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:75)
    at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:176)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:369)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

    este es el codigo que estoy ocupando
    for (FileEntryResults.FileInfo fileInfo : results.getFiles()) {
    if (fileInfo.isSaved()) {
    String path=fileInfo.getFile().getAbsolutePath();
    }
    }

    ya que necesito el path de donde queda almacenado. si pudieras ayudarme te lo agradeceria.

    estoy ocupando la ultima version de icefaces la 2.0 release y netbeans 6.9.1 con glassfish 3.0

    de antemano gracias.
    Atte. Pedro Hernandez Letelier

    1. Alejandro Ayala Autor

      Hola disculpa por respoder despues de dos siglos 🙂
      Prueba con esto para capturar el path a mi me funciona.

      path = fileInfo.getFile().getPath();

    2. Alejandro Ayala Autor

      Puedes revisar nuevamente el post porque hay una actualización que puede que ayude a resolver tu problema.

      Saludos

  3. deftones_sv

    Gracias por ejemplo, de todos los que probe, el de este sitio fue el unico que me funciono

  4. Carlos Vega

    Hola!.

    Gracias por el tutorial, sin embargo, no me funciona correctamente. Me podrían ayudar?.

    El archivo sube bien pero… me salen problemas al renderizar la página para dar la respuesta de éxito de la carga.

    ME sale lo siguiente:

    SEVERE: ICEfaces rendering required by icefaces-compat.jar components. Enable via .
    SEVERE: Error Rendering View[/public/edit/editProfile.xhtml]
    java.lang.UnsupportedOperationException: ICEfaces rendering required.
    at com.icesoft.faces.context.DOMContext.attachDOMContext(DOMContext.java:98)
    at com.icesoft.faces.renderkit.dom_html_basic.FormRenderer.encodeBegin(FormRenderer.java:66)
    at com.icesoft.faces.component.ext.renderkit.FormRenderer.encodeBegin(FormRenderer.java:41)
    at org.icefaces.impl.renderkit.RendererWrapper.encodeBegin(RendererWrapper.java:50)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1754)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:390)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:680)

    INFO: Adapting to Servlet 3.0 AsyncContext environment
    INFO: Using Servlet 3.0 AsyncContext
    INFO: Falling back to Thread Blocking environment

Los comentarios están cerrados.