2013-04-04 32 views
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> 

回答

0

命令組件上的屬性將僅處理輸入組件,其中也有具有此屬性集。您的單選按鈕輸入組件沒有它,因此在處理表單提交時忽略它。

此外,如果被創建#{downloadFile}託管bean該構建將失敗,並且更新模型值階段之前實例化(即前#{selecter.selectedRadio}是被設定JSF)。

通過

@ManagedProperty(value = "#{selecter}") 
private Selecter selecter; 

替換

@ManagedProperty(value = "#{selecter.selectedRadio}") 
private Files selectedRadio; 

和操作方法訪問selectedRadio代替。

+0

如何管理和解決在賦值之前發生的Bean的創建和初始化問題? 在這裏,我遇到了同樣的問題,我遵循了第二種方法,因爲他們無法解決第一個問題。 http://stackoverflow.com/questions/15633818/login-with-hibernate-and-store-username-logged – 2013-04-04 13:03:49

+0

我不知道爲什麼你把它看作是一個問題。在構造實例之前,「純Java」如何調用實例上的方法? – BalusC 2013-04-04 13:16:54

+0

@BalusC:我是否有權說如果他沒有在'selecter'上方的任何位置調用他的'downloadFile'託管bean,他的代碼就可以工作? – 2013-04-04 13:32:31