0
我有一個Primefaces的SelectOneRadio,它擴展了標準的SelectOneRadio。 我的問題是,當我選擇我想要下載這個選項或不保存或丟失的選項。我附上了代碼。爲什麼會發生?由於JSF/Primefaces SelectedOneRadio:值爲空
這是我下載豆:
@ManagedBean
@RequestScoped
public class DownloadFile {
private StreamedContent file;
@ManagedProperty(value = "#{selecter.selectedRadio}")
private Files selectedRadio;
//all getters/setters methods
....
....
public DownloadFile() throws IOException {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset(); // Some JSF component library or some Filter might have set some headers in the buffer beforehand. We want to get rid of them, else it may collide.
response.setContentType("application/xml"); // Check http://www.w3schools.com/media/media_mimeref.asp for all types. Use if necessary ServletContext#getMimeType() for auto-detection based on filename.
response.setHeader("Content-disposition", "attachment; filename=\"immagine.jpg\"");
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
//Qui va sostituita la risorsa con pathname+/selectedRadio (pathname la otterremo da una query)
System.out.println("Prova::" + selectedRadio);
//String s= selectedRadio.getPathname()+"/"+selectedRadio.getNome();
input = new BufferedInputStream(externalContext.getResourceAsStream("/downloaded_optimus.jpg"));
output = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[10240];
for (int length; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
} catch(Exception e) {
output.close();
input.close();
}
facesContext.responseComplete(); // Important! Else JSF will attempt to render the response which obviously will fail since it's already written with a file and closed.
}
}
這是我selecter豆:
@ManagedBean
@SessionScoped
public class Selecter {
@ManagedProperty(value = "#{sessionHandler.db}")
private Session db;
private List<Files> res= new ArrayList<Files>();
private Files selectedRadio;
//all getters/setters methods ....
@PostConstruct
public void init(){
db.beginTransaction();
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
Query query = db.createQuery("from Utenti where username= :name");
query.setParameter("name", (String)(sessionMap.get("username")));
List<Utenti>user= query.list();
for(Utenti a : user){
Iterator<Files> it = a.getFileses().iterator();
while (it.hasNext()){
res.add(it.next());
}
}
db.getTransaction().commit();
}
}
,這是我的文件.xhtml
h2>Seleziona dall'elenco il file che vuoi scaricare</h2>
<h:form enctype="multipart/form-data">
<p:outputPanel id="customPanel">
<p:selectOneRadio id = "radioID" value="#{selecter.selectedRadio}" layout="pageDirection" >
<f:selectItems value="#{selecter.res}" var="item" itemLabel="#{item.nome}" itemValue="#{item}" />
</p:selectOneRadio>
<p:dialog modal="true" widgetVar="statusDialog" header="Status" draggable="false" closable="false" resizable="false">
<p:graphicImage value="/design/ajax_loading_bar.gif" />
</p:dialog>
<br></br>
<br></br>
<p:commandButton id="downloadLink" value="Download" ajax="false" immediate="true"
icon="ui-icon-arrowthichk-s">
<p:fileDownload value="#{downloadFile.file}" />
</p:commandButton>
</p:outputPanel>
如何管理和解決在賦值之前發生的Bean的創建和初始化問題? 在這裏,我遇到了同樣的問題,我遵循了第二種方法,因爲他們無法解決第一個問題。 http://stackoverflow.com/questions/15633818/login-with-hibernate-and-store-username-logged – 2013-04-04 13:03:49
我不知道爲什麼你把它看作是一個問題。在構造實例之前,「純Java」如何調用實例上的方法? – BalusC 2013-04-04 13:16:54
@BalusC:我是否有權說如果他沒有在'selecter'上方的任何位置調用他的'downloadFile'託管bean,他的代碼就可以工作? – 2013-04-04 13:32:31