使用MyFaces Tomahawk + ​​JSF 2.0上传文件

我目前正在使用Tomahawk MyFaces将文件上传到我的服务器。 我一步一步地遵循一些指示,一切似乎都没问题,但我没有把文件保存到数据库中。我没有看到任何错误,我只是在我的eclipse控制台中看到一些警告。 有人可以看看吗? 这就是我做的:

1-Downloaded Tomahawk for JSF 2.0并将所有.jars添加到我的WEB-INF / lib文件夹中

2 – 我检查了我的web.xml是否正确配置为使用Faces Servlet。 而且我还为战斧扩展添加了一个filter。它是这样的:

  Faces Servlet javax.faces.webapp.FacesServlet 1   Faces Servlet /pages/*   pages/index.jsp   MyFacesExtensionsFilter org.apache.myfaces.webapp.filter.ExtensionsFilter   MyFacesExtensionsFilter Faces Servlet   

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

   

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

             

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:无法从context / Datapool将请求字符编码设置为UTF-8,因为已经读取了请求参数,或者已经调用了ServletRequest.getReader()

我认为它与web.xml上的filter有关

当我用浏览按钮选择文件然后我点击提交没有任何反应。

您的缺少enctype="multipart/form-data"属性。 在这里查看迷你教程: 使用Tomahawk的上传JSF 2.0文件 。

警告: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:无法从context / Datapool将请求字符编码设置为UTF-8,因为已经读取了请求参数,或者已经调用了ServletRequest.getReader()

这是Glassfish特有的。 Glassfish默认为ISO-8859-1,需要重新配置为使用UTF-8。 另请参见如何摆脱警告:PWC4011:无法将请求字符编码设置为UTF-8