How to modularize a JSF/Facelets/Spring application with OSGi?
Posted
by lexicore
on Stack Overflow
See other posts from Stack Overflow
or by lexicore
Published on 2010-04-04T19:48:38Z
Indexed on
2010/04/04
19:53 UTC
Read the original article
Hit count: 479
I'm working with very large JSF/Facelets applications which use Spring for DI/bean management. My applications have modular structure and I'm currently looking for approaches to standardize the modularization.
My goal is to compose a web application from a number of modules (possibly depending on each other). Each module may contain the following:
- Classes;
- Static resources (images, CSS, scripts);
- Facelet templates;
- Managed beans - Spring application contexts, with request, session and application-scoped beans (alternative is JSF managed beans);
- Servlet API stuff - servlets, filters, listeners (this is optional).
What I'd like to avoid (almost at all costs) is the need to copy or extract module resources (like Facelets templates) to the WAR or to extend the web.xml for module's servlets, filters, etc. It must be enough to add the module (JAR, bundle, artifact, ...) to the web application (WEB-INF/lib, bundles, plugins, ...) to extend the web application with this module.
Currently I solve this task with a custom modularization solution which is heavily based on using classpath resources:
- Special resources servlet serves static resources from classpath resources (JARs).
- Special Facelets resource resolver allows loading Facelet templates from classpath resources.
- Spring loads application contexts via the pattern
classpath*:com/acme/foo/module/applicationContext.xml- this loads application contexts defined in module JARs. - Finally, a pair of delegating servlets and filters delegate request processing to the servlets and filters configured in Spring application contexts from modules.
Last days I read a lot about OSGi and I was considering, how (and if) I could use OSGi as a standardized modularization approach. I was thinking about how individual tasks could be solved with OSGi:
- Static resources - OSGi bundles which want to export static resources register a
ResourceLoaderinstances with the bundle context. A centralResourceServletuses these resource loaders to load resources from bundles. - Facelet templates - similar to above, a central
ResourceResolveruses services registered by bundles. - Managed beans - I have no idea how to use an expression like
#{myBean.property}ifmyBeanis defined in one of the bundles. - Servlet API stuff - use something like WebExtender/Pax Web to register servlets, filters and so on.
My questions are:
- Am I inventing a bicycle here? Are there standard solutions for that? I've found a mentioning of Spring Slices but could not find much documentation about it.
- Do you think OSGi is the right technology for the described task?
- Is my sketch of OSGI application more or less correct?
- How should managed beans (especially request/session scope) be handled?
I'd be generally graefult for your comments.
© Stack Overflow or respective owner