【问题标题】:File uploading using MyFaces Tomahawk + JSF 2.0使用 MyFaces Tomahawk + ​​JSF 2.0 上传文件
【发布时间】:2011-07-22 20:05:19
【问题描述】:

我目前正在使用 Tomahawk MyFaces 将文件上传到我的服务器。我一步一步地按照一些说明进行操作,一切似乎都很好,但是我没有将文件保存到数据库中。我没有看到任何错误,我只是在我的 Eclipse 控制台中看到了一些警告。有人可以看看吗?这就是我所做的:

1-为 JSF 2.0 下载 Tomahawk 并将所有 .jar 添加到我的 WEB-INF/lib 文件夹中

2-我检查了我的 web.xml 是否正确配置为使用 Faces Servlet。我还为 tomahawks 扩展添加了一个过滤器这是它的样子:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<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>/pages/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>pages/index.jsp</welcome-file>
</welcome-file-list>
    <filter>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    </web-app>

3-我还检查了我的 faces-config.xml 是否正确:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">

4-我为上传小工具创建了一个非常简单的复合页面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk">
 <ui:composition template="WEB-INF/templates/BasicTemplate.xhtml">
<ui:define name="uploadForm">
<h:form>
<t:inputFileUpload value="#{uploadController.uploadedFile}" />
        <h:commandButton value="submit" action="#{uploadController.submit}" />
        <h:messages />
</h:form>
</ui:define>
 </ui:composition>
 </html>

5-我有一个托管 bean 来与页面通信并获取输入的文件:

@ManagedBean
@RequestScoped
public class UploadController {

@EJB
private IFileUploaderEJB fileUploaderEJB;

private UploadedFile uploadedFile;

public void submit() throws IOException {
    String fileName = FilenameUtils.getName(uploadedFile.getName());
    String contentType = uploadedFile.getContentType();
    byte[] bytes = uploadedFile.getBytes();

    // Now you can save bytes in DB (and also content type?)
    Garbage garbage = new Garbage();
    garbage.setFilename(fileName);
    garbage.setFile(bytes);
    garbage.setDescription("info about the file");
    garbage.setFileType("File extension");      
    fileUploaderEJB.uploadGarbage(garbage);

    FacesContext.getCurrentInstance().addMessage(
            null,
            new FacesMessage(String.format(
                    "File '%s' of type '%s' successfully uploaded!",
                    fileName, contentType)));
}

public UploadedFile getUploadedFile() {
    return uploadedFile;
}

public void setUploadedFile(UploadedFile uploadedFile) {
    this.uploadedFile = uploadedFile;
}}

注意:托管 bean 调用一个 EJB,该 EJB 应该将文件持久化到数据库中

6-允许访问数据库的 EJB:

    @Stateless(name = "ejbs/FileUploaderEJB")
    public class FileUploaderEJB implements IFileUploaderEJB {
@PersistenceContext
private EntityManager em;


public Garbage uploadGarbage(Garbage garbage) {
    Date date = new Date();
    DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");        

    garbage.setUploadDate(dateFormat.format(date));     
    //...

    em.persist(garbage);

    return garbage;
}

7- 最后我有一个使用 JPA 注释的实体,它使用 @Lob 将文件存储在数据库中:

    @Entity
    public class Garbage {
@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
@Column(nullable = false)
private String filename;
@Column(nullable = false)
private String fileType;
@Column(nullable = false)
private String uploadDate;
@Column(nullable = false)
private String destroyDate;
@Lob
@Column(nullable = false)
private byte[] file;
@Column(nullable = false)
private String description;
    //Getters and Setters...

问题是3:

P1 - 当我用浏览按钮选择一个文件然后我点击提交时,什么也没有发生。我在控制台中看不到任何输入查询,也没有向数据库添加新行。我错过了什么?

P2 - 每当我对源代码进行更改并再次发布控制台时,构建所需的时间比平时要长(几乎 40 秒),它会向我显示很多类似这样的警告(20或多或少):

警告:JSF1029:应用程序的版本为 2.0(明确地由 /WEB-INF/faces-config.xml 的版本或缺少 /WEB-INF/faces-confg.xml),但是类 'org .ajax4jsf.taglib.html.facelets.AjaxSupportHandler' 依赖于遗留的 facelet 类。该类表示的 facelet 工件将不会被注册。

jar 文件或 faces-config.xml 中的配置有问题吗?

P3 - 当我使用浏览器导航到项目中的任何页面时,会出现如下警告:

警告:PWC4011:无法从上下文 /Datapool 将请求字符编码设置为 UTF-8,因为请求参数已被读取,或者 ServletRequest.getReader() 已被调用

我认为这与 web.xml 中的过滤器有关

【问题讨论】:

    标签: java jsf jpa file-upload jakarta-ee


    【解决方案1】:

    当我用浏览按钮选择一个文件然后点击提交时,什么也没有发生。

    您的&lt;h:form&gt; 缺少enctype="multipart/form-data" 属性。在此处查看迷你教程:JSF 2.0 file upload with Tomahawk's &lt;t:inputFileUpload&gt;

    警告:JSF1029:应用程序的版本为 2.0(通过 /WEB-INF/faces-config.xml 的版本或缺少 /WEB-INF/faces-confg.xml 明确),但是类 'org.ajax4jsf.taglib.html.facelets.AjaxSupportHandler' 依赖于遗留的 facelet 类。这个类所代表的facelet工件将不会被注册。

    您的 Web 项目中仍有一些面向 JSF 1.2 的 RichFaces/A4J 库。如果不需要,请摆脱它们。

    警告:PWC4011:无法从上下文 /Datapool 将请求字符编码设置为 UTF-8,因为已读取请求参数,或已调用 ServletRequest.getReader()

    这是 Glassfish 特有的。 Glassfish 默认为 ISO-8859-1,需要重新配置以使用 UTF-8。另见How to get rid of WARNING: PWC4011: Unable to set request character encoding to UTF-8

    【讨论】:

    • 是的,它不见了。我现在更新下面的代码。但我收到一个 HTTP 状态 500,上面写着:警告:StandardWrapperValve[Faces Servlet]:PWC1406:Servlet.service() for servlet Faces Servlet throw exception java.lang.NullPointerException: Argument Error: Parameter viewId is null
    • 请先从您的/WEB-INF/lib 中清除所有旧的 RichFaces/Ajax4jsf/JSF/Facelets 库。这是类路径污染的标志,其中包含不兼容的版本化 Facelet 视图处理程序的库。我之前关于如何集成文件上传的回答期望一个全新的干净的网络项目,而不是一个被污染的现有项目。
    • lib 文件夹中根本没有来自richfaces 的jar,而且我刚刚从eclipse 中清理了一个项目,但仍然看到警告JSF1029。还有哪里有污染?
    • 检查整个类路径。检查 Eclipse 项目属性中的 部署程序集。检查磁盘上的/JRE/lib/JRE/lib/ext 文件夹。检查 Glassfish /lib 文件夹等。我建议完全按照我之前的答案中的描述创建一个全新的项目,以确保。这样您就可以在此基础上进一步发展。
    • 过了一会儿,我决定创建一个新的干净项目。 P2 和 P3 已解决。但是当我点击提交时,P1 仍然给我一个错误 HTTP 500。我将在堆栈跟踪中发表第二条评论
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 2015-01-05
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多