Статьи

Как загрузить с PrimeFaces 3.2 под Tomcat 6

Несколько месяцев назад я написал совет « Как загрузить с PrimeFaces под Tomcat 6 », который использовал версию PrimeFaces 2.2. С тех пор PrimeFaces был изменен, и в текущей версии 3.2 появилось много новых замечательных функций. В этом совете мы рассмотрим все эти функции.

Для начала вам понадобятся следующие JAR-файлы в папке / lib (вы можете взять их отдельно от Интернета или взять этот полный пример с http://www.filefactory.com/file/3lnbxg0x85d/n/primeFileUpload). рар, то они уже включены)

— primefaces-3.2.jar (это то, что я использовал, но вы можете взять последнюю версию библиотеки Prime Faces с сайта PrimeFaces — http://www.primefaces.org ).
— jsf-api-2.0.2-FCS.jar (опять же, возьмите последнюю версию, если считаете, что она вам нужна)
— jsf-impl-2.0.2-FCS.jar
— el-api-2.2.jar
— el- impl-2.2.jar
— commons-io-1.4.jar
— commons-fileupload-1.2.jar

Далее я настроил дескриптор приложения web.xml (в зависимости от версии Prime Faces эти конфигурации могут немного отличаться). В этом дескрипторе я настроил фильтр загрузки Prime Faces и тему PrimeFaces ui-lightness-1.0.4:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
 "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>            
    <context-param>
        <description>Context param for JSTL 1.2 to work in Tomcat 6 sun RI
        </description>
        <param-name>com.sun.faces.expressionFactory</param-name>
        <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
    </context-param>
    <context-param>
        <description>Parameter required by Mojarra 2.0</description>
        <param-name>com.sun.faces.allowTextChildren</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
        <param-value>true</param-value>
    </context-param>
    <!-- Adding a PrimeFaces theme --> 
    <context-param>
 <param-name>primefaces.THEME</param-name>
 <param-value>ui-lightness</param-value>
    </context-param>    
    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter
        </filter-class>
        <init-param>
            <param-name>thresholdSize</param-name>
            <param-value>10240</param-value> <!-- 10 Mb -->
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>  
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>   
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>   
</web-app>

Затем я написал простую страницу JSF для тестирования компонента загрузки Prime Faces:

<html xmlns="http://www.w3c.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Prime Faces</title>
        <style type="text/css">
            .ui-fileupload {
                width: 800px;
                margin: 0 auto;
            }
        </style>
    </h:head>
    <h:body>
        <h:outputText value="PrimeFaces Single Upload" 
                              style="font:30px bold; margin-left:15%;"/>
        <h:form enctype="multipart/form-data">
        <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
                mode="advanced"
                update="messages"
                label="Choose a file"
                sizeLimit="1048576"
                allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                invalidSizeMessage="The maximum file size allowed is 1 Megabyte !"
                invalidFileMessage="You are allowed to upload only images !"
                />
            <p:growl id="messages" showDetail="true" sticky="true"/>
        </h:form>

        <h:outputText value="PrimeFaces Multiple Upload" 
                              style="font:30px bold; margin-left:15%;"/>
        <h:form enctype="multipart/form-data">
        <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
                mode="advanced"
                update="messages"
                label="Choose a file"
                sizeLimit="10485760"
                multiple="true"
                allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                invalidSizeMessage="The maximum file size allowed is 10 Megabytes !"
                invalidFileMessage="You are allowed to upload only images !"
                />
            <p:growl id="messages" showDetail="true" life="5000"/>
        </h:form>

        <h:outputText value="PrimeFaces Auto Upload" 
                              style="font:30px bold; margin-left:15%;"/>
        <h:form enctype="multipart/form-data">
        <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
                 mode="advanced"
                 update="messages"
                 label="Choose a file"
                 auto="true"
                 sizeLimit="10485760"
                 allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                 invalidSizeMessage="The maximum file size allowed is 10 Megabytes !"
                 invalidFileMessage="You are allowed to upload only images !"
                 />
            <p:growl id="messages" showDetail="true" life="5000"/>
        </h:form>

        <h:outputText value="PrimeFaces Drag and Drop Upload" 
                              style="font:30px bold; margin-left:15%;"/>
        <h:form enctype="multipart/form-data">
        <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
                 mode="advanced"
                 update="messages"
                 label="Choose a file or drag and drop it here"
                 sizeLimit="10485760"
                 allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                 invalidSizeMessage="The maximum file size allowed is 10 Megabytes !"
                 invalidFileMessage="You are allowed to upload only images !"
                 />
            <p:growl id="messages" showDetail="true" life="5000"/>
        </h:form>
    </h:body>
</html>

Как видите, p: fileUpload очень гибкий и настраиваемый, что позволяет нам задавать характеристики загрузки с помощью нескольких простых атрибутов. В дальнейшем нам нужен управляемый компонент, способный справиться с самой загрузкой. Возможная реализация (вероятно, не самая лучшая, но точно не самая плохая) приведена ниже:

package com.extensions;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.faces.FacesException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.event.FileUploadEvent;

@ManagedBean(name = "fileUploadController")
@RequestScoped
public class uploadFilesBean {
   
    //Primitives
    private static final int BUFFER_SIZE = 6124;    
    private String folderToUpload;
    
    /** Creates a new instance of UploadBean */
    public uploadFilesBean() {
    }
    
    public void handleFileUpload(FileUploadEvent event) {
       
            ExternalContext extContext = 
                          FacesContext.getCurrentInstance().getExternalContext();
            File result = new File(extContext.getRealPath
                         ("//WEB-INF//files//" + event.getFile().getFileName()));
            System.out.println(extContext.getRealPath
                         ("//WEB-INF//files//" + event.getFile().getFileName()));

            try {
                FileOutputStream fileOutputStream = new FileOutputStream(result);

                byte[] buffer = new byte[BUFFER_SIZE];

                int bulk;
                InputStream inputStream = event.getFile().getInputstream();
                while (true) {
                    bulk = inputStream.read(buffer);
                    if (bulk < 0) {
                        break;
                    }
                    fileOutputStream.write(buffer, 0, bulk);
                    fileOutputStream.flush();
                }

                fileOutputStream.close();
                inputStream.close();

                FacesMessage msg = 
                            new FacesMessage("File Description", "file name: " +
                            event.getFile().getFileName() + "<br/>file size: " + 
                            event.getFile().getSize() / 1024 + 
                            " Kb<br/>content type: " + 
                            event.getFile().getContentType() + 
                                    "<br/><br/>The file was uploaded.");
                FacesContext.getCurrentInstance().addMessage(null, msg);

            } catch (IOException e) {
                e.printStackTrace();

                FacesMessage error = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                               "The files were not uploaded!", "");
                FacesContext.getCurrentInstance().addMessage(null, error);
            }       
    }    
}

Загруженные файлы отправляются в папку / WEB-INF / files.

Вот хороший скриншот загрузки Prime Faces:
Вот и все! Надеюсь, вам понравится!
Загрузите полный пример, протестированный под Tomcat 6, здесь