<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-739779127620140144</id><updated>2012-01-07T05:18:20.257-08:00</updated><category term='ActiveMQ'/><category term='Java EE 6'/><category term='Tomcat'/><category term='Web-plug'/><category term='JSF'/><category term='Spring Dynamic Module'/><category term='Spring Security 3'/><category term='OSGi'/><category term='Prime Faces'/><category term='CK-Editor'/><category term='Spring Framework'/><title type='text'>Open Garage</title><subtitle type='html'>Simple Solutions to complex problems</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-621843973156063360</id><published>2011-03-07T07:25:00.001-08:00</published><updated>2011-03-07T07:25:57.351-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Dynamic Module'/><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>Installing Spring Dynamic Module 2.0 on Apache Felix 3 in a hurry</title><content type='html'>&lt;p&gt;As I mentioned in my posts on Web-plug, I did not consider OSGi or Spring DM at that time because of learning curve and lack of time. But web-plug also has its own set of limitations. Versioning is a big issue for example. I did not try to extend the classloader of Tomcat for this. But off late OSGi and Spring DM has caught my attention again, as I have some time to focus on something new. Also I find that some really good and highly detailed books are out there in the market.So documentation is now reaching the state where it should be for a new technology and framework to be easily and widely acceptable.&lt;/p&gt; &lt;p&gt;Now I picked up – Spring Dynamic Module in Action (Manning, 2010). Its a wonderful book as most of them that I have read in Manning’s in Action series. This is a must read book. Please buy it and do not dowload a pirated e-book. The authors and publications take lot of pain in producing a good book. The examples in this book are based on Equinox OSGi container. I thought of using them on Apache Felix. So the first step is installing the OSGi container and then the framework.&lt;/p&gt; &lt;p&gt;Download and Install Apache Felix 3.0.9 from the link below:&lt;/p&gt; &lt;p&gt;&lt;a title="http://mirror.atlanticmetro.net/apache//felix/org.apache.felix.main.distribution-3.0.9.zip" href="http://mirror.atlanticmetro.net/apache//felix/org.apache.felix.main.distribution-3.0.9.zip"&gt;http://mirror.atlanticmetro.net/apache//felix/org.apache.felix.main.distribution-3.0.9.zip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Unzip the zip file in a folder named felix-framework-3.0.8. e.g – C:\felix-framework-3.0.8&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_UEQt_cUM2VM/TXT4788lBBI/AAAAAAAAAjM/qguA5HMAXYE/s1600-h/image%5B2%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_UEQt_cUM2VM/TXT48rwI39I/AAAAAAAAAjQ/qM14bQ2PLOk/image_thumb.png?imgmax=800" width="244" height="189"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now create a run.cmd file and save it in the felix-framework-3.0.8 folder using your favourite text editor.The file contains the instructions to launch the Felix framework as shown below:&lt;/p&gt; &lt;p&gt;java -jar bin/felix.jar&lt;/p&gt; &lt;p&gt;Once the run.cmd file is ready, we are all set to launch the framework. So, launch the command prompt and type run. The gogo console is shown below.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_UEQt_cUM2VM/TXT49Jf8rVI/AAAAAAAAAjU/PMx0McCm-TU/s1600-h/image%5B11%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_UEQt_cUM2VM/TXT4928AT2I/AAAAAAAAAjY/yU2_6oqzb4E/image_thumb%5B3%5D.png?imgmax=800" width="244" height="83"&gt;&lt;/a&gt;&lt;br&gt;Download and unzip Spring DM &lt;/p&gt; &lt;p&gt;Note – Spring DM has now moved to Eclipse Foundation as Gemini Blueprint project. But its still in incubation stage. So we will download and use Spring DM 2.0.0.M1 from the link below:&lt;/p&gt; &lt;p&gt;&lt;a title="http://s3.amazonaws.com/dist.springframework.org/milestone/OSGI/spring-osgi-2.0.0.M1-with-dependencies.zip" href="http://s3.amazonaws.com/dist.springframework.org/milestone/OSGI/spring-osgi-2.0.0.M1-with-dependencies.zip"&gt;http://s3.amazonaws.com/dist.springframework.org/milestone/OSGI/spring-osgi-2.0.0.M1-with-dependencies.zip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Just unzip the distribution and copy the bundles from dist and lib folders. The list is shown in figure below. The four selected bundles are core framework bundles. The rest are for Spring DM.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/TXT4-pUYrKI/AAAAAAAAAjc/sQk-dk1IUAM/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_UEQt_cUM2VM/TXT4_dOOo7I/AAAAAAAAAjg/AIbYdaeBDrw/image_thumb%5B2%5D.png?imgmax=800" width="191" height="244"&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Just copy the files to the bundle folder (in this case - C:\felix-framework-3.0.8\bundle).Now once again fire the command run.cmd and you will the gogo console now spits some log4j warning.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_UEQt_cUM2VM/TXT5AEH17cI/AAAAAAAAAjk/0vnvYUfrRTk/s1600-h/image%5B14%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_UEQt_cUM2VM/TXT5A1i9KCI/AAAAAAAAAjo/6cTYmj7nm1M/image_thumb%5B4%5D.png?imgmax=800" width="244" height="71"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The problem is well documented in the book. I will try to create a fragment in the next post to solve this on Apache Felix. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-621843973156063360?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/621843973156063360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2011/03/installing-spring-dynamic-module-20-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/621843973156063360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/621843973156063360'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2011/03/installing-spring-dynamic-module-20-on.html' title='Installing Spring Dynamic Module 2.0 on Apache Felix 3 in a hurry'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_UEQt_cUM2VM/TXT48rwI39I/AAAAAAAAAjQ/qM14bQ2PLOk/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-90755484680199824</id><published>2010-11-09T05:19:00.001-08:00</published><updated>2010-11-09T05:19:45.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java EE 6'/><title type='text'>End of Java EE 6 show</title><content type='html'>&lt;p&gt;Since last 2 days I have had lot of issues integrating JPA2 with my SLSB. Some of these are attributed to my new learning curve in Java EE 6. However with my quick exploration in last few days I can safely say that there are still serious holes in Java EE 6 world. It is slim trim and good for rapid development (unless you are on some unstable open source server) but lacks full power to drive a highly customizable and external configuration driven flexible application. These are some of my observations:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Open source servers – Geronimo 3 and JBOSS 6 not yet ready. JBOSS 6 is still better. Guys for better adoption of open source we need documentation. Open source product and closed documentation will not promote this good products.&lt;/li&gt; &lt;li&gt;Directly injecting persistence unit / entity manager results in severe cross cutting concerns. I take back my earlier word, although speed of development is important, good design goes a long way in maintenance. After writing some code in my session bean with JPA I was sad myself.&lt;/li&gt; &lt;li&gt;Java EE 6 will not suffice if you need to build and app with good number of external configuration properties. &lt;/li&gt; &lt;li&gt;Security – although I did not try much, but looks like is not as strong in terms of features that Spring security provides – especially easy integration with directory servers or SSO systems.&lt;/li&gt; &lt;li&gt;If I want to clean up my session beans by moving data access code to a DAO, then I would have to build a factory to inject it. Ah Spring does a better job here. Does Java EE 6 promote code smell? I guess YES.&lt;/li&gt; &lt;li&gt;I was feeling the need for those template classes when writing direct JPA code with entity manager.&lt;/li&gt; &lt;li&gt;I had problems using the POSTGRES data source configured using JBOSS 6 console. The persistence unit could never connect. Finally I had to resort to old days of copy+paste the xml in the deploy directory.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;Final conclusion&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I am rolling back to stick to Spring 3 on Tomcat 6/7 with Primefaces and Hibernate or my home grown data mapper. I will also use JQUERY UI and JQUERY Mobile if my requirements are that way. I may consider JBOSS 5 / 6 if&amp;nbsp; there is need for JMS / MQ and there is multiple resource managers calling for JTA. But all core will be Spring. I think lot of dust has to settle over Java EE 6, even then it will still take lot of time to match the pluggability, flexibility and wide coverage of Spring with other good frameworks.&lt;/p&gt; &lt;p&gt;Next focus will on my own simple data mapper. I will put it on source forge.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-90755484680199824?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/90755484680199824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/11/end-of-java-ee-6-show.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/90755484680199824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/90755484680199824'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/11/end-of-java-ee-6-show.html' title='End of Java EE 6 show'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-5120313054922568144</id><published>2010-11-07T04:13:00.001-08:00</published><updated>2010-11-07T09:15:00.522-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java EE 6'/><title type='text'>Adding and injecting the EJB3 session bean</title><content type='html'>In the last post the managed bean was creating the data. As a good practice the get method should never ideally do load from database or do complex time consuming operations. Its time to move the data retrieval code to a session bean( subsequently use JPA) method. In Java EE 6 it is no longer required to put the ejbs in jar files with tons of deployment descriptors. The ear file is no longer mandatory in Java EE 6. You can put your EJBs in the same war file as the web components. Ah! life is so easy and simple.&lt;br /&gt;The stateless session beans(SLSB) are POJOs and can be marked as SLSB with the @Stateless annotation. Things are even easier with EJB 3.1. You no longer require the business interface. Just a concrete class will do. Although program to interface is a great principle, but for simplicity, speed of development and ease of maintenance I will stick to the new ways. The purists may frown but I cannot think when I changed an implementation midway or in later stages of a project for whatever reason in my entire career. When we select a technology stack we need to build competency and stick to it rather than continuing to chop and change. &lt;br /&gt;Listing 1 shows the simple stateless session bean.&lt;br /&gt;Listing 1 – ProductService.java&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.windowshop.business;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;&lt;br /&gt;import com.windowshop.domain.entities.Product;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author Dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;@Stateless&lt;br /&gt;public class ProductService {&lt;br /&gt;&lt;br /&gt;public List&lt;product&gt; getProductsByMonth(){&lt;br /&gt;System.out.println("Hurray!!!!! SLSB called");&lt;br /&gt;//TODO - use JPA to fetch from db&lt;br /&gt;List&lt;product&gt; products = new ArrayList&lt;product&gt;();&lt;br /&gt;Product product = null;&lt;br /&gt;for(int i = 1 ; i &amp;lt;= 34; i++) {&lt;br /&gt;product = new Product(i,"Abc",new Date(),"","",i+1.20d,"Rs");&lt;br /&gt;products.add(product);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return products;&lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now that we have the SLSB, its time to refactor the managed bean - “move method” to the session bean. The “getProductsByMonth” will undergo few more rounds of refactoring in the future for sure. Listing 2 shows the modified managed bean.&lt;br /&gt;&lt;pre class="brush: java"&gt;package com.windowshop.web.controller;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.ejb.EJB;&lt;br /&gt;import javax.faces.bean.ManagedBean;&lt;br /&gt;import com.windowshop.business.ProductService;&lt;br /&gt;import com.windowshop.domain.entities.Product;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author Dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;@ManagedBean(name="productController")&lt;br /&gt;public class ProductController {&lt;br /&gt;@EJB &lt;br /&gt;ProductService productService;&lt;br /&gt;public List&lt;product&gt; getProductsByMonth(){&lt;br /&gt;return productService.getProductsByMonth();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So we can see that the SLSB is injected into the managed bean using @EJB annotation. The getProductsByMonth method is slimmer as the call is dedicated now to the SLSB. You will need to add some dependencies to the pom.xml file. Listing 3 shows the modified pom.xml file.&lt;br /&gt;&lt;br /&gt;Listing 3 – pom.xml&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;&lt;br /&gt;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;com.windowshop&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;shopweb&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;shopweb Maven Webapp&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;!-- Prime faces , JSF --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.primefaces&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;primefaces&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.2.RC1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;com.sun.faces&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;jsf-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.0.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;com.sun.faces&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;jsf-impl&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.0.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;commons-lang&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;commons-lang&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;javax&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;javaee-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;6.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;&amp;lt;repository&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;prime-repo&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;Prime Technology Maven Repository&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://repository.prime.com.tr/&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;repository&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;maven2-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;Java.net Repository for Maven&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://download.java.net/maven/2/&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;/repository&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;br /&gt;&amp;lt;build&amp;gt;&lt;br /&gt;&amp;lt;finalName&amp;gt;shopweb&amp;lt;/finalName&amp;gt;&lt;br /&gt;&amp;lt;plugins&amp;gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;&amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This was the easiest SLSB based project I have ever done in my life. Java EE 6 has been a refreshing experience so far. I intend to get more into depth and try out Java EE 6 and possibly all its facets possible with JBOSS 6. Now if you deploy this project you will the following lines in your JBOSS console confirming the deployment of EJB, registration in JNDI. You can launch the browser and check if the landing page is working as before. I did not find any problem.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;JBOSS6 console&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;17:05:39,480 WARN&amp;nbsp; [InterceptorInfoRepository] EJBTHREE-1852: InterceptorInfoRepository is deprecated&lt;br /&gt;17:05:40,347 INFO&amp;nbsp; [JBossASKernel] Created KernelDeployment for: shopweb.war&lt;br /&gt;17:05:40,352 INFO&amp;nbsp; [JBossASKernel] installing bean: jboss.j2ee:jar=shopweb.war,name=ProductService,service=EJB3&lt;br /&gt;17:05:40,352 INFO&amp;nbsp; [JBossASKernel]&amp;nbsp;&amp;nbsp; with dependencies:&lt;br /&gt;17:05:40,352 INFO&amp;nbsp; [JBossASKernel]&amp;nbsp;&amp;nbsp; and demands:&lt;br /&gt;17:05:40,352 INFO&amp;nbsp; [JBossASKernel]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jboss.ejb:service=EJBTimerService; Required: Described&lt;br /&gt;17:05:40,353 INFO&amp;nbsp; [JBossASKernel]&amp;nbsp;&amp;nbsp; and supplies:&lt;br /&gt;17:05:40,353 INFO&amp;nbsp; [JBossASKernel]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jndi:ProductService&lt;br /&gt;17:05:40,353 INFO&amp;nbsp; [JBossASKernel]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jndi:ProductService/no-interface&lt;br /&gt;17:05:40,354 INFO&amp;nbsp; [JBossASKernel] Added bean(jboss.j2ee:jar=shopweb.war,name=ProductService,service=EJB3) to KernelDeployment of: shopweb.war&lt;br /&gt;17:05:50,041 INFO&amp;nbsp; [TomcatDeployment] deploy, ctxPath=/shopweb&lt;br /&gt;17:05:50,237 INFO&amp;nbsp; [config] Initializing Mojarra 2.0.2 (FCS b10) for context '/shopweb'&lt;br /&gt;17:05:54,557 INFO&amp;nbsp; [AbstractNoInterfaceViewJNDIBinder] Binding the following entry in Global JNDI: &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProductService/no-interface - EJB3.1 no-interface view &lt;br /&gt;&lt;br /&gt;17:05:54,561 INFO&amp;nbsp; [SessionSpecContainer] Starting jboss.j2ee:jar=shopweb.war,name=ProductService,service=EJB3&lt;br /&gt;17:05:54,573 INFO&amp;nbsp; [EJBContainer] STARTED EJB: com.windowshop.business.ProductService ejbName: ProductService&lt;br /&gt;17:05:54,579 INFO&amp;nbsp; [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-5120313054922568144?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/5120313054922568144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/11/adding-and-injecting-ejb3-session-bean.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5120313054922568144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5120313054922568144'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/11/adding-and-injecting-ejb3-session-bean.html' title='Adding and injecting the EJB3 session bean'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-3053336793999548291</id><published>2010-11-05T23:24:00.001-07:00</published><updated>2010-11-05T23:26:08.997-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java EE 6'/><title type='text'>JSF 2.0 – First Managed Bean</title><content type='html'>The window shop, landing page is not complete. I have not shown the new product arrivals for this month in the center of the screen. In order to do that we need a managed bean which will retrieve data from the database. Later on we will integrate EJB 3.x stateless session beans to fetch the data for us. For now our managed bean will cook up the data to set the ball rolling. In this process we also discover the first domain object – Product. Going forward this will be turned into a JPA entity for CRUD operations.&lt;br /&gt;Here is how the domain object looks like:&lt;br /&gt;&lt;pre class="brush: java"&gt;/**&lt;br /&gt;* &lt;br /&gt;*/&lt;br /&gt;package com.windowshop.domain.entities;&lt;br /&gt;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.lang.builder.ToStringBuilder;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author Dhrubo&lt;br /&gt;* &lt;br /&gt;*/&lt;br /&gt;public class Product {&lt;br /&gt;private int productId;&lt;br /&gt;private String productName;&lt;br /&gt;private Date createdDate;&lt;br /&gt;private String thumnailLocation;&lt;br /&gt;private String model;&lt;br /&gt;private double price;&lt;br /&gt;private String currency;&lt;br /&gt;&lt;br /&gt;public Product() {}&lt;br /&gt;&lt;br /&gt;public Product(int productId, String productName, Date createdDate,&lt;br /&gt;String thumnailLocation, String model, double price, String currency) {&lt;br /&gt;super();&lt;br /&gt;this.productId = productId;&lt;br /&gt;this.productName = productName;&lt;br /&gt;this.createdDate = createdDate;&lt;br /&gt;this.thumnailLocation = thumnailLocation;&lt;br /&gt;this.model = model;&lt;br /&gt;this.price = price;&lt;br /&gt;this.currency = currency;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getProductId() {&lt;br /&gt;return productId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setProductId(int productId) {&lt;br /&gt;this.productId = productId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getProductName() {&lt;br /&gt;return productName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setProductName(String productName) {&lt;br /&gt;this.productName = productName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Date getCreatedDate() {&lt;br /&gt;return createdDate;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setCreatedDate(Date createdDate) {&lt;br /&gt;this.createdDate = createdDate;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getThumnailLocation() {&lt;br /&gt;return thumnailLocation;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setThumnailLocation(String thumnailLocation) {&lt;br /&gt;this.thumnailLocation = thumnailLocation;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getModel() {&lt;br /&gt;return model;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setModel(String model) {&lt;br /&gt;this.model = model;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public double getPrice() {&lt;br /&gt;return price;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setPrice(double price) {&lt;br /&gt;this.price = price;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getCurrency() {&lt;br /&gt;return currency;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setCurrency(String currency) {&lt;br /&gt;this.currency = currency;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String toString() {&lt;br /&gt;return ToStringBuilder.reflectionToString(this);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The managed bean is shown in the listing below&lt;br /&gt;&lt;pre class="brush: java"&gt;/**&lt;br /&gt;* &lt;br /&gt;*/&lt;br /&gt;package com.windowshop.web.controller;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.faces.bean.ManagedBean;&lt;br /&gt;&lt;br /&gt;import com.windowshop.domain.entities.Product;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author Dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;@ManagedBean(name="productController")&lt;br /&gt;public class ProductController {&lt;br /&gt;&lt;br /&gt;public List&lt;product&gt; getProductsByMonth(){&lt;br /&gt;&lt;br /&gt;//TODO - Remove to session bean and JPA to fetch from db&lt;br /&gt;List&lt;product&gt; products = new ArrayList&lt;product&gt;();&lt;br /&gt;Product product = null;&lt;br /&gt;for(int i = 1 ; i &amp;lt;= 34; i++) {&lt;br /&gt;product = new Product(i,"Abc",new Date(),"","",i+1.20d,"Rs");&lt;br /&gt;products.add(product);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return products;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/product&gt;&lt;/product&gt;&lt;/product&gt;&lt;/pre&gt;&lt;br /&gt;Note that with JSF 2 you can do away with faces-config.xml. This file is just optional. Instead you can turn a POJO into a managed bean with the ManagedBean annotation. One attribute is the name of the managed bean. In this case the managed bean is named “productController”. In case you do not want to name the managed bean it will by default be named with the class name part of the fully qualified class name. There are other attributes which I will take up as and when we come across the need for them. This managed bean will have a default request scope. I will discuss different scopes later. For the moment just know that for managed beans the default scope is request.&lt;br /&gt;&lt;br /&gt;Now you will want to use this managed bean in JSF pages. The listing below (newproducts.xhtml) shows the new JSF which fills the missing piece. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;xmlns:p="http://primefaces.prime.com.tr/ui"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;f:view contentType="text/html"&amp;gt;&lt;br /&gt;&amp;lt;h:form&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="New Products for November 2010"  style="font-size:.9em"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p:dataGrid var="product" value="#{productController.productsByMonth}" columns="4"&lt;br /&gt;rows="12" paginator="true" effect="true"&lt;br /&gt;paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} &lt;br /&gt;{PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"&lt;br /&gt;rowsPerPageTemplate="8,12,16"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p:column&amp;gt;&lt;br /&gt;&amp;lt;p:panel header="#{product.model}" style="text-align:center"&amp;gt;&lt;br /&gt;&amp;lt;h:panelGrid columns="1" style="width:100%"&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&amp;lt;p:graphicImage value="/images/cars/#{car.manufacturer}.jpg"/&amp;gt; &lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="#{product.productName}" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p:commandLink title="View Detail" action="#"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/p:commandLink&amp;gt;&lt;br /&gt;&amp;lt;/h:panelGrid&amp;gt;&lt;br /&gt;&amp;lt;/p:panel&amp;gt;&lt;br /&gt;&amp;lt;/p:column&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/p:dataGrid&amp;gt;&lt;br /&gt;&amp;lt;/h:form&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The layout and other pages have been updated and they are now in the SVN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-3053336793999548291?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/3053336793999548291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/11/jsf-20-first-managed-bean.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/3053336793999548291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/3053336793999548291'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/11/jsf-20-first-managed-bean.html' title='JSF 2.0 – First Managed Bean'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-8988986495480959350</id><published>2010-11-04T22:07:00.001-07:00</published><updated>2010-11-04T22:08:07.670-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java EE 6'/><title type='text'>Servlet 3.0 – Add frameworks as Plugins</title><content type='html'>&lt;p&gt;With Servlet 3.0, it is now possible to include external or 3rd party frameworks as plug-ins to the web application. This is made possible by the ServletContainerInitializer interface. The documentation says that the implementation of this interface - “allows a library/runtime to be notified of a web application's startup phase and perform any required programmatic registration of servlets, filters, and listeners in response to it”. The servlet container finds the ServletContainerInitializer using the JAR services API during application startup. The framework implementing the ServletContainerInitializer needs to add a file named javax.servlet.ServletContainerInitializer in the META-INF/services directory of the JAR file. This file points to the implementation class of the ServletContainerInitializer.The JSF 2 Majorra implementation has used this feature. If we check the JSF-IMPL-2.x jar this file is located in META-INF/services folder and points to the class -&amp;nbsp; com.sun.faces.config.FacesInitializer. If we look into this class we will find the following lines - &lt;/p&gt;&lt;pre class="brush:java"&gt;	ServletRegistration reg = servletContext.addServlet("FacesServlet","javax.faces.webapp.FacesServlet");&lt;br /&gt;  	reg.addMapping("/faces/*", "*.jsf", "*.faces");&lt;br /&gt;	servletContext.setAttribute(RIConstants.FACES_INITIALIZER_MAPPINGS_ADDED, Boolean.TRUE);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The ServletContainerInitializer thus registers the faces servlet and three URL mappings out of the box leading to clean web.xml. In fact web.xml is optional in Servlet 3.0.&lt;/p&gt;&lt;br /&gt;&lt;h5&gt;A note on JBOSS 6 JSF application&lt;/h5&gt;&lt;br /&gt;&lt;p&gt;JBOSS 6, JSF deployer is very special. It does some tricks with a JSF 2 web application. You can read it here - &lt;a title="http://docs.jboss.org/jbossas/6/JSF_Guide/en-US/html/jsf.deployer.config.html" href="http://docs.jboss.org/jbossas/6/JSF_Guide/en-US/html/jsf.deployer.config.html"&gt;http://docs.jboss.org/jbossas/6/JSF_Guide/en-US/html/jsf.deployer.config.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-8988986495480959350?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/8988986495480959350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/11/servlet-30-add-frameworks-as-plugins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/8988986495480959350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/8988986495480959350'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/11/servlet-30-add-frameworks-as-plugins.html' title='Servlet 3.0 – Add frameworks as Plugins'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-695379601004365630</id><published>2010-11-03T05:22:00.001-07:00</published><updated>2010-11-03T05:22:32.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java EE 6'/><title type='text'>First Java EE 6 application</title><content type='html'>&lt;p&gt;to create a Maven 2 Java EE 6 application. This will be primarily the UI part build with JSF. Primefaces is the library of choice to build the “windowshop” application. I will try to build a landing page similar to oscommerce. The figure 1 below shows a screenshot of the landing page mock up.  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_UEQt_cUM2VM/TNFUBMHjFCI/AAAAAAAAAhU/3pyqyBCZumM/s1600-h/landing-proto%5B3%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="landing-proto" border="0" alt="landing-proto" src="http://lh4.ggpht.com/_UEQt_cUM2VM/TNFUB9d_WYI/AAAAAAAAAhY/HgivErjTuNk/landing-proto_thumb%5B1%5D.gif?imgmax=800" width="244" height="161"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Figure 1 – Landing page prototype&lt;/p&gt; &lt;p&gt;Now let us create a Maven 2 web project using the - “maven-archetype-webapp”. &lt;/p&gt; &lt;p&gt;The listing below shows the pom.xml&lt;/p&gt; &lt;p&gt;Listing 1 – pom.xml&lt;/p&gt;&lt;pre class="brush:xml"&gt;&amp;lt;project xmlns="&lt;a href="http://maven.apache.org/POM/4.0.0&amp;quot;"&gt;http://maven.apache.org/POM/4.0.0"&lt;/a&gt; xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance&amp;quot;"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a href="http://maven.apache.org/maven-v4_0_0.xsd&amp;quot;"&gt;http://maven.apache.org/maven-v4_0_0.xsd"&lt;/a&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;com.windowshop&amp;lt;/groupId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;shopweb&amp;lt;/artifactId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;shopweb Maven Webapp&amp;lt;/name&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url&amp;gt;&lt;a href="http://maven.apache.org"&gt;http://maven.apache.org&lt;/a&gt;&amp;lt;/url&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependencies&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;4.8.1&amp;lt;/version&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Prime faces , JSF --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.primefaces&amp;lt;/groupId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;primefaces&amp;lt;/artifactId&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;2.2.RC1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;jar&amp;lt;/type&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt; &lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependencies&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;repositories&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;repository&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;id&amp;gt;prime-repo&amp;lt;/id&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Prime Technology Maven Repository&amp;lt;/name&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url&amp;gt;&lt;a href="http://repository.prime.com.tr/"&gt;http://repository.prime.com.tr/&lt;/a&gt;&amp;lt;/url&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/repository&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;repository&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;id&amp;gt;maven2-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Java.net Repository for Maven&amp;lt;/name&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url&amp;gt;&lt;a href="http://download.java.net/maven/2/"&gt;http://download.java.net/maven/2/&lt;/a&gt;&amp;lt;/url&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/repository&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/repositories&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;build&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;finalName&amp;gt;shopweb&amp;lt;/finalName&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/build&amp;gt;&lt;br&gt;&amp;lt;/project&amp;gt; &lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The web.xml need not have any entry as shown in listing 2. As per JSF 2 auto – registers FacesServlet which is required for JSF URL interpretation following the pluggability feature of Servlet 3. I will write about this feature and how this is enabled in JSF 2 in the next post.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Listing.2 – web.xml&lt;/p&gt;&lt;pre class="brush:xml"&gt;&amp;lt;web-app xmlns="&lt;a href="http://java.sun.com/xml/ns/javaee&amp;quot;"&gt;http://java.sun.com/xml/ns/javaee"&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance&amp;quot;"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="&lt;a href="http://java.sun.com/xml/ns/javaee"&gt;http://java.sun.com/xml/ns/javaee&lt;/a&gt; &lt;a href="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd&amp;quot;"&gt;http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; version="3.0"&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;display-name&amp;gt;shopweb&amp;lt;/display-name&amp;gt;&lt;br&gt;&amp;lt;/web-app&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Now let us modify the index.jsp page to redirect to the default home landing page as shown in listing 3.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Listing 3 – index.jsp&lt;/p&gt;&lt;pre class="brush:xml"&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&amp;lt;jsp:forward page="ui/home.jsf"&amp;gt;&amp;lt;/jsp:forward&amp;gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I will add the facelet templates and the home page. These are all in the SVN now. I am lazy copying them over here. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;You can add the JBOSS 5 server adapter in Eclipse to start stop JBOSS 6 for now. Add the shopweb project and start the server. Once deployment is over, browse to - &lt;a title="http://localhost:8080/shopweb/" href="http://localhost:8080/shopweb/"&gt;http://localhost:8080/shopweb/&lt;/a&gt;. This should display the guest home page. I will work to make this page similar to the prototype in Figure 1. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-695379601004365630?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/695379601004365630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/11/first-java-ee-6-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/695379601004365630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/695379601004365630'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/11/first-java-ee-6-application.html' title='First Java EE 6 application'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_UEQt_cUM2VM/TNFUB9d_WYI/AAAAAAAAAhY/HgivErjTuNk/s72-c/landing-proto_thumb%5B1%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-2215547963097181765</id><published>2010-11-02T06:19:00.001-07:00</published><updated>2010-11-02T06:19:11.335-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java EE 6'/><title type='text'>Rolling out Java EE 6 development environment</title><content type='html'>&lt;h5&gt;&lt;strong&gt;Step 0 – Download and install JDK 6&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Download JDK 6 from the link - &lt;a title="http://www.oracle.com/technetwork/java/javase/downloads/index.html" href="http://www.oracle.com/technetwork/java/javase/downloads/index.html"&gt;http://www.oracle.com/technetwork/java/javase/downloads/index.html&lt;/a&gt;. Install it under c:\java.&lt;/p&gt; &lt;h5&gt;&lt;strong&gt;Step 1 – Download and install JBOSS 6&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;JBOSS6M5 can be downloaded from the following link - &lt;a title="http://sourceforge.net/projects/jboss/files/JBoss/JBoss-6.0.0.M5" href="http://sourceforge.net/projects/jboss/files/JBoss/JBoss-6.0.0.M5"&gt;http://sourceforge.net/projects/jboss/files/JBoss/JBoss-6.0.0.M5&lt;/a&gt;. Once downloaded unzip the file to c:\jboss6.&lt;/p&gt; &lt;h5&gt;&lt;strong&gt;Step 2 – Download and install Eclipse&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Eclipse Helios 3.6.1 can be downloaded from the following link - &lt;a title="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/SR1/eclipse-jee-helios-SR1-win32.zip" href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/SR1/eclipse-jee-helios-SR1-win32.zip"&gt;http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/SR1/eclipse-jee-helios-SR1-win32.zip&lt;/a&gt;. Once downloaded unzip the file to c:/eclipse&lt;/p&gt; &lt;h5&gt;&lt;strong&gt;Step 3 – Install Maven 2 plug-in and extras&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;I will prefer to use Maven 2 as my build tool. This is very useful if we also have some continuous integration system set up in future. The Maven 2 eclipse plug-in update sites are located at - &lt;a title="http://m2eclipse.sonatype.org/installing-m2eclipse.html" href="http://m2eclipse.sonatype.org/installing-m2eclipse.html"&gt;http://m2eclipse.sonatype.org/installing-m2eclipse.html&lt;/a&gt;. Launch Eclipse and &lt;em&gt;&lt;u&gt;install the plug-in core and extras&lt;/u&gt;&lt;/em&gt;. In case of the extras install only the WTP extension.&lt;/p&gt; &lt;p&gt;Once the M2E plug-in is installed,restarting Eclipse you may get some warnings as listed below:&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;Eclipse is running in a JRE, but a JDK is required&lt;br&gt;&amp;nbsp; Some Maven plugins may not work when importing projects or updating source folders.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;You can resolve this by adding the following line to your eclipse.ini file. This file is located at c:\eclipse folder.&lt;/p&gt; &lt;p&gt;-vm&lt;br&gt;C:\Java\jdk1.6.0_22\bin\javaw.exe &lt;p&gt;This is a snapshot from my eclipse.ini file &lt;p&gt;openFile&lt;br&gt;--launcher.XXMaxPermSize&lt;br&gt;256M&lt;br&gt;-showsplash&lt;br&gt;-vm&lt;br&gt;C:\Java\jdk1.6.0_22\bin\javaw.exe&lt;br&gt;org.eclipse.platform &lt;h5&gt;&lt;strong&gt;Step 4 – Install Subversion plug-in&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;I want to safe keep my learning on some subversion repository. So I went on to create a project on GOOGLE CODE called “windowshop” - &lt;a title="http://code.google.com/p/windowshop/" href="http://code.google.com/p/windowshop/"&gt;http://code.google.com/p/windowshop/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can add the subversion plug-in for Eclipse using the following update URL - &lt;a href="http://subclipse.tigris.org/update_1.6.x"&gt;http://subclipse.tigris.org/update_1.6.x&lt;/a&gt;&lt;/p&gt; &lt;h5&gt;&lt;strong&gt;Step 5 – Configure SVN&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Now I will commit and change code kept on the Google Code SVN. So I need to add the code repository. You can do so easily by going to the SVN repository view and adding the following URL - &lt;a title="https://windowshop.googlecode.com/svn" href="https://windowshop.googlecode.com/svn"&gt;https://windowshop.googlecode.com/svn&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;The development environment is more or less setup. If I see that I have missed anything going forward, I will try to add it here.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-2215547963097181765?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/2215547963097181765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/11/rolling-out-java-ee-6-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2215547963097181765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2215547963097181765'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/11/rolling-out-java-ee-6-development.html' title='Rolling out Java EE 6 development environment'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-5997761548239556749</id><published>2010-11-02T02:39:00.001-07:00</published><updated>2010-11-02T02:39:24.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java EE 6'/><title type='text'>Exploring Java EE 6</title><content type='html'>&lt;p&gt;I have been using, learning and writing about Spring framework for last 5+ years now. It has done loads of good work to simplify life back in J2EE days. But off late I am seeing and participating in discussions where I see a transition back to the platform again. The reason being the Java EE 6 has adopted good ideas from frameworks like Spring, Hibernate etc and have come out with a lean and thin platform. This has not gone unnoticed in developer world. &lt;/p&gt; &lt;p&gt;Also in last couple of years Spring’s evolution has a framework has stalled to an extent. The core framework and extensions viz Spring MVC, Security etc being stable the guys at Spring Source have focused more on servers, OSGi, cloud and adding more products to Spring Source portfolio via acquisition route. The company itself was acquired by VMWare. So lots of things happening but nothing new or exciting enough in the core area to keep the developers attracted. This is really one bad thing that runs deep inside the Java developers’ veins. They are always in the lookout for something exciting new and better. This makes them restless to search for alternatives. The moribund around the core Spring and extensions stack and gradual evolution of Java EE 6 in the same time has acted as the new catalyst for excitement in the Java EE world. &lt;/p&gt; &lt;p&gt;I thought that this senior and experienced developers are showing interest for definite reason. I have been reviewing and reading about Java EE 6 for last few days and found it interesting, making things easier and I have a feeling that if you have half decent team Java EE 6 can cut down on development time significantly. So I thought of starting to explore this in greater detail. I have also got hold of the patterns book by Adam Bien and reading it. All in all things are looking good for the platform. I had a hard and reluctance to move to Spring from J2EE(I was a big fan of EJB in those days). But now I want to explore and make a quick transition back to Java EE 6.&lt;/p&gt; &lt;p&gt;I have decided to build some useful application to try and test all the different new features of Java EE 6. The application that I am trying to build is similar to OSCOMMERCE (&lt;a title="http://www.oscommerce.com/" href="http://www.oscommerce.com/"&gt;http://www.oscommerce.com/&lt;/a&gt;), possibly a clone of this great application. I will try to build as many features as I can when I have time. Initially I thought of using Geronimo 3 for this, but I had to stumble upon some JSF issues possibly not compliant with JSF 2 and decided to switch to JBOSS 6M5 instead. Both these servers are very new in supporting the Java EE 6 specifications and catching up with documentation. Glassfish 3 seems to be there for sometime ready with Java EE 6. But since lot has already been written about Glassfish (including books from Apress), I thought its worthwhile exploring JBOSS (and later possibly Geronimo). Also I am a bit sceptical about the future of Glassfish. JONAS is still on Java EE 5. Before I end, here is the link to the JSF 2 and Geronimo 3 issue which I posted:&lt;/p&gt; &lt;p&gt;&lt;a title="http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&amp;amp;t=5635&amp;amp;p=24048#p24048" href="http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&amp;amp;t=5635&amp;amp;p=24048#p24048"&gt;http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&amp;amp;t=5635&amp;amp;p=24048#p24048&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In my next post I will set up the development environment for Java EE 6 with Eclipse Helios 3.6.1 and JBOSS. Stay tuned!. The road will be pure Java EE 6 and then possibly some other frameworks if needed.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-5997761548239556749?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/5997761548239556749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/11/exploring-java-ee-6.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5997761548239556749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5997761548239556749'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/11/exploring-java-ee-6.html' title='Exploring Java EE 6'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-6481022393239949870</id><published>2010-09-25T23:35:00.001-07:00</published><updated>2010-09-25T23:42:06.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prime Faces'/><title type='text'>Removing the border from header layout unit</title><content type='html'>As you have seen the layout contains layout units. You can put any element inside a layout unit. Now there is a border for each layout unit. For our online store, I do not want the border and the header title. In order to remove the border, you will need to override the CSS style and to remove the header just remove the header attribute (header="TOP") from the layout unit tag. This is shown in listing below&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;xmlns:p="http://primefaces.prime.com.tr/ui"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;f:view contentType="text/html"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Simple Store - Home&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;link type="text/css" rel="stylesheet"&lt;br /&gt;href="#{request.contextPath}/themes/cupertino/skin.css" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;&lt;br /&gt;.ui-layout-unit-top .ui-layout-bd {&lt;br /&gt;border: 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p:layout fullPage="true"&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="top" height="80"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Top content." /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="bottom" header="BOTTOM" height="100"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Bottom content." /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="left" header="LEFT" width="300"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Left content" /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="right" header="RIGHT" width="200"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Right Content" /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="center" header="CENTER"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Center Content" /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;/p:layout&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The result is shown in figure below&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UEQt_cUM2VM/TJ7rDDS7x3I/AAAAAAAAAgY/ATPV8iie1io/s1600/Blog+-+5.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://2.bp.blogspot.com/_UEQt_cUM2VM/TJ7rDDS7x3I/AAAAAAAAAgY/ATPV8iie1io/s320/Blog+-+5.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-6481022393239949870?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/6481022393239949870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/09/removing-border-from-header-layout-unit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6481022393239949870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6481022393239949870'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/09/removing-border-from-header-layout-unit.html' title='Removing the border from header layout unit'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_UEQt_cUM2VM/TJ7rDDS7x3I/AAAAAAAAAgY/ATPV8iie1io/s72-c/Blog+-+5.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-4267628863101874666</id><published>2010-09-25T23:11:00.001-07:00</published><updated>2010-09-25T23:29:47.469-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prime Faces'/><title type='text'>Creating the layout</title><content type='html'>&lt;p&gt;Any web site has a layout. Layouts can be created with HTML tables, divs and with CSS with Javascript tricks. Prime Faces provides out of the box support for border layout. A border layout typically has 5 parts as shown below&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;&lt;tr bgcolor="orange"&gt; &lt;td valign="top" colspan="3"&gt;TOP / HEADER&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="orange"&gt; &lt;td height="50" valign="top" width="20%"&gt;LEFT&lt;/td&gt; &lt;td height="50" valign="top" width="60%"&gt;CENTER&lt;/td&gt; &lt;td height="50" valign="top" width="205"&gt;RIGHT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td bgcolor="orange" valign="top" colspan="3"&gt;BOTTOM / FOOTER&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;This border layout works well for most websites. Prime faces border layout can be either applied to a full page or a specific element. It can respond to expand, collapse, close and resize events of each layout unit with ajax listeners. Let us create a full page layout for a simple shopping cart application similar to OSCOMMERCE - &lt;a title="http://demo.oscommerce.com/" href="http://demo.oscommerce.com/"&gt;http://demo.oscommerce.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The listing below shows the modified home.xhtml code.&lt;/p&gt;&lt;p&gt;Listing 1 – home.xhtml&lt;/p&gt;&lt;pre class="brush: xml"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;xmlns:p="http://primefaces.prime.com.tr/ui"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;f:view contentType="text/html"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Simple Store - Home&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;link type="text/css" rel="stylesheet"&lt;br /&gt;href="#{request.contextPath}/themes/cupertino/skin.css" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p:layout fullPage="true"&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="top" header="TOP" height="80"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Top content." /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="bottom" header="BOTTOM" height="100"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Bottom content." /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="left" header="LEFT" width="300"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Left content" /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="right" header="RIGHT" width="200"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Right Content" /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;p:layoutUnit position="center" header="CENTER"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Center Content" /&amp;gt;&lt;br /&gt;&amp;lt;/p:layoutUnit&amp;gt;&lt;br /&gt;&amp;lt;/p:layout&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;You can now see the home page layout as shown in figure below:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_UEQt_cUM2VM/TJ7mjH3RSFI/AAAAAAAAAgQ/eZ5F7Gj_BpE/s1600-h/Blog%20-%204%5B7%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Blog - 4" border="0" alt="Blog - 4" src="http://lh5.ggpht.com/_UEQt_cUM2VM/TJ7mkZ59zeI/AAAAAAAAAgU/_Cne6itVnVQ/Blog%20-%204_thumb%5B3%5D.gif?imgmax=800" width="240" height="137"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-4267628863101874666?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/4267628863101874666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/09/creating-layout.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4267628863101874666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4267628863101874666'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/09/creating-layout.html' title='Creating the layout'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_UEQt_cUM2VM/TJ7mkZ59zeI/AAAAAAAAAgU/_Cne6itVnVQ/s72-c/Blog%20-%204_thumb%5B3%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-148432460382935349</id><published>2010-09-25T08:37:00.001-07:00</published><updated>2010-09-25T08:45:28.544-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prime Faces'/><title type='text'>Adding color to Prime Faces</title><content type='html'>&lt;p&gt;In my last post you have seen a command button. This command button uses the default Prime faces skin and is shown in grey. Let me now make things a bit colorful, by showing how to use the skins provided by Prime faces. Prime faces skins are all based on Jquery themeroller CSS framework. I am interested in &lt;strong&gt;cupertino &lt;/strong&gt;font and I will download the same from - &lt;a title="http://www.primefaces.org/themes/cupertino.zip" href="http://www.primefaces.org/themes/cupertino.zip"&gt;http://www.primefaces.org/themes/cupertino.zip&lt;/a&gt;. You can download lots of other ready made themes from - &lt;a title="http://www.primefaces.org/themes.html" href="http://www.primefaces.org/themes.html"&gt;http://www.primefaces.org/themes.html&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In later posts I will show how to create, install and use custom theme or skin. Once downloaded unzip the theme to webapps/themes folder. This is shown in the figure below:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/TJ4XTdcjf_I/AAAAAAAAAgA/dsFVbbYDO4k/s1600-h/Blog%20-%202%5B5%5D.gif"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Blog - 2" border="0" alt="Blog - 2" src="http://lh4.ggpht.com/_UEQt_cUM2VM/TJ4XUN8dg5I/AAAAAAAAAgE/LtkfClrUnkI/Blog%20-%202_thumb%5B1%5D.gif?imgmax=800" width="240" height="193"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Prime faces theme consists of a skin.css file and a set of images placed in images folder. Now modify your web.xml to tell Prime faces that it should no longer use the default theme sam. Here is the modified web.xml&lt;/p&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="2.5"&lt;br /&gt;	xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" &amp;gt;&lt;br /&gt;	&lt;br /&gt;   	&lt;br /&gt;    &amp;lt;context-param&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;primefaces.skin&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;none&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;/context-param&amp;gt;&lt;br /&gt;	&lt;br /&gt;       &lt;br /&gt;    &amp;lt;servlet&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;    &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;url-pattern&amp;gt;*.jsf&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;	&lt;br /&gt;    &lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Finally add the css in your JSF source using the link tag as shown in the listing (home.xhtml) below:&lt;/p&gt;&lt;pre class="brush: xml"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;	xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;	xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;	xmlns:p="http://primefaces.prime.com.tr/ui"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;f:view contentType="text/html"&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;h:head&amp;gt;&lt;br /&gt;		&amp;lt;title&amp;gt;PrimeFaces - ShowCase&amp;lt;/title&amp;gt;&lt;br /&gt;		&lt;br /&gt;		&amp;lt;link type="text/css" rel="stylesheet" href="#{request.contextPath}/themes/cupertino/skin.css" /&amp;gt;&lt;br /&gt;	&lt;br /&gt;		&lt;br /&gt;	&amp;lt;/h:head&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&amp;lt;h:body&amp;gt;&lt;br /&gt;		&amp;lt;h:form&amp;gt;&lt;br /&gt;		&amp;lt;p:commandButton value="Ajax Submit" /&amp;gt;&lt;br /&gt;		&amp;lt;/h:form&amp;gt;&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;	&amp;lt;/h:body&amp;gt;&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Now just like in the previous post, build and deploy the application on tomcat and browse to the following URL - &lt;a title="http://localhost:8080/hermesconsole/home.jsf" href="http://localhost:8080/hermesconsole/home.jsf"&gt;http://localhost:8080/hermesconsole/home.jsf&lt;/a&gt;. You will see the bluish button as shown in the figure below.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_UEQt_cUM2VM/TJ4ZE76WqlI/AAAAAAAAAgI/wzmIfZyjvm8/s1600-h/Blog%20-%203%5B2%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Blog - 3" border="0" alt="Blog - 3" src="http://lh6.ggpht.com/_UEQt_cUM2VM/TJ4ZFhINiwI/AAAAAAAAAgM/TARoHS8IbF8/Blog%20-%203_thumb.gif?imgmax=800" width="240" height="109"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-148432460382935349?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/148432460382935349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/09/adding-color-to-prime-faces.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/148432460382935349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/148432460382935349'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/09/adding-color-to-prime-faces.html' title='Adding color to Prime Faces'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_UEQt_cUM2VM/TJ4XUN8dg5I/AAAAAAAAAgE/LtkfClrUnkI/s72-c/Blog%20-%202_thumb%5B1%5D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-497880621508446692</id><published>2010-09-25T07:54:00.001-07:00</published><updated>2010-09-25T08:16:03.056-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prime Faces'/><title type='text'>Getting started with Prime faces 2</title><content type='html'>&lt;p&gt;Prime faces is an amazing JSF framework from Cagatay Civici (&lt;a title="http://cagataycivici.wordpress.com/" href="http://cagataycivici.wordpress.com/"&gt;http://cagataycivici.wordpress.com/&lt;/a&gt;). Its wonderful because it is easy to use, minimal dependencies, has probably the widest set of controls among all JSF frameworks, easy to integrate with Spring (including Spring Security) , Java EE EJBs, and last but not the least mobile UI support. So I decided to give Prime faces a try, before selecting it to use in my projects. &lt;/p&gt; &lt;h3&gt;Step 1 – Create Maven 2 project &lt;/h3&gt; &lt;p&gt;As a first step to integrating Prime faces, create a Maven 2 project in Eclipse. You will need to select ‘maven-archetype-webapp’.&lt;/p&gt; &lt;h4&gt;&lt;/h4&gt; &lt;h3&gt;Step 2 – Add repositories and dependencies in pom.xml&lt;/h3&gt; &lt;p&gt;I will be using Prime faces 2 with JSF 2 on Tomcat 6. Since the dependencies for Prime Faces and JSF 2 (JSF 2.0.3 is required) are available on different repositories, I will add them to my pom file first. The listing below shows my pom.xml&lt;/p&gt;&lt;pre class="brush: xml"&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;&lt;br /&gt;	&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;	&amp;lt;groupId&amp;gt;net.breezeware&amp;lt;/groupId&amp;gt;&lt;br /&gt;	&amp;lt;artifactId&amp;gt;hermesconsole&amp;lt;/artifactId&amp;gt;&lt;br /&gt;	&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;br /&gt;	&amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;	&amp;lt;name&amp;gt;hermesconsole Maven Webapp&amp;lt;/name&amp;gt;&lt;br /&gt;	&amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&lt;br /&gt;	&amp;lt;dependencies&amp;gt;&lt;br /&gt;		&amp;lt;dependency&amp;gt;&lt;br /&gt;			&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;			&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;			&amp;lt;version&amp;gt;4.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;			&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;		&amp;lt;/dependency&amp;gt;&lt;br /&gt;		&amp;lt;dependency&amp;gt;&lt;br /&gt;			&amp;lt;groupId&amp;gt;org.primefaces&amp;lt;/groupId&amp;gt;&lt;br /&gt;			&amp;lt;artifactId&amp;gt;primefaces&amp;lt;/artifactId&amp;gt;&lt;br /&gt;			&amp;lt;version&amp;gt;2.2.M1&amp;lt;/version&amp;gt;&lt;br /&gt;		&amp;lt;/dependency&amp;gt;&lt;br /&gt;		&amp;lt;dependency&amp;gt;&lt;br /&gt;			&amp;lt;groupId&amp;gt;com.sun.faces&amp;lt;/groupId&amp;gt;&lt;br /&gt;			&amp;lt;artifactId&amp;gt;jsf-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;			&amp;lt;version&amp;gt;2.0.3&amp;lt;/version&amp;gt;&lt;br /&gt;		&amp;lt;/dependency&amp;gt;&lt;br /&gt;		&amp;lt;dependency&amp;gt;&lt;br /&gt;			&amp;lt;groupId&amp;gt;com.sun.faces&amp;lt;/groupId&amp;gt;&lt;br /&gt;			&amp;lt;artifactId&amp;gt;jsf-impl&amp;lt;/artifactId&amp;gt;&lt;br /&gt;			&amp;lt;version&amp;gt;2.0.3&amp;lt;/version&amp;gt;&lt;br /&gt;		&amp;lt;/dependency&amp;gt;&lt;br /&gt;	&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;repositories&amp;gt;&lt;br /&gt;		&amp;lt;repository&amp;gt;&lt;br /&gt;			&amp;lt;id&amp;gt;prime-repo&amp;lt;/id&amp;gt;&lt;br /&gt;			&amp;lt;name&amp;gt;Prime Technology Maven Repository&amp;lt;/name&amp;gt;&lt;br /&gt;			&amp;lt;url&amp;gt;http://repository.prime.com.tr/&amp;lt;/url&amp;gt;&lt;br /&gt;		&amp;lt;/repository&amp;gt;&lt;br /&gt;		&amp;lt;repository&amp;gt;&lt;br /&gt;			&amp;lt;id&amp;gt;maven2-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;br /&gt;			&amp;lt;name&amp;gt;Java.net Repository for Maven&amp;lt;/name&amp;gt;&lt;br /&gt;			&amp;lt;url&amp;gt;http://download.java.net/maven/2/&amp;lt;/url&amp;gt;&lt;br /&gt;		&amp;lt;/repository&amp;gt;&lt;br /&gt;		&lt;br /&gt;	&amp;lt;/repositories&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;build&amp;gt;&lt;br /&gt;		&amp;lt;finalName&amp;gt;hermesconsole&amp;lt;/finalName&amp;gt;&lt;br /&gt;	&amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Step 3 – Change web.xml&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Add the JSF faces servlet in the web.xml file.&lt;/p&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="2.5"&lt;br /&gt;	xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" &amp;gt;&lt;br /&gt;	&lt;br /&gt;   	&lt;br /&gt;    &amp;lt;context-param&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;primefaces.skin&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;none&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;/context-param&amp;gt;&lt;br /&gt;	&lt;br /&gt;       &lt;br /&gt;    &amp;lt;servlet&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;    &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;url-pattern&amp;gt;*.jsf&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;	&lt;br /&gt;    &lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Step 4 – Add a simple xhtml file – home.xhtml&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Now let us see Prime faces in action, by adding a simple JSF snippet with 1 control from this library. &lt;/p&gt;&lt;pre class="brush: xml"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;	xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;	xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;	xmlns:p="http://primefaces.prime.com.tr/ui"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;f:view contentType="text/html"&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;h:head&amp;gt;&lt;br /&gt;		&amp;lt;title&amp;gt;Hermes Console - Trying PrimeFaces&amp;lt;/title&amp;gt;&lt;br /&gt;		&lt;br /&gt;	&lt;br /&gt;		&lt;br /&gt;	&amp;lt;/h:head&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&amp;lt;h:body&amp;gt;&lt;br /&gt;		&amp;lt;h:form&amp;gt;&lt;br /&gt;			&amp;lt;p:commandButton value="Ajax Submit" /&amp;gt;&lt;br /&gt;		&amp;lt;/h:form&amp;gt;&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;	&amp;lt;/h:body&amp;gt;&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Step 5 – Build and deloy&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Now that we are done, the next step is to build and create the war file and deploy it in Tomcat 6. Then point your browser to - &lt;a title="http://localhost:8080/hermesconsole/home.jsf" href="http://localhost:8080/hermesconsole/home.jsf"&gt;http://localhost:8080/hermesconsole/home.jsf&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;You will see the following command button on your browser:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_UEQt_cUM2VM/TJ4SLag-S0I/AAAAAAAAAf4/eDQR_E_yZm8/s1600-h/Blog%20-%201%5B3%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Blog - 1" border="0" alt="Blog - 1" src="http://lh6.ggpht.com/_UEQt_cUM2VM/TJ4SMcoaTII/AAAAAAAAAf8/dpVV-YCwbj8/Blog%20-%201_thumb%5B1%5D.gif?imgmax=800" width="240" height="159"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-497880621508446692?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/497880621508446692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/09/getting-started-with-prime-faces-2.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/497880621508446692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/497880621508446692'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/09/getting-started-with-prime-faces-2.html' title='Getting started with Prime faces 2'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_UEQt_cUM2VM/TJ4SMcoaTII/AAAAAAAAAf8/dpVV-YCwbj8/s72-c/Blog%20-%201_thumb%5B1%5D.gif?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-7257235130289696206</id><published>2010-07-06T22:35:00.001-07:00</published><updated>2010-07-06T22:35:25.015-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web-plug'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Load your Spring beans as plug-ins</title><content type='html'>&lt;p&gt;There are different ways of loading Spring beans in a web application – viz using the dispatcher servlet or the context loader listener. A more modular and flexible approach (which also allows you to minimize coupling and dependencies in your applications) is to load the barebones of your application with the core context loaders and load the rest of your beans in a pluggable way. For example you may be interested in loading your page controllers, business tier and data access code as three separate modules. Off course you can do this and then use import in a main spring config file or a comma separate list in your web.xml where you configure the spring bean definition xmls. But what if you just wanted to drop in a jar with Spring beans and be sure they will be loaded and registered in the container. This also eases the pain of swapping an implementation. The goal is to put all your Spring beans in a particular layer, package it as a jar with one or more configuration file(with one following a special naming convention which is used to load them). You can also choose to go for feature based plugin – for example for show employee details use case you can package your view (freemarker template + javascript + css = I will show you how to do this in a later post), page controller (Spring MVC annotated controller), business service (interface + pojo implementation) and data access (interface + implementation) in a jar with configuration file. But my experience with this is if you go for feature based plugin – you can very soon land up with tons of plugins difficult to manage. For the moment lets just focus on the class that makes this pluggable design possible. &lt;/p&gt;&lt;pre class="brush: java"&gt;/**&lt;br /&gt; * @author dhrubo&lt;br /&gt; */&lt;br /&gt;package com.middlewareteam.spring.web.context;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;import javax.servlet.ServletConfig;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.lang.StringUtils;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;&lt;br /&gt;import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;&lt;br /&gt;&lt;br /&gt;import org.springframework.core.io.Resource;&lt;br /&gt;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;&lt;br /&gt;import org.springframework.core.io.support.ResourcePatternResolver;&lt;br /&gt;import org.springframework.web.context.support.XmlWebApplicationContext;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author dhrubo&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public class PluggableXmlWebApplicationContext extends XmlWebApplicationContext {&lt;br /&gt;	&lt;br /&gt;	public static final String PLUGIN_CONTEXT_CONFIG_NAME = "pluginContextConfigName";&lt;br /&gt;	&lt;br /&gt;	private final Logger log = LoggerFactory.getLogger(PluggableXmlWebApplicationContext.class);&lt;br /&gt;&lt;br /&gt;	@Override&lt;br /&gt;	protected void loadBeanDefinitions(XmlBeanDefinitionReader reader)&lt;br /&gt;			throws IOException {&lt;br /&gt;&lt;br /&gt;		super.loadBeanDefinitions(reader);&lt;br /&gt;&lt;br /&gt;		log.info("Loading plugin application contexts.");&lt;br /&gt;		log.info("Seeking plugin application context configuration name from servlet config ");&lt;br /&gt;				&lt;br /&gt;		ServletConfig config = this.getServletConfig();&lt;br /&gt;		String resourceName = null;&lt;br /&gt;		if(config != null) {&lt;br /&gt;		&lt;br /&gt;			resourceName = this.getServletConfig().getInitParameter(PLUGIN_CONTEXT_CONFIG_NAME);&lt;br /&gt;			log.info("Configured plugin resource name : {}",resourceName);&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		if(StringUtils.isEmpty(resourceName)) {&lt;br /&gt;			log.info("Seeking plugin application context configuration name from servlet context/web app context.");&lt;br /&gt;			resourceName = this.getServletContext().getInitParameter(PLUGIN_CONTEXT_CONFIG_NAME);&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;		log.info("Final plugin resouce name : {}",resourceName);&lt;br /&gt;		&lt;br /&gt;		ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();&lt;br /&gt;		try {&lt;br /&gt;			Resource[] configResources = resourcePatternResolver&lt;br /&gt;					.getResources(resourceName);&lt;br /&gt;			&lt;br /&gt;			&lt;br /&gt;			if (configResources.length != 0) {&lt;br /&gt;				log.info("Plugins found");&lt;br /&gt;				for (Resource resource : configResources) {&lt;br /&gt;					log.info("Resource == " + resource);&lt;br /&gt;&lt;br /&gt;				}&lt;br /&gt;				reader.loadBeanDefinitions(configResources);&lt;br /&gt;			} else {&lt;br /&gt;				log.info("No Plugins found.");&lt;br /&gt;			}&lt;br /&gt;		} catch (IOException e) {&lt;br /&gt;			throw new RuntimeException("Error loading plugin definitions",e);&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Now this is how you should configure this class in your Spring bean loading mechanism.&lt;/p&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&lt;br /&gt;	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&lt;br /&gt;	id="dms" version="2.5"&amp;gt;&lt;br /&gt;	&amp;lt;display-name&amp;gt;oollaasweb&amp;lt;/display-name&amp;gt;&lt;br /&gt;	&amp;lt;context-param&amp;gt;&lt;br /&gt;		&amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;		&amp;lt;param-value&amp;gt;/WEB-INF/config/log4j.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;	&amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;!-- security beans are here --&amp;gt;&lt;br /&gt;	&amp;lt;context-param&amp;gt;&lt;br /&gt;		&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;		&amp;lt;param-value&amp;gt;&lt;br /&gt;          /WEB-INF/config/spring-security.xml&lt;br /&gt;     &amp;lt;/param-value&amp;gt;&lt;br /&gt;	&amp;lt;/context-param&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&amp;lt;context-param&amp;gt;&lt;br /&gt;		&amp;lt;param-name&amp;gt;contextClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;		&amp;lt;param-value&amp;gt;&lt;br /&gt;          com.middlewareteam.spring.web.context.PluggableXmlWebApplicationContext&lt;br /&gt;     &amp;lt;/param-value&amp;gt;&lt;br /&gt;	&amp;lt;/context-param&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&amp;lt;context-param&amp;gt;&lt;br /&gt;		&amp;lt;param-name&amp;gt;pluginContextConfigName&amp;lt;/param-name&amp;gt;&lt;br /&gt;		&amp;lt;param-value&amp;gt;&lt;br /&gt;          classpath*:pluginRootApplicationContext.xml&lt;br /&gt;     &amp;lt;/param-value&amp;gt;&lt;br /&gt;	&amp;lt;/context-param&amp;gt;&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;	&amp;lt;listener&amp;gt;&lt;br /&gt;		&amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;	&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;!-- Root web application context --&amp;gt;&lt;br /&gt;	&amp;lt;listener&amp;gt;&lt;br /&gt;		&amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;	&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;!-- Spring security filters --&amp;gt;&lt;br /&gt;	&amp;lt;filter&amp;gt;&lt;br /&gt;		&amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;		&amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;&lt;br /&gt;	&amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;		&amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;		&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;	&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;servlet&amp;gt;&lt;br /&gt;		&amp;lt;servlet-name&amp;gt;staticresourceservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;		&amp;lt;servlet-class&amp;gt;com.middlewareteam.spring.web.servlet.ResourceServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;		&amp;lt;load-on-startup&amp;gt;0&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;	&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;servlet&amp;gt;&lt;br /&gt;		&amp;lt;servlet-name&amp;gt;dmsservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;		&amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;		&amp;lt;init-param&amp;gt;&lt;br /&gt;			&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;			&amp;lt;param-value&amp;gt;/WEB-INF/config/spring-web.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;		&amp;lt;/init-param&amp;gt;&lt;br /&gt;		&amp;lt;init-param&amp;gt;&lt;br /&gt;			&amp;lt;param-name&amp;gt;contextClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;			&amp;lt;param-value&amp;gt;com.middlewareteam.spring.web.context.PluggableXmlWebApplicationContext&amp;lt;/param-value&amp;gt;&lt;br /&gt;		&amp;lt;/init-param&amp;gt;&lt;br /&gt;		&amp;lt;init-param&amp;gt;&lt;br /&gt;			&amp;lt;param-name&amp;gt;pluginContextConfigName&amp;lt;/param-name&amp;gt;&lt;br /&gt;			&amp;lt;param-value&amp;gt;classpath*:pluginApplicationContext.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;		&amp;lt;/init-param&amp;gt;&lt;br /&gt;&lt;br /&gt;		&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;	&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;	&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;		&amp;lt;servlet-name&amp;gt;staticresourceservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;		&amp;lt;url-pattern&amp;gt;/resources/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;	&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;		&amp;lt;servlet-name&amp;gt;dmsservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;		&amp;lt;url-pattern&amp;gt;/index.html&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;	&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;		&amp;lt;servlet-name&amp;gt;dmsservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;		&amp;lt;url-pattern&amp;gt;*.html&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;	&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;		&amp;lt;servlet-name&amp;gt;dmsservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;		&amp;lt;url-pattern&amp;gt;*.json&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;	&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;		&lt;br /&gt;		&amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;		&lt;br /&gt;	&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Now just put your spring config xml with the name pluginRootApplicationContext.xml in the root of the jar and you are ready to roll out pluggable modules. You can use multiple configuration file here too. Just import them in the pluginRootApplicationContext.xml. Also if you use Maven 2 put the pluginRootApplicationContext.xml in the src/main/resources folder. Things will be much easier to package and deploy if you are using Maven. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;There are few limitations to this model though. Since Spring does not yet support hot deployment (application context is read only at run time you cannot add beans while your app is running, you can refresh though but it is risky) you have to re-start your applications for the plugins to get listed in the Spring container. As I wrote earlier this is in line with Eclipse plugin architecture. Another limitation is we do not yet have a versioning. What this means is what if you are using application layer plugins and you have just modified a handful of classes. In that case you like that your plugin system can identify and register the new version and retire the old version during an application restart. However you can always delete the old jar and replace it with the new one till we have the version management. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-7257235130289696206?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/7257235130289696206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/07/load-your-spring-beans-as-plug-ins.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/7257235130289696206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/7257235130289696206'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/07/load-your-spring-beans-as-plug-ins.html' title='Load your Spring beans as plug-ins'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-8486305113846651304</id><published>2010-06-26T06:27:00.001-07:00</published><updated>2010-09-25T07:41:54.262-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CK-Editor'/><title type='text'>CKEDITOR 3.x - Simplest Ajax Submit Plugin</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I have assumed that you have downloaded and got started with CKEDITOR.&lt;/p&gt;&lt;p&gt;Step 1 – The html file is shown below:&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Writer&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta content="text/html; charset=utf-8" http-equiv="content-type" /&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="ckeditor/ckeditor.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="js/jquery-1.4.2.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;&lt;br /&gt;.cke_contents {&lt;br /&gt;height: 400px !important;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form action="sample_posteddata.php" method="post"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;textarea id="editor" &amp;gt; &amp;lt;/textarea&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;//&amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CKEDITOR.replace( 'editor',&lt;br /&gt;{&lt;br /&gt;fullPage : true,&lt;br /&gt;uiColor : '#9AB8F3',&lt;br /&gt;toolbar : 'MyToolbar'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//]]&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Note that the jquery js file is part of this html page.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Step 2: Create a folder called ‘ajaxsave’ under the plugin folder and save the plugin.js file in it. The source of this file is shown below:&lt;/p&gt;&lt;pre class="brush: js"&gt;CKEDITOR.plugins.add('ajaxsave',&lt;br /&gt;{&lt;br /&gt;init: function(editor)&lt;br /&gt;{&lt;br /&gt;var pluginName = 'ajaxsave';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;editor.addCommand( pluginName,&lt;br /&gt;{&lt;br /&gt;exec : function( editor )&lt;br /&gt;{&lt;br /&gt;alert( "Executing a command for the editor name - " + editor.checkDirty() );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$.post("http://localhost:8080/test/TestServlet", { name: "John", time: "2pm" } );&lt;br /&gt;&lt;br /&gt;alert('after ajax post');&lt;br /&gt;},&lt;br /&gt;canUndo : true&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;editor.addCommand(pluginName, &lt;br /&gt;new CKEDITOR.dialogCommand(pluginName)&lt;br /&gt;&lt;br /&gt;);&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;editor.ui.addButton('Ajaxsave',&lt;br /&gt;{&lt;br /&gt;label: 'Save Ajax',&lt;br /&gt;command: pluginName,&lt;br /&gt;className : 'cke_button_save'&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Thats all. You will now need to add this new button to the CKEDITOR toolbar. This is added in the config.js under ckeditor folder as shown below:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&lt;br /&gt;CKEDITOR.editorConfig = function( config )&lt;br /&gt;{&lt;br /&gt;// Define changes to default configuration here. For example:&lt;br /&gt;// config.language = 'fr';&lt;br /&gt;// config.uiColor = '#AADC6E';&lt;br /&gt;&lt;br /&gt;config.uiColor = '#AADC6E';&lt;br /&gt;config.resize_enabled = false;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;config.toolbar = 'MyToolbar';&lt;br /&gt;&lt;br /&gt;config.toolbar_MyToolbar =&lt;br /&gt;[&lt;br /&gt;['NewPage','Preview'],&lt;br /&gt;['Cut','Copy','Paste','PasteText','PasteFromWord','-','Scayt'],&lt;br /&gt;['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],&lt;br /&gt;['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],&lt;br /&gt;'/',&lt;br /&gt;['Styles','Format'],&lt;br /&gt;['Bold','Italic','Strike'],&lt;br /&gt;['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],&lt;br /&gt;['Link','Unlink','Anchor','Ajaxsave'],&lt;br /&gt;['Maximize','-','About']&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;config.extraPlugins = 'ajaxsave';&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-8486305113846651304?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/8486305113846651304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/06/ckeditor-3x-simplest-ajax-submit-plugin.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/8486305113846651304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/8486305113846651304'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/06/ckeditor-3x-simplest-ajax-submit-plugin.html' title='CKEDITOR 3.x - Simplest Ajax Submit Plugin'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-2982568240371485126</id><published>2010-05-29T21:44:00.001-07:00</published><updated>2010-05-29T23:03:48.899-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Part V : A Simple and Smart Result Mapper</title><content type='html'>The examples so far only deal with single table. But it is very much possible to join multiple tables and still use this mapper. As an example consider three entities as shown below:  &lt;table border="1" cellpadding="2" cellspacing="0" style="width: 400px;"&gt;&lt;tbody&gt; &lt;tr style="background: none repeat scroll 0% 0% orange;"&gt; &lt;td colspan="2" valign="top"&gt;&lt;b&gt;T_REPOSITORY&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;REPOSITORY_ID&lt;/td&gt; &lt;td valign="top" width="200"&gt;int&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;REPOSITORY_NAME&lt;/td&gt; &lt;td valign="top" width="200"&gt;varchar&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;CONNECTOR_ID&lt;/td&gt; &lt;td valign="top" width="200"&gt;int&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;   &lt;table border="1" cellpadding="2" cellspacing="0" style="width: 400px;"&gt;&lt;tbody&gt; &lt;tr style="background: none repeat scroll 0% 0% orange;"&gt; &lt;td colspan="2" valign="top"&gt;&lt;b&gt;T_CONNECTOR&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;CONNECTOR_ID&lt;/td&gt; &lt;td valign="top" width="200"&gt;int&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;CONNECTOR_NAME&lt;/td&gt; &lt;td valign="top" width="200"&gt;varchar&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;URL&lt;/td&gt; &lt;td valign="top" width="200"&gt;varchar&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;OWNER_ID&lt;/td&gt; &lt;td valign="top" width="200"&gt;int&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;   &lt;table border="1" cellpadding="2" cellspacing="0" style="width: 400px;"&gt;&lt;tbody&gt; &lt;tr style="background: none repeat scroll 0% 0% orange;"&gt; &lt;td colspan="2" valign="top"&gt;&lt;b&gt;T_OWNER&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;OWNER_ID&lt;/td&gt; &lt;td valign="top" width="200"&gt;int&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;OWNER_NAME&lt;/td&gt; &lt;td valign="top" width="200"&gt;varchar&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="200"&gt;OWNER_KEY&lt;/td&gt; &lt;td valign="top" width="200"&gt;varchar&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  The relationship is clear - a repository has a connector and a connector has a owner. So how can you populate a Repository object containing a Connector Object which in turn has an Owner object. This is just simple. Execute this query.  &lt;pre class="brush: sql"&gt;SELECT r.repository_id "repositoryId", r.repository_name "repositoryName",&lt;br /&gt;c.connector_id "connector.connectorId",&lt;br /&gt;c.connector_name "connector.connectorName",&lt;br /&gt;c.url "connector.url",&lt;br /&gt;o.owner_id "connector.owner.ownerId",&lt;br /&gt;o.owner_name "connector.owner.ownerName",&lt;br /&gt;o.owner_key "connector.owner.ownerKey"&lt;br /&gt;FROM&lt;br /&gt;t_repository r,t_connector c, t_owner o&lt;br /&gt;WHERE&lt;br /&gt;r.repository_id = ?&lt;br /&gt;AND   c.connector_id = r.connector_id&lt;br /&gt;AND   o.owner_id = c.owner_id&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The mapper automatically checks if the child object exists, if not it creates one and then populates the properties. The Javabeans are listed below for reference.&lt;br /&gt;Listing - Repository.java&lt;br /&gt;&lt;pre class="brush: java"&gt;import org.apache.commons.lang.builder.ToStringBuilder;&lt;br /&gt;public class Repository {&lt;br /&gt;private int repositoryId;&lt;br /&gt;private String repositoryName;&lt;br /&gt;private Connector connector;&lt;br /&gt;/**&lt;br /&gt;* @return the repositoryId&lt;br /&gt;*/&lt;br /&gt;public int getRepositoryId() {&lt;br /&gt;return repositoryId;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @param repositoryId the repositoryId to set&lt;br /&gt;*/&lt;br /&gt;public void setRepositoryId(int repositoryId) {&lt;br /&gt;this.repositoryId = repositoryId;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @return the repositoryName&lt;br /&gt;*/&lt;br /&gt;public String getRepositoryName() {&lt;br /&gt;return repositoryName;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @param repositoryName the repositoryName to set&lt;br /&gt;*/&lt;br /&gt;public void setRepositoryName(String repositoryName) {&lt;br /&gt;this.repositoryName = repositoryName;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @return the connector&lt;br /&gt;*/&lt;br /&gt;public Connector getConnector() {&lt;br /&gt;return connector;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @param connector the connector to set&lt;br /&gt;*/&lt;br /&gt;public void setConnector(Connector connector) {&lt;br /&gt;this.connector = connector;&lt;br /&gt;}&lt;br /&gt;/* (non-Javadoc)&lt;br /&gt;* @see java.lang.Object#toString()&lt;br /&gt;*/&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;&lt;br /&gt;return ToStringBuilder.reflectionToString(this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listing - Connector.java&lt;br /&gt;&lt;pre class="brush: java"&gt;import org.apache.commons.lang.builder.ToStringBuilder;&lt;br /&gt;public class Connector {&lt;br /&gt;private int connectorId;&lt;br /&gt;private String connectorName;&lt;br /&gt;private String url;&lt;br /&gt;private Owner owner;&lt;br /&gt;/**&lt;br /&gt;* @return the connectorId&lt;br /&gt;*/&lt;br /&gt;public int getConnectorId() {&lt;br /&gt;return connectorId;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @param connectorId the connectorId to set&lt;br /&gt;*/&lt;br /&gt;public void setConnectorId(int connectorId) {&lt;br /&gt;this.connectorId = connectorId;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @return the connectorName&lt;br /&gt;*/&lt;br /&gt;public String getConnectorName() {&lt;br /&gt;return connectorName;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @param connectorName the connectorName to set&lt;br /&gt;*/&lt;br /&gt;public void setConnectorName(String connectorName) {&lt;br /&gt;this.connectorName = connectorName;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @return the url&lt;br /&gt;*/&lt;br /&gt;public String getUrl() {&lt;br /&gt;return url;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @param url the url to set&lt;br /&gt;*/&lt;br /&gt;public void setUrl(String url) {&lt;br /&gt;this.url = url;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @return the owner&lt;br /&gt;*/&lt;br /&gt;public Owner getOwner() {&lt;br /&gt;return owner;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt;* @param owner the owner to set&lt;br /&gt;*/&lt;br /&gt;public void setOwner(Owner owner) {&lt;br /&gt;this.owner = owner;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* (non-Javadoc)&lt;br /&gt;* @see java.lang.Object#toString()&lt;br /&gt;*/&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;&lt;br /&gt;return ToStringBuilder.reflectionToString(this);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listing - Owner.java&lt;br /&gt;&lt;pre class="brush: java"&gt;import org.apache.commons.lang.builder.ToStringBuilder;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;* &lt;br /&gt;*/&lt;br /&gt;public class Owner {&lt;br /&gt;private long ownerId;&lt;br /&gt;private String ownerName;&lt;br /&gt;private String ownerKey;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @return the ownerId&lt;br /&gt;*/&lt;br /&gt;public long getOwnerId() {&lt;br /&gt;return ownerId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @param ownerId the ownerId to set&lt;br /&gt;*/&lt;br /&gt;public void setOwnerId(long ownerId) {&lt;br /&gt;this.ownerId = ownerId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @return the ownerName&lt;br /&gt;*/&lt;br /&gt;public String getOwnerName() {&lt;br /&gt;return ownerName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @param ownerName the ownerName to set&lt;br /&gt;*/&lt;br /&gt;public void setOwnerName(String ownerName) {&lt;br /&gt;this.ownerName = ownerName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @return the ownerKey&lt;br /&gt;*/&lt;br /&gt;public String getOwnerKey() {&lt;br /&gt;return ownerKey;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @param ownerKey the ownerKey to set&lt;br /&gt;*/&lt;br /&gt;public void setOwnerKey(String ownerKey) {&lt;br /&gt;this.ownerKey = ownerKey;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;&lt;br /&gt;return ToStringBuilder.reflectionToString(this);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-2982568240371485126?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/2982568240371485126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-v-simple-and-smart-result-mapper.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2982568240371485126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2982568240371485126'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-v-simple-and-smart-result-mapper.html' title='Part V : A Simple and Smart Result Mapper'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-6453395768139213374</id><published>2010-05-29T21:40:00.001-07:00</published><updated>2010-05-29T23:04:31.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Part IV : A Simple and Smart Result Mapper</title><content type='html'>In my last post, I have shown how the dao support class changed to convert list of maps to list of domain objects. Now the DAO implementation class must also change to use these new methods. Here is the modified DAO class.&lt;br /&gt;Listing – UserDaoImpl.java&lt;br /&gt;&lt;pre class="brush: java"&gt;package net.sf.dms.security.dao.impl;&lt;br /&gt;import java.util.List;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;import net.sf.dms.security.dao.api.UserDao;&lt;br /&gt;import net.sf.dms.security.domain.User;&lt;br /&gt;import net.sf.spring.dao.AbstractBaseDaoSupport;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;* &lt;br /&gt;*/&lt;br /&gt;public class UserDaoImpl extends AbstractBaseDaoSupport implements UserDao {&lt;br /&gt;&lt;br /&gt;private Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);&lt;br /&gt;@Override&lt;br /&gt;public List&amp;lt;User&amp;gt; listUsers() {&lt;br /&gt;return (List&amp;lt;User&amp;gt;)this.queryForList("listUsers", User.class);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void save(User user) {&lt;br /&gt;this.insert("saveUser", user.getEmail(),&lt;br /&gt;user.getPassword(), user.getFirstName(), user.getLastName());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void update(User user) {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;@Override&lt;br /&gt;public User findUserByUserName(String username) {&lt;br /&gt;logger.debug("Loading user details as part of authentication");&lt;br /&gt;return (User)this.queryForObject("findUserByUserName", User.class, username);  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public List&amp;lt;User&amp;gt; findUsersStartingWith(String nameStartsWith) {&lt;br /&gt;return (List&amp;lt;User&amp;gt;)this.queryForList("findUsersStartingWith", User.class, nameStartsWith + "%");  &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Now you can see clearly that the list or finder queries have been reduced to just 1 line. I guess this code reduction is same as in any ORM or datamapper. Now let us see how the SQL has changed. I have tested this code on Postgresql 8.3 and should work with any sensible database available. &lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="secSqlMap" class="org.springframework.beans.factory.config.MapFactoryBean"&amp;gt;&lt;br /&gt;&amp;lt;property name="sourceMap"&amp;gt;&lt;br /&gt;&amp;lt;map&amp;gt;&lt;br /&gt;&amp;lt;entry key="listUsers"&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;SELECT first_name "firstName",last_name "lastName",email "userCode",user_id "userId" FROM t_user&lt;br /&gt;&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;entry key="saveUser"&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;INSERT INTO t_user(user_id, email, password, first_name,last_name) VALUES (nextval('t_user_seq'), ?, ?, ?, ?)&lt;br /&gt;&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;entry key="findUserByUserName"&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;SELECT first_name "firstName",last_name "latName",email "userCode",user_id "userId" FROM t_user WHERE email = ?&lt;br /&gt;&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;entry key="findUsersStartingWith"&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;lt;![CDATA[&lt;br /&gt;SELECT first_name "firstName",last_name "latName",email "userCode",user_id "userId" FROM t_user &lt;br /&gt;WHERE first_name LIKE ?;&lt;br /&gt;&lt;br /&gt;]]&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/map&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Now you can see my source of meta data and how I use them to run this simple data mapper and move towards my goal of lightweight persistence and database independence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-6453395768139213374?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/6453395768139213374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-iv-simple-and-smart-result-mapper.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6453395768139213374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6453395768139213374'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-iv-simple-and-smart-result-mapper.html' title='Part IV : A Simple and Smart Result Mapper'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-1552151256194370559</id><published>2010-05-29T21:20:00.001-07:00</published><updated>2010-07-06T21:29:53.534-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Part III : A Simple and Smart Result Mapper</title><content type='html'>Now a days we make extensive use of Annotations. Whether it is a good or bad practice to mix configuration meta data with code is debatable, but its better than proprietary XML tags. Since we are so used to mixing meta data in our Java code, why not make use of same tactics in building our data mapper.  &lt;br /&gt;SQL statements in all databases supports something called an alias for column names. I will use this to map a SQL result column to a property in my bean. This is better because even if my column name changes but my alias remains same my bean will be populated properly.  &lt;br /&gt;I use JODD bean utils. You can download the JODD distribution &lt;a href="http://jodd.org/download/index.html%20%20"&gt;here&lt;/a&gt;.&amp;nbsp; A problem with JODD is that it is not available in any of the global maven repositories. So you need install the same in your local repository by running the following command&amp;nbsp; &lt;br /&gt;C:\&amp;amp;gt;mvn install:install-file -Dfile=jodd-3.0.9.jar&amp;amp;nbsp; -DgroupId=jodd -DartifactId=&lt;br /&gt;jodd -Dversion=3.0.9 -Dpackaging=jar&amp;nbsp; &lt;br /&gt;Use the GUI screens if you are using Archiva repository manager.&amp;nbsp; &lt;br /&gt;I am on windows and I have kept my jar is located at C:\jodd-3.0.9.jar. It has no other dependencies.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Correction&lt;/b&gt; - As pointed out below in the comments section JODD is now available on Maven.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.jodd&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;jodd-wot&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is the modified abstract dao support class.&lt;br /&gt;&lt;pre class="brush: java"&gt;package net.breezeware.spring.dao;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import jodd.bean.BeanUtil;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.lang.reflect.ConstructorUtils;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;public abstract class AbstractBaseDaoSupport extends SimpleJdbcDaoSupport{&lt;br /&gt;private Logger logger = LoggerFactory.getLogger(AbstractBaseDaoSupport.class);&lt;br /&gt;&lt;br /&gt;private Map&amp;lt;String, String&amp;gt; sqlMap;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;protected List&amp;lt;?&amp;gt; queryForList(String id, Class primaryType, Object ...params) {&lt;br /&gt;String sql = sqlMap.get(id);&lt;br /&gt;List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; mappedResultList = this.getSimpleJdbcTemplate().queryForList(sql, params);&lt;br /&gt;&lt;br /&gt;return this.preapreList(mappedResultList, primaryType);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected List&amp;lt;?&amp;gt; queryForList(String id, Class primaryType) {&lt;br /&gt;List&amp;lt;Object&amp;gt; result = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;String sql = sqlMap.get(id);&lt;br /&gt;&lt;br /&gt;List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; mappedResultList = this.getSimpleJdbcTemplate().queryForList(sql, new HashMap());&lt;br /&gt;return this.preapreList(mappedResultList, primaryType);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;protected Object queryForObject(String id, Class type, Object ...params) {&lt;br /&gt;String sql = sqlMap.get(id);&lt;br /&gt;Map&amp;lt;String, ?&amp;gt; dataMap = this.getSimpleJdbcTemplate().queryForMap(&lt;br /&gt;sql, params);&lt;br /&gt;&lt;br /&gt;return prepareObject(dataMap,type);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void insert(String id, Object ...params ) {&lt;br /&gt;String sql = sqlMap.get(id);&lt;br /&gt;this.getSimpleJdbcTemplate().update(sql, params);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private List&amp;lt;?&amp;gt; preapreList(List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; mappedResultList,Class primaryType) {&lt;br /&gt;List&amp;lt;Object&amp;gt; result = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;Object holder = null;&lt;br /&gt;for(Map&amp;lt;String, Object&amp;gt; resultMap : mappedResultList) {&lt;br /&gt;holder = prepareObject(resultMap,primaryType);&lt;br /&gt;result.add(holder); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;private Object prepareObject(Map&amp;lt;String, ?&amp;gt; resultMap, Class primaryType) {&lt;br /&gt;Iterator&amp;lt;String&amp;gt; it = resultMap.keySet().iterator();&lt;br /&gt;Object holder = getNewObjectInstance(primaryType);&lt;br /&gt;&lt;br /&gt;String name = null;&lt;br /&gt;Object value = null;&lt;br /&gt;&lt;br /&gt;//set all the properties&lt;br /&gt;while(it.hasNext()) {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;name = it.next();&lt;br /&gt;value = resultMap.get(name);&lt;br /&gt;&lt;br /&gt;logger.debug("Mapping property = {}, value = {}",name,value);&lt;br /&gt;&lt;br /&gt;BeanUtil.setPropertyForcedSilent(holder, name, value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return holder;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private Object getNewObjectInstance(Class clazz) {&lt;br /&gt;Object object = null;&lt;br /&gt;try {&lt;br /&gt;object = ConstructorUtils.invokeExactConstructor(clazz, null);&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;throw new RuntimeException(e);&lt;br /&gt;}&lt;br /&gt;return object;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @param sqlMap the sqlMap to set&lt;br /&gt;*/&lt;br /&gt;public void setSqlMap(Map&amp;lt;String, String&amp;gt; sqlMap) {&lt;br /&gt;this.sqlMap = sqlMap;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This class is by no means complete and is evolving. But it has the essential methods to get the ball rolling. This class uses the Spring JDBC to execute the SQL statements. The SQL statements are picked up from the externalized cache. It utilizes the meta data or column names in the SQL result set retrieved and populated by Spring JDBC as keys in those row maps. Note that in case a column does not have corresponding bean property, it will escape silently. With smart configuration (will show examples soon), this can support nested properties.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-1552151256194370559?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/1552151256194370559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-iii-simple-and-smart-result-mapper_7403.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/1552151256194370559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/1552151256194370559'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-iii-simple-and-smart-result-mapper_7403.html' title='Part III : A Simple and Smart Result Mapper'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-5848988494025481315</id><published>2010-05-29T08:07:00.001-07:00</published><updated>2010-05-29T20:05:03.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Part II : A Simple and Smart Result Mapper</title><content type='html'>I am a big fan of Spring JDBC. The reasons are simple - &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Full control over SQL. I can optimize, tweak and tune them to my free will. Let me think in terms of those tables and not objects. &lt;/li&gt;&lt;li&gt;Cuts down my DAO code significantly.&lt;/li&gt;&lt;li&gt;Takes care of all boilerplate code.&lt;/li&gt;&lt;li&gt;Integrates well with other parts of my application which mostly uses other Spring components.&lt;/li&gt;&lt;li&gt;Simple and easy to setup and get running at high speed&lt;/li&gt;&lt;li&gt;Minimal learning curve&lt;/li&gt;&lt;/ul&gt;One area where Spring framework does not do a good job is that of list/finder queries returning n number of records. Lets say you want to find the employees in a certain department. The query is executed and you get a map of records, but then you need to return a list of domain objects to the business tier. You will loop through the map list returned by Spring JDBC, for each of your record create a Javabean populate each field and then add to another list which will be finally returned. So there is lot of boilerplate code here.&amp;nbsp; Look at the example code below, which fetches all users in my system.&lt;br /&gt;&lt;pre class="brush: java"&gt;public List&amp;lt;User&amp;gt; listUsers() {&lt;br /&gt;String SQL_LIST_USER = "SELECT first_name,last_name,email,user_id FROM t_user";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; users = this.getSimpleJdbcTemplate().queryForList(SQL_LIST_USERS,new HashMap());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;User&amp;gt; userList = new ArrayList&amp;lt;User&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User userHolder = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(Map&amp;lt;String,Object&amp;gt; user : users) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder = new User();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setFirstName((String)user.get("first_name"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setLastName((String)user.get("last_name"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setUserCode((String)user.get("email"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setUserId((Integer)user.get("user_id"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userList.add(userHolder);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return userList;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/pre&gt;There is significant redundant code here. If you notice carefully, if a column name changes this code will lead to errors. You may consider this mapping and listing in a row mapper, but still you need to write this code and unnecessarily add new classes per such list method for Spring JDBC callbacks. &lt;br /&gt;So I looked for a data mapper. The best solution in this regard is iBatis. It is much simpler and has less learning curve compared to ORM and tries to do limited things. While playing with it I was once again struck by XML meta data hell. This time mapping each SQL with different maps. This could be some XML to maintain in a decently large project. Also it queries database multiple time if I need to populate object graphs. Also my attempts to integrate iBatis 3 with Maven 2 and Spring 3 failed with ClassNotFoundException. Hence my journey with iBatis ended very abruptly. I was looking for a smarter solution, which I could configure very easily, should be very simple, no learning curve, efficient and intuitive. &lt;br /&gt;The solution was in Spring framework, bit of SQL trick and an external super efficient bean manipulation library called JODD - &lt;a href="http://jodd.org/doc/beanutil.html" title="http://jodd.org/doc/beanutil.html"&gt;http://jodd.org/doc/beanutil.html&lt;/a&gt;&lt;br /&gt;As a first step towards building this simple and smart data mapper, I want to externalize my SQLs. So I introduce an abstract dao support class which does load externalized SQLs from a Spring configuration file. Note I am not using any additional XML file for this. This will again lead same problems as in iBatis. Instead its better to stick to what I know best. Here is the first version of this abstract class.&lt;br /&gt;Listing – AbstractBaseDaoSupport.java&lt;br /&gt;&lt;pre class="brush: java"&gt;package net.sf.webplug.spring.dao;  &lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Map;  &lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;  &lt;br /&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;public abstract class AbstractBaseDaoSupport extends SimpleJdbcDaoSupport{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Logger logger = LoggerFactory.getLogger(AbstractBaseDaoSupport.class);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Map&amp;lt;String, String&amp;gt; sqlMap;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param sqlMap the sqlMap to set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setSqlMap(Map&amp;lt;String, String&amp;gt; sqlMap) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.sqlMap = sqlMap;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getSql(String id) {&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;return this.sqlMap.get(id);&lt;/blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Now I change my Dao class to use this abstract class instead. &lt;br /&gt;Listing – UserDaoImpl.java &lt;br /&gt;&lt;pre class="brush: java"&gt;package net.sf.dms.security.dao.impl;  &lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;  &lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;  &lt;br /&gt;import net.sf.dms.security.dao.api.UserDao;&lt;br /&gt;import net.sf.dms.security.domain.User;  &lt;br /&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;* &lt;br /&gt;*/&lt;br /&gt;public class UserDaoImpl extends AbstractBaseDaoSupport implements UserDao {  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;User&amp;gt; listUsers() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String sql = this.getSql("listUsers");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; users = this.getSimpleJdbcTemplate().queryForList(sql,new HashMap());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;User&amp;gt; userList = new ArrayList&amp;lt;User&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User userHolder = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(Map&amp;lt;String,Object&amp;gt; user : users) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder = new User();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setFirstName((String)user.get("first_name"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setLastName((String)user.get("last_name"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setUserCode((String)user.get("email"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userHolder.setUserId((Integer)user.get("user_id"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userList.add(userHolder);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return userList;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;The sql is now moved to an Spring config file (separate just for SQLs) &lt;br /&gt;Listing – sql-repository.xml &lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="&lt;a href="http://www.springframework.org/schema/beans%22"&gt;http://www.springframework.org/schema/beans"&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance%22"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="&lt;a href="http://www.springframework.org/schema/beans"&gt;http://www.springframework.org/schema/beans&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd%22"&gt;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&lt;/a&gt;&amp;gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="secSqlMap" class="org.springframework.beans.factory.config.MapFactoryBean"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="sourceMap"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;map&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key="listUsers"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT first_name ,last_name ,email ,user_id&amp;nbsp; FROM t_user&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/entry&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/map&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;  &lt;br /&gt;&amp;lt;/beans&amp;gt; &lt;br /&gt;&lt;/pre&gt;Now that I have externalized the SQLs, its time to look into the main configuration file. There is something interesting here too.&lt;br /&gt;Listing – applicationContext.xml&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="&lt;a href="http://www.springframework.org/schema/beans%22"&gt;http://www.springframework.org/schema/beans"&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance%22"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="&lt;a href="http://www.springframework.org/schema/beans"&gt;http://www.springframework.org/schema/beans&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd%22"&gt;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&lt;/a&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;import resource="sql-repository.xml"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="secDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="driverClassName" value="org.postgresql.Driver"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="url" value="jdbc:postgresql://localhost:5432/dms"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="username" value="postgres"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="password" value="postgres"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="abstractSecBaseDaoSupport" class="net.sf.spring.dao.AbstractBaseDaoSupport" abstract="true"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="dataSource" ref="secDataSource"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="sqlMap" ref="secSqlMap"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="userDao" class="net.sf.dms.security.dao.impl.UserDaoImpl" parent="abstractSecBaseDaoSupport" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="roleDao" class="net.sf.dms.security.dao.impl.RoleDaoImpl" parent="abstractSecBaseDaoSupport"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="userRoleDao" class="net.sf.dms.security.dao.impl.UserRoleDaoImpl" parent="abstractSecBaseDaoSupport"/&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt; &lt;br /&gt;&lt;/pre&gt;Note the abstract class configuration. I do not need to configure the data source property for each dao class anymore. This ends my first step of clean up. In the next post I will show how to extend the abstract class to provide mapper functions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-5848988494025481315?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/5848988494025481315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-ii-simple-and-smart-result-mapper.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5848988494025481315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5848988494025481315'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-ii-simple-and-smart-result-mapper.html' title='Part II : A Simple and Smart Result Mapper'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-4029768349903914045</id><published>2010-05-29T06:04:00.001-07:00</published><updated>2010-05-29T20:04:47.262-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Part I : A Simple and Smart SQL Result Mapper</title><content type='html'>I am not at all a fan of ORM solutions/frameworks like Hibernate. I have already written and presented my view on different forums and discussions the reasons for my disliking. I truly empathize with Ted Neward that ORM are “Vietnam of Computer Science”. &lt;br /&gt;&lt;a href="http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html" title="http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html"&gt;http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx" title="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx&lt;/a&gt;&lt;br /&gt;Followup - &lt;a href="http://blogs.tedneward.com/2006/06/27/Thoughts+On+Vietnam+Commentary.aspx" title="http://blogs.tedneward.com/2006/06/27/Thoughts+On+Vietnam+Commentary.aspx"&gt;http://blogs.tedneward.com/2006/06/27/Thoughts+On+Vietnam+Commentary.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/404083/is-orm-still-the-vietnam-of-computer-science" title="http://stackoverflow.com/questions/404083/is-orm-still-the-vietnam-of-computer-science"&gt;http://stackoverflow.com/questions/404083/is-orm-still-the-vietnam-of-computer-science&lt;/a&gt;&lt;br /&gt;Some counter punches&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/architecture/ORM_Vietnam.aspx?display=Print" title="http://www.codeproject.com/KB/architecture/ORM_Vietnam.aspx?display=Print"&gt;http://www.codeproject.com/KB/architecture/ORM_Vietnam.aspx?display=Print&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I am not convinced as to why should I learn HQL or similar QLs provided by other OR Mapping solutions? Why should I not write and benefit from SQLs which have been proven to be so powerful over the ages and often outlive the lifetime of an application. So many times I have seen SQLs and Stored procedures being reused as applications moved from say .NET to Java and vice-versa.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is significant learning curve to an ORM add to those fancy concepts like lazy loading(if you need lazy loading you must first think that there is some problem, why are you afraid of object creation with modern day JVM and hardware or is it that you fear you will create too many objects?).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Why do I generate, tweak so many XMLs worry about so much XML based syntaxes, how do I efficiently manage these XMLs and alter later if required? There are too many XML elements and attributes some hidden undocumented? Oh this is real pain. Annotations solve some of the meta data hell, but I am still in a dilemma if mixing meta data with code is a good practice?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Why do think of my joins in terms of objects when they are best done with relational tables? Sorry I can only think of joining tables and not my objects.Live and let them live in their own world.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is no doubt ORMs are powerful and tries to make life easy. But the learning curve and deadline pressures often forces developers with somehow acquired knowledge by reading few articles and getting started guides from here and there to code and then finally when issues crop up especially too many objects, JVM crashes and sever performance worries the application falls apart and you focus more on solving these than business logic.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Even dangerous trend that I see these days is the advent of ORM specific profilers. What does this imply? Yes the ORMs are serious cause for performance bottlenecks in your applications. I know someone came to me few months back, asking why his JVM crashes when he is running his search queries and paging? His table just had about 150k records and JVM heap was 2GB. Not a bad setting at all? Is it because the ORM was fetching a significant subset of the records based on the search criteria,first to application server before starting pagination? or my friend had a bad QL statement?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I know ORMs can help with optimistic lock? But do they help with phantom records problem?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Why should I cache on application server and allow or create a slightest possibility of my JVM to burst? Does caching on JVM really increase the application performance? I always knew and still continue to believe the best place to cache database records is in the database memory. Can we not gain on performance by keeping these data to where it belongs, which have been long tuned and proven to optimize performance, reducing network trips, setting tips to bulk fetch data when required, fetch data in optimal blocks? You may be tempted to use caching systems which hides behind the ORM. But think in case of an issue you have the pain of learning another framework and then fixing your errors, if Googling does not help.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How does your ORM populate the object graph? Does it fire query after query going down the graph? If yes think about the domain model? Or think about your ORM implementation? Is there any way out? My answer is yes, smart SQL + smart mapping. I will try to show this with an example.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;However, ORMs are good, if you have indepth knowledge of the framework under consideration. Then with an ORM you can significantly cut down code in your DAO layer. This is also a myth. With Spring JDBC you can reduce your code even more or equal to what you can with an ORM. You can read an article I wrote long back on OTN(actually wrote in erstwhile BEA DEV2DEV) here to start thinking about this - &lt;a href="http://www.oracle.com/technology/pub/articles/dev2arch/2006/10/spring-jdbc-dao.html" title="http://www.oracle.com/technology/pub/articles/dev2arch/2006/10/spring-jdbc-dao.html"&gt;http://www.oracle.com/technology/pub/articles/dev2arch/2006/10/spring-jdbc-dao.html&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;One area I thought I might use ORM is when I design a product which needs to support multiple databases. But then I realised this is not true, if we manage to externalize our SQL and have an efficient strategy to map SQL result set to our domain object we can achieve database independence. 99% of the applications are not meant to be db independent. If your customer has investment so much money to procure license, build competency buy hardware for that big blackbox for Java developers called RDBMS why would he want that box of money, time and effort go down the drain by replacing it with another. So if you are trying to sell me an ORM for db independence I will not simply not buy in.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ORMs dependent on several 3rd party libraries. Do I need to increase 3rd party dependencies? Yes you will need 3rd party jars but we must make effort to keep them to minimal. There may be version collisions between 3rd party libraries used by your ORM and main framework.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-4029768349903914045?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/4029768349903914045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-i-simple-and-smart-sql-result.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4029768349903914045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4029768349903914045'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/05/part-i-simple-and-smart-sql-result.html' title='Part I : A Simple and Smart SQL Result Mapper'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-2066465474953023858</id><published>2010-05-20T02:39:00.001-07:00</published><updated>2010-07-06T22:39:35.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web-plug'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>A custom plug-in system for web applications</title><content type='html'>&lt;p&gt;Recently I was trying to put together a plugin system for web applications. The idea is similar to Eclipse plugins. Where you bundle your extension in a jar and then drop them in Eclipse-Home/plugins folder, restart Eclipse and you are ready to use it. Note that Eclipse plugins are OSGi plugins. &lt;/p&gt;&lt;p&gt;So my initial effort was to see if I could build a pluggable web application with OSGi. After few experiments with Equinox (the Eclipse OSGi engine) and Felix, I moved on to check out Spring DM as well as Spring DM server. But all I all I felt that&lt;/p&gt;&lt;ul&gt;&lt;li&gt;OSGi / DM involves significant learning curve.&lt;/li&gt;&lt;li&gt;The web server bundles are “probably” not of enterprise strength.&lt;/li&gt;&lt;li&gt;Still trying to gel with JEE.&lt;/li&gt;&lt;li&gt;Significant extra effort required to port applications to OSGi platform.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All in all&amp;nbsp; OSGi / DM has to go few more miles before we build Enterprise server apps using those containers / bundles. But its a very good start and promises a lot in the future. &lt;/p&gt;&lt;p&gt;So what to do? I started digging dip into Spring framework for a while and soon came up with an idea of a simple plug-in system for web applications. This plug-in system should allow you to package your application components(controllers,business objects, data acccess)&amp;nbsp; in a jar file with mandatory Spring config file. This jar file should be dropped in WEB-INF/lib and should be ready for use once the web container is restarted or this application is restarted. It should also allow you to package your view components as well in the jar. &lt;/p&gt;&lt;p&gt;In the next few posts I will try to show how such a simple yet effective system can be build by extending the Spring framework. I will also show some good practices that I learnt while building applications with this framework extension which I call WebPlug. The code and documentation will be available soon on Sourceforge.&amp;nbsp; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-2066465474953023858?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/2066465474953023858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/05/custom-plug-in-system-for-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2066465474953023858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2066465474953023858'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/05/custom-plug-in-system-for-web.html' title='A custom plug-in system for web applications'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-6705320359058352349</id><published>2010-04-24T08:10:00.001-07:00</published><updated>2010-10-30T23:16:09.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>SecurityContextPersistenceFilter</title><content type='html'>This bean is configured as shown below:&lt;br /&gt;&amp;lt;bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/&amp;gt; &lt;br /&gt;This bean has two main tasks and they are very important&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In a typical web application like Skyphoto the user will login once and then subsequently do several operations or click several links and buttons generating several authenticated requests to the server. Since the user was authenticated once it is important to store the security context somewhere and by some means. Otherwise he/she has to authenticate for each request and will sooner or later never use Skyphoto. In a typical web application you will store an user object in HttpSession and each time a request comes in, the server identifies this session with a session id and you get the user object. It is the responsibility of the server to cache/store and manage these session objects during the lifetime of the session.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;i&gt;“In Spring Security, the responsibility for storing the &lt;code&gt;SecurityContext&lt;/code&gt; between requests falls to the &lt;code&gt;SecurityContextPersistenceFilter&lt;/code&gt;, which by default stores the context as an &lt;code&gt;HttpSession&lt;/code&gt; attribute between HTTP requests. It restores the context to the &lt;code&gt;SecurityContextHolder&lt;/code&gt; for each request….”&lt;/i&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;The SecurityContextPersistenceFilter stores the security context in ThreadLocal for the current execution. Hence it is essential to clear this thread local object in a web application as the server uses a pool of thread and chances are that this thread will be reused. If this security context is not cleared there is a high possibility that the set information will be used for request from a different user leading to unpredictable results and possible violation of security. &lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;The SecurityContextPersistenceFilter takes care of clearing the security context object from thread local once the request completes.&lt;/blockquote&gt;This filter MUST be executed BEFORE any authentication processing filter. Authentication processing mechanisms used in those filters expect the &lt;code&gt;SecurityContextHolder&lt;/code&gt; to contain a valid &lt;code&gt;SecurityContext&lt;/code&gt; by the time they execute.&lt;br /&gt;The task of saving and retrieving the security context is delegated to a separate strategy interface SecurityContextRepository. The interface is shown below:&lt;br /&gt;public interface SecurityContextRepository {&lt;br /&gt;&amp;nbsp; SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);&lt;br /&gt;&amp;nbsp; void saveContext(SecurityContext context, HttpServletRequest request,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletResponse response);&lt;br /&gt;}&lt;br /&gt;&lt;i&gt;“The HttpRequestResponseHolder is simply a container for the incoming request and response objects, allowing the implementation to replace these with wrapper classes. The returned contents will be passed to the filter chain.”&lt;/i&gt;&lt;br /&gt;The default implementation of SecurityContextRepository is the HttpSessionSecurityContextRepository class. As the name suggests it stores the security context as an HttpSession attribute.This class has an important attribute - &lt;code&gt;allowSessionCreation&lt;/code&gt;&amp;nbsp; which by default is set to true. Hence this class can create a new session if it needs to for storing security context of an authenticated user. Note that session is only created after authentication is done and contents of security context now has been changed with authenticated user information. If you want to prevent session creation, then set this parameter to false. A sample configuration is shown below.&lt;br /&gt;&amp;lt;bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"&amp;gt; &amp;lt;property name='securityContextRepository'&amp;gt; &lt;br /&gt;&amp;lt;bean class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'&amp;gt; &amp;lt;property name='allowSessionCreation' value='false' /&amp;gt; &lt;br /&gt;&amp;lt;/bean&amp;gt; &lt;br /&gt;&amp;lt;/property&amp;gt; &lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-6705320359058352349?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/6705320359058352349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/04/securitycontextpersistencefilter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6705320359058352349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6705320359058352349'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/04/securitycontextpersistencefilter.html' title='SecurityContextPersistenceFilter'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-1521875638901509815</id><published>2010-04-24T06:06:00.001-07:00</published><updated>2010-10-30T23:15:42.962-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>How the filter chain works?</title><content type='html'>Going back to the filter chain configuration in my last post, you can see a chain filters configured as shown below:&lt;br /&gt;&amp;lt;bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"&amp;gt; &lt;br /&gt;&amp;lt;sec:filter-chain-map path-type="ant"&amp;gt; &lt;br /&gt;&amp;lt;sec:filter-chain pattern="/SkyPhotoWeb/**" filters=" securityContextPersistenceFilterWithASCFalse, basicAuthenticationFilter, exceptionTranslationFilter, filterSecurityInterceptor" /&amp;gt;&lt;br /&gt;&amp;lt;sec:filter-chain pattern="/**" filters=" securityContextPersistenceFilterWithASCTrue, formLoginFilter, exceptionTranslationFilter, filterSecurityInterceptor" /&amp;gt; &lt;br /&gt;&amp;lt;/sec:filter-chain-map&amp;gt; &lt;br /&gt;&amp;lt;/bean&amp;gt; &lt;br /&gt;Let us assume that a request is send as &lt;a href="http://draft.blogger.com/post-edit.g?blogID=739779127620140144&amp;amp;postID=1521875638901509815#"&gt;http://www.skyphoto.com/SkyPhotoWeb/dosomething.html&lt;/a&gt; the request runs through the filters as shown in picture below:&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/S9Ls5XrbskI/AAAAAAAAAdY/idqWciZAKMs/s1600-h/blog1%5B3%5D.gif"&gt;&lt;img alt="blog1" border="0" height="478" src="http://lh4.ggpht.com/_UEQt_cUM2VM/S9Ls6k2jHyI/AAAAAAAAAdc/TAuTGVbd5oU/blog1_thumb%5B1%5D.gif?imgmax=800" style="border-width: 0px; display: inline;" title="blog1" width="515" /&gt;&lt;/a&gt;&lt;br /&gt;In my next post I will explain all these and few other important filters in greater detail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-1521875638901509815?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/1521875638901509815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/04/how-filter-chain-works.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/1521875638901509815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/1521875638901509815'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/04/how-filter-chain-works.html' title='How the filter chain works?'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_UEQt_cUM2VM/S9Ls6k2jHyI/AAAAAAAAAdc/TAuTGVbd5oU/s72-c/blog1_thumb%5B1%5D.gif?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-6453153578787375780</id><published>2010-03-27T00:15:00.001-07:00</published><updated>2010-10-30T23:15:25.030-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Let us look at the Spring security filter chain</title><content type='html'>&lt;u&gt;&lt;b&gt;DelegatingFilterProxy&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;The DelegatingFilterProxy is a special filter provided by the Spring framework.It acts as a bridge connecting&lt;br /&gt;the web container and spring application container. In other words it helps pipeline request processing&lt;br /&gt;from the web container filter to a bean in Spring web application context.&lt;br /&gt;&lt;br /&gt;DelegatingFilterProxy is configured in the web.xml as shown below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;DelegatingFilterProxy is essentially a dumb filter and implements no logic. Its sole responsibility is to delegate the Filter's methods through to a bean which is obtained from the Spring application context. This enables the bean to benefit from the Spring web application context lifecycle support and configuration flexibility. &lt;br /&gt;This bean must implement javax.servlet.Filter and it must have the &lt;b&gt;same name&lt;/b&gt; as that in the filter-name element. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FilterChainProxy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;DelegatingFilterProxy is actually connected to a FilterChainProxy in the Spring application context.&lt;br /&gt;The FilterChainProxy bean has the same name as the filter name in the web.xml&lt;br /&gt;You all must be very bored hearing this again again. I am trying to get this deep into your head&lt;br /&gt;as it is one area of common configuration mistake and subsequent head banging. Trivial errors are &lt;br /&gt;always difficult to locate.&lt;br /&gt;&lt;br /&gt;In our case the FilterChainProxy was configured by the namespace configuration. A typical FilterChainProxy&lt;br /&gt;would look like this:&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;sec:filter-chain-map path-type="ant"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sec:filter-chain pattern="/SkyPhotoWeb/**" filters="&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; securityContextPersistenceFilterWithASCFalse,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; basicAuthenticationFilter,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exceptionTranslationFilter,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filterSecurityInterceptor" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sec:filter-chain pattern="/**" filters="&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; securityContextPersistenceFilterWithASCTrue,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; formLoginFilter,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exceptionTranslationFilter,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filterSecurityInterceptor" /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/sec:filter-chain-map&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now from the documentation - &lt;br /&gt;"The namespace element filter-chain-map is used to set up the security filter chain(s) which are required within the application.&lt;br /&gt;It maps a particular URL pattern to a chain of filters built up from the bean names specified in the filters element. &lt;br /&gt;Both regular expressions and Ant Paths are supported, and the most specific URIs appear first. &lt;br /&gt;At runtime the FilterChainProxy will locate the first URI pattern that matches the current web request and the list of filter beans specified &lt;br /&gt;by the filters&amp;nbsp; attribute will be applied to that request. &lt;br /&gt;The filters will be invoked in the order they are defined, so you have complete control over the filter chain which is applied to a particular URL."&lt;br /&gt;&lt;br /&gt;As you may have already guessed the bean names in the filters atrribute is a comma separate list of &lt;br /&gt;bean names configured in the Spring context. For the moment assume that they are there. I will come back to put them into action and lecture &lt;br /&gt;more about them. &lt;br /&gt;&lt;br /&gt;Now let us look into the lifecycle aspect of the FilterChainProxy.Today being a weekend, I am feeling a bit lazy so will&lt;br /&gt;copy and paste again from the official documentation which gives very good information on the lifecycle aspects.&lt;br /&gt;&lt;br /&gt;"In relation to lifecycle issues, the FilterChainProxy will always delegate init(FilterConfig) and destroy()&amp;nbsp; &lt;br /&gt;methods through to the underlaying Filters if such methods are called against FilterChainProxy itself. &lt;br /&gt;In this case, FilterChainProxy guarantees to only initialize and destroy each Filter bean once, &lt;br /&gt;no matter how many times it is declared in the filter chain(s). &lt;br /&gt;You control the overall choice as to whether these methods are called or not via the targetFilterLifecycle initialization parameter &lt;br /&gt;of DelegatingFilterProxy. &lt;br /&gt;By default this property is false and servlet container lifecycle invocations are not delegated through DelegatingFilterProxy."&lt;br /&gt;&lt;br /&gt;Thats it for now. I know you guys are getting bored with theory. Please be patient, I will drop in few more theory session, and&lt;br /&gt;soon get back to hands on stuff.&lt;b&gt;&lt;br /&gt;&amp;nbsp; &lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-6453153578787375780?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/6453153578787375780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/let-us-look-at-spring-security-filter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6453153578787375780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6453153578787375780'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/let-us-look-at-spring-security-filter.html' title='Let us look at the Spring security filter chain'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-3754304989230587963</id><published>2010-03-14T22:39:00.000-07:00</published><updated>2010-10-30T23:15:01.477-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Pause - lets look inside Spring Security</title><content type='html'>So far we have been quick to setup Spring Security and apply it in our application. But behind that minimal configuration and non-invasive behavior lot has been happening behind the scenes.&lt;br /&gt;It is time to uncover the activities under hood, draw some diagrams to understand the framework and move ahead in style. I will not draw out all the balls from the magic box now. Instead will slowly take out one ball at a time to make it slow and easy to comprehend and assimilate.&lt;br /&gt;&lt;br /&gt;Let us go back to the web.xml configuration. You will see that we have configured a &lt;span style="color: #3333ff;"&gt;DelegatingFilterProxy&lt;/span&gt;. This filter is named 'springSecurityFilterChain'. The delegating filter proxy looks for a bean named 'springSecurityFilterChain' in the root Spring web application context. So note that this name is kind of a reserved bean name and should not be used elsewhere. The delegating filter proxy as the name suggests delegates the entire security processing then to the beans declared in the Spring web application context/ or security context. Now the question in your mind is that you never declared a bean with name - 'springSecurityFilterChain' , then from where on earth did the delegating filter proxy get it and the framework started running? Well the 'springSecurityFilterChain' bean is created by the declaration &amp;lt;http&amp;gt;....&amp;lt;/http&amp;gt;&lt;br /&gt;&lt;br /&gt;There is a lot to learn and understand with this namespace configuration - &amp;lt;http&amp;amp;gt. So it needs a be enjoyed slowly like a good whisky.&lt;br /&gt;&lt;br /&gt;You must have already understood that Spring Security is based on servlet filters. This is what the official documentation says - "&lt;span style="color: #009900; font-style: italic;"&gt;Spring Security's web infrastructure is based entirely on standard servlet filters. It doesn't use servlets or any other servlet-based frameworks (such as Spring MVC) internally, so it has no strong links to any particular web technology. It deals in HttpServletRequests and HttpServletResponses and doesn't care whether the requests come from a browser, a web service client, an HttpInvoker or an AJAX application.&lt;/span&gt;  &lt;span style="color: #009900; font-style: italic;"&gt;Spring Security maintains a filter chain internally where each of the filters has a particular responsibility and filters are added or removed from the configuration depending on which services are required. The ordering of the filters is important as there are dependencies between them. &lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Just to extract the keywords - irrespective of the source of http request the intercepting filter (configured as a delegating filter proxy in web.xml) hands over the actual security processing to a filter chain configured internally or Spring web application context. The request passes through each of the internal filters and is processed depending on what are the security requirements of the application or what customization has been done. Note you can very well introduce your own filter.Also note that the order of the filter in the filter chain is very important and there may be dependencies between filters in the chain. A filter coming later in the chain may depend on some data produced by filter coming earlier in the chain. I will dig deep into all these and also take indepth look into different filters that are available out of the box and also try to show the use of a custom filter in the chain.&lt;br /&gt;&lt;br /&gt;Since we used the new namespace based configuration, the required filters are automatically configured and no bean needs to be explicitly configured. But sometimes fine grained control is required (and these may not be supported in namespace based configuration). In this case it is very well possible to get full control over the filter chain and the filters.&lt;br /&gt;&lt;br /&gt;Now I leave you with a big picture of Spring security. In my next post I will to uncover more details about Spring security and its filters. I will blow out that yellow box more in the next post.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_UEQt_cUM2VM/S53aVKU9GuI/AAAAAAAAAcY/8Ldkwq-QHpg/s1600-h/5.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5448751181272521442" src="http://1.bp.blogspot.com/_UEQt_cUM2VM/S53aVKU9GuI/AAAAAAAAAcY/8Ldkwq-QHpg/s320/5.gif" style="cursor: pointer; display: block; height: 291px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-3754304989230587963?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/3754304989230587963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/pause-lets-look-inside-spring-security.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/3754304989230587963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/3754304989230587963'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/pause-lets-look-inside-spring-security.html' title='Pause - lets look inside Spring Security'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UEQt_cUM2VM/S53aVKU9GuI/AAAAAAAAAcY/8Ldkwq-QHpg/s72-c/5.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-308766953089553839</id><published>2010-03-13T21:38:00.001-08:00</published><updated>2010-10-30T23:14:15.146-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Adding anonymous or guest access</title><content type='html'>As you have seen in my previous post the access to index.html was restricted. Whenever the user tries to access this page they were redirected to the login page. But this should not be case. The logical index.html page should be accessible to guest users as well as authenticated users.&lt;br /&gt;Turning this on is just a matter of configuration. This is shown in the modified spring-security.xml file.&lt;br /&gt;&lt;br /&gt;Listing 1 - spring.security.xml&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:beans xmlns="http://www.springframework.org/schema/security"&lt;br /&gt;xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;http://www.springframework.org/schema/security&lt;br /&gt;http://www.springframework.org/schema/security/spring-security-3.0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;http auto-config='true'&amp;gt;&lt;br /&gt;&lt;span style="color: #3333ff; font-weight: bold;"&gt;&amp;lt;intercept-url pattern="/index.html" access="IS_AUTHENTICATED_ANONYMOUSLY" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;intercept-url pattern="/**" access="ROLE_USER" /&amp;gt;&lt;br /&gt;&amp;lt;/http&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;authentication-manager&amp;gt;&lt;br /&gt;&amp;lt;authentication-provider&amp;gt;&lt;br /&gt;&amp;lt;user-service&amp;gt;&lt;br /&gt;&amp;lt;user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /&amp;gt;&lt;br /&gt;&amp;lt;user name="bob" password="bobspassword" authorities="ROLE_USER" /&amp;gt;&lt;br /&gt;&amp;lt;/user-service&amp;gt;&lt;br /&gt;&amp;lt;/authentication-provider&amp;gt;&lt;br /&gt;&amp;lt;/authentication-manager&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans:beans&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I have now added a new intercept url line.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3333ff; font-weight: bold;"&gt;&amp;lt;intercept-url pattern="/index.html" access="IS_AUTHENTICATED_ANONYMOUSLY" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;This line makes it possible to access index.html as a guest user. Now when you click on any link on the index.html page&lt;br /&gt;you will redirected to the login page in case you have not signed in.&lt;br /&gt;&lt;br /&gt;In my next post I will try to get into some theoritical details / framework internals before&lt;br /&gt;proceeding to the next round of coding and adding additional features.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-308766953089553839?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/308766953089553839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/adding-anonymous-or-guest-access.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/308766953089553839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/308766953089553839'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/adding-anonymous-or-guest-access.html' title='Adding anonymous or guest access'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-5335043745692240678</id><published>2010-03-12T20:05:00.000-08:00</published><updated>2010-03-13T20:23:27.314-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Enabling Spring Security</title><content type='html'>1&gt; Add few more jars in your WEB-INF/lib folder.&lt;br /&gt;The current view of jars is shown in the figure below.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UEQt_cUM2VM/S5srNGp3ZKI/AAAAAAAAAcI/xtegBgg6HTE/s1600-h/3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 282px;" src="http://1.bp.blogspot.com/_UEQt_cUM2VM/S5srNGp3ZKI/AAAAAAAAAcI/xtegBgg6HTE/s320/3.jpg" alt="" id="BLOGGER_PHOTO_ID_5447995678359250082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;2&gt; Add a new member named - spring-security.xml in the WEB-INF/config folder. The contents of this file is shown in Listing 1 below:&lt;br /&gt;&lt;br /&gt;Listing 1 - spring-security.xml&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans:beans xmlns="http://www.springframework.org/schema/security"&lt;br /&gt; xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;        http://www.springframework.org/schema/security&lt;br /&gt;        http://www.springframework.org/schema/security/spring-security-3.0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;http auto-config='true'&amp;gt;&lt;br /&gt;     &amp;lt;intercept-url pattern="/**" access="ROLE_USER" /&amp;gt;&lt;br /&gt; &amp;lt;/http&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;authentication-manager&amp;gt;&lt;br /&gt;     &amp;lt;authentication-provider&amp;gt;&lt;br /&gt;         &amp;lt;user-service&amp;gt;&lt;br /&gt;             &amp;lt;user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /&amp;gt;&lt;br /&gt;             &amp;lt;user name="bob" password="bobspassword" authorities="ROLE_USER" /&amp;gt;&lt;br /&gt;         &amp;lt;/user-service&amp;gt;&lt;br /&gt;     &amp;lt;/authentication-provider&amp;gt;&lt;br /&gt; &amp;lt;/authentication-manager&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans:beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is the bare minimum configuration you need to do to get Spring Security started. This is a great relief for those of you who had worked with earlier versions of Spring Security or its ancestor Acegi Security. You had to explicitly configure the entire filter chain. That was tedious and very cumbersome leading to lot of errors and time and effort going down the drain. Thanks Ben and team for this good change. I will explain the different elements in this configuration in future posts as the intention of this post is to quickly get started with Spring Security as promised earlier.&lt;br /&gt;&lt;br /&gt;Step 3 - wire everything now in the web.xml. The modified web.xml looks like the one shown below.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app id="SkyPhotoWeb" version="2.4"&lt;br /&gt; xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&amp;gt;&lt;br /&gt; &amp;lt;display-name&amp;gt;SkyPhotoWeb&amp;lt;/display-name&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Log4j config location --&amp;gt;&lt;br /&gt; &amp;lt;context-param&amp;gt;&lt;br /&gt;     &amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;     &amp;lt;param-value&amp;gt;/WEB-INF/config/log4j.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt; &amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- security beans are here --&amp;gt;&lt;br /&gt; &amp;lt;context-param&amp;gt;&lt;br /&gt;     &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;     &amp;lt;param-value&amp;gt;&lt;br /&gt;          /WEB-INF/config/spring-security.xml&lt;br /&gt;     &amp;lt;/param-value&amp;gt;&lt;br /&gt; &amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Log4j listener --&amp;gt;&lt;br /&gt; &amp;lt;listener&amp;gt;&lt;br /&gt;     &amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt; &amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Root web application context --&amp;gt;&lt;br /&gt; &amp;lt;listener&amp;gt;&lt;br /&gt;     &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt; &amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Spring security filters --&amp;gt;&lt;br /&gt; &amp;lt;filter&amp;gt;&lt;br /&gt;     &amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;     &amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;&lt;br /&gt; &amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;     &amp;lt;filter-name&amp;gt;springSecurityFilterChain&amp;lt;/filter-name&amp;gt;&lt;br /&gt;     &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Spring MVC Frontcontroller servlet --&amp;gt;&lt;br /&gt; &amp;lt;servlet&amp;gt;&lt;br /&gt;     &amp;lt;servlet-name&amp;gt;skyphotoservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;     &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;     &amp;lt;init-param&amp;gt;&lt;br /&gt;         &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;         &amp;lt;param-value&amp;gt;&lt;br /&gt;            /WEB-INF/config/spring-web.xml          &lt;br /&gt;   &amp;lt;/param-value&amp;gt;&lt;br /&gt;     &amp;lt;/init-param&amp;gt;&lt;br /&gt;     &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt; &amp;lt;/servlet&amp;gt;&lt;br /&gt; &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;     &amp;lt;servlet-name&amp;gt;skyphotoservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;     &amp;lt;url-pattern&amp;gt;*.html&amp;lt;/url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are a few things to note here.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We have setup DelegatingFilterProxy which will look for a bean springSecurityFilterChain in the&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt; spring root web application context&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;The springSecurityFilterChain bean is setup automatically by the &lt;http&gt; tag.&lt;br /&gt;&lt;/http&gt;&lt;/li&gt;&lt;li&gt;The DispatcherServlet only has a specific web application context and hence you need to load the root web application context using the ContextLoaderListener. For now this listener only loads the security related beans in the root web application context.&lt;/li&gt;&lt;li&gt;The ContextLoaderListener must be configured after the log4j listener if the later is used.&lt;/li&gt;&lt;li&gt;If you do not use the ContextLoaderListener you will encounter the following exception&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that we are all set its time for testing. So launch your favorite browser (mine is Mozilla Firefox) and type the following:&lt;br /&gt;http://localhost:8080/SkyPhotoWeb/index.html&lt;br /&gt;&lt;br /&gt;** By the way I am deploying on Tomcat 6 running on JRE 6.&lt;br /&gt;&lt;br /&gt;You will be redirected to a login page shown in figure below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UEQt_cUM2VM/S5szf3n3MHI/AAAAAAAAAcQ/gZwBX9d_FNI/s1600-h/4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 100px;" src="http://4.bp.blogspot.com/_UEQt_cUM2VM/S5szf3n3MHI/AAAAAAAAAcQ/gZwBX9d_FNI/s320/4.jpg" alt="" id="BLOGGER_PHOTO_ID_5448004796834852978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a Spring security framework generated login page. Although the desired result is not what we intended  (we donot want that the index page is accessed securily rather by all users and guests) but it is clear that Spring Security is up and running, integrated into our Spring MVC application. I will try to correct this in my future post.Also I will show how you how you can add a custom your application specific login page.&lt;br /&gt;&lt;br /&gt;Now let us supply the user id and password (jimi/jimispassword) and see what happens. You will  be redirected to the index.html page. So it also suggests that Spring Security remembers what you tried prior to signing in.&lt;br /&gt;&lt;br /&gt;Thats all for today hopefully. If I find time between watching Indial Premier League and World Field Hockey Finals I will try to clarify a few concepts later in the day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-5335043745692240678?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/5335043745692240678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/enabling-spring-security.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5335043745692240678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/5335043745692240678'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/enabling-spring-security.html' title='Enabling Spring Security'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UEQt_cUM2VM/S5srNGp3ZKI/AAAAAAAAAcI/xtegBgg6HTE/s72-c/3.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-7633144098313716136</id><published>2010-03-12T03:39:00.000-08:00</published><updated>2010-03-12T03:58:09.411-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Getting the security less application ready</title><content type='html'>1&gt; Add jstl.jar (version 1.1 i guess) to your WEB-INF/lib folder&lt;br /&gt;2&gt; Modify index.jsp as shown below&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Listing 1 - index.jsp&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"&lt;br /&gt;pageEncoding="ISO-8859-1"%&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Sky Photos home&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Welcome to Sky Photos&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Not an user yet? &amp;lt;a href="#"&amp;gt;Register&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;a href="viewphotoupload.html"&amp;gt;Upload Photo&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3&gt; Add a controller for the landing or index page.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Listing 2 - EntryController.java&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;package org.opengarage.skyphoto.web.controller;&lt;br /&gt;&lt;br /&gt;import org.springframework.stereotype.Controller;&lt;br /&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;@Controller&lt;br /&gt;public class EntryController {&lt;br /&gt; &lt;br /&gt; @RequestMapping("/index")&lt;br /&gt; public String viewLanding(){&lt;br /&gt;  return "index";&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4&gt; Add a controller for the upload page view&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Listing 3 - UploadController.java&lt;/span&gt;&lt;br /&gt;/**&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;package org.opengarage.skyphoto.web.controller;&lt;br /&gt;&lt;br /&gt;import org.springframework.stereotype.Controller;&lt;br /&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;@Controller&lt;br /&gt;public class UploadController {&lt;br /&gt; @RequestMapping("/viewphotoupload")&lt;br /&gt; public String viewPhotoUpload(){&lt;br /&gt;  return "upload";&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;5&gt; Time to launch the browser and test it on the browser.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UEQt_cUM2VM/S5ord_-H5sI/AAAAAAAAAbw/7hvQxNTMFRs/s1600-h/1.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 206px;" src="http://3.bp.blogspot.com/_UEQt_cUM2VM/S5ord_-H5sI/AAAAAAAAAbw/7hvQxNTMFRs/s320/1.jpg" alt="" id="BLOGGER_PHOTO_ID_5447714493646235330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6&gt; Click on upload photo, you will see it is accessible to any one. But only logged on users should be able to access that page.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UEQt_cUM2VM/S5osHaBHMWI/AAAAAAAAAb4/iLzPlECGMCs/s1600-h/2.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 253px;" src="http://1.bp.blogspot.com/_UEQt_cUM2VM/S5osHaBHMWI/AAAAAAAAAb4/iLzPlECGMCs/s320/2.jpg" alt="" id="BLOGGER_PHOTO_ID_5447715205012730210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the next post I will start with the first step to ensure that a user is logged in / signed in before he or she can access the upload photo page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-7633144098313716136?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/7633144098313716136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/getting-security-less-application-ready.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/7633144098313716136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/7633144098313716136'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/getting-security-less-application-ready.html' title='Getting the security less application ready'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UEQt_cUM2VM/S5ord_-H5sI/AAAAAAAAAbw/7hvQxNTMFRs/s72-c/1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-726519669295148177</id><published>2010-03-11T21:18:00.000-08:00</published><updated>2010-03-12T03:34:08.436-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Adding few more JSPs and Security Requirements</title><content type='html'>Now I will add two more JSPs – one is the home page showing some dashboard information and the other is the file upload JSP which will be used to upload photos.&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-weight: bold;"&gt;Listing 1 – home.jsp&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"&lt;br /&gt;  pageEncoding="ISO-8859-1"%&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Sky Photo - Home&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Dashboard&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Listing 2 – upload.jsp&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"&lt;br /&gt;   pageEncoding="ISO-8859-1"%&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Sky Photo - Upload&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Upload A Photo&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Requirement&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;index.jsp should be accessible without any security filtering  &lt;/li&gt;&lt;li&gt;home.jsp should be accessible only to registered users  &lt;/li&gt;&lt;li&gt;upload.jsp should only be accessible to registered users&lt;/li&gt;&lt;/ol&gt;Since the JSPs are placed under WEB-INF in any case no one can directly access it. So in the next post I will try to add a few page controllers to the scheme of things to make these pages accessible without any application security credentials.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-726519669295148177?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/726519669295148177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/adding-few-more-jsps-and-security.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/726519669295148177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/726519669295148177'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/adding-few-more-jsps-and-security.html' title='Adding few more JSPs and Security Requirements'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-4383557342894499630</id><published>2010-03-11T06:25:00.000-08:00</published><updated>2010-03-12T21:16:02.306-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Setting up Spring MVC 3 Web Application</title><content type='html'>Now its time to code a bit in Skyphoto. So launch Eclipe and create a dynamic web project ready to be deployed on Tomcat 6. I am assuming that readers are atleast familiar with this. Next we will do a bit of configuration and throw in some Spring 3 jar files into the WEB-INF/lib folder.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1 - Configure Spring Servlets and log4j in the web application deployment descriptor.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app id="SkyPhotoWeb" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&amp;gt;&lt;br /&gt;&amp;lt;display-name&amp;gt;SkyPhotoWeb&amp;lt;/display-name&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Log4j config location --&amp;gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;/WEB-INF/config/log4j.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&amp;lt;!-- Log4j listener --&amp;gt;&lt;br /&gt;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Spring MVC Frontcontroller servlet --&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;skyphotoservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;&lt;br /&gt;        &lt;br /&gt;            /WEB-INF/config/spring-web.xml&lt;br /&gt;         &lt;br /&gt;   &amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;skyphotoservlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;*.html&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2 - log4j.xml&lt;/span&gt;&lt;br /&gt;The log4j configuration will be very useful later to see all framework and application messages. I have set it to debug level to help understand the framework better.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&amp;gt;&lt;br /&gt;&amp;lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- ====================================================================== --&amp;gt;&lt;br /&gt;&amp;lt;!-- A P P E N D E R S                                                      --&amp;gt;&lt;br /&gt;&amp;lt;!-- ====================================================================== --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- console --&amp;gt;&lt;br /&gt;&amp;lt;appender name="console" class="org.apache.log4j.ConsoleAppender"&amp;gt;&lt;br /&gt;&amp;lt;layout class="org.apache.log4j.PatternLayout"&amp;gt;&lt;br /&gt;   &amp;lt;param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %M - %m - (%F, line %L)%n"/&amp;gt;&lt;br /&gt;&amp;lt;/layout&amp;gt;&lt;br /&gt;&amp;lt;/appender&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;appender name="file" class="org.apache.log4j.FileAppender"&amp;gt;&lt;br /&gt;&amp;lt;param name="File" value="C:/logs/skyphotos.log"/&amp;gt;&lt;br /&gt;&amp;lt;layout class="org.apache.log4j.PatternLayout"&amp;gt;&lt;br /&gt;   &amp;lt;param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %m (%F, line %L)%n"/&amp;gt;&lt;br /&gt;&amp;lt;/layout&amp;gt;&lt;br /&gt;&amp;lt;/appender&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- ====================================================================== --&amp;gt;&lt;br /&gt;&amp;lt;!-- L O G G E R S                                                          --&amp;gt;&lt;br /&gt;&amp;lt;!-- ====================================================================== --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt;&amp;lt;level value="debug" /&amp;gt;&lt;br /&gt;&amp;lt;appender-ref ref="console"/&amp;gt;&lt;br /&gt;&amp;lt;appender-ref ref="file"/&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/log4j:configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3 - Setting up a bare minimal spring configuration file&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Listing 3 - spring-web.xml&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;br /&gt;http://www.springframework.org/schema/context&lt;br /&gt;        http://www.springframework.org/schema/context/spring-context.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;context:component-scan base-package="org.opengarage.skyphoto.web.controller" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="jstlviewResolver"&lt;br /&gt;class="org.springframework.web.servlet.view.InternalResourceViewResolver"&amp;gt;&lt;br /&gt;&amp;lt;property name="viewClass"&lt;br /&gt;value="org.springframework.web.servlet.view.JstlView"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="prefix" value="/WEB-INF/jsp/"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="suffix" value=".jsp"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="annotationMapper"&lt;br /&gt;class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="multipartResolver"&lt;br /&gt;class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean&lt;br /&gt;class="org.springframework.web.servlet.view.InternalResourceViewResolver"&amp;gt;&lt;br /&gt;&amp;lt;property name="prefix" value="/WEB-INF/views/" /&amp;gt;&lt;br /&gt;&amp;lt;property name="suffix" value=".jsp" /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4 - setup a simple jsp&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Listing 4 - index.jsp&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" type="jsp"&gt;&amp;lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"&lt;br /&gt;pageEncoding="ISO-8859-1"%&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Sky Photos Home&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Welcome to Sky Photos&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;a href="#"&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finally here is a view of the Eclipse project. You can very well make out the jar files you need for the time being.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UEQt_cUM2VM/S5kG1bknaJI/AAAAAAAAAbo/WR-UqNc2nIE/s1600-h/PE.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 288px; height: 320px;" src="http://4.bp.blogspot.com/_UEQt_cUM2VM/S5kG1bknaJI/AAAAAAAAAbo/WR-UqNc2nIE/s320/PE.jpg" alt="" id="BLOGGER_PHOTO_ID_5447392739285493906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Note 1 - that I am storing all configuration files under /WEB-INF/config&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Note 2 - donot forget to download Spring framework and Security security distributions from their respective websites.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-4383557342894499630?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/4383557342894499630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/setting-up-spring-mvc-3-web-application.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4383557342894499630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4383557342894499630'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/setting-up-spring-mvc-3-web-application.html' title='Setting up Spring MVC 3 Web Application'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UEQt_cUM2VM/S5kG1bknaJI/AAAAAAAAAbo/WR-UqNc2nIE/s72-c/PE.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-699519680016624059</id><published>2010-03-11T06:12:00.000-08:00</published><updated>2010-10-30T23:13:39.956-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring Security 3'/><title type='text'>Exploring Spring Security 3</title><content type='html'>I am finally back to writing again after an absence of almost year and half. I will try to be more regular from now now. In this edition I will start with Spring Security 3. This will be a series of posts where I will try to build a very simple photo uploading and sharing service. This is actually my PoC with Spring Security 3. &lt;br /&gt;&lt;br /&gt;Spring Security unlike most Spring product portfolio is a not at all well documented. The tutorials available on googling are mostly outdated. Spring Security 3 certainly by look of things seems to be a very good feature rich product yet hefty beast. So here is my attempt to conquer it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Skyphoto Basic Requirements&lt;br /&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Securely upload photos into your account &lt;/li&gt;&lt;li&gt;Download photos &lt;/li&gt;&lt;li&gt;Share photos with friends and other application &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the course of this simple application development I will try to uncover most of the features of Spring Security. I will use Restful services support provided by Spring MVC so that I can expose a simple API for external applications which will consume the services of Skyphoto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-699519680016624059?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/699519680016624059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2010/03/exploring-spring-security-3.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/699519680016624059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/699519680016624059'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2010/03/exploring-spring-security-3.html' title='Exploring Spring Security 3'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-6388133332154559196</id><published>2008-12-30T08:10:00.001-08:00</published><updated>2010-09-25T07:42:15.300-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Changing the root web application in Tomcat 6</title><content type='html'>&lt;p&gt;These days I am very busy developing a large and complex web application, which is nearing its first release. This web based product runs on Tomcat 6 and will be deployed on &lt;a href="http://www.mydomain.com"&gt;http://www.mydomain.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;But if I deploy my web application on Tomcat 6, I need to specify the context root. Well this is no good, why will the users of this website be willing to remember the context root. What if the context root changes. In other words the users would not be interest in typing the following - &lt;a href="http://www.mydomain.com/myappcontext"&gt;http://www.mydomain.com/myappcontext&lt;/a&gt; to visit this site.&lt;/p&gt;&lt;p&gt;Hence it is necessary that I change the default / root web application of Tomcat and point it to my application. I wanted to try and test this on localhost first. As always I Googled and found a number of posts and none seem to work. I also read the documentation it was helpful in understanding the concepts but was not effective as I could not get it working. Finally after few hours of trial and error one of my colleague Joyeeta Majumdar found the solution. Here it is step by step account.&lt;/p&gt;&lt;p&gt;1&amp;gt; I use Maven 2 + Eclipse 3.4 to build my web application. If I run the Maven 'install' goal the web application is generated in the target folder. It is available both as .war file and in exploded form. In my case it generated as Jing-Web-0.0.1-SNAPSHOT and Jing-Web-0.0.1-SNAPSHOT.war in the folder c:\jingworkspace\Jing-Web-Main\Jing-Web\target&lt;/p&gt;&lt;p&gt;2&amp;gt; Create a folder &amp;lt;engine&amp;gt;/&amp;lt;hostname&amp;gt;. In my case - Catalina\localhost. This folder is created under &amp;lt;Tomcat_Home&amp;gt;/conf. In my case this is C:\tomcat6\conf.&lt;/p&gt;&lt;p&gt;3&amp;gt; Create a file named ROOT.xml (case-sensitive) in the C:\tomcat6\conf\Catalina\localhost folder.&lt;/p&gt;&lt;p&gt;4&amp;gt; Here is the content of my ROOT.xml file&lt;/p&gt;&lt;p&gt;&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt; &lt;/p&gt;&lt;p&gt;&amp;lt;Context reloadable=&amp;quot;true&amp;quot; path=&amp;quot;&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; docBase=&amp;quot;c:/jingworkspace/Jing-Web-Main/Jing-Web/target/target/ping-web-0.0.1-SNAPSHOT&amp;quot; /&amp;gt;&lt;/p&gt;&lt;p&gt;You will need to change the docBase attribute to the location of the exploded web application. &lt;/p&gt;&lt;p&gt;&lt;b&gt;No changes to be made either in server.xml or context.xml located in c:\tomcat6\conf folder.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Now try &lt;a href="http://localhost:8080/"&gt;http://localhost:8080/&lt;/a&gt; and it should take us to Jing-Web application. You may need to delete the contents of your browser cache(press F5) to view the changes. You may also need to delete the contents of &amp;lt;Tomcat_Home&amp;gt;/work directory to get this working.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-6388133332154559196?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/6388133332154559196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2008/12/changing-root-web-application-in-tomcat.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6388133332154559196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/6388133332154559196'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2008/12/changing-root-web-application-in-tomcat.html' title='Changing the root web application in Tomcat 6'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-2652955996631348231</id><published>2008-12-21T02:32:00.001-08:00</published><updated>2010-09-25T07:42:48.555-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='ActiveMQ'/><title type='text'>Consuming a JMS Message from ActiveMQ using Spring Message Driven POJO</title><content type='html'>&lt;p&gt;In my last post, I had shown how you can post a JMS message to a ActiveMQ queue. In this post I will show the reverse process. I will not try to consume this message using a Spring Message Driven POJO. I assume your familiarity with Spring MDP. If not you can look here - &lt;a title="http://static.springframework.org/spring/docs/2.5.x/reference/jms.html" href="http://static.springframework.org/spring/docs/2.5.x/reference/jms.html"&gt;http://static.springframework.org/spring/docs/2.5.x/reference/jms.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The operation that I intend to carry out is depicted in Figure 1.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/SU4bHTcnzJI/AAAAAAAAAUs/oXOltfKxVLM/image%5B2%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="200" alt="image" src="http://lh4.ggpht.com/_UEQt_cUM2VM/SU4bIBk5zLI/AAAAAAAAAUw/6xaGOoM8vgE/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Figure 1 - Consuming JMS message using Spring MDP&lt;/p&gt;&lt;p&gt;Step 1 - Create the message listener.&lt;/p&gt;&lt;p&gt;Listing 1 - EventMessageConsumer.java&lt;/p&gt;&lt;p&gt;/**&lt;br /&gt;* &lt;br /&gt;*/&lt;br /&gt;package org.opengarage.pingscape.mq.consumer;  &lt;p&gt;import javax.jms.Message;&lt;br /&gt;import javax.jms.MessageListener;  &lt;p&gt;/**&lt;br /&gt;* @author dhrubo&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;public class EventMessageConsumer implements MessageListener {  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* (non-Javadoc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @see javax.jms.MessageListener#onMessage(javax.jms.Message)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void onMessage(Message message) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Message Consumed -"+message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //TODO : Take some action.... invoke service method &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //NOTE : Service object is injected by Spring framework&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;} &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;}  &lt;p&gt;Step 2 - Wire up the bean in Spring configuration  &lt;p&gt;Listing 2 - spring-activemq-config.xml  &lt;p&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="&lt;a href="http://www.springframework.org/schema/beans&amp;quot;"&gt;http://www.springframework.org/schema/beans"&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance&amp;quot;"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/a&gt; xmlns:aop="&lt;a href="http://www.springframework.org/schema/aop&amp;quot;"&gt;http://www.springframework.org/schema/aop"&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:tx="&lt;a href="http://www.springframework.org/schema/tx&amp;quot;"&gt;http://www.springframework.org/schema/tx"&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="&lt;br /&gt;&lt;a href="http://www.springframework.org/schema/beans"&gt;http://www.springframework.org/schema/beans&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.springframework.org/schema/tx"&gt;http://www.springframework.org/schema/tx&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&gt;http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.springframework.org/schema/aop"&gt;http://www.springframework.org/schema/aop&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&amp;quot;"&gt;http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"&lt;/a&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="brokerURL"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;tcp://localhost:61616&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&lt;font color="#0080ff"&gt;&amp;lt;bean id="queue" class="org.apache.activemq.command.ActiveMQQueue"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;queue.opengarage&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&amp;nbsp; &amp;lt;!-- lets wrap in a pool to avoid creating a connection per send --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#0080ff"&gt;&amp;lt;bean id="connectionFactory"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="org.springframework.jms.connection.SingleConnectionFactory"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="targetConnectionFactory"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="jmsFactory" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Spring JMS Template --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="connectionFactory" ref="connectionFactory" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- a sample POJO message producer which uses a Spring JmsTemplate --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="messageProducer"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="org.opengarage.pingscape.mq.producer.EventInvitationMessageProducer"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="jmsTemplate" ref="jmsTemplate" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="queue" ref="queue" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="messageCreator"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.opengarage.pingscape.mq.producer.EventMessageCreator" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Consumer part --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0080ff"&gt;&lt;strong&gt;&amp;lt;!-- this is the Message Driven POJO (MDP) --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="messageListener"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="org.opengarage.pingscape.mq.consumer.EventMessageConsumer" /&amp;gt; &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- and this is the message listener container --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="jmsContainer"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="org.springframework.jms.listener.DefaultMessageListenerContainer"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="connectionFactory" ref="connectionFactory" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="destination" ref="queue" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="messageListener" ref="messageListener" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&amp;lt;/beans&amp;gt;  &lt;p&gt;Step 3&amp;nbsp; - Test  &lt;p&gt;Finally you can see the results of message produced and consumed in the Admin web console as shown in Figure 2.  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/SU4bLprKzRI/AAAAAAAAAU0/q5DVx7uwCfg/image%5B5%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="136" alt="image" src="http://lh6.ggpht.com/_UEQt_cUM2VM/SU4bNnFR4kI/AAAAAAAAAU4/pY-JWh5_i_g/image_thumb%5B1%5D.png" width="244" border="0"&gt;&lt;/a&gt;  &lt;p&gt;Figure 2 - Queue statistics&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-2652955996631348231?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/2652955996631348231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2008/12/consuming-jms-message-from-activemq.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2652955996631348231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/2652955996631348231'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2008/12/consuming-jms-message-from-activemq.html' title='Consuming a JMS Message from ActiveMQ using Spring Message Driven POJO'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_UEQt_cUM2VM/SU4bIBk5zLI/AAAAAAAAAUw/6xaGOoM8vgE/s72-c/image_thumb.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-7852039519138962159</id><published>2008-12-21T01:03:00.001-08:00</published><updated>2008-12-21T01:03:32.471-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Sending JMS message to ActiveMQ using Spring 2.5 from a web application</title><content type='html'>&lt;p&gt;In this post I will show how you can send JMS message to ActiveMQ from your Spring web application. I have a Spring 2.5 + JBOSS Richfaces based web application that runs on Tomcat 6 running on JDK 5. Figure 1. depicts what I intend to do.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/SU4GTkUiTOI/AAAAAAAAAUM/aClIblV-_64/F1%5B2%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="117" alt="F1" src="http://lh3.ggpht.com/_UEQt_cUM2VM/SU4GUTnL1EI/AAAAAAAAAUQ/doMenMfexrQ/F1_thumb.jpg" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Figure 1. - Send JMS Message to ActiveMQ using Spring from a web application. &lt;/p&gt; &lt;p&gt;Step 1: Drop in the following jars to WEB-INF/lib&lt;/p&gt; &lt;ul&gt; &lt;li&gt;activemq-core-5.2.0.jar  &lt;li&gt;jms.jar  &lt;li&gt;geronimo-j2ee-management_1.0_spec-1.0.jar&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Step 2: Create the destination/Queue using the ActiveMQ admin web application.&lt;/p&gt; &lt;p&gt;Launch your browser and point it to - &lt;a title="http://localhost:8161/admin/" href="http://localhost:8161/admin/"&gt;http://localhost:8161/admin/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/SU4GVWHzh4I/AAAAAAAAAUU/bLFbdx1LQd8/image%5B2%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="image" src="http://lh6.ggpht.com/_UEQt_cUM2VM/SU4GV6MgM-I/AAAAAAAAAUY/K4ejaXG5FXc/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Figure 2. - ActiveMQ admin console.&lt;/p&gt; &lt;p&gt;Click on 'Queues' to navigate to queue list and create screen. You will need to supply the queue name and click on 'Create' to create a new queue destination on ActiveMQ server. This is shown in Figure 3.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_UEQt_cUM2VM/SU4GWpbIADI/AAAAAAAAAUc/rgbQsjmFtJo/image%5B5%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="116" alt="image" src="http://lh5.ggpht.com/_UEQt_cUM2VM/SU4GXTrlOiI/AAAAAAAAAUg/8c7mDRjXPRc/image_thumb%5B1%5D.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Figure 3 - Create a new Queue.&lt;/p&gt; &lt;p&gt;Step 3. Create a message producer interface.&lt;/p&gt; &lt;p&gt;This may not be necessary, but since I prefer to implement Program to Interface in my application i define a message producer interface. This is shown in Listing 1.&lt;/p&gt; &lt;p&gt;Listing 1 - MessageProducer.java&lt;/p&gt; &lt;p&gt;/**&lt;br&gt;* &lt;br&gt;*/&lt;br&gt;package org.opengarage.pingscape.mq.producer;  &lt;p&gt;/**&lt;br&gt;* @author dhrubo&lt;br&gt;*&lt;br&gt;*/&lt;br&gt;public interface MessageProducer {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void send(Object message);&lt;br&gt;}  &lt;p&gt;This interface defines a single method(can have more, but for now this will suffice) which accepts an object (Java bean) which will be passed to the Queue.  &lt;p&gt;Step 4. An implementation of the MessageProducer interface  &lt;p&gt;This class is responsible for sending a particular Javabean object to the queue (your goal may be different / may want to send something different).  &lt;p&gt;Listing 2 - EventInvitationMessageProducer.java  &lt;p&gt;/**&lt;br&gt;* &lt;br&gt;*/&lt;br&gt;package org.opengarage.pingscape.mq.producer;  &lt;p&gt;import javax.jms.Queue;  &lt;p&gt;import org.opengarage.pingscape.bean.Event;&lt;br&gt;import org.springframework.jms.core.JmsTemplate;  &lt;p&gt;/**&lt;br&gt;* @author dhrubo&lt;br&gt;*&lt;br&gt;*/&lt;br&gt;public class EventInvitationMessageProducer implements MessageProducer{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private JmsTemplate jmsTemplate;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Queue queue;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private EventMessageCreator messageCreator;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param jmsTemplate the jmsTemplate to set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setJmsTemplate(JmsTemplate jmsTemplate) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.jmsTemplate = jmsTemplate;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param queue the queue to set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setQueue(Queue queue) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.queue = queue;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param messageCreator the messageCreator to set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setMessageCreator(EventMessageCreator messageCreator) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.messageCreator = messageCreator;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0080ff"&gt;&lt;strong&gt;public void send(Object message) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.messageCreator.setEvent((Event)message);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.jmsTemplate.send(this.queue, this.messageCreator);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;}  &lt;p&gt;The key is the send method. It uses a MessageCreator to consume the supplied Event object. It then uses the JmsTemplate to send this message to the destination.  &lt;p&gt;Step 5. Provide the message creator implementation  &lt;p&gt;Listing 3 - EventMessageCreator.java  &lt;p&gt;/**&lt;br&gt;* &lt;br&gt;*/&lt;br&gt;package org.opengarage.pingscape.mq.producer;  &lt;p&gt;import javax.jms.JMSException;&lt;br&gt;import javax.jms.Message;&lt;br&gt;import javax.jms.ObjectMessage;&lt;br&gt;import javax.jms.Session;  &lt;p&gt;import org.opengarage.pingscape.bean.Event;&lt;br&gt;import org.springframework.jms.core.MessageCreator;  &lt;p&gt;/**&lt;br&gt;* @author dhrubo&lt;br&gt;*&lt;br&gt;*/&lt;br&gt;public class EventMessageCreator implements MessageCreator {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Event event;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* (non-Javadoc)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @see org.springframework.jms.core.MessageCreator#createMessage(javax.jms.Session)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Message createMessage(Session session) throws JMSException {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectMessage objectMsg = session.createObjectMessage();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectMsg.setObject(event);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return objectMsg;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param event the event to set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setEvent(Event event) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.event = event;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;}  &lt;p&gt;Step 6 - Wire up in Spring configuration  &lt;p&gt;Listing 4 - spring-activemq-config.xml  &lt;p&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br&gt;&amp;lt;beans xmlns="&lt;a href="http://www.springframework.org/schema/beans&amp;quot;"&gt;http://www.springframework.org/schema/beans"&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance&amp;quot;"&gt;http://www.w3.org/2001/XMLSchema-instance"&lt;/a&gt; xmlns:aop="&lt;a href="http://www.springframework.org/schema/aop&amp;quot;"&gt;http://www.springframework.org/schema/aop"&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:tx="&lt;a href="http://www.springframework.org/schema/tx&amp;quot;"&gt;http://www.springframework.org/schema/tx"&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="&lt;br&gt;&lt;a href="http://www.springframework.org/schema/beans"&gt;http://www.springframework.org/schema/beans&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.springframework.org/schema/tx"&gt;http://www.springframework.org/schema/tx&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&gt;http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.springframework.org/schema/aop"&gt;http://www.springframework.org/schema/aop&lt;/a&gt; &lt;a href="http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&amp;quot;"&gt;http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"&lt;/a&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="brokerURL"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;tcp://localhost:61616&amp;lt;/value&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="queue" class="org.apache.activemq.command.ActiveMQQueue"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;queue.opengarage&amp;lt;/value&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/constructor-arg&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Spring JMS Template --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="connectionFactory"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- lets wrap in a pool to avoid creating a connection per send --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.springframework.jms.connection.SingleConnectionFactory"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="targetConnectionFactory"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local="jmsFactory" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- a sample POJO message producer which uses a Spring JmsTemplate --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="messageProducer" class="org.opengarage.pingscape.mq.producer.EventInvitationMessageProducer"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="jmsTemplate" ref="jmsTemplate"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="queue" ref="queue"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="messageCreator"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.opengarage.pingscape.mq.producer.EventMessageCreator"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;lt;/beans&amp;gt;  &lt;p&gt;Step 7 - Client of the message producer  &lt;p&gt;Now we need a client to use the message producer. The Event business service class will use this message producer. This is shown in Listing 5.  &lt;p&gt;Listing 5 - EventServiceImpl.java  &lt;p&gt;/**&lt;br&gt;* &lt;br&gt;*/&lt;br&gt;package org.opengarage.pingscape.service.impl;  &lt;p&gt;import org.apache.commons.logging.Log;&lt;br&gt;import org.apache.commons.logging.LogFactory;&lt;br&gt;import org.opengarage.pingscape.bean.Event;&lt;br&gt;import org.opengarage.pingscape.business.api.EventService;&lt;br&gt;import org.opengarage.pingscape.mq.producer.MessageProducer;&lt;br&gt;&lt;/p&gt; &lt;p&gt;/**&lt;br&gt;* @author dhrubo&lt;br&gt;*&lt;br&gt;*/&lt;br&gt;public class EventServiceImpl implements EventService {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final Log _LOG = LogFactory.getLog(EventServiceImpl.class);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private MessageProducer messageProducer; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* (non-Javadoc)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @see org.opengarage.pingscape.business.api.EventService#saveEvent(org.opengarage.pingscape.bean.Event)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void saveEvent(Event event) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messageProducer.send(event);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param messageProducer the messageProducer to set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setMessageProducer(MessageProducer messageProducer) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.messageProducer = messageProducer;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;}  &lt;p&gt;Step 8 - Configure in Spring application context.  &lt;p&gt;The message producer is injected by the Spring framework. Here is the configuration snippet from the service configuration.  &lt;p&gt;Listing 6 - spring-service-config.xml  &lt;p&gt;&amp;lt;!-- Other beans --&amp;gt;  &lt;p&gt;&amp;lt;bean name="eventService"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class="org.opengarage.pingscape.business.impl.EventServiceImpl"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="messageProducer" ref="messageProducer" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;  &lt;p&gt;Step 9 - Test for message  &lt;p&gt;Finally I restart my Tomcat when everything is ready, launch the event entry form, fill in data and click on Send button in the screen. The event details are now in the queue. You can test this in the ActiveMQ admin web console as shown in the Figure - 4 below.  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_UEQt_cUM2VM/SU4GYXt_zPI/AAAAAAAAAUk/dYNB67o0tUE/image%5B8%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="102" alt="image" src="http://lh4.ggpht.com/_UEQt_cUM2VM/SU4GYzOqa0I/AAAAAAAAAUo/rwfKFm4jsTA/image_thumb%5B2%5D.png" width="244" border="0"&gt;&lt;/a&gt;  &lt;p&gt;Figure 4 - New message now in the Queue.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-7852039519138962159?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/7852039519138962159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2008/12/sending-jms-message-to-activemq-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/7852039519138962159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/7852039519138962159'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2008/12/sending-jms-message-to-activemq-using.html' title='Sending JMS message to ActiveMQ using Spring 2.5 from a web application'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_UEQt_cUM2VM/SU4GUTnL1EI/AAAAAAAAAUQ/doMenMfexrQ/s72-c/F1_thumb.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-739779127620140144.post-4138103020240346188</id><published>2008-11-04T08:08:00.001-08:00</published><updated>2008-11-04T08:20:22.448-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring Framework'/><title type='text'>Initializing static fields of Spring beans</title><content type='html'>&lt;p&gt;This solution is courtesy Chris Harris UK.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0080ff"&gt;Step 1:&lt;/font&gt;&lt;/strong&gt; Create a bean factory post processor as shown in Listing 1&lt;/p&gt;  &lt;p&gt;&lt;font color="#0080ff"&gt;&lt;strong&gt;Listing 1 :&lt;/strong&gt;&lt;/font&gt; StaticInitializerBeanFactoryPostProcessor .java&lt;/p&gt;  &lt;p&gt;/**    &lt;br /&gt;*     &lt;br /&gt;*/     &lt;br /&gt;package org.opengarage.spring.postprocessor; &lt;/p&gt;  &lt;p&gt;import java.lang.reflect.Method;    &lt;br /&gt;import java.lang.reflect.Modifier;     &lt;br /&gt;import java.util.Iterator;     &lt;br /&gt;import java.util.Map; &lt;/p&gt;  &lt;p&gt;import org.springframework.beans.BeanWrapperImpl;    &lt;br /&gt;import org.springframework.beans.BeansException; &lt;/p&gt;  &lt;p&gt;import org.springframework.beans.factory.NoSuchBeanDefinitionException;    &lt;br /&gt;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;     &lt;br /&gt;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; &lt;/p&gt;  &lt;p&gt;/**    &lt;br /&gt;* @author dhrubo     &lt;br /&gt;*     &lt;br /&gt;*/     &lt;br /&gt;public class StaticInitializerBeanFactoryPostProcessor implements BeanFactoryPostProcessor {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private Map classes;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private BeanWrapperImpl bri; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public StaticInitializerBeanFactoryPostProcessor() {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bri = new BeanWrapperImpl();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (Iterator classIterator = classes.keySet().iterator(); classIterator.hasNext(); ) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String className = (String)classIterator.next();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //System.out.println(&amp;quot;Class &amp;quot; + className + &amp;quot;:&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Map vars = (Map)classes.get(className);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class c = null;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = Class.forName(className);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } catch (ClassNotFoundException e) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new NoSuchBeanDefinitionException(&amp;quot;Class not found for &amp;quot; + className);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method[] methods = c.getMethods();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (Iterator fieldIterator = vars.keySet().iterator(); fieldIterator.hasNext(); ) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String fieldName = (String)fieldIterator.next();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Object value = vars.get(fieldName);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method method = findStaticSetter(methods, fieldName);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (method == null) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new RuntimeException(&amp;quot;No static setter method found for class &amp;quot; +     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; className + &amp;quot;, field &amp;quot; + fieldName,null);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //System.out.println(&amp;quot;\tFound method &amp;quot; + method.getName() + &amp;quot; for field &amp;quot; + fieldName + &amp;quot;, value &amp;quot; + value);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Object newValue = bri.doTypeConversionIfNecessary(value, getPropertyType(method));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; method.invoke(null, new Object[] {newValue});     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } catch (Exception e) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new RuntimeException(&amp;quot;Invocation of method &amp;quot; + method.getName() +     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot; on class &amp;quot; + className + &amp;quot; with value &amp;quot; + value + &amp;quot; failed.&amp;quot;, e);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; private Class getPropertyType(Method setter) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Class params[] = setter.getParameterTypes();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (params.length != 1) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new RuntimeException(&amp;quot;bad write method arg count: &amp;quot; + setter);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return&amp;#160; params[0];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; /**    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Look for a static setter method for field named fieldName in Method[].     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * Return null if none found.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @param methods     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @param fieldName     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @return     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private Method findStaticSetter(Method[] methods, String fieldName) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String methodName = setterName(fieldName);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i=0; i&amp;lt;methods.length; i++) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (methods[i].getName().equals(methodName) &amp;amp;&amp;amp;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Modifier.isStatic(methods[i].getModifiers())) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return methods[i];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; /**    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * return the standard setter name for field fieldName     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @param fieldName     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @return     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private String setterName(String fieldName) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String nameToUse = null;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (fieldName.length() == 1) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Character.isLowerCase(fieldName.charAt(0))) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nameToUse = fieldName.toUpperCase();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nameToUse = fieldName;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } else {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Character.isLowerCase(fieldName.charAt(0)) &amp;amp;&amp;amp; Character.isLowerCase(fieldName.charAt(1))) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nameToUse = fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; else {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nameToUse = fieldName;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return &amp;quot;set&amp;quot; + nameToUse;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public void setClasses(Map classes) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.classes = classes;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0080ff"&gt;Step 2 :&lt;/font&gt;&lt;/strong&gt; Create your simple test class&lt;/p&gt;  &lt;p&gt;&lt;font color="#0080ff"&gt;&lt;strong&gt;Listing 2 :&lt;/strong&gt;&lt;/font&gt; Test.java&lt;/p&gt;  &lt;p&gt;/**   &lt;br /&gt; *     &lt;br /&gt; */    &lt;br /&gt;package org.opengarage.spring.test; &lt;/p&gt;  &lt;p&gt;import java.util.Properties; &lt;/p&gt;  &lt;p&gt;/**   &lt;br /&gt; * @author dhrubo    &lt;br /&gt; *    &lt;br /&gt; */    &lt;br /&gt;public class Test {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private static Properties properties; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; /**   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @return the properties    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static Properties getProperties() {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return properties;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; /**   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; * @param properties the properties to set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; */    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static void setProperties(Properties properties) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Test.properties = properties;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0080ff"&gt;Step 3 :&lt;/font&gt;&lt;/strong&gt; Finally wire up everything in Spring configuration file&lt;/p&gt;  &lt;p&gt;&lt;font color="#0080ff"&gt;&lt;strong&gt;Listing 3&lt;/strong&gt;&lt;/font&gt; - Spring-config.xml&lt;/p&gt;  &lt;p&gt;&amp;lt;bean class=&amp;quot;org.opengarage.spring.postprocessor.StaticInitializerBeanFactoryPostProcessor&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;classes&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;map&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;entry key=&amp;quot;org.opengarage.pingscape.test.Test&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;map&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;entry key=&amp;quot;properties&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;bean class=&amp;quot;org.springframework.beans.factory.config.PropertiesFactoryBean&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;locations&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;value&amp;gt;classpath:org/opengarage/spring/test/jdbc.properties&amp;lt;/value&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/entry&amp;gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/map&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/entry&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/map&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/property&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bean&amp;gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/739779127620140144-4138103020240346188?l=open-garage.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://open-garage.blogspot.com/feeds/4138103020240346188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://open-garage.blogspot.com/2008/11/setting-static-fields-in-spring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4138103020240346188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/739779127620140144/posts/default/4138103020240346188'/><link rel='alternate' type='text/html' href='http://open-garage.blogspot.com/2008/11/setting-static-fields-in-spring.html' title='Initializing static fields of Spring beans'/><author><name>Dhrubojyoti Kayal</name><uri>http://www.blogger.com/profile/07029673269008865273</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_UEQt_cUM2VM/SMOB1c_KkGI/AAAAAAAAANE/ibvp-9uKnwo/S220/dhrubo.jpg'/></author><thr:total>0</thr:total></entry></feed>
