Composant personnalisé pour JSF 2

JSF 2.0 permet de facilement créer des composants pour nos applications web.

Nous allons voir comment les développer.

Gloablement, on pourra distinguer 2 types de composants :

  1. Les composants simples
  2. Les composants avancés

1-Les composants simples

Les composants simples sont réalisés à partir de template facelet. Il s’agit en fait de créer des morceaux de code facelet/xhtml (composition) qui pourront ensuite être utilisés comme des composants JSF.

Exemple



    

#{label}

2-Les composants avancées

Les composants avancés sont développés en JAVA. On va dans ce cas pouvoir faire beaucoup plus de choses car on a le contrôle total sur la manière dont le composant va s’afficher en générant nous même le code HTML.

Pour cela il suffit d’étendre la classe UIComponentBase et de surcharger certaines méthodes. Il faudra aussi déclarer notre composant grâce à une annotation.

Exemple


import java.io.IOException;
import javax.faces.context.FacesContext;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.ResponseWriter;

@FacesComponent("OutputTitle")
public class OutputTitle extends UIComponentBase {

	private String label;

	public String getLabel() {
		return label;
	}

	public void setLabel(String label) {
		this.label = label;
	}

	@Override
	public String getFamily() {
		return "fr.mon.projet";
	}

	@Override
	public void encodeBegin(FacesContext context) throws IOException {
		ResponseWriter writer = context.getResponseWriter();
		writer.write("

"); if (label != null) { writer.write(label); } writer.write("

"); } } }

Quelque soit le type de composant, il faudra créer un fichier /WEB-INF/monprojet-taglib.xml pour décrire notre librairie de balises et ajouter les lignes suivantes dans le web.xml du projet :


    javax.faces.FACELETS_LIBRARIES
    /WEB-INF/monprojet-taglib.xml
  



    http://fr.mon.projet/lib
    
        outputTitle
        
            OutputTitle
        
    
    
        simpleOutputTitle
        simpleOutputTitle.xhtml
    


Ensuite il suffit de déclarer le namespace de la librairie dans la page jsf et d’utiliser notre balise.

Exemple :