2013-04-04 5 views
0

J'ai un SelectOneRadio de Primefaces qui étend le SelectOneRadio standard. Mon problème est que lorsque je sélectionne l'option que je veux télécharger ceci ou pas enregistré ou est perdu. Je joins le code. Pourquoi cela arrive-t-il? MerciJSF/Primefaces SelectedOneRadio: la valeur est nulle

Ceci est mon Bean pour le téléchargement:

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

Ceci est mon haricot pour 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(); 
} 

}

ce qui est mon fichier 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> 

Répondre

0

LeL'attributsur le composant de commande ne traitera que les composants d'entrée dont et ont cet attribut. Votre composant d'entrée de bouton radio ne l'a pas et est donc ignoré pendant le traitement du formulaire.

En outre, cette construction échouera si #{downloadFile} bean géré est créé et instancié avant les valeurs du modèle mise à jour phase (à savoir avant la #{selecter.selectedRadio} est été fixé par JSF).

Remplacer

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

par

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

et accéder à la selectedRadio dans la méthode d'action à la place.

+0

Comment puis-je gérer et résoudre ce problème de création et d'initialisation du Bean avant que les valeurs ne soient affectées? Ici j'ai eu le même problème et j'ai suivi la deuxième approche que vous avez suggérée car ils ne sont pas capables de résoudre le premier. http://stackoverflow.com/questions/15633818/login-with-hibernate-and-store-username-logged –

+0

Je ne sais pas pourquoi vous le voyez comme un problème. Comment est-il possible en Java "simple" d'invoquer des méthodes sur une instance avant qu'elle ne soit construite? – BalusC

+0

@BalusC: Ai-je raison de dire que son code fonctionnerait s'il n'appelait pas son bean géré 'downloadFile' n'importe où au-dessus du' selecter'? –

Questions connexes