我是primefaces的新手,我正在尝试在我的项目中实现fileUpload组件。 我已经打开了文档,但对我来说并不清楚,我的实现也不起作用。
第一行文件说:
“首先要做的是配置解析多部分请求的fileupload过滤器.FileUpload过滤器应该映射到Faces Servlet。”
建议使用此代码:
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>
org.primefaces.webapp.filter.FileUploadFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
到web.xml描述符
第一个问题: “...解析多部分请求的过滤器”。我明白这意味着如果我想上传超过1个文件,我应该使用该代码(我不确定)。 所以我想我应该错过,但是在互联网上我发现的大多数例子都应该实现这个代码。
第二个问题: 当我尝试在我的web.xml文件中实现过滤器时:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/configuration-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<listener>
<listener- class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- JSF Mapping -->
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>redmond</param-value>
</context-param>
</web-app>
我收到很多错误:
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/wals]]
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/wals]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
... 7 more
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Unknown Source)
at java.lang.Class.getDeclaredFields(Unknown Source)
at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106)
at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:261)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationFilterAnnotations(WebAnnotationSet.java:110)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:66)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:405)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 7 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
... 21 more
第三个问题: 这可能是由第一和第二个问题引起的,但我不确定。如果我放弃过滤器代码并在xhtml文件中实现类似的素数:
<h:form enctype="multipart/form-data">
<h:outputText value="Wybór zdjęcia: " />
<p:fileUpload value="#{fileUploadController.file}" mode="simple" />
<p:commandButton value="Submit" ajax="false"/>
</h:form>
简单定义fileUploadController bean:
@Component
@Scope("session")
@ManagedBean
@SessionScoped
public class FileUploadController
{
private UploadedFile file;
public UploadedFile getFile()
{
return file;
}
public void setFile(UploadedFile file)
{
this.file = file;
}
}
我得到文件字段的空值。我的目标是上传图像,将其更改为Blob并发送到数据库。 我非常感谢你的帮助,因为如果没有那部分我就无法继续我的项目。
答案 0 :(得分:1)
看起来你可能会遗漏一些依赖项。在我发布了链接here的另一个帖子上有类似的错误。它基本上建议你需要为commons-fileupload和commons-io添加jar文件。希望这可以帮助您解决问题。
答案 1 :(得分:1)
在我的情况下,问题是缺少Faces Servlet的定义。从Servlet 3.0开始,它由容器自动声明。显然,servlet可能会有一些与FacesServlet不同的名称,这会破坏FileUploadFilter的定义。
具体来说 - 我的问题是没有为高级上传器调用侦听器,也没有为简单上传器设置文件变量。
https://docs.oracle.com/javaee/6/api/javax/faces/webapp/FacesServlet.html
解决方案是在web.xml中声明Faces Servlet(即使它是自动声明的)。
我的问题出现在Jboss 7.1上,Primefaces 5.0。我试着遵循这里的所有建议,直到我认识到实际上我没有定义Faces Servlet。由于应用程序的其他部分与自动声明一样好,我花了一些时间寻找解决方案。希望它会对任何人有所帮助。
答案 2 :(得分:0)
问题是因为servlet-name错误。
更改:
<servlet-name>Faces Servlet</servlet-name>
到
<servlet-name>facesServlet</servlet-name>
解决了这个问题。这是一个团队项目,我没有注意到名称已被更改,所以请小心。谢谢你的帮助。
答案 3 :(得分:0)
fileUpload和primefaces上传文件的空值
下载commons-fileupload-1.2.1.jar,commons-io-2.0.1.jar并输入WEB_INF / lib。否则在pom.xml文件中添加依赖项。你的问题将会解决。