Загрузка файлов с использованием MyFaces Tomahawk + JSF 2.0 - PullRequest
3 голосов
/ 25 марта 2011

В настоящее время я использую Tomahawk MyFaces для загрузки файлов на мой сервер.Я следовал некоторым инструкциям шаг за шагом, и все кажется нормальным, но я не сохраняю файл в базе данных. Я не вижу никаких ошибок, я просто вижу некоторые предупреждения в моей консоли затмения.Может ли кто-нибудь взглянуть?Вот что я сделал:

1-Скачанный томагавк для JSF 2.0 и добавил все .jars в мою папку WEB-INF / lib

2-я проверил, что мой web.xml корректеннастроен на использование сервлета Faces.А также я добавил фильтр для расширений томагавков. Вот как это выглядит:

<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-У меня есть управляемый компонент для взаимодействия со страницей и получения введенного файла:

@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;
}}

Примечание. Управляемый компонент вызывает 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.Артефакт лицевой стороны, представленный этим классом, не будет зарегистрирован.

Что-то не так с файлами JAR или с конфигурацией FaceS-config.xml?

P3 - Когда я перехожу на любую из страниц моего проекта с использованием браузера, появляется следующее предупреждение:

ПРЕДУПРЕЖДЕНИЕ: PWC4011: невозможно установить кодировку символа запроса в UTF-8 изcontext / Datapool, поскольку параметры запроса уже прочитаны или ServletRequest.getReader () уже вызван

Я думаю, что это как-то связано с фильтром в web.xml

1 Ответ

4 голосов
/ 25 марта 2011

Когда я выбираю файл с помощью кнопки обзора, а затем нажимаю «Отправить», ничего не происходит.

В вашем <h:form> отсутствует атрибут enctype="multipart/form-data". Посмотрите мини-учебник здесь: Загрузка файла JSF 2.0 с Томагавком <t:inputFileUpload>.

ПРЕДУПРЕЖДЕНИЕ: JSF1029: Версия приложения имеет версию 2.0 (либо явно из-за версии /WEB-INF/faces-config.xml, либо из-за отсутствия /WEB-INF/faces-confg.xml), однако Класс org.ajax4jsf.taglib.html.facelets.AjaxSupportHandler 'зависит от унаследованного класса Facelet. Артефакт лицевой стороны, представленный этим классом, не будет зарегистрирован.

В вашем веб-проекте все еще есть библиотеки RichFaces / A4J, ориентированные на JSF 1.2. Избавьтесь от них, если вам это не нужно.

ПРЕДУПРЕЖДЕНИЕ: PWC4011: невозможно установить кодировку символа запроса в UTF-8 из context / Datapool, поскольку параметры запроса уже прочитаны или ServletRequest.getReader () уже вызван

Это особенность Glassfish. По умолчанию Glassfish соответствует ISO-8859-1, и его необходимо перенастроить для использования UTF-8. См. Также Как избавиться от ПРЕДУПРЕЖДЕНИЯ: PWC4011: Невозможно установить кодировку символа запроса в UTF-8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...