web-dev-qa-db-fra.com

Utilisation de la boucle foreach dans JSF

J'ai besoin de créer une liste de boutons de commande sur ma page, mais j'ai des problèmes avec. Je passe la liste de mon bean via request.setAttribute et cela semble fonctionner lorsque j'obtiens les valeurs une à la fois, mais lorsque je parcours une boucle foreach, elles semblent toutes être nulles (et donc générées et ayant un valeur par défaut 0, "" etc., pour autant que je sache). Toute aide serait grandement appréciée! Dans le code ajouté, j'obtiens les valeurs correctes lorsque je crée les boutons en dehors de la boucle foreach, mais pas lorsque j'exécute la boucle elle-même. La liste est de type entier et devrait être plus tard un Java (rencontré le même problème). En utilisant JSF version 2.2. Logtest () et gotoprofile () impriment le pointeur d'intérêt.

mon haricot a:

@ManagedBean(name="MyProfile")
@RequestScoped

Et j'ai mis ma variable myInterestList dans mon bean avec:

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>
11
user3058296

Si vous utilisez JSF 2, vous devez changer votre page en xhtml, alors vous pouvez utiliser i: repeat et obtenir beaucoup plus de goodies des facettes.

J'ai fait deux pages très simples, une en JSP et l'autre en XHTML. Ils utilisent un bean géré dans la portée de la demande. Les deux fonctionnent et affichent trois boutons d'affilée. Notez que j'utilise Glassfish comme serveur, car il était plus facile de commencer. Pour le Tomcat (7.x), vous devrez peut-être copier les bibliothèques jsf-api, jsf-impl (2.x) et jstl (1.2) dans le chemin de classe.

Voici la page 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>

Voici la page XHTML:

<?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>

Pourquoi utilisez-vous un bean dans la portée de la demande et y définissez-vous une variable dans la session? Restez simple et changez le bean en portée de session:

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

}
32
Spindizzy