Help

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">
<facelet-taglib>
	 <library-class>org.el.func.FnLibrary</library-class>
</facelet-taglib>

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() {
		super(Namespace);
		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 SeamFunc.java to be available in the EL. Now create org.el.func.SeamFunc.java:

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) {
				buff.append(str);
			}
		}
		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:

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>
        /META-INF/elfunctions.taglib.xml
    </param-value>
</context-param>

Create a test.xhtml page and add:

xmlns:e="http://org.el.func/SeamFunc"

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.