h:inputFile 没有调用部分 setter
h:inputFile doesn't call Part setter
这是我第一次使用 h:inputFile,遇到了一些问题。
我的托管 Bean 中的 Part 属性的 setter 方法从未被调用,因此当调用上传方法时,Part 对象始终为 null。
Form 和 inputFile 组件
<h:form enctype="multipart/form-data">
<div class="pic add-pic">
<h:inputFile id="upload-test" required="true"
value="#{uploadController.uploadedFile}">
</h:inputFile>
<h:commandLink styleClass="pic add-pic"
action="#{uploadController.addPic()}">
<i class="fa fa-plus"></i>
<span>Add pic</span>
</h:commandLink>
</div>
</h:form>
托管 Bean
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.servlet.http.Part;
@ManagedBean
@ViewScoped
public class UploadController {
private Part uploadedFile;
public Part getUploadedFile() {
return this.uploadedFile;
}
public void setUploadedFile(Part uploadedFile) {
this.uploadedFile = uploadedFile;
}
public void addPic() {
System.out.println("Uploaded a file: " +
uploadedFile.getSubmittedFileName());
}
}
我已经在 inputFile
中尝试使用 ajax
<h:inputFile id="upload-test" required="true"
value="#{uploadController.uploadedFile}">
<f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:inputFile>
并在命令链接中使用 ajax
<h:commandLink styleClass="pic add-pic">
<i class="fa fa-plus"></i>
<span>Add pic</span>
<f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:commandLink>
但这两个选项都没有效果。
PS: 我正在使用 javax.servlet-api 版本 3.1 和 JSF 2.2.12 (Mojarra) 和 运行 在 Wildfly 9.0.2 上
PS2: 我也在使用 Primefaces(不是在这种情况下),我的 web.xml 中有 fileUpload 过滤器(我已经尝试删除它,经过测试但没有成功)。
经过几次尝试并部署了一个只有默认值的新项目(就像@BalusC 在我的问题的评论中所说的那样),我发现问题出在 [=20 中的 PrimeFaces FileUploadFilter =]!!
我之前解决过,但不知道为什么那次没用,可能是Eclipse提供的项目部署刷新有问题。
但现在我又试了一次,成功了!
感谢@BalusC 的帮助!
感谢 BalusC 和 Diego Marques!我的应用程序也有类似的问题,它部署在 Tomcat 8 - h:inputFile 值 "Part" setter 从未被调用过。你的帮助让我找到了我的一些库,它们已经发现我的问题实际上是 Tomcat 设置。
如果将其包含在这里也有帮助,Tomcat(可能还有 Glassfish)需要以下设置才能使其成为 "spec-compliant"。
<Context allowCasualMultipartParsing="true"
https://github.com/ocpsoft/rewrite/issues/136
您可以使用@MultipartConfig(和@WebServlet)标记您的 bean,而不是进行上述上下文设置。
这是我第一次使用 h:inputFile,遇到了一些问题。
我的托管 Bean 中的 Part 属性的 setter 方法从未被调用,因此当调用上传方法时,Part 对象始终为 null。
Form 和 inputFile 组件
<h:form enctype="multipart/form-data">
<div class="pic add-pic">
<h:inputFile id="upload-test" required="true"
value="#{uploadController.uploadedFile}">
</h:inputFile>
<h:commandLink styleClass="pic add-pic"
action="#{uploadController.addPic()}">
<i class="fa fa-plus"></i>
<span>Add pic</span>
</h:commandLink>
</div>
</h:form>
托管 Bean
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.servlet.http.Part;
@ManagedBean
@ViewScoped
public class UploadController {
private Part uploadedFile;
public Part getUploadedFile() {
return this.uploadedFile;
}
public void setUploadedFile(Part uploadedFile) {
this.uploadedFile = uploadedFile;
}
public void addPic() {
System.out.println("Uploaded a file: " +
uploadedFile.getSubmittedFileName());
}
}
我已经在 inputFile
中尝试使用 ajax<h:inputFile id="upload-test" required="true"
value="#{uploadController.uploadedFile}">
<f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:inputFile>
并在命令链接中使用 ajax
<h:commandLink styleClass="pic add-pic">
<i class="fa fa-plus"></i>
<span>Add pic</span>
<f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:commandLink>
但这两个选项都没有效果。
PS: 我正在使用 javax.servlet-api 版本 3.1 和 JSF 2.2.12 (Mojarra) 和 运行 在 Wildfly 9.0.2 上
PS2: 我也在使用 Primefaces(不是在这种情况下),我的 web.xml 中有 fileUpload 过滤器(我已经尝试删除它,经过测试但没有成功)。
经过几次尝试并部署了一个只有默认值的新项目(就像@BalusC 在我的问题的评论中所说的那样),我发现问题出在 [=20 中的 PrimeFaces FileUploadFilter =]!!
我之前解决过,但不知道为什么那次没用,可能是Eclipse提供的项目部署刷新有问题。
但现在我又试了一次,成功了!
感谢@BalusC 的帮助!
感谢 BalusC 和 Diego Marques!我的应用程序也有类似的问题,它部署在 Tomcat 8 - h:inputFile 值 "Part" setter 从未被调用过。你的帮助让我找到了我的一些库,它们已经发现我的问题实际上是 Tomcat 设置。
如果将其包含在这里也有帮助,Tomcat(可能还有 Glassfish)需要以下设置才能使其成为 "spec-compliant"。
<Context allowCasualMultipartParsing="true"
https://github.com/ocpsoft/rewrite/issues/136
您可以使用@MultipartConfig(和@WebServlet)标记您的 bean,而不是进行上述上下文设置。