Comment utiliser component binding dans JSF droite? (composante visée par la demande dans la session visée par la demande))

Mojara 2.1.21

j'ai mis à jour ma question en fonction des commentaires. J'ai deux situations où un composant est lié à la session du serveur bean. (Liens supplémentaires avec l'information: L'attribut de liaison provoque l'ID du composant dupliqué trouvé dans la vue et https://stackoverflow.com/a/12512672/2692917 )

Version 1:

unique.xhtml:

 <h:outputText value=... binding="#{mysessionbean.out}" />

java:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }

Version 2:

Modèle

.xhtml:

 <h:outputText value=... binding="#{mysessionbean.out}"

View 1.xhtml:

 <ui:composition template="template.xhtml" />

vue2.xhtml:

 <ui:composition template="template.xhtml" />

java:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }

Version 1 est ok. (Au moins je n'ai pas rencontré d'erreurs jusqu'à présent). Mais dans la version 2, l'erreur de duplicate id se produit si je navigue depuis d'une page à l'autre. Pourquoi se produit-il ? Est-il sûr d'utiliser le composant (request-scoped) (dans la version 1) avec la session scoped binding ? Y a-t-il d'autres cas d'utilisation à considérer ?

Edit: exigence fonctionnelle 1:

je veux utiliser Primefaces datable dans une vue. J'ai besoin de quelques infos de ce datatable. (Tel que l'indice de ligne ou de ligne sélectionné). Donc lier le datatable m'aide à récupérer cette information.

exigence fonctionnelle 2:

fixation d'éléments dans des éléments composites. Ils seront liés à la session d'étendue de haricot. (Et utilisé principalement sur une seule page, mais si je l'ai utilisé sur une autre page ?

exigences 3

La situation dans la "Version 2". Modèle avec menu primefaces et reliure de session scoped. Pour cela, j'ai utilisé le El-Binding.

4
demandé sur Community 2013-09-07 03:13:15

2 réponses

dans JSF 2.x, à moins que vous ne vouliez manipuler les composants programmatiquement (ce qui est à son propre aussi plutôt louche), il n'y a pas de cas d'utilisation raisonnable du monde réel pour lier les composants à un support de fève. Ce n'est pas sûr s'ils ne sont plus utilisés dans la fève elle-même, ou si ce sont seulement leurs attributs qui sont aplatis.


quant à l'exigence fonctionnelle d'obtenir la rangée actuelle de la table de données, il ya beaucoup Comment puis-je passer une ligne sélectionnée à commandLink inside datable? , par exemple si votre environnement supporte EL 2.2:

<h:dataTable value="#{bean.items}" var="item">
    <h:column>
        <h:commandLink value="Foo" action="#{bean.foo(item)}" />

les deux dernières exigences ne sont absolument pas claires. Au moins, si vous faites quelque chose comme:

<x:someComponent binding="#{bean.someComponent}" />

en haricot

someComponent.setSomeAttribute(someAttribute);
someComponent.setOtherAttribute(otherAttribute);

, alors vous devriez plutôt faire

<x:someComponent someAttribute="#{bean.someAttribute}" otherAttribute="#{bean.otherAttribute}" />

Ou, si vous avez l'intention d'être en mesure d'utiliser le composant ailleurs dans la vue comme

<h:inputText ... required="#{not empty param[bean.save.clientId]}" />
...
<h:commandButton binding="#{bean.save}" ... />

et l'instance est plus loin nulle part été utilisé dans le haricot, puis se débarrasser de la propriété inutile tout à fait:

<h:inputText ... required="#{not empty param[save.clientId]}" />
...
<h:commandButton binding="#{save}" ... />

S'il n'y a vraiment, vraiment aucun moyen pour une raison qui n'est pas claire, alors divisez toutes les propriétés scoped request de la session scoped bean out en une requête séparée haricot scoped que vous à votre tour liez pour former des actions. La session scoped one peut simplement être injecté comme un @ManagedProperty de la requête scoped one.


Voir aussi:

7
répondu BalusC 2017-05-23 11:45:49

Nous avons rencontré un problème similaire et je veux juste partager notre solution:

problème: Dans un point de vue, il y avait un (étendu en grande partie personnalisé) datable.

<x:dataTable binding="#{bean.someSomeDataTable}" />

après avoir navigué vers une autre page et retour, nous voulions que le datatable ait le même état exact. Nous avons déjà résolu ce problème en liant la donnée à la fève de soutien. Cela a bien fonctionné avec la JSPs. Avec les Facelets, nous ne pouvions pas faire cela (erreurs D'ID en double). Nous avons donc utilisé l' liant, mais seulement sauvé / restauré l'état du composant datable.

public HtmlDataTable getSomeDataTable()
{
 HtmlDataTable htmlDataTable = new HtmlDataTable();
 if (tableState != null)
   htmlDataTable.restoreState(FacesContext.getCurrentInstance(), tableState);
 return htmlDataTable;
}

public void setSomeDataTable(HtmlDataTable table)
{
  tableState = table.saveState(FacesContext.getCurrentInstance());
}
2
répondu Dominik 2014-05-28 15:43:37