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.

9 comments:
 
21. Aug 2008, 16:56 America/New_York | Link

I receive this error in JBoss upon hitting the login page of our application (Seam 2.0GA, RichFaces 3.1.4). I have followed these instructions exactly but removed the import of the TextHandler class.

Caused by: java.lang.NoClassDefFoundError: com/sun/facelets/tag/AbstractTagLibrary
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

Has anyone experienced this problem?

 
30. Sep 2008, 18:24 America/New_York | Link

ran into same problem, for me it was class loader issue as the custom EL was part of internal reusable library that is loaded as part of ear. Moving foo.war/WEB-INF/lib/jsf-facelets.jar to foo.ear/lib/jsf-facelets.jar resolved class loader issue..

Thanks

 
19. Oct 2008, 05:24 America/New_York | Link

This post may be very obvious to many but to some perhaps not.

You do not have to follow the package conventions in the post. You may use whatever package names and library names you feel like.

In addition, you can add multiple classes that contain static helper functions that may exists in your code.

Here is something very similar to what I ended up doing:

/**
 * 
 */
package com.Foo.facelets;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import com.sun.facelets.tag.AbstractTagLibrary;

/**
 * Foo Custom Facelets Tag Library
 * 
 * Currently it supports the StringUtil methods available in Foo and FooBar libs
 * plus additional Foo Enterprise methods and SEAM specific methods
 * related to EL Expressions
 * 
 * @see http://www.seamframework.org/Documentation/CreatingCustomELFunctions
 * 
 */
public class FooFaceletsLibray extends AbstractTagLibrary
{
    public final static String Namespace = "http://Foo.com/jsf/facelets";

    public static final FooFaceletsLibray Instance = new FooFaceletsLibray();

    public FooFaceletsLibray()
    {
        super(Namespace);
        try
        {
            addStaticMethods(SeamFunctions.class);
            addStaticMethods(FooFunctions.class);
            addStaticMethods(com.Foo.somePackage.util.StringUtils.class);
            addStaticMethods(com.Foo.anotherPackage.util.StringUtils.class);
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }
    }
    
    protected void addStaticMethods(Class<?> clazz)
    {
        Method[] methods = clazz.getMethods();
        for (int i = 0; i < methods.length; i++)
        {
            if (Modifier.isStatic(methods[i].getModifiers()))
            {
                this.addFunction(methods[i].getName(), methods[i]);
            }
        }        
    }
}
 
11. Feb 2009, 00:17 America/New_York | Link

hello I need help with the creation of the tag, I receive this error, besides the elfunctions.taglib.xml show me the following warning.
The file cannot be validated as the host "java.sun.com" is currently unreachable.
elfunctions.taglib.xml the code after this error
please what can I do.


18:02:08,065 ERROR [viewhandler] Error Loading Library: /META-INF/elfunctions.taglib.xml
java.io.IOException: Error parsing [jndi:/localhost/proyecto_generar/META-INF/elfunctions.taglib.xml]:
        at com.sun.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:410)
        at com.sun.facelets.FaceletViewHandler.initializeCompiler(FaceletViewHandler.java:274)
        at com.sun.facelets.FaceletViewHandler.initialize(FaceletViewHandler.java:161)
        at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:537)
        at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
        at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:196)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
        at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:177)
        at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:267)
        at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:380)
        at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:507)
        at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.xml.sax.SAXException: Error Handling [jndi:/localhost/proyecto_generar/META-INF/elfunctions.taglib.xml@6,55] <library-class>
        at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.endElement(TagLibraryConfig.java:271)
        at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.endNamespaceScope(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source)
        at org.apache.xerces.impl.dtd.XMLDTDValidator.endElement(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
        at javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
        at com.sun.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:407)
        ... 52 more
Caused by: java.lang.ClassNotFoundException: org.el.func.FnLibrary
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at com.sun.facelets.util.ReflectionUtil.forName(ReflectionUtil.java:36)
        at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.createClass(TagLibraryConfig.java:291)
        at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.processLibraryClass(TagLibraryConfig.java:339)
        at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.endElement(TagLibraryConfig.java:171)
        ... 67 more




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

<facelet-taglib>
         <library-class>org.el.func.FnLibrary</library-class>
</facelet-taglib>

warning
The file cannot be validated as the host "java.sun.com" is currently unreachable.
 
06. Aug 2009, 11:55 America/New_York | Link
I am getting the following error:

javax.el.ELException: Function 'e:concat' not found
        at org.apache.el.lang.ExpressionBuilder.visit(ExpressionBuilder.java:171)
        at org.apache.el.parser.SimpleNode.accept(SimpleNode.java:129)
        at org.apache.el.lang.ExpressionBuilder.prepare(ExpressionBuilder.java:133)
        at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:147)
        at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:190)
        at org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:68)
        at com.sun.facelets.el.ELText$ELTextVariable.apply(ELText.java:161)
        at com.sun.facelets.el.ELText$ELTextComposite.apply(ELText.java:142)
        at com.sun.facelets.compiler.TextInstruction.apply(TextInstruction.java:56)
        at com.sun.facelets.compiler.UIInstructionHandler.apply(UIInstructionHandler.java:95)
        at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
        at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:119)
        at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
        at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
        at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
        at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
        at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
        at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:144)
        at com.sun.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:60)
        at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:73)
        at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
        at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:119)
        at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
        at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
        at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
        at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
        at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
        at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:144)
        at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:113)
        at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
        at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
        at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
        at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:524)
        at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567)
        at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
        at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
        at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Unknown Source)
15:08:21,749 WARN [lifecycle] executePhase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@16bf0aa) threw exception

Any help appricated.

Thanks.
 
20. Apr 2010, 14:59 America/New_York | Link

And if I want to define multiple tag libraries to be used? How can I do this? First, in a project I passed facelets.LIBRARIES as a semicolon-delimited list and i worked fine, but now this is not working. Only the first entry of the lis is recognized.

 
16. Feb 2011, 11:25 America/New_York | Link

I'm having the same problem carlos and sashwat. Either of you figure out what the problem was?

Thanks!

 
16. Feb 2011, 11:26 America/New_York | Link

I'm having the same problem carlos and sashwat. Either of you figure out what the problem was?

Thanks!

 
16. Feb 2011, 12:42 America/New_York | Link

I figured out the issue:

Do not expect hot-deploy to pick this up. Make all of your changes before you deploy it to the server. Also, clear out the {server-profile}/temp and {server-profile}/work directories just in case.

If it doesn't work the first time, try one more time. I suppose it worked on my second try because it didn't pick up the file correctly.