Загрузка файлов с помощью MyFaces Tomahawk + JSF 2.0
В настоящее время я использую Tomahawk MyFaces для загрузки файлов на свой сервер. Я выполнил несколько инструкций шаг за шагом, и все вроде бы хорошо, но я не хочу, чтобы файл сохранялся в базе данных. Я не вижу никакой ошибки, я просто вижу некоторые предупреждения в моей консоли eclipse. Может ли кто-нибудь взглянуть? Это то, что я сделал:
1-Загруженный Tomahawk для JSF 2.0 и добавил все .jars в мою папку WEB-INF/lib
2-Я проверил, что мой web.xml настроен правильно для использования сервлетов Faces. А также я добавил фильтр для расширений 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-Я также проверил, что мои face-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, который должен сохраняться в базе данных файла
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- И, наконец, у меня есть Entity, который использует аннотации 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), однако class 'org.ajax4jsf.taglib.html.facelets.AjaxSupportHandler 'зависит от унаследованного класса facelet. Артефакт лица, представленный этим классом, не будет зарегистрирован.
Что-то не так с файлами jar или с конфигурацией в faces-config.xml?
P3 - Когда я перехожу к любой из страниц моего проекта, пользуясь браузером, предупреждение, подобное этому:
ПРЕДУПРЕЖДЕНИЕ: PWC4011: Невозможно установить кодировку символов запроса в UTF-8 из контекста /Datapool, поскольку параметры запроса уже были прочитаны или ServletRequest.getReader() уже был вызван
Я думаю, что это имеет какое-то отношение к фильтру в web.xml
Ответы
Ответ 1
Когда я выбираю файл с кнопкой обзора, а затем нажимаю кнопку "Отправить", ничего не происходит.
В вашем <h:form>
отсутствует атрибут enctype="multipart/form-data"
. Ознакомьтесь с мини-учебником здесь: Загрузка файла JSF 2.0 с помощью Tomahawk <t:inputFileUpload>
.
ПРЕДУПРЕЖДЕНИЕ: JSF1029: приложение имеет версию 2.0 (либо явно версия /WEB -INF/faces-config.xml, либо отсутствие /WEB -INF/faces-confg.xml), однако class 'org.ajax4jsf.taglib.html.facelets.AjaxSupportHandler 'зависит от унаследованного класса facelet. Артефакт лица, представленный этим классом, не будет зарегистрирован.
В вашем веб-проекте все еще есть JSF 1.2-целевые библиотеки RichFaces/A4J. Избавьтесь от них, если вам это не понадобится.
ПРЕДУПРЕЖДЕНИЕ: PWC4011: Невозможно установить кодировку символов запроса в UTF-8 из контекста /Datapool, поскольку параметры запроса уже были прочитаны или ServletRequest.getReader() уже был вызван
Это специфическая для Glassfish. Glassfish по умолчанию соответствует ISO-8859-1 и нуждается в переконфигурации для использования UTF-8. См. Также Как избавиться от WARNING: PWC4011: Невозможно установить кодировку символов запроса в UTF-8