2013-12-09 16 views
11

Ho bisogno di creare un elenco di comandi sulla mia pagina, ma ho qualche problema con esso. Ho passato la lista dal mio bean tramite request.setAttribute e sembra funzionare quando ottengo i valori uno alla volta, ma quando corro attraverso un ciclo foreach, sembrano tutti nulli (e quindi generati, e avendo un valore predefinito 0, "" ecc., per quanto ne so). Qualsiasi aiuto sarebbe molto apprezzato! Nel codice aggiunto, ottengo i valori corretti quando eseguo i pulsanti all'esterno del ciclo foreach, ma non quando eseguo il ciclo stesso. L'elenco è di tipo intero e dovrebbe essere in seguito un oggetto java (eseguito nello stesso problema). usando JSF versione 2.2. Sia logtest() che getoprofile() stampano l'interestpointer.Utilizzo del ciclo foreach in JSF

mio fagiolo ha:

@ManagedBean(name="MyProfile") 
@RequestScoped 

E ho impostato il mio myInterestList variabile nel mio fagioli con:

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);   
session.setAttribute("myInterestProfileName", profileName); 


<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> 
<%@ page import="java.util.List,com.jsflogin.stringWithPointer" %> 

<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> 
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
<f:view> 



<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>JSF Successfull login</title> 
</head> 
<body> 


    <h:form id="forloop"> 
      <c:set var ="myTempList" value="${myInterestListYay}" scope="session"/> 
      <c:out value="interest list"/><p> 
      <h:commandButton value="#{myInterestListYay[1]}" action="#{MyProfile.logTest}"> 
       <f:setPropertyActionListener target ="#{MyProfile.interestPointer}" value = "#{myInterestListYay[1]}"/> 
      </h:commandButton><p> 


      <ui:repeat var="orly"value="${myInterestListYay}" varstatus="status"> 
       <c:out value="${status.index}"/><h:commandButton value="#{orly}" action="#{MyProfile.logTest}"> 
       <f:setPropertyActionListener target ="#{MyProfile.interestPointer}" value = "#{orly}"/> 
      </h:commandButton><p> 
      </ui:repeat> 
      <c:forEach var="orly" items="${MyProfile.interestsAndPointers}" varStatus="status" > 
       <c:out value="${status.index}"/><c:out value=": "/><c:out value="${orly.stringName}"/><h:commandButton value="go to interest page" action="#{MyProfile.goToInterestProfile}"> 
       <f:setPropertyActionListener target ="#{MyProfile.interestPointer}" value = "#{orly.pointer}"/> 
      </h:commandButton><p> 
      </c:forEach>  
     </h:form> 



    </body> 
    </f:view> 
</html> 
+0

Usa $ {} invece di Orly # {} Orly –

+0

ottengo questo errore durante il tentativo di compilare. "in base al TLD, il valore dell'attributo è un valore differito o un metodo differito, ma il valore specificato contiene $ -expression" – user3058296

risposta

29

Se si utilizza JSF 2 si dovrebbe cambiare la tua pagina di XHTML, allora si può usa ui: ripeti lo e ottieni molte altre chicche da facette.

Ho creato due pagine molto semplici, una come JSP e l'altra come XHTML. Utilizzano un bean gestito nell'ambito della richiesta. Entrambi funzionano e rendono tre pulsanti di seguito. Nota che utilizzo Glassfish come server, dal momento che è stato più facile iniziare. Per Tomcat (7.x) potrebbe essere necessario copiare le librerie jsf-api, jsf-impl (2.x) e jstl (1.2) nel classpath.

Questa è la pagina JSP:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> 
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> 
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 

<f:view> 
    <html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
     <title>JSP Page</title> 
    </head> 
    <body> 
     <h:form> 
      <c:forEach var="item" items="#{cart.items}"> 
      <h:commandButton value="#{item}"/> 
      </c:forEach> 
     </h:form> 
    </body> 
    </html> 
</f:view> 

Qui l'XHTML Pagina:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
    <title>Simple JSF</title> 
    </h:head> 
    <h:body> 
    <h:form> 
     <ui:repeat value="#{cart.items}" var="item"> 
      <h:commandButton value="#{item}" /> 
     </ui:repeat> 
    </h:form> 
    </h:body> 
</html> 

Perché usate un fagiolo nella richiesta di portata e impostare variabili lì nella sessione? Keep it simple e cambiare il fagiolo di scope di sessione:

@ManagedBean(name = "cart") 
@SessionScoped 
public class CartBean { 

    private List<String> items; 

    public CartBean() { 
    items = new ArrayList<>(); 
    items.add("shirt"); 
    items.add("skirt"); 
    items.add("trouser"); 
    } 

    public List<String> getItems() { 
    return items; 
    } 

} 
+0

# {...} modello non consentito nel corpo del testo che dice :(se io uso $, mostra solo un commandbutton, che è vuoto, nonostante ci sia 4 in myInterestListYay. – user3058296

+0

Quale versione di JSF usi? Potresti pubblicare più contenuti della pagina? – Spindizzy

+0

Ho aggiornato il mio post originale con la pagina completa al momento Ho copiato il resto in un documento del blocco note per assicurarmi che gli errori non siano stati causati da questo. Ho aggiunto un po 'di testo su come è impostato anche il mio bean gestito – user3058296