Я использую PrimeFaces для нового проекта, и это довольно впечатляющий набор компонентов.Во всяком случае, у меня есть проблема с использованием "реального мира" компонента загрузки файла.На моей странице есть список данных, который показывает вложения, связанные с конкретным документом, и я хочу предоставить ссылку для прямой загрузки этого файла в элемент списка данных.Вот мой код xhtml:
<p:dataList id="ListaAllegati" value="#{documentBean.documento.allegati}" type="definition" var="attach" style="border: none" ">
<f:facet name="description">
<h:outputText value="#{attach.name}" />
<p:commandLink ajax="false" title="Download" action="#{documentBean.selectAttach}>
<h:graphicImage style="margin-left: 10px; border: none" value="./images/article.png" height="24" width="24" ></h:graphicImage>
<p:fileDownload value="#{documentBean.downloadFile}"/>
<f:setPropertyActionListener target="#{documentBean.selectedAttach}" value="#{attach}" />
</p:commandLink>
</f:facet>
</p:dataList>
и относительный Java-бин (объем запроса):
private StreamedContent downloadFile;
public StreamedContent getDownloadFile() {
log.info("getter dell'allegato invocato");
InputStream stream = null;
byte[] rawFile = null;
if (selectedAttach == null) {
log.warn("Nessun allegato passato");
return null;
} else {
try {
log.info("Recupero del file " + selectedAttach.getGuid());
rawFile = attachManager.retrieveFile(selectedAttach.getGuid());
} catch (Exception e) {
String msg = "Errore durante il recupero del file";
log.error(msg, e);
FacesMessage fmsg = new FacesMessage(msg, "");
FacesContext.getCurrentInstance().addMessage(null, fmsg);
}
stream = new ByteArrayInputStream(rawFile);
DefaultStreamedContent file = new DefaultStreamedContent(stream,
selectedAttach.getMimeType(), selectedAttach.getName());
return file;
}
}
public void selectAttach() {
log.info("commandLink action invocata");
}
private Allegato selectedAttach;
public Allegato getSelectedAttach() {
return selectedAttach;
}
public void setSelectedAttach(Allegato selectedAttach) {
log.info("Allegato selezionato");
if (selectedAttach==null) log.warn("L'allegato passato è nullo");
this.selectedAttach = selectedAttach;
}
Итак, пара вопросов:
- Яделать правильные вещи, пытаясь передать выбранное вложение таким образом?В противном случае, как я могу передать параметр, чтобы сообщить о бине, по которому щелкнуло вложение?
- Почему в первый раз, когда я щелкаю ссылку команды, ничего не происходит?Это сделать туда-обратно с сервером, но ничего не происходит.Во второй раз это дает мне исключение.
- Почему никогда не вызывается documentBean.selectAttach, а свойство documentBean.selectedAttach никогда не устанавливается (ни во второй раз)?за любую подсказку