Problem Solver

Access Java Static Methods and Constants from EL

By , 24 September 2015

Access Java Static Methods and Constants from EL
Access Java Static Methods and Constants from EL

Java EL 3.0 provides a way to access static variables and static methods from JSF or JSP, but it's a bit nasty, requiring you to import the packages into your EL Context. I'm lazy and have been using this hack since 2012, so I'm just going to keep doing it for EL 3.0. The hack I'm using makes static methods and constants available via normal managed beans. Note, I'm using Lombok annotations to generate the getters and setters automatically.

@ManagedBean
@ApplicationScoped
@Getter @Setter 
public class App {
    
    /* global compile-time constants */
    public static final String ROOT_DIR = "/var/local";
    public static final String UPLOADS_DIR = "/var/local/uploads";
    public static final String IMAGE_DIR = "/var/local/images";
    public static final String MANAGER_ROLE = "manager";

    /* EL accessors for static constants */
    String root_dir = ROOT_DIR;
    String uploads_dir = UPLOADS_DIR;
    String image_dir = IMAGE_DIR;
    String manager_role = MANAGER_ROLE;

    /* EL accessors for static methods */
    public long ctime() {
       return System.currentTimeMillis();
    }
}
Access Java Static Methods and Constants from EL

Java identifiers are case sensitive so there is no namespace problem with the static and non-static properties. Now, all we need to do to access the statics via EL is:

 ${app.manager_role}

or

 ${app.ctime()}

As an added bonus, your IDE should be able to refactor your templates easily if you decide to change the variable names.

Alternatively, you could declare all your static methods in faces-config.xml but that's too much work for me, and you lose type safety and refactoring support.

 

About Roger Keays

Access Java Static Methods and Constants from EL

I am an artist, an engineer, and a student of psychology. Some projects I'm working on at the moment are Sunburnt SEO, The Game Of Your Life, Money Talks and other, top secret stuff. You can follow me via RSS or on Twitter, Facebook, and even Google+.

Add a comment

Please visit http://RogerKeays.com/access-java-static-methods-and-constants-from-el to add your comments.

Comment posted by: bat, 4 months ago

Muy bueno

Comment posted by: kenneth centurion, 11 months ago

you can also display values from the facescontext sesionmap like this:

<p:outputLabel value="Last Logged In:[#{sessionScope.lastLoginDate}]"/>

 

and in your bean you can put a value in the session map like this:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("lastLoginDate",new Date());

Comment posted by: , 3 years ago

That works too, but I actually like how the application scoped bean creates a mini namespace for my constants.

Some people also use the "map hack". i.e. override the get() method of a Map.

Comment posted by: Tom Asel, 3 years ago

 Nice one :-)

Another approach is to have a custom ELResolver enabling you to use custom implicit objects.

E.g. SomeClass.MY_CONSTANT could be accessed via #{myConstant} . I prefer this one over application scoped beans for my projects.

Follow Roger Keays

It'll Change Your Life

I write every Sunday about all sorts of interesting stuff. Drop me your email and you'll be the first to get my articles when they're published. It'll change your life. And it's free :)


Website Updates

Latest Poll

Is your life is better or worse because of Facebook?
Better
Worse
The same