mercredi juil. 28, 2010

Servlet 3.0, fragments and web.xml to rule them all

This blog has moved to alexismp.wordpress.com
Follow the link for the most up-to-date version of this blog entry.

Servlet 3.0 has some very nice ease-of-development features in the form of new annotations (such as @WebServlet) and some useful extensibility features with web-fragments (details here) and ServletContainerInitializer which all contribute to make web.xml optional. While this is a great step towards more modular applications and an overall development simplification, you may want to have more control over what's being deployed in your production system. This is what metadata-complete helps you achieve.

web.xml contains a metadata-complete attribute in the web-app element whose binary value defines whether other sources of metadata should be considered when deploying this web application, this includes annotations on class files (@WebServlet, but also @WebListener, @WebFilter, ...), web-fragment.xml as well as classes located in WEB-INF/classes. If set to true all of these will be ignored and web.xml is the only metadata considered. Setting it to false falls back to the default behavior. Note you can also use this attribute inside fragments to have them consider annotation or not. Check the Servlet 3.0 specification (section 15.5) for details on that part.

Better than a long blog entry, here's a short screencast (available in HD) illustrating the basics of this feature :

You can try this all today in GlassFish.

Here are other Java EE 6-related "lesser-known features" :
Module initialization order in Java EE 6
WEB-INF/lib/{\*.jar}/META-INF/resources
Just say no to Scarlett Johansson ... (but say yes to Bean Validation)!
javax.annotation.ManagedBean
EJB 3.1 asynchrony and transactions

mercredi avr. 28, 2010

WEB-INF/lib/{\*.jar}/META-INF/resources

This blog has moved to alexismp.wordpress.com
Follow the link for the most up-to-date version of this blog entry.

Modularity is one of the themes for Java EE 6 and servlet 3.0 fragments one often mentioned as one examples of this (see details here). This blog entry is about a small yet very useful new feature of the servlet 3.0 specification to deal with static content such as images, CSS or JavaScript.

Before servlet 3.0, images could be made accessible from the root of the web applications but that meant copying the files to the WAR archive and keeping them up-to-date. This certainly meant a solution tightly coupled with the web application development and packaging. The other option was to place this static content in the docroot of the application server which was in turn time probably too loosely coupled allowing for anyone to access this and encouraging every application to use the same set of static content.

With Servlet 3.0, a JAR placed in WEB-INF/lib has static content from its META-INF/resource directory accessible from the web-context root. You can also parse this previous statement with WEB-INF/lib/{\*.jar}/META-INF/resources. So this means you no longer need to use the ServletContext getResource() and getResourceAsStream() methods with some rather dumb rewriting.

In this simple web application WAR example :

... the static resources are available from :

http://host:port/webcontext/scripts.js
http://host:port/webcontext/styles.css
http://host:port/webcontext/welcome.png


where http://host:port/webcontext/ could be replaced with the relative path "./"

This makes for more modular applications. Other than images, think of how this applies to CSS and javascript. It's probably now a good idea to package JavaScript libraries such a jquery or dojo in a dedicated JAR (effectively a resource JAR).

The other use-case I can think of is configuration files. One could deploy with WEB-INF/lib/testing.jar or with WEB-INF/lib/production.jar each of which containing META-INF/resources/config.properties file with different content. The application code reading the configuration would always access it using ./config.properties (or http://host:port/webcontext/config.properties).

Note this mechanism also applies to JSPs and that resource files placed in the document root take precedence. Get all the details from paragraph 10.5 of the Servlet 3.0 specification.

Try this out today in GlassFish 3 and above.

About

This blog has moved

Alexis Moussine-Pouchkine's Weblog

GlassFish - Stay Connected

Search

Archives
« avril 2014
lun.mar.mer.jeu.ven.sam.dim.
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    
       
Today
Blogroll

No bookmarks in folder

News

No bookmarks in folder