Built with Seam

You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.

In the WebContent/META-INF/ (JBDS) or view/META-INF/ (seam-gen) create a file called elfunctions.taglib.xml. If the META-INF/ dir does not exist, create it also. The content of elfunctions.taglib.xml should be:

<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">

Create another src package src/facelets with the packagename: org.el.func and add

package org.el.func;

import com.sun.facelets.tag.AbstractTagLibrary;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class FnLibrary extends AbstractTagLibrary {

	public final static String Namespace = "http://org.el.func/SeamFunc";

	public static final FnLibrary INSTANCE = new FnLibrary();

	public FnLibrary() {
		try {
			Method[] methods = SeamFunc.class.getMethods();
			for (int i = 0; i < methods.length; i++) {
				if (Modifier.isStatic(methods[i].getModifiers())) {
					this.addFunction(methods[i].getName(), methods[i]);
		} catch (Exception e) {
			throw new RuntimeException(e);

The above will dynamically add any of the static methods in a class called to be available in the EL. Now create

package org.el.func;

import org.jboss.seam.core.Expressions;

public class SeamFunc {

	public static String concat(String... strings) {
		StringBuilder buff = new StringBuilder();
		if (strings != null) {
			for (String str : strings) {
		return buff.toString();

	public static Object evalEl(String expression) {
		String framedExpr = "#{" + expression + "}";
		Object value = Expressions.instance().createValueExpression(framedExpr).getValue();
		return value;


Now the last piece is to define the location of the elfunctions.taglib.xml in web.xml:


Create a test.xhtml page and add:


and to the body:

#{e:concat('Hello ', 'World!')} / #{e:evalEl('conversation')}

These are just two examples of functions, you can create as many as you'd like. The evalEL seems useless, until you realize you can do something like:

#{e:evalEL(e:concat('person', 'Home'))}

which correctly resolves the value of the Seam component named personHome.