2017-06-02 2 views
0

Alors que la vue peut obtenir toutes les valeurs du bean, lorsqu'une case à cocher (h:selectBooleanCheckbox) est activée, le bean n'est pas mis à jour. La méthode setSelected() dans Item n'est jamais appelée à partir de la vue.La valeur de la case à cocher JSF n'est pas envoyée au bean

J'ai essayé de changer la portée du bean en application, en utilisant une carte au lieu d'une valeur pour la propriété sélectionnée et une tentative stupide d'écrire ma propre fonction ajax javascript.

L'application avec laquelle je travaille est un peu ancienne, donc j'utilise Tomcat 6, JSF 1.2 et Richfaces 3.3.3.Final.

Il semble que ce devrait être simple, je pense que je manque quelque chose d'évident, mais je suis là depuis deux jours et je n'arrive pas à comprendre pourquoi le bean n'est pas mis à jour.

Mon point de vue est le suivant:

<!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:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:c="http://java.sun.com/jstl/core" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich"> 
<head> 
<title>JSF</title> 
</head> 
    <body> 
     <h:form id="tableForm"> 
      <rich:dataTable id="table" value="#{managedBean}" var="item" width="100%"> 
       <rich:column label="Select" align="center" width="40px" > 
        <f:facet name="header"> 
         <h:outputText value="Select" /> 
        </f:facet> 
        <h:selectBooleanCheckbox value="#{item.selected}" > 
         <a4j:support execute="@this" event="onclick" ajaxSingle="true"/> 
        </h:selectBooleanCheckbox> 
       </rich:column> 
       <rich:column label="Name" align="center" width="40px"> 
        <f:facet name="header"> 
         <h:outputText value="Name" /> 
        </f:facet> 
        <h:outputText value="#{item.name}" /> 
       </rich:column> 
      </rich:dataTable> 
     </h:form> 
    </body> 
</html> 

J'ai un bean géré ItemBean portée de session:

import org.richfaces.model.ExtendedTableDataModel; 
public class ItemBean extends ExtendedTableDataModel<Item>{ 
    public ItemBean() {super(new ItemProvider());} 
} 

ItemProvider est:

import org.richfaces.model.DataProvider; 

public class ItemProvider implements DataProvider<Item>{ 

    private List<Item> items = new ArrayList<Item>(); 

    public ItemProvider(){ 
     for(int i = 0; i < 10; i++){ 
      items.add(new Item(i, "Item "+i)); 
     } 
    } 

    public Item getItemByKey(Object key) {return items.get((Integer)key);} 

    public List<Item> getItemsByRange(int fromIndex, int toIndex) { 
     return new ArrayList<Item>(items.subList(fromIndex, toIndex)); 
    } 

    public Object getKey(Item arg0) {return arg0.getId();} 

    public int getRowCount() {return items.size();} 
} 

et articles sont:

public class Item { 
    private final int id; 
    private final String name; 
    private boolean selected; 

    public Item(int id, String name) { 
     this.id = id; 
     this.name = name; 
     selected = false; 
    } 

    public int getId(){ 
     return id; 
    } 

    public String getName(){ 
     return name; 
    } 

    public boolean isSelected(){ 
     return selected; 
    } 

    public void setSelected(boolean selected){ 
     this.selected = selected; 
    } 
} 

Répondre

0

Le problème était que je n'avais pas configuré mon fichier web.xml correctement.

je manque les points suivants qui achemine la demande de richfaces:

<filter> 
    <display-name>RichFaces Filter</display-name> 
    <filter-name>richfaces</filter-name> 
    <filter-class>org.ajax4jsf.Filter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>richfaces</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    </filter-mapping> 
1

Je suppose que vos étiquettes vanille html, head et body pourraient causer cela. Ajax-stuff (javascript) doit parfois aller dans la section <head> de la page (avec les références de script requis). Parce que JSF travaille avec des composants, il doit insérer le javascript requis pour un composant donné au moment où le composant est ajouté au modèle objet sous-jacent. Par conséquent, JSF doit gérer les balises html, head et body. Ainsi, au lieu de les créer en tant que vanilla-html, utilisez les balises <h:html>, <h:body> et <h:head> appropriées, qui transmettront cette tâche à JSF. De cette façon, le code javascript requis pour votre gestionnaire d'événement onclick devrait être généré et la case à cocher devrait fonctionner comme prévu.

+0

Merci pour votre réponse, malheureusement, le problème était que je l'avais manqué configuration web.xml. Est-il préférable d'utiliser les balises dans votre réponse lorsque vous travaillez dans JSF? Il semble que ce serait le cas. – Sam