SeamFramework.orgCommunity Documentation

Chapitre 33. Les contrôles JSF de Seam

33.1. Les balises
33.1.1. Les contrôle de navigation
33.1.2. Les convertisseurs et les validateurs
33.1.3. Le formatage
33.1.4. Le texte de Seam
33.1.5. Le support de formulaire
33.1.6. Divers
33.2. Les annotations

Seam inclus de nombreux contrôles JSF qui sont très utile pour travailler avec Seam. Leur but est d'essayer de compléter les contrôles JSF livrés, et les contrôles provenant de bibliothèques tierces partites. Nous recommandons les bibliothèques de balises Ajax4JSF et ADF faces (maintenant Trinidad) à utiliser avec Seam. Nous ne recommandons pas l'utilisation de la bibliothèque de balises Tomahawk.

Pour utiliser ces balises, définissez l'espace de nommage "s" dans votre page comme ci-dessous (seulement pour les facelets):


<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:s="http://jboss.com/products/seam/taglib"
>

L'exemple ui (NdT: user interface=interface utilisateur) montre l'utilisation de nombreuses balises.

Description

Affecte un convertisseur d'entité au composant courrant. C'est vraiment utile pour un bouton radio ou un controle de type combobox.

Le convertisseur fonctionne avec des entités gérées - qu'elle soit simple ou composée. Le convertisseur devrait être capable de trouver les éléments déclaré dans le controle de JSF dans la soumission du formulaire, autrement vous allez recevoir une erreur de validation.

Attribus

Aucun.

La configuration.

Vous devez utiliser des transactions géré par Seam (voir Section 9.2, « Seam managed transactions ») avec le <s:convertEntity />.

Si votre Contexte du Managed Persistence n'appelle pas entityManager, alors vous allez avoir besoin de le définir dans components.xml:

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:ui="http://jboss.com/products/seam/ui">
 
   <ui:jpa-entity-loader entity-manager="#{em}" />

Si votre Session du Managed Persistence n'appelle pas entityManager, alors vous allez avoir besoin de le définir dans components.xml:

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:ui="http://jboss.com/products/seam/ui">
 
   <ui:hibernate-entity-loader />

Si votre Session du Managed Persistence n'appelle pas session, alors vous allez avoir besoin de le définir dans components.xml:

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:ui="http://jboss.com/products/seam/ui">
            
   <ui:hibernate-entity-loader session="#{hibernateSession}" />

Si vous voulez utiliser plus d'un gestionnaire d'entité avec le convertisseur d'entité, vous devez créer une copie du convertisseur d'entité pour chaque gestionnaire d'entité dans components.xml - notez comment le convertisseur d'entité va déléguer au chargeur de l'entité la réalisation des opérations de persistance:

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:ui="http://jboss.com/products/seam/ui">
 
   <ui:entity-converter name="standardEntityConverter" entity-loader="#{standardEntityLoader}" />
            
   <ui:jpa-entity-loader name="standardEntityLoader" entity-manager="#{standardEntityManager}" />
   
   <ui:entity-converter name="restrictedEntityConverter" entity-loader="#{restrictedEntityLoader}" />
            
   <ui:jpa-entity-loader name="restrictedEntityLoader" entity-manager="#{restrictedEntityManager}" />
<h:selectOneMenu value="#{person.continent}">
   <s:selectItems value="#{continents.resultList}" var="continent" 
                  label="#{continent.name}" />
    <f:converter converterId="standardEntityConverter" />
</h:selectOneMenu
>

Utilisation


<h:selectOneMenu value="#{person.continent}" required="true">
   <s:selectItems value="#{continents.resultList}" var="continent" 
                  label="#{continent.name}" 
                  noSelectionLabel="Please Select..."/>
   <s:convertEntity />
</h:selectOneMenu
>

Description

"Décore" un champs de saisie JSF quand la validation échoue ou quand required="true" est définie.

Attribus

#{invalid} et #{required} sont disponible dans s:decorate; #{required} est évalué à true si vous avez défini que le composant de saisie est décoré comme prévus , et #{invalid} évalué à true si une erreur de validation apparait.

Utilisation


<s:decorate template="edit.xhtml">
   <ui:define name="label"
>Country:</ui:define>
      <h:inputText value="#{location.country}" required="true"/>
   </s:decorate
>

<ui:composition 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:s="http://jboss.com/products/seam/taglib">
                  
   <div
>   
   
      <s:label styleClass="#{invalid?'error':''}">
         <ui:insert name="label"/>
         <s:span styleClass="required" rendered="#{required}"
>*</s:span>
      </s:label>
        
      <span class="#{invalid?'error':''}">
         <s:validateAll>
            <ui:insert/>
         </s:validateAll>
      </span>
        
      <s:message styleClass="error"/>     
      
   </div
>   
  
</ui:composition
>

Description

Produit un jeton aléatoire qui doit être inséré dans un champs caché de formulaire pour aider à sécuriser l'envoie de 'un formulaire contre les attaques "cross-site request forgery (XSRF)". Notez que le navigateur doit avoir les cookies actifs pour permettre de soumettre le formulaire qui est inlus avec ce composant.

Attribus

Utilisation


<h:form>
   <s:token enableCookieNotice="true" requireSession="false"/>
   ...
</h:form
>

Description

Rend un control de téléchargement de fichier. Ce control doit être utilisé dans un formulaire avec un type d'encodage multipart/form-data, autrement dit:


<h:form enctype="multipart/form-data"
>

Pour les requêtes multipart, le filtre de servlet Multipart de Seam doit aussi être configuré dans web.xml:


<filter>
  <filter-name
>Seam Filter</filter-name>
  <filter-class
>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name
>Seam Filter</filter-name>
  <url-pattern
>/*</url-pattern>
</filter-mapping
>

La configuration.

Les options de configurations suivant pour les requêtes multipart peuvent être configuré dans components.xml:

Voici un exemple:


<component class="org.jboss.seam.web.MultipartFilter">
  <property name="createTempFiles"
>true</property>
  <property name="maxRequestSize"
>1000000</property>
</component
>

Attribus

Utilisation


<s:fileUpload id="picture" data="#{register.picture}" 
              accept="image/png"
              contentType="#{register.pictureContentType}" />

Description

Une extension de <h:graphicImage> qui permet à l'image d'être cré dans un Seam Component; d'autres transformation peuvent être appliqué à l'image.

Tous les attributs de <h:graphicImage> sont supportés, à l'identique:

Attribus

Les transformations

Pour appliquer une transormation à une image, vous pouvez inclure une balise spécifiant la transformation à appliquer. Seam supporte actuellement ces transformations:

Il est facile de créer votre propre transformation - créez un UIComponent qui implémente org.jboss.seam.ui.graphicImage.ImageTransform. A l'intérieur d'une méthode applyTransform() utilisant image.getBufferedImage() pour obtenir l'image originelle et image.setBufferedImage() pour affecter votre image transformée. Les transformations sont appliqué dans l'odre spécifié dans la vue.

Utilisation


<s:graphicImage rendered="#{auction.image ne null}"
                value="#{auction.image.data}">
  <s:transformImageSize width="200" maintainRatio="true"/>
</s:graphicImage
>

Seam fourni aussi des annotations pour vous permettre d'utiliser les composants de Seam comme un convertisseur de JSF et les validateurs:

@Converter
@Name("itemConverter") 

@BypassInterceptors 
@Converter
public class ItemConverter implements Converter {
   
   @Transactional
   public Object getAsObject(FacesContext context, UIComponent cmp, String value) {
      EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
      entityManager.joinTransaction();
      // Do the conversion
   }
  
   public String getAsString(FacesContext context, UIComponent cmp, Object value) {
      // Do the conversion
   }
  
}

<h:inputText value="#{shop.item}" converter="itemConverter" />

Enregistre le composant de Seam comme un convertisseur JSF. Visible ici un convertisseur qui est capable d'accéder au JPA EntityManager dans une transaction JTA, pendant la conversion d'une valeur vers sa représentation comme objet.

@Validator
@Name("itemValidator") 

@BypassInterceptors 
@org.jboss.seam.annotations.faces.Validator
public class ItemValidator implements javax.faces.validator.Validator {
      
   public void validate(FacesContext context, UIComponent cmp, Object value)
         throws ValidatorException {
      ItemController ItemController = (ItemController) Component.getInstance("itemController");
      boolean valid = itemController.validate(value);
      if (!valid) {
         throw ValidatorException("Invalid value " + value);
      }
   }
}

<h:inputText value="#{shop.item}" validator="itemValidator" />

Enregistre le composant de Seam comme un validateur JSF. Visible ici une validateur qui injecte un autre composant de Seam, le composant injecté est utilisé pour valider la valeur.