<?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-8815881187810062309</id><updated>2011-04-22T01:02:44.751+03:00</updated><category term='timezone'/><category term='Spring'/><category term='JSP'/><category term='java'/><category term='filter'/><category term='Configuration'/><title type='text'>J2EE Cookbook</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://j2eecookbook.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://j2eecookbook.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mykola Paliyenko</name><uri>http://www.blogger.com/profile/02866042640294053551</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8815881187810062309.post-8060561909094308239</id><published>2008-06-03T19:29:00.002+03:00</published><updated>2008-06-03T19:34:04.672+03:00</updated><title type='text'>Moved to Python</title><content type='html'>Unfortunately for Java community, I'm the next one to leave it.&lt;br /&gt;I'm no longer J2EE fellow, and I'm really happy with Python, excelent language and platforn that just do the job without any buzz around it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8815881187810062309-8060561909094308239?l=j2eecookbook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://j2eecookbook.blogspot.com/feeds/8060561909094308239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8815881187810062309&amp;postID=8060561909094308239' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/8060561909094308239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/8060561909094308239'/><link rel='alternate' type='text/html' href='http://j2eecookbook.blogspot.com/2008/06/moved-to-python.html' title='Moved to Python'/><author><name>Mykola Paliyenko</name><uri>http://www.blogger.com/profile/02866042640294053551</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8815881187810062309.post-5246685223627995506</id><published>2007-12-17T16:00:00.000+02:00</published><updated>2007-12-17T19:03:27.381+02:00</updated><title type='text'>Amazon has opened SimpleDB service</title><content type='html'>Now you can easily outsource your database hosting. One more step to enabling infrastructures that are completely build using SaS approach.&lt;br /&gt;Good analysis of the topic is &lt;a href="http://highscalability.com/current-pros-and-cons-list-simpledb"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8815881187810062309-5246685223627995506?l=j2eecookbook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://j2eecookbook.blogspot.com/feeds/5246685223627995506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8815881187810062309&amp;postID=5246685223627995506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/5246685223627995506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/5246685223627995506'/><link rel='alternate' type='text/html' href='http://j2eecookbook.blogspot.com/2007/12/amazon-has-opened-simpledb-service.html' title='Amazon has opened SimpleDB service'/><author><name>Mykola Paliyenko</name><uri>http://www.blogger.com/profile/02866042640294053551</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8815881187810062309.post-1334304896332971755</id><published>2007-07-09T13:37:00.000+03:00</published><updated>2007-07-12T20:43:13.693+03:00</updated><title type='text'>Choosing scripting language (Bash vs Perl vs Python vs Ruby)</title><content type='html'>Not Java but definitely Enterprise.&lt;br /&gt;&lt;br /&gt;Like many other companies one day we faced the problem when bash was not enough for facilitating work of our  product. We started &lt;a href="http://web.omnidrive.com/APIServer/shared/ouXXxSHVsfUGVa346eTvfxJ2/Sonopia_Scripting_Language.pdf"&gt;investigation&lt;/a&gt; about what language to use to use in addition to simple bash scripts.&lt;br /&gt;&lt;br /&gt;As you see Python is a winner due to the simplest syntax and good experience of using it in Google and Amazon.&lt;br /&gt;&lt;br /&gt;Hope this helps to make scripting in our company more consistent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8815881187810062309-1334304896332971755?l=j2eecookbook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://j2eecookbook.blogspot.com/feeds/1334304896332971755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8815881187810062309&amp;postID=1334304896332971755' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/1334304896332971755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/1334304896332971755'/><link rel='alternate' type='text/html' href='http://j2eecookbook.blogspot.com/2007/07/choosing-scripting-language-bash-vs.html' title='Choosing scripting language (Bash vs Perl vs Python vs Ruby)'/><author><name>Mykola Paliyenko</name><uri>http://www.blogger.com/profile/02866042640294053551</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8815881187810062309.post-2025540715641374591</id><published>2007-07-08T13:20:00.000+03:00</published><updated>2007-07-11T15:39:49.433+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='JSP'/><category scheme='http://www.blogger.com/atom/ns#' term='Configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Accessing properties loaded via Spring PropertyPlaceholderConfigurer from JSP</title><content type='html'>&lt;h3&gt;Overview&lt;/h3&gt;&lt;br /&gt;The problem is defined &lt;a href="http://forum.springframework.org/archive/index.php/t-15689.html"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;I have configured some properties files for the application using the PropertyPlaceholderConfigurer. How can I access these properties in JSP?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We have faced the same problem when we quite often need access from JSP to some configurable parameter. Usually we did the same way as described in the forum thread by  having specific beans that were configured by PropertyPlaceholderConfigurer. But with the time they began look like some pretty wrong approach, when we had properties that are not connected to each other in one place and clear understanding that it is a workaround that need to be eliminated.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Idea&lt;/h3&gt;&lt;br /&gt;Idea was very simple, read all properties configured by PropertyPlaceholderConfigurer  and put them to some attribute of the ServletContext, thus getting them accessible via 'application' scope from JSP. However it looks simple but there is no ability to extract resolved properties from PropertyPlaceholderConfigurer, I spend quite time to read code and understand what to do.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Implementation&lt;/h3&gt;&lt;br /&gt;The simples way I found is extending it with own class that will do the job of exposing properties to the outside.&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;&lt;span class="syntax9"&gt;package&lt;/span&gt; com.sonopia.sonoportal.web.util;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; java.util.Collections;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; java.util.HashMap;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; java.util.HashSet;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; java.util.Map;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; java.util.Properties;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; org.springframework.beans.BeansException;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; org.springframework.beans.factory.config.ConfigurableListableBeanFactory;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax3"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Bean&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;that&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;should&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;be&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;used&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;instead&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;of&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;the&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;{&lt;/span&gt;&lt;span class="syntax12"&gt;@link&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;PropertyPlaceholderConfigurer&lt;/span&gt;&lt;span class="syntax3"&gt;}&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;if&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;you&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;want&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;to&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;have&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;access&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;to&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;the&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;resolved&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;properties&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;not&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;obly&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;from&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;the&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Spring&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;context&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;e&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt;g&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;from&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;JSP&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;or&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;so&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;More&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;details&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;about&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;usage&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;here&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;http&lt;/span&gt;&lt;span class="syntax3"&gt;:&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;wiki&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt;sonopia&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt;com&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;x&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;GmQ&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax12"&gt;@author&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Mykola&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Palienko&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;class&lt;/span&gt; ExposablePropertyPaceholderConfigurer &lt;span class="syntax8"&gt;extends&lt;/span&gt; PropertyPlaceholderConfigurer &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;private&lt;/span&gt; Map&lt;span class="syntax18"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span class="syntax18"&gt;&amp;gt;&lt;/span&gt; resolvedProps;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax11"&gt;@&lt;/span&gt;&lt;span class="syntax11"&gt;Override&lt;/span&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;protected&lt;/span&gt; &lt;span class="syntax10"&gt;void&lt;/span&gt; &lt;span class="syntax6"&gt;processProperties&lt;/span&gt;(ConfigurableListableBeanFactory beanFactoryToProcess,&lt;br /&gt;      Properties props) &lt;span class="syntax8"&gt;throws&lt;/span&gt; BeansException &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class="syntax14"&gt;super&lt;/span&gt;.&lt;span class="syntax6"&gt;processProperties&lt;/span&gt;(beanFactoryToProcess, props);&lt;br /&gt;      resolvedProps &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax8"&gt;new&lt;/span&gt; HashMap&lt;span class="syntax18"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span class="syntax18"&gt;&amp;gt;&lt;/span&gt;();&lt;br /&gt;      &lt;span class="syntax8"&gt;for&lt;/span&gt; (Object key : props.&lt;span class="syntax6"&gt;keySet&lt;/span&gt;()) &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;          String keyStr &lt;span class="syntax18"&gt;=&lt;/span&gt; key.&lt;span class="syntax6"&gt;toString&lt;/span&gt;();&lt;br /&gt;          resolvedProps.&lt;span class="syntax6"&gt;put&lt;/span&gt;(keyStr, &lt;span class="syntax6"&gt;parseStringValue&lt;/span&gt;(props.&lt;span class="syntax6"&gt;getProperty&lt;/span&gt;(keyStr), props,&lt;br /&gt;                  &lt;span class="syntax8"&gt;new&lt;/span&gt; &lt;span class="syntax6"&gt;HashSet&lt;/span&gt;()));&lt;br /&gt;      &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;public&lt;/span&gt; Map&lt;span class="syntax18"&gt;&amp;lt;&lt;/span&gt;String, String&lt;span class="syntax18"&gt;&amp;gt;&lt;/span&gt; &lt;span class="syntax6"&gt;getResolvedProps&lt;/span&gt;() &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class="syntax8"&gt;return&lt;/span&gt; Collections.&lt;span class="syntax6"&gt;unmodifiableMap&lt;/span&gt;(resolvedProps);&lt;br /&gt;  &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and configuring it in the Spring context declaration xml file in your project&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;    &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;bean&lt;/span&gt;&lt;span class="syntax17"&gt; &lt;/span&gt;&lt;span class="syntax17"&gt;id&lt;/span&gt;&lt;span class="syntax17"&gt;=&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax13"&gt;propertyConfigurer&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax17"&gt; &lt;/span&gt;&lt;span class="syntax17"&gt;class&lt;/span&gt;&lt;span class="syntax17"&gt;=&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax13"&gt;com.sonopia.sonoportal.web.util.ExposablePropertyPaceholderConfigurer&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;property&lt;/span&gt;&lt;span class="syntax17"&gt; &lt;/span&gt;&lt;span class="syntax17"&gt;name&lt;/span&gt;&lt;span class="syntax17"&gt;=&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax13"&gt;locations&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;list&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;value&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;classpath:sonoportal.properties&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;value&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;value&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;classpath:sonoportal.custom.properties&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;value&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;value&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;classpath:sonoportal.buildInfo.properties&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;value&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;          &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;list&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;property&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;bean&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The good thing here is that we also resolve ANT style properties like &lt;span style="font-style: italic;"&gt;${dbname}&lt;/span&gt; etc.&lt;br /&gt;&lt;br /&gt;Then we need to expose that properties to the ServletContext, this job usually is done by implementing ServletContextListener.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;&lt;span class="syntax3"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Copyright&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;2005&lt;/span&gt;&lt;span class="syntax3"&gt;-&lt;/span&gt;&lt;span class="syntax3"&gt;2006&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Sonopia&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Corporation&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;package&lt;/span&gt; com.sonopia.sonoportal.web.listener;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.ServletContext;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.ServletContextEvent;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.ServletContextListener;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; org.springframework.web.context.WebApplicationContext;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; org.springframework.web.context.support.WebApplicationContextUtils;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; com.sonopia.sonoportal.web.util.ExposablePropertyPaceholderConfigurer;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax3"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Listener&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;that&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;exposes&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;properties&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;configured&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;by&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;{&lt;/span&gt;&lt;span class="syntax12"&gt;@link&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;ExposablePropertyPaceholderConfigurer&lt;/span&gt;&lt;span class="syntax3"&gt;}&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;to&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;the&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;web&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;application&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;context&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;More&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;details&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;about&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;usage&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;here&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;http&lt;/span&gt;&lt;span class="syntax3"&gt;:&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;wiki&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt;sonopia&lt;/span&gt;&lt;span class="syntax3"&gt;.&lt;/span&gt;&lt;span class="syntax3"&gt;com&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;x&lt;/span&gt;&lt;span class="syntax3"&gt;/&lt;/span&gt;&lt;span class="syntax3"&gt;GmQ&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax12"&gt;@author&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Mykola&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Palienko&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;class&lt;/span&gt; ConfigPropertiesExposerListener &lt;span class="syntax8"&gt;implements&lt;/span&gt; ServletContextListener &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax8"&gt;static&lt;/span&gt; &lt;span class="syntax8"&gt;final&lt;/span&gt; String DEFAULT_PROPERTIES_BEAN_NAME &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax13"&gt;propertyConfigurer&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax8"&gt;static&lt;/span&gt; &lt;span class="syntax8"&gt;final&lt;/span&gt; String DEFAULT_CONTEXT_PROPERTY &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax13"&gt;"&lt;/span&gt;&lt;span class="syntax13"&gt;configProperties&lt;/span&gt;&lt;span class="syntax13"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;private&lt;/span&gt; String propertiesBeanName &lt;span class="syntax18"&gt;=&lt;/span&gt; DEFAULT_PROPERTIES_BEAN_NAME;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;private&lt;/span&gt; String contextProperty &lt;span class="syntax18"&gt;=&lt;/span&gt; DEFAULT_CONTEXT_PROPERTY;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;void&lt;/span&gt; &lt;span class="syntax6"&gt;contextDestroyed&lt;/span&gt;(ServletContextEvent sce) &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;void&lt;/span&gt; &lt;span class="syntax6"&gt;contextInitialized&lt;/span&gt;(ServletContextEvent sce) &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class="syntax2"&gt;//&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;TODO&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;add&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;ability&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;to&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;configure&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;non&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;default&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;values&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;via&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;serveltContexParams&lt;/span&gt;&lt;br /&gt;      ServletContext servletContext &lt;span class="syntax18"&gt;=&lt;/span&gt; sce.&lt;span class="syntax6"&gt;getServletContext&lt;/span&gt;();&lt;br /&gt;      WebApplicationContext context &lt;span class="syntax18"&gt;=&lt;/span&gt; WebApplicationContextUtils&lt;br /&gt;              .&lt;span class="syntax6"&gt;getRequiredWebApplicationContext&lt;/span&gt;(servletContext);&lt;br /&gt;      ExposablePropertyPaceholderConfigurer configurer &lt;span class="syntax18"&gt;=&lt;/span&gt;&lt;br /&gt;          (ExposablePropertyPaceholderConfigurer) context.&lt;span class="syntax6"&gt;getBean&lt;/span&gt;(propertiesBeanName);&lt;br /&gt;      sce.&lt;span class="syntax6"&gt;getServletContext&lt;/span&gt;().&lt;span class="syntax6"&gt;setAttribute&lt;/span&gt;(contextProperty, configurer.&lt;span class="syntax6"&gt;getResolvedProps&lt;/span&gt;());&lt;br /&gt;&lt;br /&gt;  &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and add several lines to the &lt;span style="font-style: italic;"&gt;web.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;        &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;listener&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;              &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;listener-class&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                      com.sonopia.sonoportal.web.listener.ConfigPropertiesExposerListener&lt;br /&gt;              &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;listener-class&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;listener&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Usage&lt;/h3&gt;&lt;br /&gt;Having all above done accessing any property from JSP is not harder than&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;${configProperties['website.hostname']}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The snippet above will print out &lt;span style="font-style: italic;"&gt;website.hostname&lt;/span&gt; property configured by &lt;span style="font-style: italic;"&gt;ExposablePropertyPaceholderConfigurer&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8815881187810062309-2025540715641374591?l=j2eecookbook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://j2eecookbook.blogspot.com/feeds/2025540715641374591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8815881187810062309&amp;postID=2025540715641374591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/2025540715641374591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/2025540715641374591'/><link rel='alternate' type='text/html' href='http://j2eecookbook.blogspot.com/2007/07/accessing-properties-loaded-via-spring.html' title='Accessing properties loaded via Spring PropertyPlaceholderConfigurer from JSP'/><author><name>Mykola Paliyenko</name><uri>http://www.blogger.com/profile/02866042640294053551</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8815881187810062309.post-8888943675304041599</id><published>2007-06-16T13:25:00.000+03:00</published><updated>2007-06-16T19:37:57.885+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='timezone'/><category scheme='http://www.blogger.com/atom/ns#' term='filter'/><title type='text'>Formatting date to client timezone</title><content type='html'>Unlike a locale information that is passed by browsers via HTTP header, there is no straightforward way to retrieve the information about client timezone offset.&lt;br /&gt;I also have not found any ready-to-use solutions to workaround this in web and one day when we've been posted the bug that our SMS sending times appears to be in the server timezone. I've found the solution.&lt;br /&gt;The idea is pretty easy, the only way you can pass client timezone to the server is by calculating it using&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;&lt;span class="syntax8"&gt;var&lt;/span&gt; tzo &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax8"&gt;new&lt;/span&gt; &lt;span class="syntax10"&gt;Date&lt;/span&gt;()&lt;span class="syntax18"&gt;.&lt;/span&gt;&lt;span class="syntax6"&gt;getTimezoneOffset&lt;/span&gt;()&lt;span class="syntax18"&gt;;&lt;/span&gt;        &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next step - you need to pass it to the server, there is a number of ways to do it but they all have one drawback, you cannot format dates from the just loaded page, since script executes on the client. Anyway the options are: Cookie and AJAX. Cookie is easier and seems that AJAX is overkill here, that is why I've chosen cookie way.&lt;br /&gt;&lt;br /&gt;The whole code on the client looks like&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;c&lt;/span&gt;&lt;span class="syntax17"&gt;:&lt;/span&gt;&lt;span class="syntax6"&gt;if&lt;/span&gt;&lt;span class="syntax17"&gt; &lt;/span&gt;&lt;span class="syntax17"&gt;test&lt;/span&gt;&lt;span class="syntax17"&gt;=&lt;/span&gt;&lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax13"&gt;$&lt;/span&gt;&lt;span class="syntax13"&gt;{&lt;/span&gt;&lt;span class="syntax13"&gt;sessionScope&lt;/span&gt;&lt;span class="syntax13"&gt;[&lt;/span&gt;&lt;span class="syntax13"&gt;'&lt;/span&gt;&lt;span class="syntax13"&gt;sonoportal&lt;/span&gt;&lt;span class="syntax13"&gt;.&lt;/span&gt;&lt;span class="syntax13"&gt;timezoneOffset&lt;/span&gt;&lt;span class="syntax13"&gt;'&lt;/span&gt;&lt;span class="syntax13"&gt;]&lt;/span&gt;&lt;span class="syntax13"&gt; &lt;/span&gt;&lt;span class="syntax13"&gt;=&lt;/span&gt;&lt;span class="syntax13"&gt;=&lt;/span&gt;&lt;span class="syntax13"&gt; &lt;/span&gt;&lt;span class="syntax13"&gt;null&lt;/span&gt;&lt;span class="syntax13"&gt;}&lt;/span&gt;&lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax1"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="syntax1"&gt;Setting&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;TZ&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;offset&lt;/span&gt;&lt;span class="syntax1"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax17"&gt;&amp;lt;script&lt;/span&gt;&lt;span class="syntax17"&gt; &lt;/span&gt;&lt;span class="syntax17"&gt;type&lt;/span&gt;&lt;span class="syntax17"&gt;=&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax17"&gt;text&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;javascript&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax8"&gt;var&lt;/span&gt; tzo &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax8"&gt;new&lt;/span&gt; &lt;span class="syntax10"&gt;Date&lt;/span&gt;()&lt;span class="syntax18"&gt;.&lt;/span&gt;&lt;span class="syntax6"&gt;getTimezoneOffset&lt;/span&gt;()&lt;span class="syntax18"&gt;;&lt;/span&gt;        &lt;br /&gt;document&lt;span class="syntax18"&gt;.&lt;/span&gt;cookie &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax13"&gt;timezoneOffset=&lt;/span&gt;&lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt; &lt;span class="syntax18"&gt;+&lt;/span&gt; &lt;span class="syntax14"&gt;escape&lt;/span&gt;(tzo &lt;span class="syntax18"&gt;*&lt;/span&gt; (&lt;span class="syntax18"&gt;-&lt;/span&gt;&lt;span class="syntax5"&gt;1&lt;/span&gt;))&lt;span class="syntax18"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax17"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;c&lt;/span&gt;&lt;span class="syntax17"&gt;:&lt;/span&gt;&lt;span class="syntax6"&gt;if&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;          &lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;We've also added the condition not to send cookie if we already have info about user timezone offset in the HttpSession.&lt;br /&gt;&lt;br /&gt;Now we need to process the timezone on server and set it to the session. In our application we are using standard JSTL &lt;span style="font-style:italic;"&gt;fmt:formatDate&lt;/span&gt; for formatting dates and times. Fortunately you can set default timezone in the user's HttpSession scope and it will be used authomatically. Here is the code for a Filter that do the job:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;&lt;span class="syntax9"&gt;package&lt;/span&gt; com.sonopia.sonoportal.web.filter;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; java.io.IOException;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; java.util.TimeZone;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.Filter;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.FilterChain;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.FilterConfig;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.ServletException;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.ServletRequest;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.ServletResponse;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.http.Cookie;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.http.HttpServletRequest;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.http.HttpServletResponse;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; javax.servlet.jsp.jstl.core.Config;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax9"&gt;import&lt;/span&gt; org.apache.commons.lang.time.DateUtils;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax3"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax12"&gt;@author&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Mykola&lt;/span&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;Paliyenko&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax3"&gt; &lt;/span&gt;&lt;span class="syntax3"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;class&lt;/span&gt; SetTimezoneOffsetFilter &lt;span class="syntax8"&gt;implements&lt;/span&gt; Filter &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax8"&gt;static&lt;/span&gt; &lt;span class="syntax8"&gt;final&lt;/span&gt; String PROPERTY_TIMEZONE_OFFEST &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax13"&gt;sonoportal.timezoneOffset&lt;/span&gt;&lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax8"&gt;static&lt;/span&gt; &lt;span class="syntax8"&gt;final&lt;/span&gt; String COOKIE_NAME &lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax13"&gt;timezoneOffset&lt;/span&gt;&lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;void&lt;/span&gt; &lt;span class="syntax6"&gt;destroy&lt;/span&gt;() &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;void&lt;/span&gt; &lt;span class="syntax6"&gt;doFilter&lt;/span&gt;(ServletRequest request, ServletResponse response, FilterChain chain)&lt;br /&gt;        &lt;span class="syntax8"&gt;throws&lt;/span&gt; IOException, ServletException &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;        HttpServletRequest req &lt;span class="syntax18"&gt;=&lt;/span&gt; (HttpServletRequest) request;&lt;br /&gt;        HttpServletResponse res &lt;span class="syntax18"&gt;=&lt;/span&gt; (HttpServletResponse) response;&lt;br /&gt;        &lt;span class="syntax8"&gt;if&lt;/span&gt; (req.&lt;span class="syntax6"&gt;getSession&lt;/span&gt;().&lt;span class="syntax6"&gt;getAttribute&lt;/span&gt;(PROPERTY_TIMEZONE_OFFEST) &lt;span class="syntax18"&gt;=&lt;/span&gt;&lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax14"&gt;null&lt;/span&gt;) &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="syntax8"&gt;if&lt;/span&gt; (req.&lt;span class="syntax6"&gt;getCookies&lt;/span&gt;() &lt;span class="syntax18"&gt;!&lt;/span&gt;&lt;span class="syntax18"&gt;=&lt;/span&gt; &lt;span class="syntax14"&gt;null&lt;/span&gt;) &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;                &lt;span class="syntax8"&gt;for&lt;/span&gt; (Cookie cookie : req.&lt;span class="syntax6"&gt;getCookies&lt;/span&gt;()) &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;                    &lt;span class="syntax8"&gt;if&lt;/span&gt; (COOKIE_NAME.&lt;span class="syntax6"&gt;equals&lt;/span&gt;(cookie.&lt;span class="syntax6"&gt;getName&lt;/span&gt;())) &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;                        &lt;span class="syntax10"&gt;int&lt;/span&gt; timezoneOffsetMinutes &lt;span class="syntax18"&gt;=&lt;/span&gt; Integer.&lt;span class="syntax6"&gt;parseInt&lt;/span&gt;(cookie.&lt;span class="syntax6"&gt;getValue&lt;/span&gt;());&lt;br /&gt;                        TimeZone timeZone &lt;span class="syntax18"&gt;=&lt;/span&gt; TimeZone.&lt;span class="syntax6"&gt;getTimeZone&lt;/span&gt;(&lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;&lt;span class="syntax13"&gt;GMT&lt;/span&gt;&lt;span class="syntax13"&gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;                        timeZone.&lt;span class="syntax6"&gt;setRawOffset&lt;/span&gt;(&lt;br /&gt;                                (&lt;span class="syntax10"&gt;int&lt;/span&gt;) (timezoneOffsetMinutes &lt;span class="syntax18"&gt;*&lt;/span&gt; DateUtils.MILLIS_PER_MINUTE));&lt;br /&gt;                        Config.&lt;span class="syntax6"&gt;set&lt;/span&gt;(req.&lt;span class="syntax6"&gt;getSession&lt;/span&gt;(), Config.FMT_TIME_ZONE, timeZone);&lt;br /&gt;                        req.&lt;span class="syntax6"&gt;getSession&lt;/span&gt;().&lt;span class="syntax6"&gt;setAttribute&lt;/span&gt;(&lt;br /&gt;                                PROPERTY_TIMEZONE_OFFEST, timezoneOffsetMinutes);&lt;br /&gt;                        &lt;span class="syntax2"&gt;//&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;removing&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;cookie,&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;Sun&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;sucks&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;as&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;usual&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;in&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;their&lt;/span&gt;&lt;span class="syntax2"&gt; &lt;/span&gt;&lt;span class="syntax2"&gt;API&lt;/span&gt;&lt;br /&gt;                        cookie.&lt;span class="syntax6"&gt;setMaxAge&lt;/span&gt;(&lt;span class="syntax5"&gt;0&lt;/span&gt;);&lt;br /&gt;                        res.&lt;span class="syntax6"&gt;addCookie&lt;/span&gt;(cookie);&lt;br /&gt;                    &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;                &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;            &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;        chain.&lt;span class="syntax6"&gt;doFilter&lt;/span&gt;(request, response);&lt;br /&gt;    &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="syntax8"&gt;public&lt;/span&gt; &lt;span class="syntax10"&gt;void&lt;/span&gt; &lt;span class="syntax6"&gt;init&lt;/span&gt;(FilterConfig config) &lt;span class="syntax8"&gt;throws&lt;/span&gt; ServletException &lt;span class="syntax18"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="syntax18"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that we are removing cookies once we get the timezone offset to reduce client/server traffic since otherwise it get send with every single request.&lt;br /&gt;What remains? Declaring filter &lt;span style="font-style:italic;"&gt;web.xml&lt;/span&gt; file&lt;br /&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;        &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;filter&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;filter-name&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;SetTimezoneOffsetFilter&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;filter-name&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;filter-class&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                        com.sonopia.sonoportal.web.filter.SetTimezoneOffsetFilter&lt;br /&gt;                &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;filter-class&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;filter&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;filter-mapping&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;filter-name&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;SetTimezoneOffsetFilter&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;filter-name&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;url-pattern&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;/*&lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;url-pattern&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="syntax17"&gt;&amp;lt;&lt;/span&gt;&lt;span class="syntax17"&gt;/&lt;/span&gt;&lt;span class="syntax17"&gt;filter-mapping&lt;/span&gt;&lt;span class="syntax17"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Thats all. Now your site is one of a little set of sites that care about user's time zone.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Limitations/Drawbacks&lt;/h4&gt;&lt;br /&gt;- First served page in session will show the server times.&lt;br /&gt;- If user changing timezone within session it will not be tracked by server. It is a very minor issue but still&lt;br /&gt;- Additional global filter for the application&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8815881187810062309-8888943675304041599?l=j2eecookbook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://j2eecookbook.blogspot.com/feeds/8888943675304041599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8815881187810062309&amp;postID=8888943675304041599' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/8888943675304041599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/8888943675304041599'/><link rel='alternate' type='text/html' href='http://j2eecookbook.blogspot.com/2007/06/formatting-date-to-client-timezone.html' title='Formatting date to client timezone'/><author><name>Mykola Paliyenko</name><uri>http://www.blogger.com/profile/02866042640294053551</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8815881187810062309.post-845352305973341908</id><published>2007-06-16T09:50:00.000+03:00</published><updated>2007-06-16T13:17:05.217+03:00</updated><title type='text'>Getting started</title><content type='html'>This blog is about building feature rich application based on Java open source frameworks, problems and solution related to it. Creating our product day by day from prototype to the live system, from 4 developers to 30+, we get valuable experience that might be useful to share with community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8815881187810062309-845352305973341908?l=j2eecookbook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://j2eecookbook.blogspot.com/feeds/845352305973341908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8815881187810062309&amp;postID=845352305973341908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/845352305973341908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8815881187810062309/posts/default/845352305973341908'/><link rel='alternate' type='text/html' href='http://j2eecookbook.blogspot.com/2007/06/getting-started.html' title='Getting started'/><author><name>Mykola Paliyenko</name><uri>http://www.blogger.com/profile/02866042640294053551</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
