Comment utiliser la page JSF? Le formulaire unique? Plusieurs formulaires? Des formes imbriquées?

j'utilise la technologie Facelet Templating pour mettre en page Ma page dans une application JSF 2 sur laquelle je travaille.

dans mon en-tête.xhtml, primefaces exige que ménubar soit enfermé dans la forme h:.

<h:form>
    <p:menubar autoSubmenuDisplay="true">
        Menu Items here!
    </p:menubar>
</h:form>

ainsi, dans mes pages de contenu, j'aurai un autre formulaire h:ou plus.

est-ce que ça va marcher si je place juste le formulaire h:dans mon modèle.xhtml?

<h:body>
    <h:form>
        <div id="top">
            <ui:insert name="header"><ui:include src="sections/header.xhtml"/></ui:insert>
        </div>
        <div>
            <div id="left">
                <ui:insert name="sidebar"><ui:include src="sections/sidebar.xhtml"/></ui:insert>
            </div>
            <div id="content" class="left_content">
                <ui:insert name="content">Content</ui:insert>
            </div>
        </div>
        <div id="bottom">
            <ui:insert name="footer"><ui:include src="sections/footer.xhtml"/></ui:insert>
        </div>
    <h:form>
</h:body>

je pense en fait à un cas d'utilisation où j'ai besoin de plusieurs h: forme dans une page.

Merci

39
demandé sur BalusC 2011-09-10 17:10:06

2 réponses

vous pouvez utiliser en toute sécurité plusieurs formulaires dans une page JSF. Ce N'est pas différent de L'utilisation de HTML.

Imbrication <form> éléments invalide dans HTML . Comme JSF ne produit qu'un tas de HTML, ce n'est pas différent dans JSF. La nidification <h:form> est donc également invalide dans JSF.

<h:form>
    ...
    <h:form> <!-- This is INVALID! -->
        ...
    </h:form>
    ...
</h:form>

le comportement du navigateur quant à la soumission d'un formulaire imbriqué n'est pas spécifié. Il peut ou peut ne pas fonctionner comme vous le souhaitez. Il peut par exemple simplement rafraîchir la page sans invoquer la méthode d'action bean. Même si vous déplacez la forme imbriquée (ou un composant qui la contient) en dehors de la forme mère avec une manipulation dom (ou en utilisant par exemple les PrimeFaces appendTo="@(body)" ), il ne fonctionnera toujours pas et il devrait y avoir Non formes imbriquées au moment du chargement de la page.

quant aux formes que vous devez garder, avoir un seul "Dieu " <h:form> est en fait une mauvaise pratique. Donc, vous feriez mieux de retirer l'extérieur <h:form> du modèle maître et laisser le header , sidebar , content les sections etc définissent chacune leur propre <h:form> . Plusieurs formes parallèles sont valables.

<h:form>
    ...
</h:form>
<h:form> <!-- This is valid. -->
    ...
</h:form>

chaque formulaire doit avoir une responsabilité claire. E. g. un formulaire de connexion, formulaire de recherche, le formulaire principal, la boîte de dialogue formulaire, etc. Vous ne voulez pas inutilement traiter tous les autres formulaires / entrées, lorsque vous soumettez un certain formulaire.

notez donc que lorsque vous soumettez un certain formulaire, d'autres formulaires ne sont pas traités. Donc, si vous avez l'intention de traiter une entrée d'une autre forme de toute façon, alors vous avez un problème de conception. Soit vous le mettez dans la même forme, soit vous y mettez de vilains piratages JavaScript pour copier les informations nécessaires dans un champ caché du formulaire contenant le bouton Soumettre.

dans une certaine forme, vous pouvez cependant utiliser ajax pour limiter le traitement des entrées à un sous-ensemble plus petit. Par exemple: <f:ajax execute="@this"> traitera (submit/convert/validate/invoke) seulement le composant courant et pas les autres dans le même formulaire. Ceci est généralement utilisé dans les cas d'utilisation où d'autres entrées dans le même formulaire doivent être remplies/rendues/basculées dynamiquement, par exemple des menus déroulants dépendants, des listes autocomplètes, des tables de sélection, etc.

voir aussi:

81
répondu BalusC 2017-10-18 12:57:02

j'ai été déconcerté par cette question pendant un certain temps. Au lieu d'une série de formulaires indépendants, je me suis converti à un modèle, c'est-à-dire, plutôt que de faire un appel à un xhtml avec des formulaires listés, habituellement sous forme d'ui:include, je fais un appel à ceux anciennement ui:included XHTML pages qui ui:contenu capturé dans un modèle parent.

-1
répondu emm 2016-11-18 20:48:00