Прежде всего, этот (старый) вопрос и ответ предполагает JSF 2.0 / 2.1.Начиная с JSF 2.2 есть собственный компонент <h:inputFile>
без необходимости использования сторонних библиотек компонентов.См. Также Как загрузить файл с использованием JSF 2.2.?Где находится сохраненный файл?
Самый простой способ - использовать Томагавк для JSF 2.0 .Он предлагает компонент <t:inputFileUpload>
.
Вот пошаговое руководство:
Создайте пустой динамический веб-проект для Servlet 3.0 и JSF 2.0.web.xml
должен соответствовать спецификации Servlet 3.0 и уже содержать сервлет JSF:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
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"
id="YourProjectName" version="3.0">
<display-name>Your Project Name</display-name>
<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>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
* faces-config.xml
должен соответствовать спецификации JSF 2.0:
<?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">
</faces-config>
Скачать Томагавк 1.1.10 для JSF 2.0 .Извлеките zip-файл, перейдите в папку /lib
и скопируйте все файлы *.jar
в свой /WEB-INF/lib
.
Это 18 файлов, из которых batik*.jar
и xml*.jar
не нужны для использования только компонента t:inputFileUpload
.Вы можете оставить их в стороне.
Настройте фильтр расширений Томагавк в web.xml
.Это тот, кто отвечает за обработку multipart/form-data
запросов, которые необходимы для возможности отправки файлов по HTTP.
<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>
Обратите внимание, что <servlet-name>
должен точно соответствовать <servlet-name>
FacesServlet
как вы определили в web.xml
.
Создайте простой Facelet, upload.xhtml
:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Tomahawk file upload demo</title>
</h:head>
<h:body>
<h:form enctype="multipart/form-data">
<t:inputFileUpload value="#{bean.uploadedFile}" />
<h:commandButton value="submit" action="#{bean.submit}" />
<h:messages />
</h:form>
</h:body>
</html>
Обратите внимание на атрибут enctype="multipart/form-data"
на<h:form>
, это очень важно для возможности отправки файлов с HTTP.
Создание простого управляемого компонента, com.example.Bean
:
package com.example;
import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.io.FilenameUtils;
import org.apache.myfaces.custom.fileupload.UploadedFile;
@ManagedBean
@RequestScoped
public class Bean {
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?)
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;
}
}
Так и должно быть.Откройте его по http://localhost:8080/projectname/upload.xhtml.
Что касается ваших конкретных вопросов:
что мне нужно сделать, чтобы передать файл из JSF в управляемый компонент и затем преобразовать его вбайт [] (чтобы можно было передать его в EJB)?
Ответ дан выше.
Как сервлетпомогите мне?
Умеет обрабатывать и контролировать HTTP запросы / ответы.В среде JSF FacesServlet
уже выполняет всю работу.
Нужен ли для этого сервлет?
ВJSF среда, FacesServlet
является обязательным.Но это уже предусмотрено API, вам не нужно писать его самостоятельно.Однако, чтобы иметь возможность загружать файлы из базы данных, определенно полезен другой сервлет.Вы можете найти базовый пример здесь: Сервлет для обслуживания статического контента .
Также я обнаружил, что в каком-то блоге упоминается что-то о сервлетах 3.0, но я не знаюесли моя рабочая среда использует его, как, если я использую сервлеты 3.0 (я использую JEE6)?
Если вы используете контейнер Servlet 3.0, такой как Glassfish 3, JBoss AS 6, Tomcat 7 и т. Д. И web.xml
объявлен как Servlet 3.0, тогда вы определенно используете Servlet 3.0.Сервлет 3.0 является частью Java EE 6.