<?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:blogger='http://schemas.google.com/blogger/2008' 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-4882327673297017980</id><updated>2024-09-27T09:12:24.683-04:00</updated><category term="spring"/><category term="HTML Tag"/><category term="Enum"/><category term="Tag File"/><category term="JMX"/><category term="Annotation"/><category term="Basic Authentication"/><category term="Spring Security"/><category term="Flex"/><category term="Java"/><category term="Tomcat"/><category term="ajax"/><category term="eclipse"/><category term="i18n"/><category term="log4j"/><category term="remote debug"/><category term="web service"/><category term="Conversion"/><category term="EnumMap"/><category term="Fiddler"/><category term="Firefox"/><category term="Hexadecimal"/><category term="Hibernate"/><category term="IE"/><category term="JAXB2"/><category term="JNDI"/><category term="JNLP"/><category term="JSON"/><category term="Json-lib"/><category term="Modify Headers"/><category term="Oracle"/><category term="SQL"/><category term="Unicode"/><category term="applet"/><category term="commons-logging"/><category term="csv"/><category term="culture difference"/><category term="displaytag"/><category term="jconsole"/><category term="l10n"/><category term="local process"/><category term="pdf"/><category term="proptotype"/><category term="servlet"/><category term="standalone"/><category term="velocity"/><category term="web start"/><category term="xFire"/><title type='text'>Out Of Katie&#39;s Head</title><subtitle type='html'>This blog serves as my personal work documentations.  Most of the posts are ideas/solutions from work.  Some of the code has been simplified or improved.  Others are modified to conceal coding work from company&#39;s architecture.  Some posts are thoughts outside of my job and may be in Chinese.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-939449518694779840</id><published>2012-03-03T01:33:00.000-05:00</published><updated>2012-03-03T01:33:35.978-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>wm_concat for Oracle</title><content type='html'>I need to add a style description to a Phone domain.&amp;nbsp; However Style has a many to many relationship to Phone in Database.&amp;nbsp; Usually, one would just create the Style Domain and the Mapping in Hibernate to add it as a set in Phone Domain.&amp;nbsp; But in my case, all I want is a concatenated String of all style names a Phone has. And to do so, I&#39;ll have to iterate through the set to join all the style names as a string.&amp;nbsp; Consider Phone is already heavily packed and we usually query for large list of Phones throughout our application, plus that we only display style on one newly designed page, the easy way will not be an efficient way.&lt;br /&gt;
&lt;br /&gt;
So I tried to google out a better way to do it.&amp;nbsp; What I gathered most is that for MySql, group_concat can achieve what I want.&amp;nbsp; Unfortunately, it&#39;s not valid for Oracle.&amp;nbsp; And, there are a lot discussions on Oracle forum on how to achieve the same effort through very complicated queries and I got lost about half way through.&lt;br /&gt;
&lt;br /&gt;
Then I found this little post on wm_concat for Oracle.&amp;nbsp; On my first tryout, I was able to get it working in my project.&lt;br /&gt;
&lt;br /&gt;
In my hibernate mapping, instead of:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; name=&quot;stylePhoneMap&quot;&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; table=&quot;style_phone_map&quot;&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; batch-size=&quot;5&quot;&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; lazy=&quot;false&quot;&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; cascade=&quot;none&quot;&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;key column=&quot;phone_id&quot;/&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;one-to-many class=&quot;com.vzw.my.company.domain.phone.StylePhoneMap&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/set&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;
I used:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&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; name=&quot;style&quot;&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; type=&quot;java.lang.String&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;formula=&quot;(select wm_concat(a.style_name) from style a, style_phone_map b where a.style_id=b.style_id and b.phone_id = phone_id)&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;insert=&quot;false&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;update=&quot;false&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/blockquote&gt;
The result of the formula will return as a CLOB in SQL Navigator.&amp;nbsp; I would put a length attribute on the property if for fact the result will be a long String.&amp;nbsp; But for my case, I know for sure I don&#39;t need to.&amp;nbsp; All style names are concatenated as one String with comma as separator.&amp;nbsp; No extra domain object, no extra Java code to convert the Set to a String.&amp;nbsp; What a great trick!&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/939449518694779840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/939449518694779840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/939449518694779840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/939449518694779840'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2012/03/wmconcat-for-oracle.html' title='wm_concat for Oracle'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-2531670557161297161</id><published>2012-01-09T18:55:00.048-05:00</published><updated>2012-03-02T20:44:36.600-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Flex"/><category scheme="http://www.blogger.com/atom/ns#" term="l10n"/><title type='text'>L10n in Flex Quick Guide</title><content type='html'>&lt;div style=&quot;text-align: left;&quot;&gt;
Recently I was looking into localization of my Flex project, not to support multiple language, but to support different server environment setup. &lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
So I came up with two options:&lt;/div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Using l10n property file: &lt;/li&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&amp;nbsp;Create a locale directory right under the project.&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;&lt;div align=&quot;justify&quot; style=&quot;border: medium none;&quot;&gt;
Add a sub directory under&amp;nbsp;locale named with the locale you want to add.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div align=&quot;justify&quot; style=&quot;border: medium none;&quot;&gt;
Add the property file under the sub directory (Note this is different than the Java i18n setup which you just create property file in the pattern &amp;lt;Resource Name&amp;gt;_&amp;lt;locale&amp;gt;.properties)&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW5IXQc9L1cIv3CSLQAgmfbDH-w9W8XlC_9tjOLuEaKsoED1VyZi5XaSyi5FbVoOgC2s0e375dhrWz0LGGTtErzEk7_d4UOhJYna_ImAb0nuM5_cLhuiNbkAY7pGfZSqOk53Zk-o8urzDC/s1600/resource.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;275px&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW5IXQc9L1cIv3CSLQAgmfbDH-w9W8XlC_9tjOLuEaKsoED1VyZi5XaSyi5FbVoOgC2s0e375dhrWz0LGGTtErzEk7_d4UOhJYna_ImAb0nuM5_cLhuiNbkAY7pGfZSqOk53Zk-o8urzDC/s320/resource.png&quot; uda=&quot;true&quot; width=&quot;320px&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div align=&quot;justify&quot; style=&quot;border: medium none;&quot;&gt;
Repeat 2 and 3 if you have more locales to add.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div align=&quot;justify&quot; style=&quot;border: medium none;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;
Go to Project Properties and then Flex Compiler, in the Additional compiler argument section add &quot;-locale&amp;nbsp;&amp;lt;locale list seperated by comma&amp;gt; -source-path=locale/{locale} -allow-source-path-overlap=true&quot;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx_Kny0Ux9Rjn6pAljR1IAk0STby9gY4pNT7QIXRgMY2qlXHpi9oYm-DsFyvCUER_HTHvltj3peyT5Hb6Yg9qpezzztXqIv56Qp15gD8diHK1X5LXWnI8y-WiIR3u5MJHPNLBwohHcrRBa/s1600/FlexCompiler.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;309&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx_Kny0Ux9Rjn6pAljR1IAk0STby9gY4pNT7QIXRgMY2qlXHpi9oYm-DsFyvCUER_HTHvltj3peyT5Hb6Yg9qpezzztXqIv56Qp15gD8diHK1X5LXWnI8y-WiIR3u5MJHPNLBwohHcrRBa/s320/FlexCompiler.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style=&quot;border: medium none; text-align: left;&quot;&gt;
In mxml file add [ResourceBundle(&quot;&amp;lt;Resource File&amp;nbsp;Name&amp;gt;&quot;)] to metadata.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div align=&quot;justify&quot; style=&quot;border: medium none;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Wherever you need a resource, use resourceManager.getString(&#39;&amp;lt;Resource File&amp;nbsp;Name&amp;gt;&#39;, &#39;&amp;lt;Resource Key&amp;gt;&#39;).&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivipXz4uHWoWjafTbeDX7ypSE9J-6oycQHoBJ5uKaY6NgQeLDFI7dGCiT3AKQEJseVZQ5KDsm0BJveCZjbrTXYsOWUgXjeOExjYS5yO2uyH6S2Q_XpOFq00-lI-Li27GJFAj9d8SOGwXbJ/s1600/mxml.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;74&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivipXz4uHWoWjafTbeDX7ypSE9J-6oycQHoBJ5uKaY6NgQeLDFI7dGCiT3AKQEJseVZQ5KDsm0BJveCZjbrTXYsOWUgXjeOExjYS5yO2uyH6S2Q_XpOFq00-lI-Li27GJFAj9d8SOGwXbJ/s320/mxml.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Passing environment variables as FlashVars:&lt;/li&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;Add flashvars as parameter in object in jsp file&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZBuuNU9ZA5uT0gEB_ZBDeF5_HLhoBJdyT_GZDWW41XnIVkEYd4YKfEeIbTyYefzcBg3CggnOZqiRcQd3rBmmGOSxoekIBeFHnvdCCoZk9Upc6Ebm51VYKg8LHMoOZlEa8xVT6smyKudLx/s1600/object.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;59&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZBuuNU9ZA5uT0gEB_ZBDeF5_HLhoBJdyT_GZDWW41XnIVkEYd4YKfEeIbTyYefzcBg3CggnOZqiRcQd3rBmmGOSxoekIBeFHnvdCCoZk9Upc6Ebm51VYKg8LHMoOZlEa8xVT6smyKudLx/s320/object.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;span id=&quot;goog_1838352837&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_1838352838&quot;&gt;&lt;/span&gt;In mxml, using FlexGlobals.topLevelApplication.parameters.&amp;lt;parameter key&amp;gt; to get the passed in value&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDzJuZeAkx1Q9ink49xeerybCyfDHnZWBQVp792N24p9OSjTOhBTtEfQ9PiIyxYQ9S56Cw9dPxkiR3KQghwIFyO_tjI4exZC_N4ZEtAeoj5KdrIsY-UYQh0AfOrSl3VqAGUKeB45a-eKQc/s1600/endpoint.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDzJuZeAkx1Q9ink49xeerybCyfDHnZWBQVp792N24p9OSjTOhBTtEfQ9PiIyxYQ9S56Cw9dPxkiR3KQghwIFyO_tjI4exZC_N4ZEtAeoj5KdrIsY-UYQh0AfOrSl3VqAGUKeB45a-eKQc/s400/endpoint.png&quot; width=&quot;400&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Option 2 is obviously easier to setup.&amp;nbsp; We don&#39;t need to add additional property files but reference existing resource setup in Java project.&lt;span id=&quot;goog_1838352835&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_1838352836&quot;&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/2531670557161297161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/2531670557161297161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2531670557161297161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2531670557161297161'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2012/01/l10n-in-flex-quick-guide.html' title='L10n in Flex Quick Guide'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW5IXQc9L1cIv3CSLQAgmfbDH-w9W8XlC_9tjOLuEaKsoED1VyZi5XaSyi5FbVoOgC2s0e375dhrWz0LGGTtErzEk7_d4UOhJYna_ImAb0nuM5_cLhuiNbkAY7pGfZSqOk53Zk-o8urzDC/s72-c/resource.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-2296855356710710399</id><published>2011-12-09T15:58:00.001-05:00</published><updated>2011-12-09T16:30:09.263-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Firefox"/><category scheme="http://www.blogger.com/atom/ns#" term="Flex"/><title type='text'>Flex + Firefox Display Issue</title><content type='html'>When I first started to look into Flex development, I ran into a strange situation.&amp;nbsp; My application runs fine in IE, but when I try the same thing in Firefox, the Flash block just disappeared.&amp;nbsp; It&#39;s not even displaying the the install Flash Player message as if I don&#39;t have the plug-in installed.&lt;br /&gt;
&lt;br /&gt;
This issue has puzzled me for months till today.&amp;nbsp; I finally found out the cause from &lt;a href=&quot;http://code.google.com/p/swfobject/wiki/faq&quot;&gt;here&lt;/a&gt;.&amp;nbsp; So to make the swf file display, I&#39;ll have to define height for all the elements that will parent the file.&amp;nbsp; ie:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&lt;br /&gt;
&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;lt;div id=&quot;parent&quot;&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;...&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;lt;div id=&quot;child&quot;&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;[swf object]&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;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&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;lt;/body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/blockquote&gt;
&lt;br /&gt;
For this to work in Firefox, I need to define following css style:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
html, body, #parent, #child {height:100%}&lt;/blockquote&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/2296855356710710399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/2296855356710710399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2296855356710710399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2296855356710710399'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2011/12/flex-firefox-display-issue.html' title='Flex + Firefox Display Issue'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-6617561711104126392</id><published>2011-09-01T15:11:00.000-04:00</published><updated>2011-12-09T15:50:53.268-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fiddler"/><category scheme="http://www.blogger.com/atom/ns#" term="IE"/><category scheme="http://www.blogger.com/atom/ns#" term="Modify Headers"/><title type='text'>Modify Headers in IE</title><content type='html'>Modify Headers is a very useful Firefox plug-in for developers.&amp;nbsp; It allows you to setup mocking data in headers for testing.&amp;nbsp; However, sometime the problem we are trying to solve is browser specific.&amp;nbsp; In this case, using Firefox is not an option.&amp;nbsp; I happen to bump into such issue that I have to get my application working in IE.&amp;nbsp; So I googled it and finally came up with the solution using Fiddler 2.&amp;nbsp; And here is my note on how to set it up and get it to work:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5HvoLKRxuiRsjAA8wg6hfyhGxetQqGM7jO0UC0C8PVkp5dVRmAQLcxlv_oDHDjOmIveUZ8jalpGsABh9lowCiwT617CGC5dpSPA22rZodo6kC3PJiI4675N4fiZvHBBYHNKrS9tX4IdNy/s1600/setting.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;257&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5HvoLKRxuiRsjAA8wg6hfyhGxetQqGM7jO0UC0C8PVkp5dVRmAQLcxlv_oDHDjOmIveUZ8jalpGsABh9lowCiwT617CGC5dpSPA22rZodo6kC3PJiI4675N4fiZvHBBYHNKrS9tX4IdNy/s320/setting.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;After installed Fiddler 2 from it&#39;s &lt;a href=&quot;http://www.fiddler2.com/fiddler2/version.asp&quot;&gt;official site&lt;/a&gt;, start the application.&lt;/li&gt;
&lt;li&gt;On the right panel, select Filters tab.&lt;/li&gt;
&lt;li&gt;Check &quot;Use Filters&quot;&lt;/li&gt;
&lt;li&gt;If you only need to add one header, then check &quot;Set Request Header&quot; and fill in the key-value pair under the &quot;Request Headers&quot; section&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;If you need to add more than one header, then go to Menu -&amp;gt; Rules -&amp;gt; Customize Rules... or hit Ctrl + R to open CustomRules.js, &lt;/li&gt;
&lt;li&gt;Search for function OnBeforeRequest(oSession: Session) in the file, and add your headers in the function, ie: oSession.oRequest[&quot;MY_HEADER&quot;] = &quot;HEADER_VALUE&quot;;&lt;/li&gt;
&lt;li&gt;Save the filterset configuration and CustomRules.js&lt;/li&gt;
&lt;li&gt;IE8 or below doesn’t send requests for localhost through any proxies, and as a 
proxy, Fiddler will not receive such traffic, thus modify headers won&#39;t work with localhost or 127.0.0.1 at all. You can refer to &lt;a class=&quot;external&quot; href=&quot;http://www.fiddlertool.com/fiddler/help/hookup.asp#Q-LocalTraffic&quot;&gt;How-To 
guide&lt;/a&gt; to setup your local 
instance as you like.&amp;nbsp; Just make sure that whenever the header you added is asked, the request doesn&#39;t come for localhost or 127.0.0.1.&lt;/li&gt;
&lt;li&gt;Finally, it come to the most tricky part.&amp;nbsp; When testing, you should always start Fiddler first, then click on the &quot;Browse&quot; button from toolbar to open a new IE window and go to your testing site from there.&lt;/li&gt;
&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/6617561711104126392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/6617561711104126392' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/6617561711104126392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/6617561711104126392'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2011/09/modify-headers-in-ie.html' title='Modify Headers in IE'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5HvoLKRxuiRsjAA8wg6hfyhGxetQqGM7jO0UC0C8PVkp5dVRmAQLcxlv_oDHDjOmIveUZ8jalpGsABh9lowCiwT617CGC5dpSPA22rZodo6kC3PJiI4675N4fiZvHBBYHNKrS9tX4IdNy/s72-c/setting.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-2194895240059194728</id><published>2010-11-01T23:19:00.054-04:00</published><updated>2010-11-10T00:04:21.526-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="commons-logging"/><category scheme="http://www.blogger.com/atom/ns#" term="log4j"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>Log4j in Spring</title><content type='html'>Spring uses commons-logging for logging solution.  However, most developers prefer Log4j.  Here is a couple points I think need to be noted when use Log4j with Spring.&lt;br /&gt;
&lt;br /&gt;
First, Spring 2.5.x uses commons-logging version 1.1 as dependency by default.&amp;nbsp;  However, it has compatibility issues with Log4j 1.2.  The easiest solution is simply change to commons-logging version 1.0.4.&amp;nbsp; You might notice, though, with the version change, commons-logging&#39;s trace log will become debug log.&lt;br /&gt;
&lt;br /&gt;
Second, Spring actually has &lt;a href=&quot;http://firstpartners.net/kb/index.php/Spring_Pointer_to_Log4j_Configuration_File&quot; linkindex=&quot;49&quot;&gt;a few ways&lt;/a&gt; to configure Log4j settings.&amp;nbsp; One of my favorite is Log4jConfigurer.&amp;nbsp; It not only allows you to configure Log4j, but also give you an option to set a refresh interval to check Log4j configuration changes at runtime, which means there is no need to stop the application to make Log4j logging level, etc.&lt;br /&gt;
&lt;br /&gt;
To set the refresh interval programmatically:&lt;br /&gt;
&lt;blockquote&gt;//initialize log4j with refresh every 5 min.&lt;br /&gt;
try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Log4jConfigurer.initLogging(getLocalLog4jConfig(), 5*60*1000);&lt;br /&gt;
} catch (Exception e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;Unable to initialize log4j configuration!&quot;);&lt;br /&gt;
}&lt;/blockquote&gt;&lt;br /&gt;
Same configuration in Spring context:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;bean id=&quot;log4jInitialization&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&quot;org.springframework.beans.factory.config.MethodInvokingFactoryBean&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;targetClass&quot; value=&quot;org.springframework.util.Log4jConfigurer&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;targetMethod&quot; value=&quot;initLogging&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;arguments&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;classpath:log4j.xml&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;lt;value&amp;gt;300000&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
A special note on Log4j:&lt;br /&gt;
There is a lot discussion on whether we should use log.isDebugEnabled() should be used.&amp;nbsp; I agree with the point that if the message doesn&#39;t need much computation, then it&#39;s not necessary to use log.isDebugEnabled() since it is checked within the log.debug(msg) call.&lt;br /&gt;
&lt;br /&gt;
To verify, I also tried some testing code.&amp;nbsp; It seems to me that the initial log always takes longer than the rest logs.&amp;nbsp; So compare to running different settings in consequence, it&#39;s only fair to run them separately.&lt;br /&gt;
&lt;br /&gt;
Other than that, with a 1000 loop of a simple string constant, it doesn&#39;t make much time difference (in milliseconds) whether to use log.isDebugEnabled() or not.&amp;nbsp; Same result with a message that requires simple computation.&lt;br /&gt;
&lt;br /&gt;
Some people mentioned taking advantage of Java 5&#39;s new String feature and use something like String.format(&quot;some message %s&quot;, obj); where %s will be replaced by obj.&amp;nbsp; My test shows that this actually slows down logging speed instead of improving it.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/2194895240059194728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/2194895240059194728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2194895240059194728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2194895240059194728'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/11/log4j-in-spring.html' title='Log4j in Spring'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-8775634833464742755</id><published>2010-10-29T20:45:00.004-04:00</published><updated>2010-10-29T22:55:27.800-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="displaytag"/><category scheme="http://www.blogger.com/atom/ns#" term="i18n"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>i18n Locale configuration with Spring</title><content type='html'>i18n with Spring is fairly easy.&lt;br /&gt;
&lt;br /&gt;
First of all, you&#39;ll need to declare a bean named&amp;nbsp;localeResolver.&amp;nbsp; &lt;span style=&quot;font-family: Courier New;&quot;&gt;DispatcherServlet&lt;/span&gt;&amp;nbsp;will automatically&amp;nbsp;looking for this bean when a request comes in.&amp;nbsp; Spring has AcceptHeaderLocaleResolver, CookieLocaleResolver, and SessionLocaleResolver.&amp;nbsp; In my case, I&#39;ll use SessionLocaleResolver to go with user sessions.&lt;br /&gt;
&lt;br /&gt;
Then you&#39;ll need to define a LocaleChangeInterceptor bean and list it in your url handler mapping&#39;s interceptors list.&lt;br /&gt;
&lt;br /&gt;
Here is my spring bean declaration:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;bean&amp;nbsp;id=&quot;localeChangeInterceptor&quot;&lt;br /&gt;
class=&quot;org.springframework.web.servlet.i18n.LocaleChangeInterceptor&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;paramName&quot;&amp;nbsp;value=&quot;lang&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean&amp;nbsp;id=&quot;localeResolver&quot;&lt;br /&gt;
class=&quot;org.springframework.web.servlet.i18n.SessionLocaleResolver&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean&amp;nbsp;id=&quot;handlerMapping&quot;&lt;br /&gt;
class=&quot;org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;interceptors&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&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&amp;nbsp;bean=&quot;localeChangeInterceptor&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
With above configuration, I can change the locale to it_IT with a link like http://localhost:8080/myApp/home.do?lang=it_IT&lt;br /&gt;
&lt;br /&gt;
In Java, there are serveral ways to get the locale:&lt;br /&gt;
1. If you know which locale resolver,&amp;nbsp;in my case SessionLocaleResolver,&amp;nbsp;I&amp;nbsp;use&lt;br /&gt;
&lt;blockquote&gt;Locale locale = (Locale) request.getSession().getAttribute( &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);&lt;/blockquote&gt;2. A universal way to get the locale&lt;br /&gt;
&lt;blockquote&gt;Locale locale = RequestContextUtils.getLocale(request);&lt;/blockquote&gt;3. Spring documentation says using RequestContext.getLocale() to get the locale.&amp;nbsp; However, getLocale is not a static method in RequestContext.&lt;br /&gt;
&lt;br /&gt;
To get the locale in JSP page:&lt;br /&gt;
&lt;blockquote&gt;${sessionScope[&#39;org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE&#39;]}&lt;/blockquote&gt;&lt;br /&gt;
If you are using displaytag, you&#39;ll need to add following configuration to displaytag.properties&lt;br /&gt;
&lt;blockquote&gt;locale.resolver=org.displaytag.localization.I18nSpringAdapter&lt;/blockquote&gt;&lt;br /&gt;
After all this, there is still one more problem -- no default Locale before user pick any.&lt;br /&gt;
There are couple ways to solve this:&lt;br /&gt;
1. If you want to force use a certain Locale, LocaleResolver has a setDefaultLocale method, so specify default Locale in localeResolver bean and we now have:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;bean&amp;nbsp;id=&quot;localeResolver&quot;&lt;br /&gt;
class=&quot;org.springframework.web.servlet.i18n.SessionLocaleResolver&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;defaultLocale&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean&amp;nbsp;class=&quot;java.util.Locale&quot;&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;constructor-arg&amp;nbsp;index=&quot;0&quot;&amp;nbsp;value=&quot;it&quot;/&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;constructor-arg&amp;nbsp;index=&quot;1&quot;&amp;nbsp;value=&quot;IT&quot;/&amp;gt;&lt;br /&gt;
&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;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/blockquote&gt;One downside with this approach.&amp;nbsp; In JSP page though, the default Locale value&amp;nbsp;can not be picked up using Expression Language above.&lt;br /&gt;
&lt;br /&gt;
2. If you want to use the user&#39;s browser&#39;s language preference, then you need to manually set the locale:&lt;br /&gt;
In Java:&lt;br /&gt;
&lt;blockquote&gt;request.getSession().setAttribute(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; request.getLocale());&lt;/blockquote&gt;In JSP (not actually setting the default locale in session, but use the browser default when there is no locale in session):&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;c:set&amp;nbsp;var=&quot;language&quot;&amp;gt;${sessionScope[&#39;org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE&#39;]}&amp;lt;/c:set&amp;gt;&lt;br /&gt;
&amp;lt;c:if&amp;nbsp;test=&quot;${empty&amp;nbsp;language}&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;c:set&amp;nbsp;var=&quot;language&quot;&amp;gt;${pageContext.request.locale}&amp;lt;/c:set&amp;gt;&lt;br /&gt;
&amp;lt;/c:if&amp;gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/8775634833464742755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/8775634833464742755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/8775634833464742755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/8775634833464742755'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/10/i18n-locale-configuration-with-spring.html' title='i18n Locale configuration with Spring'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-1628370921836036097</id><published>2010-10-16T22:18:00.007-04:00</published><updated>2010-11-09T23:17:58.407-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="JNLP"/><category scheme="http://www.blogger.com/atom/ns#" term="remote debug"/><category scheme="http://www.blogger.com/atom/ns#" term="standalone"/><category scheme="http://www.blogger.com/atom/ns#" term="Tomcat"/><category scheme="http://www.blogger.com/atom/ns#" term="web start"/><title type='text'>Remote Debug Web Start, Tomcat and Standalone Application</title><content type='html'>Remote debug web start is not as easy as applet.&amp;nbsp; Same setting for &lt;a href=&quot;http://outofkatieshead.blogspot.com/2010/10/remote-debug-applet.html&quot; linkindex=&quot;17&quot;&gt;applet&lt;/a&gt; doesn&#39;t work at all.&amp;nbsp; Finally, I managed to make it work with an alternative solution.&amp;nbsp; Instead of launching the web start from a web site, I downloaded the JNLP file and launched it from command line.&lt;br /&gt;
&lt;br /&gt;
My environment: Windows 7 64-bit, JDK 6 Update 14, MyEclipse for Spring.&lt;br /&gt;
Here is what I did:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDmvmlP58F5eAreUjcyMkYWoAygopOrjyyF6KraqwjcDZ160oiWtxBvVru0JnS2mqEbAbwXYNbWVhtBuevMZARUUqugPcbieLr4W11jYnIdshoNu-PX9cM0BYHh5s5xMjT2tQCMsAM8LoC/s1600/blockremote.PNG&quot; imageanchor=&quot;1&quot; linkindex=&quot;18&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;80&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDmvmlP58F5eAreUjcyMkYWoAygopOrjyyF6KraqwjcDZ160oiWtxBvVru0JnS2mqEbAbwXYNbWVhtBuevMZARUUqugPcbieLr4W11jYnIdshoNu-PX9cM0BYHh5s5xMjT2tQCMsAM8LoC/s400/blockremote.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;No need to setup Runtime Parameters in Java Control Panel this time. &lt;/li&gt;
&lt;li&gt;I used port 8200 for remote debug.&lt;/li&gt;
&lt;li&gt;server=y must be used&lt;/li&gt;
&lt;li&gt;suspend can be y or n.&amp;nbsp; If suspend=n, then Web Start will launch right away.&amp;nbsp; But if suspend=y, Web Start will not launch until a debugger is attached to port 8200.&lt;/li&gt;
&lt;li&gt;In Eclipse/MyEclipse, Debug Configuration must use Socket Attach as Connection Type and use port 8200.&lt;/li&gt;
&lt;/ol&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGQJaW8L9CLSHa_iMeoBopvicY-yez-rY4zhKeynkTbAl2dgk6ShGk6dNb29a5YijFQa9QWl58bz-CEM7V8CHzyt61ENdeX-gneyVaSBhV8V95mb7nSdC8bVwUrAZ7KHX0vLYsLf1SdvZb/s1600/webstart.PNG&quot; imageanchor=&quot;1&quot; linkindex=&quot;19&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;286&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGQJaW8L9CLSHa_iMeoBopvicY-yez-rY4zhKeynkTbAl2dgk6ShGk6dNb29a5YijFQa9QWl58bz-CEM7V8CHzyt61ENdeX-gneyVaSBhV8V95mb7nSdC8bVwUrAZ7KHX0vLYsLf1SdvZb/s400/webstart.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Remote debug Tomcat or other standalone application is very similar to Web Start.  However, the runtime parameters have to be added to the application&#39;s start script.  And in this case, suspend is better to set to n so that the application will not wait for a debugger to attach.  Since this type of application is most likely deployed to a remote server, Host in Debug Configuration also needs to match the corresponding domain.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/1628370921836036097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/1628370921836036097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1628370921836036097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1628370921836036097'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/10/remote-debug-web-start-application.html' title='Remote Debug Web Start, Tomcat and Standalone Application'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDmvmlP58F5eAreUjcyMkYWoAygopOrjyyF6KraqwjcDZ160oiWtxBvVru0JnS2mqEbAbwXYNbWVhtBuevMZARUUqugPcbieLr4W11jYnIdshoNu-PX9cM0BYHh5s5xMjT2tQCMsAM8LoC/s72-c/blockremote.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-3591718878218652881</id><published>2010-10-14T21:14:00.066-04:00</published><updated>2010-11-09T22:15:32.103-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="applet"/><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="remote debug"/><title type='text'>Remote Debug an Applet</title><content type='html'>Remote debug is relatively new to me.&amp;nbsp; But after a few days of trying, I finally got a hand of it.&amp;nbsp; Remote debug applet is the easiest and first in success during my experiment.&lt;br /&gt;
&lt;br /&gt;
My environment: Windows 7 64-bit, IE8, JRE 6 Update 21, MyEclipse for Spring. &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Go to Start --&amp;gt; Control Panel --&amp;gt; Java (32 bit), this will open the Java Control Panel.&lt;/li&gt;
&lt;li&gt;Go to Java Tab and click on View...&lt;/li&gt;
&lt;li&gt;Add &quot;-Xdebug -Xrunjdwp:transport=dt_socket,address=9000,suspend=y&quot; to  the Runtime Parameters&lt;/li&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFcIX3V-1iMGoutyMwv38d8rtYKY-KPtgaa0xOaIh2d61F_GDi4qxUzVhIW1VE-JsiuLM_gpw8WywrhXKsDHws_T9qc__j0pTY31h0e69tRF2ozALRbXpNR9lqvuSSItVTlzAg5diz7sKo/s1600/JavaControlPanel.png&quot; imageanchor=&quot;1&quot; linkindex=&quot;21&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;394&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFcIX3V-1iMGoutyMwv38d8rtYKY-KPtgaa0xOaIh2d61F_GDi4qxUzVhIW1VE-JsiuLM_gpw8WywrhXKsDHws_T9qc__j0pTY31h0e69tRF2ozALRbXpNR9lqvuSSItVTlzAg5diz7sKo/s400/JavaControlPanel.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;In Eclipse/MyEclipse, click Debug --&amp;gt; Debug Configurations ... from toolbar.&lt;/li&gt;
&lt;li&gt;Add a new configuration under Remote Java Application.&amp;nbsp; Make sure you use Socket Listen as Connection Type.&amp;nbsp; Also match the port, which is 9000 in my case.&lt;/li&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3wgvSDlM6SwzscmPFFg8keU0MFflN0q73sohkDfCeCQNgyhtlAoQG0Qw4TaraTjWSQGvPnOdNNv44ABFHyXRzt-JHYWZM2eIxmT9bUzMXKJv_KIevGXMcSHkfvKyDIdpA6lnTLVNk4xPz/s1600/applet.PNG&quot; imageanchor=&quot;1&quot; linkindex=&quot;22&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;285&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3wgvSDlM6SwzscmPFFg8keU0MFflN0q73sohkDfCeCQNgyhtlAoQG0Qw4TaraTjWSQGvPnOdNNv44ABFHyXRzt-JHYWZM2eIxmT9bUzMXKJv_KIevGXMcSHkfvKyDIdpA6lnTLVNk4xPz/s400/applet.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;Now start the Debug Configuration just added, Applet in my case.  You&#39;ll see in Progress panel that port 9000 is being listened.&lt;/li&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3LINe0dtQ5UctaVLdr8hzKF81umcbtOqpUIuvmssLemXRjtJAg_emk-pvscZ8zEo7UH6bU12Fly7z0FyQ4gb3SaYVuruQ_knZxxNYytqFQyI9HniODRwzBIE7gaFONvGIQkKb0RB6zX8I/s1600/progress.PNG&quot; imageanchor=&quot;1&quot; linkindex=&quot;23&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3LINe0dtQ5UctaVLdr8hzKF81umcbtOqpUIuvmssLemXRjtJAg_emk-pvscZ8zEo7UH6bU12Fly7z0FyQ4gb3SaYVuruQ_knZxxNYytqFQyI9HniODRwzBIE7gaFONvGIQkKb0RB6zX8I/s1600/progress.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;Add break point in code and launch the applet. &lt;/li&gt;
&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/3591718878218652881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/3591718878218652881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/3591718878218652881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/3591718878218652881'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/10/remote-debug-applet.html' title='Remote Debug an Applet'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFcIX3V-1iMGoutyMwv38d8rtYKY-KPtgaa0xOaIh2d61F_GDi4qxUzVhIW1VE-JsiuLM_gpw8WywrhXKsDHws_T9qc__j0pTY31h0e69tRF2ozALRbXpNR9lqvuSSItVTlzAg5diz7sKo/s72-c/JavaControlPanel.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-2913897448483683001</id><published>2010-07-30T20:07:00.000-04:00</published><updated>2010-10-30T20:30:23.618-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JMX"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>JMX with Spring and Annotation (Part 3)</title><content type='html'>A few problems I encountered during the whole setup process.&lt;br /&gt;
1. In the CustomJMXAuthenticator&#39;s authenticate method, my original code was:&lt;br /&gt;
&lt;blockquote&gt;public Subject authenticate(Object credentials) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(credentials == null || !(credentials instanceof String[]))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new SecurityException(&quot;Credentials are required!&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; String[] info = (String[]) credentials;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Subject subject = new Subject();&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(StringUtils.equals(info[0], userName)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp; StringUtils.equals(info[1], password))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subject.getPrincipals().add(new JMXPrincipal(userName));&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return subject;&lt;/span&gt;&lt;br /&gt;
}&lt;/blockquote&gt;This works fine in Java 6 Jconsole, incorrect user name and password will result in access deny.&amp;nbsp; However, in Java 5 Jconsole, CustomJMXAuthenticator becomes useless.&amp;nbsp; Turns out, in Java 5, as long as a subject is returned, Jconsole will consider the authentication is a success.&amp;nbsp; So I have to throw a SecurityException to make the authentication work in Java 5.&lt;br /&gt;
&lt;br /&gt;
2. Timing issue in Spring beans.&amp;nbsp; registry bean has to be fully created before serverConnector bean is being created.&amp;nbsp; Otherwise, Spring will throw exception at runtime.&amp;nbsp; For it to work, I have to put registry bean&amp;nbsp;in the top of the context file and serverConnector bean at the bottom.&lt;br /&gt;
&lt;br /&gt;
3.&amp;nbsp;Linux system has a known&amp;nbsp;issue with JMX&amp;nbsp;remote access.&amp;nbsp; The issue is that when resolving host, if no java.rmi.server.hostname property is defined, it will return ip address 127.0.1.1 instead of 127.0.0.1.&amp;nbsp; The solution then is set java.rmi.server.hostname to localhost in system property as well as environment map in serverConnector bean.&amp;nbsp; So aside from the Spring configuration in &lt;a href=&quot;http://outofkatieshead.blogspot.com/2010/07/jmx-with-spring-and-annotation-part-2.html&quot;&gt;Part 2&lt;/a&gt;.&amp;nbsp; I also added following code before registry bean:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;bean&amp;nbsp;class=&quot;org.springframework.beans.factory.config.MethodInvokingFactoryBean&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;staticMethod&quot;&amp;nbsp;value=&quot;java.lang.System.setProperty&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&quot;arguments&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&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;java.rmi.server.hostname&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;lt;value&amp;gt;localhost&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/2913897448483683001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/2913897448483683001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2913897448483683001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2913897448483683001'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/07/jmx-with-spring-and-annotation-part-3.html' title='JMX with Spring and Annotation (Part 3)'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-4615657273641379889</id><published>2010-07-30T19:16:00.074-04:00</published><updated>2010-10-30T20:06:24.170-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Annotation"/><category scheme="http://www.blogger.com/atom/ns#" term="JMX"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>JMX with Spring and Annotation (Part 2)</title><content type='html'>Now that MBeanExporter is setup, we need to set the server-side connector to expose the MBeanServer.&lt;br /&gt;
&lt;br /&gt;
For security concern, I decide to add in JMX authentication.&amp;nbsp; It is very complicated to setup&amp;nbsp;with Java&#39;s configuration.&amp;nbsp; However, I managed to do so with Spring with two simple steps:&lt;br /&gt;
1. CustomJMXAuthenticator.java&lt;br /&gt;
&lt;blockquote&gt;package com.my.company.server; &lt;br /&gt;
&lt;br /&gt;
import javax.management.remote.JMXAuthenticator;&lt;br /&gt;
import javax.management.remote.JMXPrincipal;&lt;br /&gt;
import javax.security.auth.Subject;&lt;br /&gt;
&lt;br /&gt;
import org.apache.commons.lang.StringUtils;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
&amp;nbsp;* @author Yaohua Wang&lt;br /&gt;
&amp;nbsp;*&lt;br /&gt;
&amp;nbsp;*/&lt;br /&gt;
public class CustomJMXAuthenticator implements JMXAuthenticator {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private String userName;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private String password;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setUserName(String userName) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.userName = userName;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPassword(String password) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.password = password;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public Subject authenticate(Object credentials) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(credentials == null &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;|| !(credentials instanceof String[]))&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; throw new SecurityException(&quot;Credentials are required!&quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;String[] info = (String[]) credentials;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(StringUtils.equals(info[0], userName)&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;amp;&amp;amp; StringUtils.equals(info[1], password)){&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;Subject subject = new Subject();&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; subject.getPrincipals().add(new JMXPrincipal(userName));&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; return subject;&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; throw new SecurityException(&quot;Unable to match credentials!&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/blockquote&gt;&lt;br /&gt;
2. Spring configuration:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;bean&amp;nbsp;id=&quot;registry&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&quot;org.springframework.remoting.rmi.RmiRegistryFactoryBean&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; destroy-method=&quot;destroy&quot;&amp;nbsp;autowire=&quot;no&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;port&quot;&amp;nbsp;value=&quot;1099&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;alwaysCreate&quot;&amp;nbsp;value=&quot;true&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;bean&amp;nbsp;id=&quot;serverConnector&quot;&amp;nbsp;class=&quot;org.springframework.jmx.support.ConnectorServerFactoryBean&quot;&amp;nbsp;autowire=&quot;no&quot;&amp;nbsp;depends-on=&quot;registry&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;objectName&quot;&amp;nbsp;value=&quot;connector:name=rmi&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;serviceUrl&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value=&quot;service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;threaded&quot;&amp;nbsp;value=&quot;true&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;daemon&quot;&amp;nbsp;value=&quot;true&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;environmentMap&quot;&amp;gt;&lt;br /&gt;
&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;lt;entry&amp;nbsp;key=&quot;java.rmi.server.hostname&quot;&amp;nbsp;value=&quot;localhost&quot;/&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;entry&amp;nbsp;key=&quot;jmx.remote.authenticator&quot;&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;bean&lt;br /&gt;
class=&quot;com.my.company.server.CustomJMXAuthenticator&quot;&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;property&amp;nbsp;name=&quot;userName&quot;&amp;nbsp;value=&quot;jmxuser&quot;/&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;property&amp;nbsp;name=&quot;password&quot;&amp;nbsp;value=&quot;jmxpassword&quot;/&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;/bean&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;/entry&amp;gt;&lt;br /&gt;
&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;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
Now start the server and&amp;nbsp;open jconsole.&amp;nbsp; Type in following information:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Remote Process: localhost:1099&lt;/li&gt;
&lt;li&gt;User Name: jmxuser&lt;/li&gt;
&lt;li&gt;Password: jmxpassword&lt;/li&gt;
&lt;/ul&gt;You should see the domain &quot;ChannelServer&quot; in MBeans tab.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/4615657273641379889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/4615657273641379889' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/4615657273641379889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/4615657273641379889'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/07/jmx-with-spring-and-annotation-part-2.html' title='JMX with Spring and Annotation (Part 2)'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-4096379747516109183</id><published>2010-07-29T22:59:00.002-04:00</published><updated>2010-10-30T19:16:01.619-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Annotation"/><category scheme="http://www.blogger.com/atom/ns#" term="JMX"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>JMX with Spring and Annotation (Part 1)</title><content type='html'>I was working on migrating&amp;nbsp;a standalone server to Spring&amp;nbsp;when I started looking into Spring&#39;s JMX support.&amp;nbsp; And then I found how convienent it is to use Annotation to define MBeans instead of creating MBean interfaces.&lt;br /&gt;
&lt;br /&gt;
First of all, I got rid of the old MBean interface:&lt;br /&gt;
ServerMBean.java&lt;br /&gt;
&lt;blockquote&gt;package com.my.company.server;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
&lt;br /&gt;
public interface ServerMBean {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getName() throws IOException;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getVersion() throws IOException;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public long getChannelCount() throws IOException;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void shutdown() throws IOException;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void sendMessage(String message) throws IOException;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String[] getLoggers() throws IOException;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getLogLevel(String category) throws IOException;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setLogLevel(String category, String level) throws IOException; &lt;br /&gt;
}&lt;/blockquote&gt;And rewrite the Server class like:&lt;br /&gt;
&lt;blockquote&gt;package com.my.company.server;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Collections;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
&lt;br /&gt;
import org.apache.log4j.Level;&lt;br /&gt;
import org.apache.log4j.LogManager;&lt;br /&gt;
import org.apache.log4j.Logger;&lt;br /&gt;
import org.springframework.jmx.export.annotation.ManagedAttribute;&lt;br /&gt;
import org.springframework.jmx.export.annotation.ManagedOperation;&lt;br /&gt;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;&lt;br /&gt;
import org.springframework.jmx.export.annotation.ManagedOperationParameters;&lt;br /&gt;
import org.springframework.jmx.export.annotation.ManagedResource;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedResource(objectName=&quot;ChannelServer:type=Server&quot;, description=&quot;Server&quot;)&lt;/span&gt;&lt;br /&gt;
public class Server {&lt;br /&gt;
&lt;br /&gt;
protected Logger log = Logger.getLogger(getClass());&lt;br /&gt;
&lt;br /&gt;
private String name;&lt;br /&gt;
private String version;&lt;br /&gt;
private long uptime;&lt;br /&gt;
private int channelCount;&lt;br /&gt;
&lt;br /&gt;
protected Server(String name, String version) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.name = name;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.version = version;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedAttribute(description=&quot;Server Name&quot;)&lt;/span&gt;&lt;br /&gt;
public String getName() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedAttribute(description=&quot;Server Version&quot;)&lt;/span&gt;&lt;br /&gt;
public String getVersion() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return version;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public long getUpTime() {&lt;br /&gt;
return uptime;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedAttribute(description=&quot;Channel Count&quot;)&lt;/span&gt;&lt;br /&gt;
public long getChannelCount() throws IOException {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.channelCount;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperation(description=&quot;Shutdown Server&quot;)&lt;/span&gt;&lt;br /&gt;
public void shutdown() throws IOException {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; stop();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperation(description=&quot;Send a message&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperationParameters({&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ManagedOperationParameter(name=&quot;msg&quot;, description=&quot;message&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;})&lt;/span&gt;&lt;br /&gt;
public void sendMessage(String msg) throws IOException {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //blah blah&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperation(description=&quot;Set log level to the given category&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperationParameters({&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ManagedOperationParameter(name=&quot;category&quot;, description=&quot;category&quot;),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ManagedOperationParameter(name=&quot;level&quot;, description=&quot;log level&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;})&lt;/span&gt;&lt;br /&gt;
public void setLogLevel(String category, String level) throws IOException {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; log.warn(&quot;Setting log level &quot; + level + &quot; for &quot; + category);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Level logLevel = Level.toLevel(level);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; LogManager.getLogger(category).setLevel(logLevel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperation(description=&quot;Log level for given category&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperationParameters({&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ManagedOperationParameter(name=&quot;category&quot;, description=&quot;category&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;})&lt;/span&gt;&lt;br /&gt;
public String getLogLevel(String category) throws IOException {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return LogManager.getLogger(category).getLevel().toString();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;@ManagedOperation(description=&quot;List of loggers&quot;)&lt;/span&gt;&lt;br /&gt;
public String[] getLoggers() throws IOException {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Enumeration&amp;lt;?&amp;gt; loggers = LogManager.getCurrentLoggers();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayList&amp;lt;String&amp;gt; loggerList = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (loggers.hasMoreElements()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Logger logger = (Logger)loggers.nextElement();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;loggerList.add(logger.getName());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Collections.sort(loggerList);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return loggerList.toArray(new String[0]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public final void start() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; log.info(&quot;Starting channel server...&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //blah blah&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uptime = System.currentTimeMillis();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception ex) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.fatal(&quot;Error starting channel server&quot;, ex);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stop();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public final void stop() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; log.info(&quot;Shutting down channel server...&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //blah blah&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Throwable e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log.error(&quot;error stopping container&quot;, e);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.exit(1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; log.info(&quot;Shutdown completed&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; System.exit(0);&lt;br /&gt;
}&lt;br /&gt;
}&lt;/blockquote&gt;Now let&#39;s moving on to Spring configuration. First, define the MBeanExporter:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;bean&amp;nbsp;name=&quot;jmxAttributeSource&quot;&amp;nbsp;class=&quot;org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource&quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean&amp;nbsp;id=&quot;exporter&quot;&amp;nbsp;class=&quot;org.springframework.jmx.export.MBeanExporter&quot;&amp;nbsp;lazy-init=&quot;false&quot;&amp;nbsp;autowire=&quot;no&quot;&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;nbsp;name=&quot;autodetect&quot;&amp;nbsp;value=&quot;true&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;nbsp;name=&quot;assembler&quot;&amp;gt;&lt;br /&gt;
&amp;lt;bean&amp;nbsp;class=&quot;org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler&quot;&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;nbsp;name=&quot;attributeSource&quot;&amp;nbsp;ref=&quot;jmxAttributeSource&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;nbsp;name=&quot;namingStrategy&quot;&amp;gt;&lt;br /&gt;
&amp;lt;bean&amp;nbsp;class=&quot;org.springframework.jmx.export.naming.MetadataNamingStrategy&quot;&amp;gt;&lt;br /&gt;
&amp;lt;property&amp;nbsp;name=&quot;attributeSource&quot;&amp;nbsp;ref=&quot;jmxAttributeSource&quot;/&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;/blockquote&gt;An much simpler alternative:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;beans&amp;nbsp;default-autowire=&quot;byName&quot;&lt;br /&gt;
xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;xmlns:context=&quot;http://www.springframework.org/schema/context&quot;&lt;/span&gt;&lt;br /&gt;
xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans&amp;nbsp;http://www.springframework.org/schema/beans/spring-beans.xsd&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;http://www.springframework.org/schema/context&amp;nbsp;http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;/span&gt;&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context:mbean-export/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/4096379747516109183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/4096379747516109183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/4096379747516109183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/4096379747516109183'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/07/jmx-with-spring-and-annotation-part-1.html' title='JMX with Spring and Annotation (Part 1)'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-3301699440924223142</id><published>2010-07-29T17:44:00.002-04:00</published><updated>2010-10-29T20:28:17.993-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Annotation"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="JAXB2"/><title type='text'>JAXB2 Annotations</title><content type='html'>It is scary to find out that a dependency of your project is no longer supported and you really need a code update. That&#39;s what happened to me when I requested the source code of one dependency and I was told no one can find it.&lt;br /&gt;
&lt;br /&gt;
The dependency I need to update is a JAXB client implementation to connect to liveglobalbid (lgb) - a leading developer of online auction software providing a high quality, real time simultaneous video and audio broadcast of a live auction sale. And surprisingly, I was able to get rid of the dependency along with the JAXB dependencies and use JAXB 2.0 API that comes with Java 5 and above.&amp;nbsp; Besides that, by using JAXB 2.0 Annotations, the new client implementation is simple and light.&lt;br /&gt;
&lt;br /&gt;
First, a sample xml I&#39;ll get from lgb:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;?xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;UTF-8&quot;&amp;nbsp;?&amp;gt;&lt;br /&gt;
&amp;lt;caster&amp;nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;
xsi:noNamespaceSchemaLocation=&quot;http://www.liveglobalbid.com/caster.xsd&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;pid&amp;gt;25717&amp;lt;/pid&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mountpoint&amp;nbsp;name=&quot;blah blah&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;source&amp;nbsp;id=&quot;9&quot;&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;sound&amp;lt;/type&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;remoteid&amp;gt;blah blah&amp;lt;/remoteid&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;average_frame_size&amp;gt;94&amp;lt;/average_frame_size&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;average_frame_rate&amp;gt;3.83&amp;lt;/average_frame_rate&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mountpoint&amp;gt;&lt;br /&gt;
&amp;lt;/caster&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
Basic structure here is:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Caster is the main object (XmlRootElement), which contains a pid and&amp;nbsp;one or more&amp;nbsp;mountpoint object (XmlElement).&lt;/li&gt;
&lt;li&gt;A&amp;nbsp;mountpoint object&amp;nbsp;has&amp;nbsp;one or more source object (XmlElement)&lt;/li&gt;
&lt;li&gt;A source has type, remoteid, average_frame_size, and average_frame_rate (XmlElement)&lt;/li&gt;
&lt;li&gt;So in total, we&#39;ll need&amp;nbsp;3 object models: Caster, MountPoint (XmlType), and Source (XmlType).&lt;/li&gt;
&lt;li&gt;MountPoint has an attribute called name (XmlAttribute)&lt;/li&gt;
&lt;li&gt;Source has an attribute called id (XmlAttribute)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Source.java&lt;br /&gt;
&lt;blockquote&gt;package com.my.company.caster.jaxb2; &lt;br /&gt;
&lt;br /&gt;
import javax.xml.bind.annotation.XmlAttribute;&lt;br /&gt;
import javax.xml.bind.annotation.XmlElement;&lt;br /&gt;
import javax.xml.bind.annotation.XmlType;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
&amp;nbsp;* @author k_wang&lt;br /&gt;
&amp;nbsp;*&lt;br /&gt;
&amp;nbsp;*/&lt;br /&gt;
@XmlType&lt;br /&gt;
public class Source {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlAttribute&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected int id;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected String type;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected String remoteid;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected int average_frame_size;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected double average_frame_rate;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * default constructor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public Source() { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp;full constructor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public Source(int id, String type, String remoteid,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;int average_frame_size, double average_frame_rate) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.id = id;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.type = type;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.remoteid = remoteid;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.average_frame_size = average_frame_size;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.average_frame_rate = average_frame_rate;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getId() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return id;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getType() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return type;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getRemoteid() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return remoteid;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getAverageFrameSize() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return average_frame_size;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getAverageFrameRate() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return average_frame_rate;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
MountPoint.java&lt;br /&gt;
&lt;blockquote&gt;package com.my.company.caster.jaxb2; &lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import javax.xml.bind.annotation.XmlAttribute;&lt;br /&gt;
import javax.xml.bind.annotation.XmlElement;&lt;br /&gt;
import javax.xml.bind.annotation.XmlType;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
&amp;nbsp;* @author k_wang&lt;br /&gt;
&amp;nbsp;*&lt;br /&gt;
&amp;nbsp;*/&lt;br /&gt;
@XmlType(name=&quot;mountpoint&quot;)&lt;br /&gt;
public class MountPoint {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlAttribute&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected String name;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected List&amp;lt;Source&amp;gt;&lt;source&gt;&lt;source&gt; source = new ArrayList&amp;lt;Source&amp;gt;&lt;source&gt;&lt;source&gt;();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public MountPoint() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param name&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param source&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public MountPoint(String name, List&amp;lt;Source&amp;gt;&lt;source&gt;&lt;source&gt; source) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.name = name;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(source != null)&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; this.source = source;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public String getName() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return name;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;Source&amp;gt;&lt;source&gt; getSource() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return source;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Caster.java&lt;br /&gt;
&lt;blockquote&gt;package com.my.company.caster.jaxb2; &lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import javax.xml.bind.annotation.XmlElement;&lt;br /&gt;
import javax.xml.bind.annotation.XmlRootElement;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
&amp;nbsp;* @author k_wang&lt;br /&gt;
&amp;nbsp;*&lt;br /&gt;
&amp;nbsp;*/&lt;br /&gt;
&amp;nbsp;@XmlRootElement(name=&quot;caster&quot;)&lt;br /&gt;
public class Caster {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected long pid;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @XmlElement&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected List&amp;lt;MountPoint&amp;gt;&lt;mountpoint&gt; mountpoint = new ArrayList&amp;lt;MountPoint&amp;gt;&lt;mountpoint&gt;();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public Caster() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public Caster(long pid, List&amp;lt;MountPoint&amp;gt;&lt;mountpoint&gt; mountpoint) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.pid = pid;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.mountpoint = mountpoint;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public long getPid() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pid;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;MountPoint&amp;gt;&lt;mountpoint&gt; getMountpoint() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mountpoint;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
And to get the Caster model from a URL:&lt;br /&gt;
&lt;blockquote&gt;public Caster getCaster(URL url) throws JAXBException { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Caster caster = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream in = url.openStream();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unmarshaller unmarshaller = JAXBContext.newInstance(Caster.class).createUnmarshaller();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; caster = (Caster) unmarshaller.unmarshal(new StreamSource(in));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; in.close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new JAXBException(&quot;Unable to parse source input stream: &quot;, e);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return caster;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/3301699440924223142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/3301699440924223142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/3301699440924223142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/3301699440924223142'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/07/jaxb2-annotations.html' title='JAXB2 Annotations'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-2027127959036406755</id><published>2010-07-20T12:14:00.052-04:00</published><updated>2010-10-30T14:23:54.416-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Basic Authentication"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring Security"/><title type='text'>Basic Authentication with Spring Security (Part 3)</title><content type='html'>Basic&amp;nbsp;authentication with Spring Security&amp;nbsp;works great in my application until a web site is trying to access my application by pass in Authorization information through parameter instead of request header.&amp;nbsp; I have to create a CustomBasicProcessingFilter to handle the special case, which leads to my new application context configuration:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;security:http&amp;nbsp;auto-config=&quot;false&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; access-denied-page=&quot;/noaccess.jsp&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; session-fixation-protection=&quot;none&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: yellow;&quot;&gt;entry-point-ref=&quot;authenticationEntryPoint&quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/helper*&quot;&amp;nbsp;filters=&quot;none&quot;&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/index.jsp*&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&quot;ROLE_ANONYMOUS&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/logout.*&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&quot;ROLE_ANONYMOUS&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/401.jsp*&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&quot;ROLE_ANONYMOUS&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/noaccess.jsp*&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&quot;ROLE_ANONYMOUS&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/*.do*&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&quot;ROLE_USER&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:http-basic/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:anonymous&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:logout&amp;nbsp;logout-url=&quot;/logout.do&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; logout-success-url=&quot;/logout.html&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;security:concurrent-session-control&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max-sessions=&quot;1&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exception-if-maximum-exceeded=&quot;true&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/security:http&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;security:authentication-provider&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; user-service-ref=&quot;authenticationProvider&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean&amp;nbsp;name=&quot;authenticationProvider&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&quot;com.my.company.web.CustomUserDetailsService&quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;security:authentication-manager&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; alias=&quot;authenticationManager&quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;lt;bean&amp;nbsp;id=&quot;authenticationEntryPoint&quot;&amp;nbsp;class=&quot;org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&quot;realmName&quot;&amp;nbsp;value=&quot;My&amp;nbsp;Realm&quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;lt;bean&amp;nbsp;id=&quot;customFilter&quot;&amp;nbsp;class=&quot;com.my.company.web.CustomBasicProcessingFilter&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security:custom-filter&amp;nbsp;after=&quot;BASIC_PROCESSING_FILTER&quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;As you can see from above, Spring Security&#39;s Basic Authentication is still in use.&amp;nbsp; However, when this failed, CustomBasicProcessingFilter will be called to retry authentication.&lt;br /&gt;
&lt;br /&gt;
entry-point-ref in security:http&amp;nbsp;is a must for custom filters.&amp;nbsp; Without it, the application won&#39;t work at all.&lt;br /&gt;
&lt;br /&gt;
One more think you&#39;ll need to watch out when adding custom filter.&amp;nbsp; If you have more than one servlet defined in web.xml but not all of them requires authentication, you might need to add them to the configuration for exclusion even if it was working without the configuration before the custom filter.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/2027127959036406755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/2027127959036406755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2027127959036406755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/2027127959036406755'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/07/basic-authentication-with-spring.html' title='Basic Authentication with Spring Security (Part 3)'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-6825082740864877436</id><published>2010-06-07T12:36:00.000-04:00</published><updated>2010-11-10T00:38:09.934-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="log4j"/><category scheme="http://www.blogger.com/atom/ns#" term="velocity"/><title type='text'>Velocity Template in Web Application</title><content type='html'>I don&#39;t use Velocity a lot.&amp;nbsp; Initially, I was just using it for mail templates in a standalone application.&amp;nbsp; The setup is simple:&lt;br /&gt;
&lt;blockquote&gt;VelocityEngine velocity = new VelocityEngine();&lt;br /&gt;
velocity.setProperty(Velocity.RESOURCE_LOADER, &quot;class&quot;);&lt;br /&gt;
velocity.setProperty(&quot;class.resource.loader.class&quot;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ClasspathResourceLoader.class.getName());&lt;br /&gt;
velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM_CLASS, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log4JLogChute.class.getName());&lt;br /&gt;
velocity.setProperty(&quot;runtime.log.logsystem.log4j.logger&quot;, &quot;mail&quot;);&lt;/blockquote&gt;Here I use ClasspathResourceLoader along with Log4j as logging method.&lt;br /&gt;
&lt;br /&gt;
Then I decide to use Velocity again in a web application.  To use Velocity in web application, however, you&#39;ll need a WebappResourceLoader.&amp;nbsp; WebappResourceLoader is available in VelocityTools.&amp;nbsp; However, you can always write your own.&lt;br /&gt;
&lt;br /&gt;
Since I only needed this one class, I copied over the class from VelocityTools and made following configuration in my servlet:&lt;br /&gt;
&lt;blockquote&gt;VelocityEngine velocity = new VelocityEngine();&lt;br /&gt;
velocity.setProperty(Velocity.RESOURCE_LOADER, &quot;webapp&quot;);&lt;br /&gt;
velocity.setProperty(&quot;webapp.resource.loader.class&quot;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebappResourceLoader.class.getName());&lt;br /&gt;
velocity.setProperty(&quot;webapp.resource.loader.path&quot;, &quot;/templates/&quot;);&lt;br /&gt;
velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM_CLASS,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServletLogChute.class.getName());&lt;/blockquote&gt;I did try using Log4JLogChute, but somehow couldn&#39;t get it to log messages.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/6825082740864877436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/6825082740864877436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/6825082740864877436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/6825082740864877436'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/11/velocity-template-in-web-application.html' title='Velocity Template in Web Application'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-6726548590850711684</id><published>2010-03-31T09:58:00.042-04:00</published><updated>2010-10-30T10:28:30.432-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Basic Authentication"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring Security"/><title type='text'>Basic Authentication with Spring Security (Part 2)</title><content type='html'>So I double checked my configuration, nothing seems to be wrong.&amp;nbsp; In the end, I managed to get it to work for the first time with following added&amp;nbsp;configuration:&lt;br /&gt;
In web.xml&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;login-config&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;auth-method&amp;gt;BASIC&amp;lt;/auth-method&amp;gt;&lt;br /&gt;
&amp;lt;/login-config&amp;gt;&lt;br /&gt;
&amp;lt;error-page&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;error-code&amp;gt;401&amp;lt;/error-code&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;location&amp;gt;/WEB-INF/jsp/errors/401.jsp&amp;lt;/location&amp;gt;&lt;br /&gt;
&amp;lt;/error-page&amp;gt;&lt;/blockquote&gt;401.jsp&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;%&lt;br /&gt;
&amp;nbsp;&amp;nbsp;response.setHeader(&quot;WWW-Authenticate&quot;,&amp;nbsp;&quot;BASIC&amp;nbsp;realm=\&quot;My&amp;nbsp;Realm\&quot;&quot;);&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta&amp;nbsp;http-equiv=&quot;refresh&quot;&amp;nbsp;content=&quot;1;url=https://www.mysite.com/subscribe/&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;HTTP&amp;nbsp;Status&amp;nbsp;401&amp;lt;/h1&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unauthorized&amp;nbsp;Access.&amp;nbsp;&amp;nbsp;Redirecting&amp;nbsp;to&amp;nbsp;registration&amp;nbsp;page...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
Update: I was able to get the application running without above configuration.&amp;nbsp; All I need is moving the response.setHeader code to my welcome-file specified in the web.xml file, in my case, index.jsp.&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;%&lt;br /&gt;
&amp;nbsp;&amp;nbsp;response.setHeader(&quot;WWW-Authenticate&quot;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;BASIC realm=\&quot;My&amp;nbsp;Realm\&quot;&quot;);&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&amp;lt;%@&amp;nbsp;page&amp;nbsp;language=&quot;java&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; contentType=&quot;text/html;&amp;nbsp;charset=UTF-8&quot;%&amp;gt;&lt;br /&gt;
&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;prefix=&quot;c&quot;&amp;nbsp;uri=&quot;http://java.sun.com/jsp/jstl/core&quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;
&amp;lt;c:redirect&amp;nbsp;url=&quot;/home.do&quot;&amp;nbsp;/&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
Although I specified a logout in Spring Security configuration, it doesn&#39;t work very well.&amp;nbsp; Unless I close down all browsers opened at the same time, I&#39;ll be logged right back in&amp;nbsp;by the browser&#39;s memory cache.&amp;nbsp; So I ended up adding a &quot;You are now logged out!&amp;nbsp; Please close the main window to clean up browser cache!&quot; message&amp;nbsp;in the logout.html page.&amp;nbsp; And finally, Business decided to remove the logout link on the page.&amp;nbsp; Looks like a form-based authentication is a better choice.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/6726548590850711684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/6726548590850711684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/6726548590850711684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/6726548590850711684'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/03/basic-authentication-with-spring_31.html' title='Basic Authentication with Spring Security (Part 2)'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-4628349760552201045</id><published>2010-03-30T23:00:00.002-04:00</published><updated>2010-10-30T09:33:41.417-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Basic Authentication"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring Security"/><title type='text'>Basic Authentication with Spring Security (Part 1)</title><content type='html'>About two years back, I learned to authenticate a user using CAS.&amp;nbsp; Back then, we were using a business customized framework integrated with Spring and Struts.&amp;nbsp; And there are a lot Java coding in the default jsp page to make the authentication work.&lt;br /&gt;
&lt;br /&gt;
This year, I&#39;m working on migrating an old project to Spring framework.&amp;nbsp; For the web application, I decide to use Spring Security to replace the custom Basic Authentication machanism implemented by the previous developer.&lt;br /&gt;
&lt;br /&gt;
On my first tryout, I have following added to existing&amp;nbsp;configuration:&lt;br /&gt;
In web.xml&lt;br /&gt;
&lt;blockquote&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;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; org.springframework.web.filter.DelegatingFilterProxy&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/filter-class&amp;gt;&lt;br /&gt;
&amp;lt;/filter&amp;gt;&lt;br /&gt;
&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;lt;/filter-mapping&amp;gt;&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;listener-class&amp;gt;&lt;br /&gt;
org.springframework.security.ui.session.HttpSessionEventPublisher&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
In application context file, first add schema delaration:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;beans&amp;nbsp;default-autowire=&quot;byName&quot;&amp;nbsp;default-lazy-init=&quot;true&quot;&lt;br /&gt;
xmlns:security=&quot;http://www.springframework.org/schema/security&quot;&lt;br /&gt;
xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;
xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans&lt;br /&gt;
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;
http://www.springframework.org/schema/security&lt;br /&gt;
http://www.springframework.org/schema/security/spring-security-2.0.4.xsd&quot;&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;
Then add security configuration:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;security:http&amp;nbsp;auto-config=&quot;false&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; access-denied-page=&quot;/noaccess.jsp&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; session-fixation-protection=&quot;none&quot;&amp;gt;&lt;br /&gt;
&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/index.jsp*&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&quot;ROLE_ANONYMOUS&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/logout.*&quot; filters=&quot;none&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/noaccess.jsp*&quot; filters=&quot;none&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;security:intercept-url&amp;nbsp;pattern=&quot;/*.do*&quot; access=&quot;ROLE_USER&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;security:http-basic&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;security:anonymous&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;security:logout&amp;nbsp;logout-url=&quot;/logout.do&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; logout-success-url=&quot;/logout.html&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;security:concurrent-session-control&amp;nbsp;max-sessions=&quot;1&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; exception-if-maximum-exceeded=&quot;true&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;/security:http&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;security:authentication-provider&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; user-service-ref=&quot;authenticationProvider&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bean&amp;nbsp;name=&quot;authenticationProvider&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&quot;com.my.company.web.CustomUserDetailsService&quot;&amp;nbsp;/&amp;gt;&lt;/blockquote&gt;So far, everything is&amp;nbsp;by Spring Security&#39;s documentation.&lt;br /&gt;
&lt;br /&gt;
I need to use a CustomUserDetailsService which creates a CustomUserDetails object upon authentication process.&amp;nbsp; Besides&amp;nbsp;authenticate a user, I also need a Customer object from CustomUserDetails&amp;nbsp;to determin whether a user has certain authority to access certain area in the same page.&amp;nbsp; And in the Java code, I can get the Customer object by following code:&lt;br /&gt;
&lt;blockquote&gt;public static Customer getCustomer() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Object obj = SecurityContextHolder.getContext()&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .getAuthentication().getPrincipal();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (obj != null &amp;amp;&amp;amp; obj instanceof CustomUserDetails)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ((CustomUserDetails) obj).getCustomer();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br /&gt;
}&lt;/blockquote&gt;&lt;br /&gt;
At this point, everything seems to be in place except that when I run the application, it always gives me a&amp;nbsp;HTTP Status 401 (Unauthorized Access).</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/4628349760552201045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/4628349760552201045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/4628349760552201045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/4628349760552201045'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/03/basic-authentication-with-spring.html' title='Basic Authentication with Spring Security (Part 1)'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-1633419984392073586</id><published>2010-01-06T20:35:00.115-05:00</published><updated>2010-10-30T21:51:31.088-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JNDI"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="Tomcat"/><title type='text'>Tomcat + JNDI DataSource + Spring</title><content type='html'>One tedious thing to do in project development is to keep track of configurations for different environment.&amp;nbsp; What happens often in a release is a wrong configuration causing the whole project to be rebuilt.&amp;nbsp; DataSource is one of the most common configuration.&lt;br /&gt;
&lt;br /&gt;
And when Tech Op suggested to move configuration from project to them, I first started with setting up JNDI DataSource in Tomcat.&lt;br /&gt;
&lt;br /&gt;
On Tomcat side, there are two places need to be configured:&lt;br /&gt;
1. Add the JDBC jar to Tomcat&#39;s library,&amp;nbsp;for Tomcat 5.5, in common/lib directory.&lt;br /&gt;
2. Add&amp;nbsp;the&amp;nbsp;&lt;a href=&quot;http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html&quot;&gt;DataSource&lt;/a&gt; as a&amp;nbsp;Resource to server.xml under GlobalNamingResources:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;Resource&amp;nbsp;name=&quot;myApp&quot;&amp;nbsp;auth=&quot;Container&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&quot;javax.sql.DataSource&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; driverClassName=&quot;oracle.jdbc.OracleDriver&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; url=&quot;jdbc:oracle:thin:@&amp;lt;oracle&amp;nbsp;db&amp;nbsp;connection&amp;nbsp;string&amp;gt;&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;username=&quot;&amp;lt;user&amp;nbsp;name&amp;gt;&quot;&amp;nbsp;password=&quot;&amp;lt;password&amp;gt;&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;maxActive=&quot;10&quot;&amp;nbsp;maxIdle=&quot;5&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxWait=&quot;60000&quot;&amp;nbsp;removeAbandoned=&quot;true&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; removeAbandonedTimeout=&quot;60&quot;&amp;nbsp;logAbandoned=&quot;true&quot;/&amp;gt;&lt;/blockquote&gt;Note: removeAbandoned=”true”, removeAbandonedTimeout=”60” and logAbandoned=”true” is Tomcat’s recommended solution to prevent dB connection pool leaks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the project side, there are also two places need to be configured: &lt;br /&gt;
1. In the web application&#39;s root directory, create a META-INF directory if not exists.&amp;nbsp; And add a context.xml to META-INF with following content:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;Context&amp;nbsp;reloadable=&quot;true&quot;&amp;nbsp;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ResourceLink&amp;nbsp;name=&quot;jdbc/myApp&quot;&amp;nbsp;global=&quot;myApp&quot;&amp;nbsp;type=&quot;java.lang.Integer&quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;lt;/Context&amp;gt;&lt;/blockquote&gt;context.xml will be copied over to conf/Catalina/localhost with the the project&#39;s context name as file name&amp;nbsp;if the file doesn&#39;t exist.&amp;nbsp; So for the first time deployment, it is necessary to check the conf/Catalina/localhost directory and delete the context file if exists.&lt;br /&gt;
&lt;br /&gt;
2. In Spring configuration:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;bean&amp;nbsp;id=&quot;dataSource&quot;&amp;nbsp;class=&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;nbsp;name=&quot;jndiName&quot;&amp;nbsp;value=&quot;java:comp/env/jdbc/myApp&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/blockquote&gt;An alternative configuration with jee schema:&lt;br /&gt;
&lt;blockquote&gt;&amp;lt;?xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;
&amp;lt;beans&amp;nbsp;xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: yellow;&quot;&gt;xmlns:jee=&quot;http://www.springframework.org/schema/jee&quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/jee&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&lt;/span&gt;&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;jee:jndi-lookup&amp;nbsp;id=&quot;dataSource&quot;&amp;nbsp;jndi-name=&quot;jdbc/myApp&quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/1633419984392073586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/1633419984392073586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1633419984392073586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1633419984392073586'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2010/01/tomcat-jndi-datasource-spring.html' title='Tomcat + JNDI DataSource + Spring'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-1115182806763171967</id><published>2009-04-21T16:57:00.011-04:00</published><updated>2009-04-21T19:14:40.686-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jconsole"/><category scheme="http://www.blogger.com/atom/ns#" term="JMX"/><category scheme="http://www.blogger.com/atom/ns#" term="local process"/><title type='text'>Detect Local Processes for JMX access</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;People who dealt JMX must know about jconsole -- a very useful JMX-compliant monitoring tool. So when I was asked to create a web application that monitors JMX enabled remote servers, I tried to mimic the same functionalities that jconsole offers. One thing in particular, is that how jconsole detects local processes that are available for viewing.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;First of all, jconsole from Java5 and Java6 has different behavior on detection.  Java5 only lists local processes that are JMX enabled while Java6 lists all local processes and greys out the ones that is not available for viewing and has the ability to enable JMX agent on a process that can be viewed.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I think this is because of the attach API introduced in Java6.  By using the VirtualMachine class from attach API, I&#39;m able to tell whether a process is running under Java6.  As long as a process is running using Java6, VirtualMachine can load an agent to it and thus enable the JMX viewing in jconsole.  Knowing where the difference comes from, I created a simple class to mimic the very same function using attach API in conjunction with &lt;a href=&quot;http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html&quot;&gt;jps&lt;/a&gt; runtime command.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;package net.katiewang.jmx.local;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import java.util.Set;&lt;br /&gt;import java.util.TreeMap;&lt;br /&gt;&lt;br /&gt;import sun.tools.jps.Jps;&lt;br /&gt;&lt;br /&gt;import com.sun.tools.attach.AttachNotSupportedException;&lt;br /&gt;import com.sun.tools.attach.VirtualMachine;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;* @author KWang&lt;br /&gt;&amp;nbsp* &lt;br /&gt;&amp;nbsp*/&lt;br /&gt;public class DetectLocalProcess {&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected static enum STATUS{enabled, notEnalbed, willBeEnabled};&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param args&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @throws IOException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void main(String[] args) throws IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// first round: get all process info.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// process id is the key, name of the process is the value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// name includes full package name for the application&#39;s main class&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// or the full path name to the application&#39;s JAR file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// along with the arguments passed to the main method&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&lt;String, String&gt; processes = getProcesses();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// second round: detect if jmx is enabled&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// process id is the key, whether the process is jmx enabled is the&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&lt;String, STATUS&gt; jmx = detectJMXAgent(processes.keySet());&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printProcessInfo(processes, jmx);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static void printProcessInfo(Map&lt;String, String&gt; processes, Map&lt;String, STATUS&gt; jmx){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(Map.Entry&lt;String, STATUS&gt; process : jmx.entrySet()){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;******************************&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;PID:     &quot; + process.getKey());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;Name:    &quot; + processes.get(process.getKey()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;Status:  &quot; + getString(process.getValue()));&lt;br /&gt;&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static String getString(STATUS value) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (value) {&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;case enabled:&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;return &quot;Enabled&quot;;&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;case willBeEnabled:&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;return &quot;Will Be Enabled&quot;;&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;case notEnalbed:&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;default:&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;return &quot;Not Enabled&quot;;&lt;br /&gt;&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static Map&lt;String, STATUS&gt; detectJMXAgent(Set&lt;String&gt; processids) throws IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&lt;String, STATUS&gt; jmx = new TreeMap&lt;String, STATUS&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Runtime rt = Runtime.getRuntime();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedReader br = new BufferedReader(new InputStreamReader(rt.exec(&quot;jps -l -v&quot;)&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;.getInputStream()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String line = new String();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while ((line = br.readLine()) != null) {&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;String[] proc = line.split(&quot; &quot;);&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;if (processids.contains(proc[0])){&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;STATUS isJmx = STATUS.notEnalbed;&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;for(String process : proc){&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;if(process.startsWith(&quot;-Dcom.sun.management.jmxremote&quot;) ||&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;process.startsWith(&quot;-Dcom.sun.management.config.file&quot;)){&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;isJmx = STATUS.enabled;&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;break;&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;}&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;}&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;if(!STATUS.enabled.equals(isJmx)){&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;try {&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;VirtualMachine.attach(proc[0]);&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;isJmx = STATUS.willBeEnabled;&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;} catch (AttachNotSupportedException e) {&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;//do nothing&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;}&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;}&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;jmx.put(proc[0], isJmx);&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;}&lt;br /&gt;&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;return jmx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static Map&lt;String, String&gt; getProcesses() throws IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&lt;String, String&gt; processes = new TreeMap&lt;String, String&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Runtime rt = Runtime.getRuntime();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedReader br = new BufferedReader(new InputStreamReader(rt.exec(&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;&quot;jps -l -m&quot;).getInputStream()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String line = new String();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while ((line = br.readLine()) != null) {&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;String[] proc = line.split(&quot; &quot;);&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;if (proc[1].equals(Jps.class.getName()) &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;|| proc[1].equals(DetectLocalProcess.class.getName()))&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;continue; // ignore jps command process and this process&lt;br /&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;processes.put(proc[0], line.substring(proc[0].length()).trim());&lt;br /&gt;&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;return processes;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The result will be something like:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;******************************&lt;br /&gt;PID:     2476&lt;br /&gt;Name:    org.apache.catalina.startup.Bootstrap start&lt;br /&gt;Status:  Not Enabled&lt;br /&gt;******************************&lt;br /&gt;PID:     3872&lt;br /&gt;Name:    my_jmx_enabled_app.jar client&lt;br /&gt;Status:  Enabled&lt;br /&gt;******************************&lt;br /&gt;PID:     5164&lt;br /&gt;Name:    sun.tools.jconsole.JConsole&lt;br /&gt;Status:  Will Be Enabled&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;With viewable process dectected.  Now I can simply using the attach API to &lt;a href=&quot;http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#gdhkz&quot;&gt;create a JMX monitoring service connection&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Attach API is not included in Java classpath by default.  So when running my little test class, you need to either make sure to include tools.jar in your classpath or comment out the if statement which calls VirtualMachine.attach(String processId) method (Of course, in this case, you&#39;ll only know processes that are JMX enable at start -- same behavior as jconsole in Java5).</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/1115182806763171967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/1115182806763171967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1115182806763171967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1115182806763171967'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2009/04/detect-local-processes-for-jmx-access.html' title='Detect Local Processes for JMX access'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-5518179161147458365</id><published>2009-03-15T21:24:00.009-04:00</published><updated>2009-03-16T18:53:34.476-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="culture difference"/><title type='text'>An Example of Culture Difference between China and US</title><content type='html'>When I was in fourth or fifth grade, my teacher Miss Wang once told us that while she was an intern at another school, there was this student whose parents were doctors studied overseas and the student didn&#39;t wear the same cloth for two weeks. At that time, my only though is (and I think most of my classmates have the same though) that the student&#39;s family must be really rich cause I was used to wear same set of clothing for almost a week during winter time. And even I change cloth everyday during summer, there is no way I can wear different set everyday for two weeks. It wasn&#39;t till I came to US that I realized I was totally wrong.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://tkfiles.storage.live.com/y1pnWfaGo6QIruUHBp-eo9h_tKbyqwVMs3VcCkfkAZ-uDfqOk0eZK0sx2LaKXQSK8FqFjOHGCxgSXk&quot;&gt;&lt;img style=&quot;FLOAT: left; MARGIN: 0pt 10px 10px 0pt; WIDTH: 400px; CURSOR: pointer; HEIGHT: 380px&quot; alt=&quot;&quot; src=&quot;http://tkfiles.storage.live.com/y1pnWfaGo6QIruUHBp-eo9h_tKbyqwVMs3VcCkfkAZ-uDfqOk0eZK0sx2LaKXQSK8FqFjOHGCxgSXk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;In China, it is very common to see airer (I couldn&#39;t come up with a better name for it.) outside a balcony. That is because unlike Americans who use washing machine and dryer to clean their cloth, Chinese way of cleaning is still very traditional -- hand wash and natural drying by direct sunshine. Even there are cleaning services, they are usually only targeting hotels, not common families. Besides, Chinese people prefers the smell of the sun. Imaging hand washing your own or even your whole family&#39;s cloth by hand everyday, I believe no American would love to do that. Even though nowadays washing machine are common in big cities, people are still used to hand wash their delicates cause they believe washing machine will shorten the life of these cloth. On the other side, I once heard this funny story about Chinese farmers use washing machine to clean fresh potatoes and causing their washing machine to jam because of the high soil level.&lt;br /&gt;&lt;br /&gt;Now that I&#39;m in America, I realized that people will think you are not sanitary if you wear the same cloth several days in a row. I start to adapt to the culture difference and try not to wear same cloth for more than two days. But the truth is that I sweat less than I was in China because Chinese don&#39;t turn on AC at home except extreme weather. And not all schools and/or workplace are equipped with AC. Not to mention there is no strict smoking-free area in most places in China. My cloth is more likely to catch some weird smell in China than in America. And, no wonder the student didn&#39;t wear same cloth for two weeks. I have to wait about a month before I can wash my &quot;dirty&quot; cloth in two loads - one for colored and the other for whites.&lt;br /&gt;&lt;br /&gt;Ever since the foreign businesses start to expand to China, the young Chinese generation starts to change too. My aunt once complained to me that my cousin who works for a Japanese company tends to change cloth everyday and leaves the cleaning job to her. But there lies differeces. First of all, my aunt doesn&#39;t have a washing machine. Second of all, my cousin doesn&#39;t have a lot cloth to change to. So his clothings are washed more frequently which means they are going to be wasted far more quickly than they can be.&lt;br /&gt;&lt;br /&gt;This got me thinking. China is the biggest developing country in the world. By introducing foreign businesses into the country, we can learn advanced technologies faster and develop China quicker than ever. But that doesn&#39;t mean we should adapt everything blindly. Every country has it&#39;s own culture and conditions which makes the country unique, different from others. While learning from others, we should filter out or at least being flexible to the ones that doesn&#39;t fit China&#39;s culture and conditions. Blind learning can sometime do no good to a country and maybe even destroy a country&#39;s good assets. In this case, using washing machine is a more effecient way to clean clothes, especially in big cities with fast pace. Changing clothing on a frequent basis is better for one&#39;s healty. But if my cousin doesn&#39;t have a washing machine and he doesn&#39;t wash his own cloth, he shouldn&#39;t force into changing clothing on a daily basis and leaves all the burden to my aunt, which in Chinese traditional view is a disrespect to the elderly.&lt;br /&gt;&lt;br /&gt;I think America is a good example of culture fusion. The country has only about couple hundred years of history. But because it&#39;s special condition -- combines people/elites from all over the world into one, it is able to develop into one of the strongest countries in the world in such a short time. However, I wouldn&#39;t say America is a good example for China. Unlike America, China has one of the most ancient history. Like a thousand-year-old tree, its root goes much more deeper than it looks. It takes more time than others to bring new blood into its stream. But once the new blood runs smoothly in the stream, it will be much stronger than others. In this case, washing machine is the new blood, even though it&#39;s more efficient, Chinese people still prefer to wash their cloth by hand. But with the faster pace of living in the modern world, I believe sooner or later the younger generation will switch their preferences to washing machine which can result a better use of time. And on the other side, I don&#39;t want America to be an example for China. Behind it&#39;s success, America is also called a culture destroyer. Study shows that it&#39;s very likely that within no more than four generations, off-springs of immigration families will forget their first language and, more to that, their roots. I hope China can keep it&#39;s positive culture and conditions during any transition.&lt;br /&gt;&lt;br /&gt;No matter where I am, no matter where I go, my skin color tells everyone I&#39;m a Chinese. And, no matter what happens, I&#39;ll always say that I&#39;m proud to be a Chinese. I don&#39;t want to deny the facts that China&#39;s government has it&#39;s flaws. I believe every country&#39;s government has flaws. It&#39;s just a matter of how many. But I came to US for a better understanding of my own country. And by doing so, I hope one day I can help my country to grow stronger, even if just a little bit. My best wishes to China&#39;s future!</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/5518179161147458365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/5518179161147458365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/5518179161147458365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/5518179161147458365'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2009/03/culture-difference.html' title='An Example of Culture Difference between China and US'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-3833446637774162768</id><published>2008-06-18T17:46:00.005-04:00</published><updated>2008-06-18T18:09:06.961-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Conversion"/><category scheme="http://www.blogger.com/atom/ns#" term="Hexadecimal"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Unicode"/><title type='text'>Java Unicode to Hexadecimal Character Codes Conversion</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;When it comes to internationalization, resource encoding is a big challenge.  Sun&#39;s JDK doesn&#39;t offer UTF-8 encoding on ResourceBundle.  So one way to work around is convert all UTF-8 translations in property files to Hexadecimal Characters first.  There are lots of website offering online converters to serve the purpose.  But there is still quite a few steps to do.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Recently, I started to work on a resource repository that centralize global resources within the company to reduce duplicate work.  Users are suppose to be able to import and export resources in property file format.  So it got me thinking, what if I offer real-time conversion of Hexadecimal Characters upon exporting resources to save the trouble.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;After explored some of the online converter sites mentioned earlier, I find that the actual conversion is fairly simple.  Strangely, all these websites uses JavaScript, but no search result turns out to do it Java way.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Anyway, here is my little Test class:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;package&amp;nbsp;net.katiewang.test;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.io.BufferedReader;&lt;br /&gt;import&amp;nbsp;java.io.File;&lt;br /&gt;import&amp;nbsp;java.io.FileInputStream;&lt;br /&gt;import&amp;nbsp;java.io.IOException;&lt;br /&gt;import&amp;nbsp;java.io.InputStream;&lt;br /&gt;import&amp;nbsp;java.io.InputStreamReader;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;KWang&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;JavaUnicodeTest&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;final&amp;nbsp;static&amp;nbsp;String&amp;nbsp;digits&amp;nbsp;=&amp;nbsp;&quot;0123456789ABCDEF&quot;;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;args&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@throws&amp;nbsp;IOException&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main(String[]&amp;nbsp;args)&amp;nbsp;throws&amp;nbsp;IOException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(args.length&amp;nbsp;&amp;gt;&amp;nbsp;0){&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;System.out.println(&quot;File&amp;nbsp;path:&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;args[0]);&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;InputStream&amp;nbsp;is&amp;nbsp;=&amp;nbsp;new&amp;nbsp;FileInputStream(new&amp;nbsp;File(args[0]));&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;BufferedReader&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BufferedReader(new&amp;nbsp;InputStreamReader(is,&amp;nbsp;&quot;UTF-8&quot;));&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;String&amp;nbsp;line&amp;nbsp;=&amp;nbsp;&quot;&quot;;&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;while((line&amp;nbsp;=&amp;nbsp;reader.readLine())&amp;nbsp;!=&amp;nbsp;null){&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;String&amp;nbsp;newLine&amp;nbsp;=&amp;nbsp;&quot;&quot;;&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;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;line.length();&amp;nbsp;i++){&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;char&amp;nbsp;ch&amp;nbsp;=&amp;nbsp;line.charAt(i);&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;newLine&amp;nbsp;+=&amp;nbsp;unicodeToJava(ch);&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;}&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;System.out.println(newLine);&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&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;System.err.println(&quot;No&amp;nbsp;argument&amp;nbsp;specified!&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;String&amp;nbsp;unicodeToJava&amp;nbsp;(char&amp;nbsp;ch){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(ch)&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;nbsp;case&amp;nbsp;9:&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;return&amp;nbsp;&quot;\\t&quot;;&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;case&amp;nbsp;10:&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;return&amp;nbsp;&quot;\\n&quot;;&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;case&amp;nbsp;12:&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;return&amp;nbsp;&quot;\\f&quot;;&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;case&amp;nbsp;13:&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;return&amp;nbsp;&quot;\\r&quot;;&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;case&amp;nbsp;34:&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;return&amp;nbsp;&quot;\\\&quot;&quot;;&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;case&amp;nbsp;92:&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;return&amp;nbsp;&quot;\\\\&quot;;&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;default:&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;break;&lt;br /&gt;&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;if&amp;nbsp;(ch&amp;nbsp;&amp;lt;&amp;nbsp;32&amp;nbsp;||&amp;nbsp;ch&amp;nbsp;&amp;gt;&amp;nbsp;126)&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;return&amp;nbsp;&quot;\\u&quot;&amp;nbsp;+&amp;nbsp;getHexCode(ch);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;String.valueOf(ch);&lt;br /&gt;&amp;nbsp;&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;private&amp;nbsp;static&amp;nbsp;String&amp;nbsp;getHexCode(char&amp;nbsp;ch){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;String(new&amp;nbsp;char[]{leastSignificantHexDigit(ch&amp;nbsp;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;12),&amp;nbsp;leastSignificantHexDigit(ch&amp;nbsp;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;8),&amp;nbsp;leastSignificantHexDigit(ch&amp;nbsp;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;4),&amp;nbsp;leastSignificantHexDigit(ch)});&lt;br /&gt;&amp;nbsp;&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;private&amp;nbsp;static&amp;nbsp;char&amp;nbsp;leastSignificantHexDigit(int&amp;nbsp;ch){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;digits.charAt(ch&amp;nbsp;&amp;amp;&amp;nbsp;0x0f);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;To run the test, simple execute with a file path as argument.  In unicodeToJava, I choose to ignore any regular characters, which I recommend.  But if you want to convert everything instead, skip all the conditions in unicodeToJava and leave only one line -- return &quot;\\u&quot; + getHexCode(ch); -- will do the trick.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/3833446637774162768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/3833446637774162768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/3833446637774162768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/3833446637774162768'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2008/06/java-unicode-to-hexadecimal-character.html' title='Java Unicode to Hexadecimal Character Codes Conversion'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-7936991790903979549</id><published>2008-05-20T16:54:00.008-04:00</published><updated>2008-05-20T19:19:49.644-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML Tag"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>AJAX + Spring + HTMLTagTemplate</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Let&#39;s assume that I have a form with two fields, one called &quot;Select Field&quot;, the second is a dynamic field that changes when &quot;Select Field&quot; value changes.  How do I do that?  Most likely you will say AJAX.  That&#39;s right.  But what if the second field can not only be a text field, but a select, or even some customized field, say calendar, as well?  That can be a lot of possibilities and hard to maintain.  So, I say, why not use HTMLTagTemplate?  And after different try outs, I come up with this sample:&lt;br /&gt;&lt;br /&gt;FormField.java&lt;br /&gt;&lt;blockquote style=&quot;height: 200px&quot;&gt;&lt;br /&gt;package&amp;nbsp;net.yw.html;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.util.HashMap;&lt;br /&gt;import&amp;nbsp;java.util.Map;&lt;br /&gt;import&amp;nbsp;java.util.SortedMap;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;net.yw.resource.ResourceLookup;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.apache.commons.beanutils.BeanUtils;&lt;br /&gt;import&amp;nbsp;org.apache.commons.lang.StringUtils;&lt;br /&gt;import&amp;nbsp;org.apache.log4j.Logger;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;KWang&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;FormField&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;static&amp;nbsp;Logger&amp;nbsp;log&amp;nbsp;=&amp;nbsp;Logger.getLogger(FormField.class);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;property&amp;nbsp;name&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Object&amp;nbsp;to&amp;nbsp;be&amp;nbsp;parsed&amp;nbsp;as&amp;nbsp;JSONForm&#39;s&amp;nbsp;formEntry&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;String&amp;nbsp;name;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;boolean&amp;nbsp;required;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;String&amp;nbsp;labelKey;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;ResourceLookup&amp;nbsp;lookups;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;which&amp;nbsp;tag&amp;nbsp;to&amp;nbsp;be&amp;nbsp;used&amp;nbsp;for&amp;nbsp;this&amp;nbsp;field&amp;nbsp;when&amp;nbsp;displaying&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;HTMLTagTemplate&amp;nbsp;tag;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;properties&amp;nbsp;to&amp;nbsp;be&amp;nbsp;added&amp;nbsp;to&amp;nbsp;the&amp;nbsp;tag&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;properties;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;Object&amp;nbsp;body;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//javascript&amp;nbsp;to&amp;nbsp;call&amp;nbsp;with&amp;nbsp;static&amp;nbsp;field&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;String&amp;nbsp;javascript;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//options&amp;nbsp;for&amp;nbsp;select&amp;nbsp;tag&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;SortedMap&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;options;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;FormField()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;default&amp;nbsp;tag&amp;nbsp;is&amp;nbsp;text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.tag&amp;nbsp;=&amp;nbsp;FormTagTemplate.text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.properties&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;properties.put(&amp;quot;size&amp;quot;,&amp;nbsp;29);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.body&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;labelKey&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getLabelKey()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;labelKey;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;labelKey&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;the&amp;nbsp;labelKey&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setLabelKey(String&amp;nbsp;labelKey)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.labelKey&amp;nbsp;=&amp;nbsp;labelKey;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getName()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;the&amp;nbsp;name&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setName(String&amp;nbsp;name)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.name&amp;nbsp;=&amp;nbsp;name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;getProperties()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;properties;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;properties&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;the&amp;nbsp;properties&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setProperties(Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;properties)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(Map.Entry&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;entry:properties.entrySet())&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;this.properties.put(entry.getKey().toLowerCase(),&amp;nbsp;entry.getValue());&lt;br /&gt;&amp;nbsp;&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;public&amp;nbsp;void&amp;nbsp;addProperty(String&amp;nbsp;key,&amp;nbsp;Object&amp;nbsp;value){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.properties.put(key.toLowerCase(),&amp;nbsp;value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;required&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;boolean&amp;nbsp;isRequired()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;required;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;required&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;the&amp;nbsp;required&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setRequired(boolean&amp;nbsp;required)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.required&amp;nbsp;=&amp;nbsp;required;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;tag&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;HTMLTagTemplate&amp;nbsp;getTag()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;tag;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;tag&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;the&amp;nbsp;tag&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setTag(HTMLTagTemplate&amp;nbsp;tag)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(tag&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;this.tag.equals(tag))&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;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.tag&amp;nbsp;=&amp;nbsp;tag;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;properties.clear();&lt;br /&gt;&amp;nbsp;&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;public&amp;nbsp;void&amp;nbsp;setTag(String&amp;nbsp;tagName)&amp;nbsp;throws&amp;nbsp;HTMLTagException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&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;nbsp;setTag(FormTagTemplate.valueOf(tagName));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(RuntimeException&amp;nbsp;e)&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;nbsp;try&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTag(CustomTagTemplate.valueOf(tagName));&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;catch&amp;nbsp;(RuntimeException&amp;nbsp;e1)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;No&amp;nbsp;valid&amp;nbsp;tag&amp;nbsp;found&amp;nbsp;for&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;tagName);&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;}&lt;br /&gt;&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;lookups&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;ResourceLookup&amp;nbsp;getLookups()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;lookups;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;lookups&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;the&amp;nbsp;lookups&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setLookups(ResourceLookup&amp;nbsp;bundle)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.lookups&amp;nbsp;=&amp;nbsp;bundle;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getFieldTag()&amp;nbsp;throws&amp;nbsp;HTMLTagException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.debug(&amp;quot;JSONFormField&amp;nbsp;getFieldTag()&amp;nbsp;called&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(tag&amp;nbsp;!=&amp;nbsp;null)&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;nbsp;//&amp;nbsp;seq.&amp;nbsp;here&amp;nbsp;is&amp;nbsp;important,&amp;nbsp;id&amp;nbsp;is&amp;nbsp;used&amp;nbsp;for&amp;nbsp;Ajax&amp;nbsp;to&amp;nbsp;locate&amp;nbsp;element&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;if&amp;nbsp;(properties.get(&amp;quot;name&amp;quot;)&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;StringUtils.isBlank(properties.get(&amp;quot;name&amp;quot;).toString()))&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;properties.put(&amp;quot;name&amp;quot;,&amp;nbsp;this.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;&amp;nbsp;if&amp;nbsp;(properties.get(&amp;quot;id&amp;quot;)&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;StringUtils.isBlank(properties.get(&amp;quot;id&amp;quot;).toString()))&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;properties.put(&amp;quot;id&amp;quot;,&amp;nbsp;this.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;&amp;nbsp;return&amp;nbsp;&amp;nbsp;tag.doStart(properties)&amp;nbsp;+&amp;nbsp;getBody()&amp;nbsp;+&amp;nbsp;tag.doEnd();&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getLabelTag()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.debug(&amp;quot;JSONFormField&amp;nbsp;getLabelTag()&amp;nbsp;called&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;labelString&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(required)&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;labelString&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;lt;span&amp;nbsp;style=\&amp;quot;color:#FF0000;\&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;\n&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;labelString&amp;nbsp;+=&amp;nbsp;getLabelValue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;labelString;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;labelString&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getLabelValue()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(StringUtils.isNotBlank(labelKey)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;lookups&amp;nbsp;!=&amp;nbsp;null)&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;nbsp;String&amp;nbsp;value&amp;nbsp;=&amp;nbsp;lookups.getValue(labelKey);&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;return&amp;nbsp;StringUtils.isBlank(value)&amp;nbsp;?&amp;nbsp;labelKey&amp;nbsp;:&amp;nbsp;value;&lt;br /&gt;&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;return&amp;nbsp;StringUtils.isBlank(labelKey)&amp;nbsp;?&amp;nbsp;&amp;quot;&amp;quot;:labelKey;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;provides&amp;nbsp;an&amp;nbsp;clone&amp;nbsp;copy,&amp;nbsp;user&amp;nbsp;can&amp;nbsp;make&amp;nbsp;modification&amp;nbsp;without&amp;nbsp;changing&amp;nbsp;the&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;original&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;FormField&amp;nbsp;getClone()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&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;nbsp;return&amp;nbsp;(FormField)&amp;nbsp;BeanUtils.cloneBean(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;e)&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;nbsp;return&amp;nbsp;null;&lt;br /&gt;&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;toString()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;string&amp;nbsp;=&amp;nbsp;getLabelTag()&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;:&amp;nbsp;getLabelTag();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&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;nbsp;string&amp;nbsp;+=&amp;nbsp;getFieldTag()&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;:&amp;nbsp;getFieldTag();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(HTMLTagException&amp;nbsp;e)&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;nbsp;e.printStackTrace();&lt;br /&gt;&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;return&amp;nbsp;string;&lt;br /&gt;&amp;nbsp;&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;public&amp;nbsp;void&amp;nbsp;setValue(String&amp;nbsp;value){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;StringUtils.isBlank(value)&amp;nbsp;?&amp;nbsp;&amp;quot;&amp;quot;:value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(tag&amp;nbsp;instanceof&amp;nbsp;FormTagTemplate){&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;try&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch((FormTagTemplate)tag){&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;case&amp;nbsp;radio:&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;for(String&amp;nbsp;key:properties.keySet()){&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;&amp;nbsp;if(StringUtils.equalsIgnoreCase(key,&amp;nbsp;&amp;quot;value&amp;quot;)){&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;compareValue&amp;nbsp;=&amp;nbsp;properties.get(key).toString();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;properties.put(&amp;quot;checked&amp;quot;,&amp;nbsp;Boolean.valueOf(StringUtils.equals(value,&amp;nbsp;compareValue)));&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&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;&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;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;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;break;&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;case&amp;nbsp;checkbox:&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;if(!properties.containsKey(&amp;quot;value&amp;quot;))&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;&amp;nbsp;properties.put(&amp;quot;value&amp;quot;,&amp;nbsp;&amp;quot;on&amp;quot;);&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;properties.put(&amp;quot;checked&amp;quot;,&amp;nbsp;Boolean.valueOf(value));&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;break;&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;case&amp;nbsp;textarea:&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;case&amp;nbsp;div:&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;this.body&amp;nbsp;=&amp;nbsp;value;&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;break;&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;default:&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;properties.put(&amp;quot;value&amp;quot;,&amp;nbsp;value);&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;break;&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;}&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;catch&amp;nbsp;(RuntimeException&amp;nbsp;e)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.properties.put(&amp;quot;value&amp;quot;,&amp;nbsp;value);&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&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;this.properties.put(&amp;quot;value&amp;quot;,&amp;nbsp;value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;body&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;Object&amp;nbsp;getBody()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//getBody&amp;nbsp;is&amp;nbsp;called&amp;nbsp;only&amp;nbsp;by&amp;nbsp;getFieldTag,&amp;nbsp;at&amp;nbsp;this&amp;nbsp;point&amp;nbsp;tag&amp;nbsp;should&amp;nbsp;be&amp;nbsp;final&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(this.lookups&amp;nbsp;!=&amp;nbsp;null&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;this.tag.equals(FormTagTemplate.select)){&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;String&amp;nbsp;value&amp;nbsp;=&amp;nbsp;properties.get(&amp;quot;value&amp;quot;)&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&amp;quot;&amp;quot;:properties.get(&amp;quot;value&amp;quot;).toString();&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;boolean&amp;nbsp;blank&amp;nbsp;=&amp;nbsp;false;&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;if(properties.containsKey(&amp;quot;blank&amp;quot;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;properties.get(&amp;quot;blank&amp;quot;)&amp;nbsp;instanceof&amp;nbsp;Boolean)&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;blank&amp;nbsp;=&amp;nbsp;(Boolean)properties.get(&amp;quot;blank&amp;quot;);&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;&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;StringBuffer&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuffer();&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;FormTagTemplate&amp;nbsp;option&amp;nbsp;=&amp;nbsp;FormTagTemplate.option;&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;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;optionProp&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;try&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(blank){&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;optionProp.put(&amp;quot;value&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;);&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;optionProp.put(&amp;quot;label&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;);&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;sb.append(option.doStart(optionProp)&amp;nbsp;+&amp;nbsp;option.doEnd());&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;}&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;if(this.options&amp;nbsp;!=&amp;nbsp;null&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!this.options.isEmpty()){&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;for&amp;nbsp;(Map.Entry&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;entry&amp;nbsp;:&amp;nbsp;options.entrySet()){&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;optionProp.put(&amp;quot;value&amp;quot;,&amp;nbsp;entry.getKey().toString());&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;optionProp.put(&amp;quot;label&amp;quot;,&amp;nbsp;entry.getValue().toString());&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;if(StringUtils.isNotBlank(value))&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;&amp;nbsp;optionProp.put(&amp;quot;selected&amp;quot;,&amp;nbsp;StringUtils.equals(value,&amp;nbsp;entry.getKey().toString()));&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;sb.append(option.doStart(optionProp)&amp;nbsp;+&amp;nbsp;optionProp.get(&amp;quot;label&amp;quot;)&amp;nbsp;+&amp;nbsp;option.doEnd());&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;}&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;}&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;catch&amp;nbsp;(HTMLTagException&amp;nbsp;e)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.error(&amp;quot;option&amp;nbsp;rendering&amp;nbsp;throw&amp;nbsp;exception&amp;quot;,&amp;nbsp;e);&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;}&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;return&amp;nbsp;sb.toString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&amp;nbsp;if(StringUtils.isNotBlank(this.javascript)){&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;//java&amp;nbsp;solution&amp;nbsp;is&amp;nbsp;always&amp;nbsp;prefered&amp;nbsp;first&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;return&amp;nbsp;&amp;quot;&amp;lt;script&amp;gt;document.write(&amp;quot;&amp;nbsp;+&amp;nbsp;this.javascript&amp;nbsp;+&amp;nbsp;&amp;quot;(&#39;&amp;quot;&amp;nbsp;+&amp;nbsp;this.body&amp;nbsp;+&amp;nbsp;&amp;quot;&#39;));&amp;lt;/script&amp;gt;&amp;quot;;&lt;br /&gt;&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;return&amp;nbsp;body;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;javascript&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getJavascript()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;javascript;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;javascript&amp;nbsp;the&amp;nbsp;javascript&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setJavascript(String&amp;nbsp;javascript)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.javascript&amp;nbsp;=&amp;nbsp;javascript;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;options&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;SortedMap&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;getOptions()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;options;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;options&amp;nbsp;the&amp;nbsp;options&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setOptions(SortedMap&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;options)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.options&amp;nbsp;=&amp;nbsp;options;&lt;br /&gt;&amp;nbsp;&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;public&amp;nbsp;String&amp;nbsp;getValue(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(tag.equals(FormTagTemplate.div)){&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;if(StringUtils.isNotBlank(String.valueOf(this.getBody())))&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;return&amp;nbsp;String.valueOf(this.getBody());&lt;br /&gt;&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;return&amp;nbsp;&amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;EmployeeForm.java&lt;br /&gt;&lt;blockquote style=&quot;height:200px&quot;&gt;&lt;br /&gt;package&amp;nbsp;net.yw.form;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.io.Serializable;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;KWang&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;EmployeeForm&amp;nbsp;implements&amp;nbsp;Serializable&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;final&amp;nbsp;long&amp;nbsp;serialVersionUID&amp;nbsp;=&amp;nbsp;1L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;String&amp;nbsp;fieldName;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;Profile&amp;nbsp;profile;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;fieldName&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getFieldName()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;fieldName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;fieldName&amp;nbsp;the&amp;nbsp;fieldName&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setFieldName(String&amp;nbsp;fieldName)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.fieldName&amp;nbsp;=&amp;nbsp;fieldName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;the&amp;nbsp;profile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;Profile&amp;nbsp;getProfile()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;profile;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;profile&amp;nbsp;the&amp;nbsp;profile&amp;nbsp;to&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;setProfile(Profile&amp;nbsp;profile)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.profile&amp;nbsp;=&amp;nbsp;profile;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;EmployeeFormAction.java&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;package&amp;nbsp;net.yw.ajax.action;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;javax.servlet.http.HttpServletRequest;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.apache.commons.beanutils.BeanUtils;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;net.sf.json.JSONObject;&lt;br /&gt;import&amp;nbsp;net.yw.form.EmployeeForm;&lt;br /&gt;import&amp;nbsp;net.yw.html.FormField;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;KWang&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;EmployeeFormAction&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getField(HttpServletRequest&amp;nbsp;request)&amp;nbsp;throws&amp;nbsp;Exception{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JSONObject&amp;nbsp;object&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JSONObject(false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EmployeeForm&amp;nbsp;form&amp;nbsp;=&amp;nbsp;(EmployeeForm)&amp;nbsp;request.getAttribute(&amp;quot;form&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;fieldName&amp;nbsp;=&amp;nbsp;request.getParameter(&amp;quot;$fieldName&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;value&amp;nbsp;=&amp;nbsp;BeanUtils.getProperty(form,&amp;nbsp;fieldName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(FormField&amp;nbsp;field:form.getEmployeeFields()){&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;if(field.getName().equals(fieldName)){&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;field.setValue(value);&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;object.put(&amp;quot;dynamicLabel&amp;quot;,&amp;nbsp;field.getLabelTag());&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;object.put(&amp;quot;dynamicField&amp;quot;,&amp;nbsp;field.getFieldTag());&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;break;&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;}&lt;br /&gt;&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;return&amp;nbsp;object.toString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;employeeform.jsp&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;form&amp;nbsp;action=&amp;quot;javascript:callAjax()&amp;quot;&amp;nbsp;name=&amp;quot;employee&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&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;lt;td&amp;gt;Select&amp;nbsp;Field:&amp;lt;/td&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;lt;td&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;lt;tags:select&amp;nbsp;property=&amp;quot;fieldName&amp;quot;&amp;nbsp;onchange=&amp;quot;javascript:callAjax()&amp;quot;&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;lt;option&amp;nbsp;value=&amp;quot;profile.salutation&amp;quot;&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;nbsp;&amp;lt;option&amp;nbsp;value=&amp;quot;profile.firstName&amp;quot;&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;nbsp;&amp;lt;option&amp;nbsp;value=&amp;quot;profile.lastName&amp;quot;&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;nbsp;&amp;lt;option&amp;nbsp;value=&amp;quot;profile.jobTitle&amp;quot;&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;nbsp;&amp;lt;option&amp;nbsp;value=&amp;quot;profile.dob&amp;quot;&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;nbsp;&amp;lt;option&amp;nbsp;value=&amp;quot;profile.cell&amp;quot;&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;nbsp;&amp;lt;option&amp;nbsp;value=&amp;quot;profile.createdDate&amp;quot;&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;nbsp;&amp;lt;option&amp;nbsp;value=&amp;quot;profile.lastUpdatedOn&amp;quot;&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;lt;/tags:select&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;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&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;lt;td&amp;gt;&amp;lt;div&amp;nbsp;id=&amp;quot;dynamicLabel&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;:&amp;lt;/td&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;lt;td&amp;gt;&amp;lt;div&amp;nbsp;id=&amp;quot;dynamicField&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;callAjax(){&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;var&amp;nbsp;parameters&amp;nbsp;=&amp;nbsp;&#39;$action=EmployeeFormAction&amp;amp;$method=getField&amp;amp;$fieldName=&#39;&amp;nbsp;+&amp;nbsp;$F(&#39;fieldName&#39;);&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;new&amp;nbsp;Ajax.Request(&amp;quot;/[appName]/AjaxServlet&amp;quot;,&amp;nbsp;{asynchronous:&amp;nbsp;false,&amp;nbsp;parameters:&amp;nbsp;parameters,&amp;nbsp;onSuccess:&amp;nbsp;function(request,&amp;nbsp;json){&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;try{&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;json&amp;nbsp;=&amp;nbsp;request.responseText.evalJSON(true);&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;}catch(e){&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;alert(&#39;evalJSON:&#39;&amp;nbsp;+&amp;nbsp;&amp;nbsp;$H(e).collect(function(entry){return&amp;nbsp;entry.key&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;entry.value;}).join(&amp;quot;&amp;nbsp;||&amp;nbsp;&amp;quot;));&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;}&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;$H(json).each(function(field){&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;$(field.key).update(field.value);&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;});&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;}});&lt;br /&gt;&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;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;applicationContext.xml&lt;br /&gt;&lt;blockquote style=&quot;height: 200px&quot;&gt;&lt;br /&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE&amp;nbsp;beans&amp;nbsp;PUBLIC&amp;nbsp;&amp;quot;-//SPRING//DTD&amp;nbsp;BEAN&amp;nbsp;2.0//EN&amp;quot;&amp;nbsp;&amp;quot;http://www.springframework.org/dtd/spring-beans-2.0.dtd&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans&amp;nbsp;default-autowire=&amp;quot;byName&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bean&amp;nbsp;id=&amp;quot;textField&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.html.FormField&amp;quot;&amp;nbsp;scope=&amp;quot;prototype&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;properties&amp;quot;&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;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;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;size&amp;quot;&amp;nbsp;value=&amp;quot;29&amp;quot;&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;lt;/map&amp;gt;&lt;br /&gt;&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;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bean&amp;nbsp;id=&amp;quot;staticField&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.html.FormField&amp;quot;&amp;nbsp;scope=&amp;quot;prototype&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;tag&amp;quot;&amp;nbsp;ref=&amp;quot;selectTag&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&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;lt;bean&amp;nbsp;id=&amp;quot;selectField&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.html.FormField&amp;quot;&amp;nbsp;scope=&amp;quot;prototype&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;tag&amp;quot;&amp;nbsp;ref=&amp;quot;divTag&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&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;lt;bean&amp;nbsp;id=&amp;quot;calendarField&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.html.FormField&amp;quot;&amp;nbsp;scope=&amp;quot;prototype&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;tag&amp;quot;&amp;nbsp;ref=&amp;quot;calendarField&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bean&amp;nbsp;id=&amp;quot;employeeFields&amp;quot;&amp;nbsp;class=&amp;quot;java.util.ArrayList&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&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;nbsp;&amp;lt;list&amp;nbsp;value-type=&amp;quot;net.yw.html.FormField&amp;quot;&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;lt;bean&amp;nbsp;parent=&amp;quot;selectField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.salutation&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.salutation&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;properties&amp;quot;&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;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;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;nbsp;key=&amp;quot;blank&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;nbsp;type=&amp;quot;java.lang.Boolean&amp;quot;&amp;gt;true&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;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;&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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;options&amp;quot;&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;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;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;nbsp;key=&amp;quot;MR&amp;quot;&amp;nbsp;value=&amp;quot;Mr.&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;MRS&amp;quot;&amp;nbsp;value=&amp;quot;Mrs.&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;MISS&amp;quot;&amp;nbsp;value=&amp;quot;Miss&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;MS&amp;quot;&amp;nbsp;value=&amp;quot;Ms.&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;DR&amp;quot;&amp;nbsp;value=&amp;quot;Dr.&amp;quot;&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;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;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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bean&amp;nbsp;parent=&amp;quot;textField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.firstName&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.firstName&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;required&amp;quot;&amp;nbsp;value=&amp;quot;true&amp;quot;&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;lt;/bean&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;lt;bean&amp;nbsp;parent=&amp;quot;textField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.lastName&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.lastName&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;required&amp;quot;&amp;nbsp;value=&amp;quot;true&amp;quot;&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;lt;/bean&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;lt;bean&amp;nbsp;parent=&amp;quot;textField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.jobTitle&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.jobTitle&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;options&amp;quot;&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;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;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;nbsp;key=&amp;quot;CLERK&amp;quot;&amp;nbsp;value=&amp;quot;Clerk&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;SALESMAN&amp;quot;&amp;nbsp;value=&amp;quot;Salesman&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;INSPECTOR&amp;quot;&amp;nbsp;value=&amp;quot;Inspector&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;CONTRACTOR&amp;quot;&amp;nbsp;value=&amp;quot;Contractor&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;entry&amp;nbsp;key=&amp;quot;ADMIN&amp;quot;&amp;nbsp;value=&amp;quot;Administrator&amp;quot;&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;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;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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bean&amp;nbsp;parent=&amp;quot;calendarField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.dob&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.dob&amp;quot;&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;lt;/bean&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;lt;bean&amp;nbsp;parent=&amp;quot;textField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.cell&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.cell&amp;quot;&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;lt;/bean&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;lt;bean&amp;nbsp;parent=&amp;quot;staticField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.createdDate&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.createdDate&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;javascript&amp;quot;&amp;nbsp;value=&amp;quot;formatDate&amp;quot;&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;lt;/bean&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;lt;bean&amp;nbsp;parent=&amp;quot;staticField&amp;quot;&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;lt;property&amp;nbsp;name=&amp;quot;name&amp;quot;&amp;nbsp;value=&amp;quot;profile.lastUpdatedOn&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;labelKey&amp;quot;&amp;nbsp;value=&amp;quot;label.lastUpdatedOn&amp;quot;&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;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;javascript&amp;quot;&amp;nbsp;value=&amp;quot;formatDate&amp;quot;&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;lt;/bean&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;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&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;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bean&amp;nbsp;id=&amp;quot;selectTag&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.html.FormTagTemplate&amp;quot;&amp;nbsp;factory-method=&amp;quot;valueOf&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;constructor-arg&amp;nbsp;value=&amp;quot;select&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&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;lt;bean&amp;nbsp;id=&amp;quot;divTag&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.html.FormTagTemplate&amp;quot;&amp;nbsp;factory-method=&amp;quot;valueOf&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;constructor-arg&amp;nbsp;value=&amp;quot;div&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&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;lt;bean&amp;nbsp;id=&amp;quot;calendarTag&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.html.CustomTagTemplate&amp;quot;&amp;nbsp;factory-method=&amp;quot;valueOf&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;constructor-arg&amp;nbsp;value=&amp;quot;calendar&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&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;lt;bean&amp;nbsp;id=&amp;quot;EmployeeFormAction&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.ajax.action.EmployeeFormAction&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bean&amp;nbsp;id=&amp;quot;employee&amp;quot;&amp;nbsp;class=&amp;quot;net.yw.form.EmployeeForm&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I used Spring Based Ajax Servlet explained in my previous post.  For more detail on servlet configuration, please see &lt;a href=&quot;http://outofkatieshead.blogspot.com/2008/05/example-of-spring-based-ajax-servlet.html&quot;&gt;here&lt;/a&gt;.  Please note that these sample code are for demonstration here.  They are simplified from actual working code but haven&#39;t been tested.  Also, ResourceLookup is a customized Spring configured Resource Bundle that is not covered here.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/7936991790903979549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/7936991790903979549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/7936991790903979549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/7936991790903979549'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2008/05/ajax-spring-htmltagtemplate.html' title='AJAX + Spring + HTMLTagTemplate'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-7131601440998993623</id><published>2008-05-20T14:55:00.004-04:00</published><updated>2008-05-20T15:21:59.401-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Tag File"/><title type='text'>Custom Tag Using Tag File</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;In my last post, I demonstrated &lt;a href=&quot;http://outofkatieshead.blogspot.com/2008/05/use-of-enummap.html&quot;&gt;use of EnumMap&lt;/a&gt; by creating two custom tags, calendar and number, implementing HTMLTagTemplate interface.  However, you can also write the tag in pure tag file as following.&lt;br /&gt;&lt;br /&gt;calendar.tag&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;value&amp;quot;&amp;nbsp;required=&amp;quot;true&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;property&amp;quot;&amp;nbsp;required=&amp;quot;true&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;src&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;size&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;imgStyleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;styleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;errorStyleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;tabindex&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;timepicker&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;interval&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;include&amp;nbsp;file=&amp;quot;/WEB-INF/jsp/common/includes.jsp&amp;quot;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:if&amp;nbsp;test=&amp;quot;${timepicker&amp;nbsp;==&amp;nbsp;null}&amp;quot;&amp;gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;timepicker&amp;quot;&amp;nbsp;value=&amp;quot;false&amp;quot;/&amp;gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&amp;lt;c:if&amp;nbsp;test=&amp;quot;${interval&amp;nbsp;==&amp;nbsp;null}&amp;quot;&amp;gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;interval&amp;quot;&amp;nbsp;value=&amp;quot;15&amp;quot;/&amp;gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;inputName&amp;quot;&amp;nbsp;value=&amp;quot;${fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(property,&amp;nbsp;&#39;.&#39;,&amp;nbsp;&#39;&#39;),&amp;nbsp;&#39;(&#39;,&amp;nbsp;&#39;&#39;),&amp;nbsp;&#39;)&#39;,&amp;nbsp;&#39;&#39;),&amp;nbsp;&#39;[&#39;,&amp;nbsp;&#39;&#39;),&amp;nbsp;&#39;]&#39;,&amp;nbsp;&#39;&#39;)}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${styleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;right-align&#39;&amp;nbsp;:&amp;nbsp;styleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;c:if&amp;nbsp;test=&amp;quot;${not&amp;nbsp;empty&amp;nbsp;request.errors.messages[property]}&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${errorStyleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;errorField&#39;&amp;nbsp;:&amp;nbsp;errorStyleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&amp;nbsp;&lt;br /&gt;&amp;lt;input&amp;nbsp;type=&amp;quot;text&amp;quot;&amp;nbsp;id=&amp;quot;${inputName}&amp;quot;&amp;nbsp;name=&amp;quot;${inputName}&amp;quot;&amp;nbsp;class=&amp;quot;${class}&amp;quot;&amp;nbsp;size=&amp;quot;${size&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;29&#39;&amp;nbsp;:&amp;nbsp;size}&amp;quot;&amp;nbsp;tabindex=&amp;quot;${tabindex}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;img&amp;nbsp;src=&amp;quot;${src&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;../images/calendar.gif&#39;&amp;nbsp;:&amp;nbsp;src}&amp;quot;&amp;nbsp;id=&amp;quot;${inputName}_img&amp;quot;&amp;nbsp;name=&amp;quot;${inputName}_img&amp;quot;&amp;nbsp;class=&amp;quot;${imgStyleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;calendar&#39;&amp;nbsp;:&amp;nbsp;imgStyleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;div&amp;nbsp;id=&amp;quot;${inputName}_fmt&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;input&amp;nbsp;type=&amp;quot;hidden&amp;quot;&amp;nbsp;name=&amp;quot;${property}&amp;quot;&amp;nbsp;id=&amp;quot;${property}&amp;quot;&amp;nbsp;value=&amp;quot;${value}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt; epochCalendar(&#39;${property}&#39;,&amp;nbsp;&#39;${inputName}&#39;,&amp;nbsp;${timepicker},&amp;nbsp;${interval});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;number.tag&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;property&amp;quot;&amp;nbsp;required=&amp;quot;true&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;type&amp;quot;&amp;nbsp;required=&amp;quot;true&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;size&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;styleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;errorStyleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;tabindex&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;include&amp;nbsp;file=&amp;quot;/WEB-INF/jsp/common/includes.jsp&amp;quot;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;inputName&amp;quot;&amp;nbsp;value=&amp;quot;${fn:replace(property,&amp;nbsp;&#39;.&#39;,&amp;nbsp;&#39;&#39;)}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${styleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;right-align&#39;&amp;nbsp;:&amp;nbsp;styleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;c:if&amp;nbsp;test=&amp;quot;${not&amp;nbsp;empty&amp;nbsp;request.errors.messages[property]}&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${errorStyleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;errorField&#39;&amp;nbsp;:&amp;nbsp;errorStyleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&amp;nbsp;&lt;br /&gt;&amp;lt;input&amp;nbsp;type=&amp;quot;text&amp;quot;&amp;nbsp;id=&amp;quot;${inputName}&amp;quot;&amp;nbsp;name=&amp;quot;${inputName}&amp;quot;&amp;nbsp;class=&amp;quot;${class}&amp;quot;&amp;nbsp;size=&amp;quot;${size&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&amp;quot;29&amp;quot;&amp;nbsp;:&amp;nbsp;size}&amp;quot;&amp;nbsp;tabindex=&amp;quot;${tabindex}&amp;quot;&lt;br /&gt;  onblur=&amp;quot;javascript:formatNumberFunc(this,&#39;${property}&#39;,&#39;${type}&#39;);&amp;quot;&lt;br /&gt;  onfocus=&amp;quot;javascript:unformatNumber(this,&#39;${type}&#39;);&amp;quot;&amp;nbsp;maxlength=&amp;quot;11&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;tags:input&amp;nbsp;type=&amp;quot;hidden&amp;quot;&amp;nbsp;property=&amp;quot;${property}&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt; if($(&#39;${property}&#39;).value&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;$(&#39;${property}&#39;).value&amp;nbsp;==&amp;nbsp;&#39;&#39;)&lt;br /&gt;  $(&#39;${property}&#39;).value&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt; $(&#39;${inputName}&#39;).value&amp;nbsp;=&amp;nbsp;formatNumberFunction($(&#39;${property}&#39;).value,&#39;${type}&#39;);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Please note that these tag files uses &lt;a href=&quot;http://www.prototypejs.org/&quot;&gt;prototype&lt;/a&gt; in javascript.  Following is some sample code in JSP page.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;%--&amp;nbsp;calendar&amp;nbsp;selector&amp;nbsp;for&amp;nbsp;date&amp;nbsp;of&amp;nbsp;birth&amp;nbsp;--%&amp;gt;&lt;br /&gt;&amp;lt;tags:calendar&amp;nbsp;value=&amp;quot;${request.form.dob}&amp;quot;&amp;nbsp;property=&amp;quot;dob&amp;quot;&amp;nbsp;tabindex=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%--&amp;nbsp;format&amp;nbsp;a&amp;nbsp;number&amp;nbsp;in&amp;nbsp;currency&amp;nbsp;--%&amp;gt;&lt;br /&gt;&amp;lt;tags:number&amp;nbsp;property=&amp;quot;retailPrice&amp;quot;&amp;nbsp;type=&amp;quot;currency&amp;quot;&amp;nbsp;tabindex=&amp;quot;2&amp;quot;/&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/7131601440998993623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/7131601440998993623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/7131601440998993623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/7131601440998993623'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2008/05/custom-tag-using-tag-file.html' title='Custom Tag Using Tag File'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-1892604335447367252</id><published>2008-05-20T14:02:00.006-04:00</published><updated>2008-05-20T15:24:04.418-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Enum"/><category scheme="http://www.blogger.com/atom/ns#" term="EnumMap"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML Tag"/><title type='text'>Use of EnumMap</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvgpk3uTeF9ActYio5RmoH7SuD6X2bHki7Ggli6ZuMsDlIrGY64NO2oekUrZ5CSYGKG4UBLqg8Tsv5Dej9O_DLyb1x5ebZLSLZdZBdAkUVtvQuodd9G5d6XRrlzt0YRMpnV-YDjY8wIRG/s1600-h/calendar.JPG&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvgpk3uTeF9ActYio5RmoH7SuD6X2bHki7Ggli6ZuMsDlIrGY64NO2oekUrZ5CSYGKG4UBLqg8Tsv5Dej9O_DLyb1x5ebZLSLZdZBdAkUVtvQuodd9G5d6XRrlzt0YRMpnV-YDjY8wIRG/s320/calendar.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5202525046481200082&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I have posted a few blogs explaining my idea of using Enum to create FormTagTemplate class which writes HTML tags.  In this post, I&#39;ll use FormTagTemplate in CustomTagTemplate to sample the use of EnumMap.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomTagTemplate has two custom tags: calendar and number.  Calendar tag, as you can see from the image on the left, has one text field, one hidden field, and one image.  When you click on the image or select the text field, a calendar will pop up.  Number tag has one text field and one hidden field.  It formats the number entered when the text field is onblur and unformat the number when the text field is onfocus.  The actual raw value, however, is stored in the hidden field for both tags.  Both tags require javascripts which I do not cover here.  Calendar tag&#39;s javascript is my personal modification from &lt;a href=&quot;http://www.meanfreepath.com/javascript_calendar/index.html&quot;&gt;Epoch JavaScript Calendar&lt;/a&gt;.  I also added on a time picker with customizable time interval.&lt;br /&gt;&lt;br /&gt;CustomTagTemplate.java&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;package&amp;nbsp;net.yw.html;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.util.EnumMap;&lt;br /&gt;import&amp;nbsp;java.util.HashMap;&lt;br /&gt;import&amp;nbsp;java.util.Map;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.apache.commons.lang.StringUtils;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;KWang&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public&amp;nbsp;enum&amp;nbsp;CustomTagTemplate&amp;nbsp;implements&amp;nbsp;HTMLTagTemplate&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;calendar()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;void&amp;nbsp;setDefaults(){&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;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;properties&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;properties.put(&amp;quot;class&amp;quot;,&amp;nbsp;&amp;quot;right-align&amp;quot;);&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;properties.put(&amp;quot;size&amp;quot;,&amp;nbsp;29);&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;this.defaults.put(FormTagTemplate.text,&amp;nbsp;properties);&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;&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;properties&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;properties.put(&amp;quot;src&amp;quot;,&amp;nbsp;&amp;quot;../images/calendar.gif&amp;quot;);&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;properties.put(&amp;quot;class&amp;quot;,&amp;nbsp;&amp;quot;calendar&amp;quot;);&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;properties.put(&amp;quot;alt&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;);&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;this.defaults.put(FormTagTemplate.img,&amp;nbsp;properties);&lt;br /&gt;&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;doEnd()&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;nbsp;return&amp;nbsp;&amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;doStart(Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;propertyMap)&amp;nbsp;throws&amp;nbsp;HTMLTagException&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;nbsp;StringBuffer&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuffer();&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;String&amp;nbsp;name&amp;nbsp;=&amp;nbsp;propertyMap.get(&amp;quot;name&amp;quot;).toString();&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;&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;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;defaults&amp;nbsp;=&amp;nbsp;this.defaults.get(FormTagTemplate.text);&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;defaults.putAll(propertyMap);&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;if(defaults.containsKey(&amp;quot;value&amp;quot;))&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;defaults.remove(&amp;quot;value&amp;quot;);&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;defaults.put(&amp;quot;name&amp;quot;,&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input&amp;quot;);&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;defaults.put(&amp;quot;id&amp;quot;,&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input&amp;quot;);&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;sb.append(FormTagTemplate.text.doStart(defaults));&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;&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;sb.append(&amp;quot;\n&amp;quot;);&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;defaults&amp;nbsp;=&amp;nbsp;this.defaults.get(FormTagTemplate.img);&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;defaults.put(&amp;quot;name&amp;quot;,&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input_img&amp;quot;);&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;defaults.put(&amp;quot;id&amp;quot;,&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input_img&amp;quot;);&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;sb.append(FormTagTemplate.img.doStart(defaults));&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;&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;sb.append(&amp;quot;\n&amp;quot;);&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;defaults&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;defaults.put(&amp;quot;id&amp;quot;,&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input_fmt&amp;quot;);&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;sb.append(FormTagTemplate.div.doStart(defaults)&amp;nbsp;+&amp;nbsp;FormTagTemplate.div.doEnd());&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;&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;sb.append(&amp;quot;\n&amp;quot;);&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;defaults&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;defaults.put(&amp;quot;name&amp;quot;,&amp;nbsp;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;&amp;nbsp;defaults.put(&amp;quot;id&amp;quot;,&amp;nbsp;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;&amp;nbsp;if(propertyMap.containsKey(&amp;quot;value&amp;quot;))&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;defaults.put(&amp;quot;value&amp;quot;,&amp;nbsp;propertyMap.get(&amp;quot;value&amp;quot;));&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;sb.append(FormTagTemplate.hidden.doStart(defaults));&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;&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;boolean&amp;nbsp;timepicker&amp;nbsp;=&amp;nbsp;propertyMap.containsKey(&amp;quot;timepicker&amp;quot;)&amp;nbsp;?&amp;nbsp;Boolean.valueOf(propertyMap.get(&amp;quot;timepicker&amp;quot;).toString())&amp;nbsp;:&amp;nbsp;false;&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;int&amp;nbsp;interval&amp;nbsp;=&amp;nbsp;propertyMap.containsKey(&amp;quot;interval&amp;quot;)&amp;nbsp;?&amp;nbsp;Integer.valueOf(propertyMap.get(&amp;quot;interval&amp;quot;).toString())&amp;nbsp;:&amp;nbsp;15;&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;sb.append(&amp;quot;&amp;lt;script&amp;nbsp;type=\&amp;quot;text/javascript\&amp;quot;&amp;gt;&amp;quot;);&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;sb.append(&amp;quot;epochCalendar(&#39;&amp;quot;&amp;nbsp;+&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;&#39;,&amp;nbsp;&#39;&amp;quot;&amp;nbsp;+&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input&#39;,&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;timepicker&amp;nbsp;+&amp;nbsp;&amp;quot;,&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;interval&amp;nbsp;+&amp;nbsp;&amp;quot;);&amp;quot;);&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;sb.append(&amp;quot;&amp;lt;/script&amp;gt;&amp;quot;);&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;return&amp;nbsp;sb.toString();&lt;br /&gt;&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;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;number(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;void&amp;nbsp;setDefaults(){&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;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;properties&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;properties.put(&amp;quot;class&amp;quot;,&amp;nbsp;&amp;quot;right-align&amp;quot;);&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;properties.put(&amp;quot;size&amp;quot;,&amp;nbsp;29);&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;properties.put(&amp;quot;maxlength&amp;quot;,&amp;nbsp;11);&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;this.defaults.put(FormTagTemplate.text,&amp;nbsp;properties);&lt;br /&gt;&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;doEnd()&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;nbsp;return&amp;nbsp;&amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;doStart(Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;propertyMap)&amp;nbsp;throws&amp;nbsp;HTMLTagException&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;nbsp;StringBuffer&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuffer();&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;String&amp;nbsp;name&amp;nbsp;=&amp;nbsp;propertyMap.get(&amp;quot;name&amp;quot;).toString();&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;String&amp;nbsp;format&amp;nbsp;=&amp;nbsp;propertyMap.get(&amp;quot;format&amp;quot;).toString();&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;&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;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;defaults&amp;nbsp;=&amp;nbsp;this.defaults.get(FormTagTemplate.text);&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;defaults.putAll(propertyMap);&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;if(defaults.containsKey(&amp;quot;value&amp;quot;))&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;defaults.remove(&amp;quot;value&amp;quot;);&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;defaults.put(&amp;quot;name&amp;quot;,&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input&amp;quot;);&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;defaults.put(&amp;quot;id&amp;quot;,&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input&amp;quot;);&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;defaults.put(&amp;quot;onblur&amp;quot;,&amp;nbsp;&amp;quot;javascript:formatNumberFunc(this,&#39;&amp;quot;&amp;nbsp;+&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;&#39;,&#39;&amp;quot;&amp;nbsp;+&amp;nbsp;format&amp;nbsp;+&amp;nbsp;&amp;quot;&#39;);&amp;quot;);&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;defaults.put(&amp;quot;onfocus&amp;quot;,&amp;nbsp;&amp;quot;javascript:unformatNumber(this,&#39;&amp;quot;&amp;nbsp;+&amp;nbsp;format&amp;nbsp;+&amp;nbsp;&amp;quot;&#39;);&amp;quot;);&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;sb.append(FormTagTemplate.text.doStart(defaults));&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;&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;sb.append(&amp;quot;\n&amp;quot;);&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;defaults&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;defaults.put(&amp;quot;name&amp;quot;,&amp;nbsp;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;&amp;nbsp;defaults.put(&amp;quot;id&amp;quot;,&amp;nbsp;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;&amp;nbsp;Object&amp;nbsp;value&amp;nbsp;=&amp;nbsp;&amp;quot;0&amp;quot;;&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;if(propertyMap.containsKey(&amp;quot;value&amp;quot;))&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;value&amp;nbsp;=&amp;nbsp;propertyMap.get(&amp;quot;value&amp;quot;);&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;if(value&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;StringUtils.isBlank(value.toString())&amp;nbsp;||&amp;nbsp;!StringUtils.isNumeric(value.toString()))&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;value&amp;nbsp;=&amp;nbsp;&amp;quot;0&amp;quot;;&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;defaults.put(&amp;quot;value&amp;quot;,&amp;nbsp;value);&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;sb.append(FormTagTemplate.hidden.doStart(defaults));&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;&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;sb.append(&amp;quot;\n&amp;quot;);&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;sb.append(&amp;quot;&amp;lt;script&amp;nbsp;type=\&amp;quot;text/javascript\&amp;quot;&amp;gt;&amp;quot;);&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;sb.append(&amp;quot;$(&#39;&amp;quot;&amp;nbsp;+&amp;nbsp;name&amp;nbsp;+&amp;nbsp;&amp;quot;_input&#39;).value&amp;nbsp;=&amp;nbsp;formatNumberFunction(&amp;quot;&amp;nbsp;+&amp;nbsp;value&amp;nbsp;+&amp;nbsp;&amp;quot;,&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;format&amp;nbsp;+&amp;nbsp;&amp;quot;);&amp;quot;);&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;sb.append(&amp;quot;&amp;lt;/script&amp;gt;&amp;quot;);&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;return&amp;nbsp;sb.toString();&lt;br /&gt;&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;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;EnumMap&amp;lt;FormTagTemplate,&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;gt;&amp;nbsp;defaults&amp;nbsp;=&amp;nbsp;new&amp;nbsp;EnumMap&amp;lt;FormTagTemplate,&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;gt;(FormTagTemplate.class);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;CustomTagTemplate(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.setDefaults();&lt;br /&gt;&amp;nbsp;&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;protected&amp;nbsp;abstract&amp;nbsp;void&amp;nbsp;setDefaults();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;abstract&amp;nbsp;String&amp;nbsp;doEnd();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;abstract&amp;nbsp;String&amp;nbsp;doStart(Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;propertyMap)&amp;nbsp;throws&amp;nbsp;HTMLTagException;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Of course you can add a calendar and a number function to the &lt;a href=&quot;http://outofkatieshead.blogspot.com/2008/05/html-tag-templates-with-enum-and-tag_2204.html&quot;&gt;Utility&lt;/a&gt; class and create tag files in the same way as I did for &lt;a href=&quot;http://outofkatieshead.blogspot.com/2008/05/html-tag-templates-with-enum-and-tag_6278.html&quot;&gt;input and select tag&lt;/a&gt;.  However, it will be much easier if you just write it in &lt;a href=&quot;http://outofkatieshead.blogspot.com/2008/05/custom-tag-using-tag-file.html&quot;&gt;pure tag file&lt;/a&gt;.  Then you might wonder why go through all the trouble to write CustomTagTemplate?  The answer is to use it for AJAX calls, which will be covered soon.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/1892604335447367252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/1892604335447367252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1892604335447367252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1892604335447367252'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2008/05/use-of-enummap.html' title='Use of EnumMap'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqvgpk3uTeF9ActYio5RmoH7SuD6X2bHki7Ggli6ZuMsDlIrGY64NO2oekUrZ5CSYGKG4UBLqg8Tsv5Dej9O_DLyb1x5ebZLSLZdZBdAkUVtvQuodd9G5d6XRrlzt0YRMpnV-YDjY8wIRG/s72-c/calendar.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-1252123533368354876</id><published>2008-05-20T12:30:00.001-04:00</published><updated>2008-05-20T13:32:33.741-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Enum"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML Tag"/><category scheme="http://www.blogger.com/atom/ns#" term="Tag File"/><title type='text'>HTML Tag Template - Tag File</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Now that we&#39;ve done the Java part, let&#39;s get down to Tag File.  First of all, we need to add value, input, and select functions from the &lt;a href=&quot;http://outofkatieshead.blogspot.com/2008/05/html-tag-templates-with-enum-and-tag_2204.html&quot;&gt;Utility&lt;/a&gt; class to a tld file and place it under WEB-INF.&lt;br /&gt;&lt;br /&gt;html.tld&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;taglib&amp;nbsp;xmlns=&amp;quot;http://java.sun.com/xml/ns/j2ee&amp;quot;&amp;nbsp;xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;nbsp;xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd&amp;quot;&amp;nbsp;version=&amp;quot;2.0&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;tlib-version&amp;gt;1.0&amp;lt;/tlib-version&amp;gt;&lt;br /&gt; &amp;lt;short-name&amp;gt;HTMLFunc&amp;lt;/short-name&amp;gt;&lt;br /&gt; &amp;lt;function&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;value&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;function-class&amp;gt;net.yw.html.HTMLTagUtils&amp;lt;/function-class&amp;gt;&lt;br /&gt;  &amp;lt;function-signature&amp;gt;java.lang.String&amp;nbsp;value(java.lang.Object,&amp;nbsp;java.lang.String,&amp;nbsp;boolean)&amp;lt;/function-signature&amp;gt;&lt;br /&gt; &amp;lt;/function&amp;gt;&lt;br /&gt; &amp;lt;function&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;input&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;function-class&amp;gt;net.yw.html.HTMLTagUtils&amp;lt;/function-class&amp;gt;&lt;br /&gt;  &amp;lt;function-signature&amp;gt;java.lang.String&amp;nbsp;input(java.lang.Object,&amp;nbsp;java.lang.String,&amp;nbsp;java.lang.String,&amp;nbsp;java.lang.String,&amp;nbsp;java.util.Map)&amp;lt;/function-signature&amp;gt;&lt;br /&gt; &amp;lt;/function&amp;gt;&lt;br /&gt; &amp;lt;function&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;select&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;function-class&amp;gt;net.yw.html.HTMLTagUtils&amp;lt;/function-class&amp;gt;&lt;br /&gt;  &amp;lt;function-signature&amp;gt;java.lang.String&amp;nbsp;select(java.lang.Object,&amp;nbsp;java.lang.String,&amp;nbsp;java.lang.String,&amp;nbsp;java.util.Map,&amp;nbsp;java.lang.Object,&amp;nbsp;java.lang.String,&amp;nbsp;java.lang.String,&amp;nbsp;java.lang.String)&amp;lt;/function-signature&amp;gt;&lt;br /&gt; &amp;lt;/function&amp;gt;&lt;br /&gt;&amp;lt;/taglib&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Also, you&#39;ll need to create a tags folder under WEB-INF which will holds all the tag files.  In addition, an include.jsp which holds all the tag definition is imported in each tag file.&lt;br /&gt;&lt;br /&gt;includes.jsp&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;%--&amp;nbsp;&amp;nbsp;To&amp;nbsp;use&amp;nbsp;Servlet&amp;nbsp;2.4,&amp;nbsp;the&amp;nbsp;following&amp;nbsp;setting&amp;nbsp;should&amp;nbsp;have&amp;nbsp;a&amp;nbsp;&amp;quot;/jsp&amp;quot;&amp;nbsp;before&amp;nbsp;&amp;quot;/jstl&amp;quot;&amp;nbsp;--%&amp;gt;&lt;br /&gt;&amp;lt;%--&amp;nbsp;JSTL&amp;nbsp;Tags&amp;nbsp;--%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;prefix=&amp;quot;c&amp;quot;&amp;nbsp;uri=&amp;quot;http://java.sun.com/jsp/jstl/core&amp;quot;&amp;nbsp;%&amp;gt;&amp;nbsp;&lt;br /&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;prefix=&amp;quot;fmt&amp;quot;&amp;nbsp;uri=&amp;quot;http://java.sun.com/jsp/jstl/fmt&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;prefix=&amp;quot;fn&amp;quot;&amp;nbsp;&amp;nbsp;uri=&amp;quot;http://java.sun.com/jsp/jstl/functions&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;prefix=&amp;quot;spring&amp;quot;&amp;nbsp;uri=&amp;quot;http://www.springframework.org/tags&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%--&amp;nbsp;Other&amp;nbsp;Tags&amp;nbsp;--%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;uri=&amp;quot;/WEB-INF/html.tld&amp;quot;&amp;nbsp;prefix=&amp;quot;html&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;prefix=&amp;quot;tags&amp;quot;&amp;nbsp;tagdir=&amp;quot;/WEB-INF/tags&amp;quot;%&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assume that form and error information is hold in request, and a default error style -- &#39;errorField&#39; exists, we now have two standard tag files.&lt;br /&gt;&lt;br /&gt;input.tag&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;tag&amp;nbsp;dynamic-attributes=&amp;quot;attrMap&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;type&amp;quot;&amp;nbsp;required=&amp;quot;true&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;property&amp;quot;&amp;nbsp;required=&amp;quot;true&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;styleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;errorStyleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;include&amp;nbsp;file=&amp;quot;/WEB-INF/jsp/common/includes.jsp&amp;quot;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;type&amp;quot;&amp;nbsp;value=&amp;quot;${fn:toLowerCase(type)}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${styleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;right-align&#39;&amp;nbsp;:&amp;nbsp;styleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;c:if&amp;nbsp;test=&amp;quot;${not&amp;nbsp;empty&amp;nbsp;request.errors.messages[property]}&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${errorStyleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;errorField&#39;&amp;nbsp;:&amp;nbsp;errorStyleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;${html:input(request.form,&amp;nbsp;property,&amp;nbsp;class,&amp;nbsp;type,&amp;nbsp;attrMap)}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;select.tag&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;tag&amp;nbsp;dynamic-attributes=&amp;quot;attrMap&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;property&amp;quot;&amp;nbsp;required=&amp;quot;true&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;collections&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;type=&amp;quot;java.lang.Object&amp;quot;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;valueProperty&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;labelProperty&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;styleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;attribute&amp;nbsp;name=&amp;quot;errorStyleClass&amp;quot;&amp;nbsp;required=&amp;quot;false&amp;quot;&amp;nbsp;rtexprvalue=&amp;quot;true&amp;quot;&amp;nbsp;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%@&amp;nbsp;include&amp;nbsp;file=&amp;quot;/WEB-INF/jsp/common/includes.jsp&amp;quot;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${styleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;&#39;&amp;nbsp;:&amp;nbsp;styleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;c:if&amp;nbsp;test=&amp;quot;${not&amp;nbsp;empty&amp;nbsp;request.errors.messages[property]}&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;c:set&amp;nbsp;var=&amp;quot;class&amp;quot;&amp;nbsp;value=&amp;quot;${errorStyleClass&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&#39;errorField&#39;&amp;nbsp;:&amp;nbsp;errorStyleClass}&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&amp;lt;c:set&amp;nbsp;var=&amp;quot;optionString&amp;quot;&amp;gt;&amp;lt;jsp:doBody&amp;nbsp;/&amp;gt;&amp;lt;/c:set&amp;gt;&lt;br /&gt;${html:select(request.form,&amp;nbsp;property,&amp;nbsp;class,&amp;nbsp;attrMap,&amp;nbsp;collections,&amp;nbsp;valueProperty,&amp;nbsp;labelProperty,&amp;nbsp;optionString)}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Note there is an attribute called attrMap which is a dynamic-attribute.  With attrMap in place, you can add any extra attribute to the tag besides what have been defined in the tag file.  And these extra attributes will be passed as the HTML Tag&#39;s atrribute values.  It is safe to do so as long as the property filter process in FormTagTemplate.java is in place.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For select tag, the user has multiple ways to specify options.  You can write the options manually between the select tag.  Or, you can pass in a collection or an array and specify the value and label property.  Also, you can pass in a map which&#39;s key is the value property and value is the label property.  There is also a blank option indicating adding a blank option on top of the option list when it&#39;s true.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Here is some example:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;tags:input&amp;nbsp;type=&amp;quot;text&amp;quot;&amp;nbsp;property=&amp;quot;stockNumber&amp;quot;&amp;nbsp;size=&amp;quot;29&amp;quot;&amp;nbsp;styleClass=&amp;quot;left-align&amp;quot;&amp;nbsp;tabindex=&amp;quot;1&amp;quot;&amp;nbsp;errorStyleClass=&amp;quot;errorClass&amp;quot;&amp;nbsp;maxlength=&amp;quot;20&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tags:select&amp;nbsp;property=&amp;quot;typeId&amp;quot;&amp;nbsp;collections=&amp;quot;${request.form.optionMap}&amp;quot;&amp;nbsp;blank=&amp;quot;true&amp;quot;&amp;nbsp;tabindex=&amp;quot;2&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tags:select&amp;nbsp;property=&amp;quot;selectedName&amp;quot;&amp;nbsp;style=&amp;quot;width:&amp;nbsp;80px&amp;quot;&amp;nbsp;onchange=&amp;quot;javascript:doSubmit();&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c:forEach&amp;nbsp;var=&amp;quot;name&amp;quot;&amp;nbsp;items=&amp;quot;${request.form.availableNames}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c:choose&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;lt;c:when&amp;nbsp;test=&amp;quot;${name[0]&amp;nbsp;==&amp;nbsp;request.form.selectedName}&amp;quot;&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;lt;option&amp;nbsp;value=&amp;quot;${name[0]}&amp;quot;&amp;nbsp;selected&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;lt;/c:when&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;lt;c:otherwise&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;lt;option&amp;nbsp;value=&amp;quot;${name[0]}&amp;quot;&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;lt;/c:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/c:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c:catch&amp;nbsp;var=&amp;quot;error&amp;quot;&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;lt;tags:label&amp;nbsp;key=&amp;quot;${name[1]}&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/c:catch&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/c:forEach&amp;gt;&lt;br /&gt;&amp;lt;/tags:select&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%--&amp;nbsp;request.form.styles&amp;nbsp;is&amp;nbsp;an&amp;nbsp;array&amp;nbsp;--%&amp;gt;&lt;br /&gt;&amp;lt;tags:select&amp;nbsp;property=&amp;quot;style&amp;quot;&amp;nbsp;collections=&amp;quot;${request.form.styles}&amp;quot;&amp;nbsp;valueProperty=&amp;quot;0&amp;quot;&amp;nbsp;labelProperty=&amp;quot;1&amp;quot;&amp;nbsp;tabindex=&amp;quot;4&amp;quot;&amp;nbsp;blank=&amp;quot;false&amp;quot;&amp;nbsp;style=&amp;quot;width:178px&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Coming up next, more on custom HTML Tag and use of HTMLTagTemplate in AJAX.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/1252123533368354876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/1252123533368354876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1252123533368354876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/1252123533368354876'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2008/05/html-tag-templates-with-enum-and-tag_6278.html' title='HTML Tag Template - Tag File'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4882327673297017980.post-5189721705225795726</id><published>2008-05-20T11:49:00.000-04:00</published><updated>2008-05-20T13:32:03.554-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Enum"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML Tag"/><category scheme="http://www.blogger.com/atom/ns#" term="Tag File"/><title type='text'>HTML Tag Template - Utility</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;In my &lt;a href=&quot;http://outofkatieshead.blogspot.com/2008/05/html-tag-templates-with-enum-and-tag_20.html&quot;&gt;previous post&lt;/a&gt;, I wrote a FormTagTemplate which can write form tags.  However, since I don&#39;t use TagSupport, I&#39;ll need a little utility class in order to actually use it to write tags in jsp files.&lt;br /&gt;&lt;br /&gt;HTMLTagUtils.java&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;package&amp;nbsp;net.yw.html;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.lang.reflect.InvocationTargetException;&lt;br /&gt;import&amp;nbsp;java.util.Arrays;&lt;br /&gt;import&amp;nbsp;java.util.Collection;&lt;br /&gt;import&amp;nbsp;java.util.HashMap;&lt;br /&gt;import&amp;nbsp;java.util.Map;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.apache.commons.beanutils.BeanUtils;&lt;br /&gt;import&amp;nbsp;org.apache.commons.lang.StringUtils;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;KWang&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public&amp;nbsp;class&amp;nbsp;HTMLTagUtils&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;ResponseUtils.filter(String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;String&amp;nbsp;filter(String&amp;nbsp;value)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(value&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;value.length()&amp;nbsp;==&amp;nbsp;0)&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;return&amp;nbsp;value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuffer&amp;nbsp;result&amp;nbsp;=&amp;nbsp;null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;filtered&amp;nbsp;=&amp;nbsp;null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;value.length();&amp;nbsp;i++)&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;nbsp;filtered&amp;nbsp;=&amp;nbsp;null;&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;switch&amp;nbsp;(value.charAt(i))&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&#39;&amp;lt;&#39;:&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;filtered&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;lt;&amp;quot;;&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;break;&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;case&amp;nbsp;&#39;&amp;gt;&#39;:&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;filtered&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;gt;&amp;quot;;&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;break;&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;case&amp;nbsp;&#39;&amp;amp;&#39;:&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;filtered&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;amp;&amp;quot;;&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;break;&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;case&amp;nbsp;&#39;&amp;quot;&#39;:&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;filtered&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;quot;&amp;quot;;&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;break;&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;case&amp;nbsp;&#39;\&#39;&#39;:&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;filtered&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;#39;&amp;quot;;&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;break;&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;}&lt;br /&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;if&amp;nbsp;(result&amp;nbsp;==&amp;nbsp;null)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(filtered&amp;nbsp;!=&amp;nbsp;null)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuffer(value.length()&amp;nbsp;+&amp;nbsp;50);&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;if&amp;nbsp;(i&amp;nbsp;&amp;gt;&amp;nbsp;0)&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;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;result.append(value.substring(0,&amp;nbsp;i));&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;}&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;result.append(filtered);&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;}&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;else&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(filtered&amp;nbsp;==&amp;nbsp;null)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.append(value.charAt(i));&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;else&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.append(filtered);&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;value&amp;nbsp;:&amp;nbsp;result.toString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;String&amp;nbsp;value(Object&amp;nbsp;bean,&amp;nbsp;String&amp;nbsp;property,&amp;nbsp;boolean&amp;nbsp;escapeXml)&amp;nbsp;throws&amp;nbsp;IllegalAccessException,&amp;nbsp;InvocationTargetException,&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;NoSuchMethodException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;value&amp;nbsp;=&amp;nbsp;BeanUtils.getProperty(bean,&amp;nbsp;property);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(value&amp;nbsp;==&amp;nbsp;null)&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;return&amp;nbsp;&amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;escapeXml?filter(value):value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;String&amp;nbsp;select(Object&amp;nbsp;bean,&amp;nbsp;String&amp;nbsp;property,&amp;nbsp;String&amp;nbsp;styleClass,&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;properties,&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;Object&amp;nbsp;collections,&amp;nbsp;String&amp;nbsp;valueProperty,&amp;nbsp;String&amp;nbsp;labelProperty,&amp;nbsp;String&amp;nbsp;optionString)&amp;nbsp;throws&amp;nbsp;&amp;nbsp;HTMLTagException&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(StringUtils.isBlank(property))&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;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;property&amp;nbsp;is&amp;nbsp;missing&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormTagTemplate&amp;nbsp;select&amp;nbsp;=&amp;nbsp;FormTagTemplate.select;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;properties.put(&amp;quot;name&amp;quot;,&amp;nbsp;property);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!properties.containsKey(&amp;quot;id&amp;quot;))&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;properties.put(&amp;quot;id&amp;quot;,&amp;nbsp;properties.get(&amp;quot;name&amp;quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(StringUtils.isNotBlank(styleClass))&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;properties.put(&amp;quot;class&amp;quot;,&amp;nbsp;styleClass);&lt;br /&gt;&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;StringBuffer&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuffer(select.doStart(properties));&lt;br /&gt;&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;//options&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormTagTemplate&amp;nbsp;option&amp;nbsp;=&amp;nbsp;FormTagTemplate.option;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(properties.containsKey(&amp;quot;blank&amp;quot;)){&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;boolean&amp;nbsp;blank&amp;nbsp;=&amp;nbsp;Boolean.parseBoolean(properties.get(&amp;quot;blank&amp;quot;).toString());&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;if(blank){&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;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;blankOp&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;blankOp.put(&amp;quot;value&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;);&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;blankOp.put(&amp;quot;label&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;);&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;sb.append(option.doStart(blankOp)&amp;nbsp;+&amp;nbsp;option.doEnd());&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;}&lt;br /&gt;&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;if(collections&amp;nbsp;!=&amp;nbsp;null){&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;try&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;value&amp;nbsp;=&amp;nbsp;bean&amp;nbsp;==&amp;nbsp;null&amp;nbsp;?&amp;nbsp;&amp;quot;&amp;quot;:value(bean,&amp;nbsp;property,&amp;nbsp;false);&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;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;optionProp&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;Object&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;if(collections&amp;nbsp;instanceof&amp;nbsp;Map){&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;for(Map.Entry&amp;lt;Object,&amp;nbsp;Object&amp;gt;&amp;nbsp;entry:((Map&amp;lt;Object,&amp;nbsp;Object&amp;gt;)collections).entrySet()){&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;optionProp.put(&amp;quot;value&amp;quot;,&amp;nbsp;entry.getKey().toString());&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;optionProp.put(&amp;quot;label&amp;quot;,&amp;nbsp;entry.getValue().toString());&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;optionProp.put(&amp;quot;selected&amp;quot;,&amp;nbsp;StringUtils.equals(value,&amp;nbsp;entry.getKey().toString()));&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;sb.append(option.doStart(optionProp)&amp;nbsp;+&amp;nbsp;optionProp.get(&amp;quot;label&amp;quot;)&amp;nbsp;+&amp;nbsp;option.doEnd());&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;}&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;}else&amp;nbsp;if(collections&amp;nbsp;instanceof&amp;nbsp;Collection){&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;for(Object&amp;nbsp;object:((Collection)collections)){&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;optionProp.put(&amp;quot;value&amp;quot;,&amp;nbsp;StringUtils.isBlank(valueProperty)?object.toString():value(object,&amp;nbsp;valueProperty,&amp;nbsp;false));&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;optionProp.put(&amp;quot;label&amp;quot;,&amp;nbsp;StringUtils.isBlank(labelProperty)?object.toString():value(object,&amp;nbsp;labelProperty,&amp;nbsp;false));&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;optionProp.put(&amp;quot;selected&amp;quot;,&amp;nbsp;StringUtils.equals(value,&amp;nbsp;optionProp.get(&amp;quot;value&amp;quot;).toString()));&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;sb.append(option.doStart(optionProp)&amp;nbsp;+&amp;nbsp;optionProp.get(&amp;quot;label&amp;quot;)&amp;nbsp;+&amp;nbsp;option.doEnd());&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;}&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;}else&amp;nbsp;if(collections.getClass().isArray()){&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;for(Object&amp;nbsp;object:Arrays.asList((Object[])collections)){&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;if(object.getClass().isArray()){&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;&amp;nbsp;int&amp;nbsp;valueIndex&amp;nbsp;=&amp;nbsp;StringUtils.isNumeric(valueProperty)?Integer.valueOf(valueProperty):0;&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;&amp;nbsp;int&amp;nbsp;labelIndex&amp;nbsp;=&amp;nbsp;StringUtils.isNumeric(labelProperty)?Integer.valueOf(labelProperty):0;&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;&amp;nbsp;optionProp.put(&amp;quot;value&amp;quot;,&amp;nbsp;((Object[])object)[valueIndex]);&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;&amp;nbsp;optionProp.put(&amp;quot;label&amp;quot;,&amp;nbsp;((Object[])object)[labelIndex]);&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;&amp;nbsp;optionProp.put(&amp;quot;selected&amp;quot;,&amp;nbsp;StringUtils.equals(value,&amp;nbsp;optionProp.get(&amp;quot;value&amp;quot;).toString()));&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;&amp;nbsp;sb.append(option.doStart(optionProp)&amp;nbsp;+&amp;nbsp;optionProp.get(&amp;quot;label&amp;quot;)&amp;nbsp;+&amp;nbsp;option.doEnd());&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;}else{&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;&amp;nbsp;optionProp.put(&amp;quot;value&amp;quot;,&amp;nbsp;StringUtils.isBlank(valueProperty)?object.toString():value(object,&amp;nbsp;valueProperty,&amp;nbsp;false));&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;&amp;nbsp;optionProp.put(&amp;quot;label&amp;quot;,&amp;nbsp;StringUtils.isBlank(labelProperty)?object.toString():value(object,&amp;nbsp;labelProperty,&amp;nbsp;false));&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;&amp;nbsp;optionProp.put(&amp;quot;selected&amp;quot;,&amp;nbsp;StringUtils.equals(value,&amp;nbsp;optionProp.get(&amp;quot;value&amp;quot;).toString()));&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;&amp;nbsp;sb.append(option.doStart(optionProp)&amp;nbsp;+&amp;nbsp;optionProp.get(&amp;quot;label&amp;quot;)&amp;nbsp;+&amp;nbsp;option.doEnd());&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;}&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;}&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;}&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;catch&amp;nbsp;(IllegalAccessException&amp;nbsp;e)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Cannot&amp;nbsp;get&amp;nbsp;value&amp;nbsp;of&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;property&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;bean&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;nbsp;}&amp;nbsp;catch&amp;nbsp;(InvocationTargetException&amp;nbsp;e)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Cannot&amp;nbsp;get&amp;nbsp;value&amp;nbsp;of&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;property&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;bean&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;nbsp;}&amp;nbsp;catch&amp;nbsp;(NoSuchMethodException&amp;nbsp;e)&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Cannot&amp;nbsp;get&amp;nbsp;value&amp;nbsp;of&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;property&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;bean&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;nbsp;}&lt;br /&gt;&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(StringUtils.isNotBlank(optionString))&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;sb.append(optionString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(select.doEnd());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sb.toString();&lt;br /&gt;&amp;nbsp;&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;public&amp;nbsp;static&amp;nbsp;String&amp;nbsp;input(Object&amp;nbsp;bean,&amp;nbsp;String&amp;nbsp;property,&amp;nbsp;String&amp;nbsp;styleClass,&amp;nbsp;String&amp;nbsp;type,&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Object&amp;gt;&amp;nbsp;properties)&amp;nbsp;throws&amp;nbsp;HTMLTagException{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(StringUtils.isBlank(property))&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;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;property&amp;nbsp;is&amp;nbsp;missing&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormTagTemplate&amp;nbsp;tag&amp;nbsp;=&amp;nbsp;FormTagTemplate.valueOf(type);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(tag&amp;nbsp;==&amp;nbsp;null)&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;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;tag&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;type&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;not&amp;nbsp;found!&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if(tag.equals(FormTagTemplate.select)&amp;nbsp;||&amp;nbsp;tag.equals(FormTagTemplate.option))&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;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Please&amp;nbsp;use&amp;nbsp;select&amp;nbsp;for&amp;nbsp;select/option&amp;nbsp;type&amp;nbsp;tag!&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if(tag.equals(FormTagTemplate.div))&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;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Please&amp;nbsp;use&amp;nbsp;div&amp;nbsp;tag&amp;nbsp;directly&amp;nbsp;in&amp;nbsp;page!&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;properties.put(&amp;quot;name&amp;quot;,&amp;nbsp;property);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!properties.containsKey(&amp;quot;id&amp;quot;))&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;properties.put(&amp;quot;id&amp;quot;,&amp;nbsp;properties.get(&amp;quot;name&amp;quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(StringUtils.isNotBlank(styleClass))&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;properties.put(&amp;quot;class&amp;quot;,&amp;nbsp;styleClass);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&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;nbsp;String&amp;nbsp;value&amp;nbsp;=&amp;nbsp;bean&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;tag.equals(FormTagTemplate.file)&amp;nbsp;?&amp;nbsp;&amp;quot;&amp;quot;:value(bean,&amp;nbsp;property,&amp;nbsp;false);&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;switch(tag){&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;case&amp;nbsp;radio:&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;for(String&amp;nbsp;key:properties.keySet()){&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;if(StringUtils.equalsIgnoreCase(key,&amp;nbsp;&amp;quot;value&amp;quot;)){&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;&amp;nbsp;String&amp;nbsp;compareValue&amp;nbsp;=&amp;nbsp;properties.get(key).toString();&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;&amp;nbsp;properties.put(&amp;quot;checked&amp;quot;,&amp;nbsp;Boolean.valueOf(StringUtils.equals(value,&amp;nbsp;compareValue)));&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;&amp;nbsp;break;&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;}&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;}&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;break;&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;case&amp;nbsp;checkbox:&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;if(!properties.containsKey(&amp;quot;value&amp;quot;))&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;properties.put(&amp;quot;value&amp;quot;,&amp;nbsp;&amp;quot;on&amp;quot;);&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;properties.put(&amp;quot;checked&amp;quot;,&amp;nbsp;Boolean.valueOf(value));&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;break;&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;default:&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;properties.put(&amp;quot;value&amp;quot;,&amp;nbsp;value);&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;break;&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;}&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;&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;StringBuffer&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuffer(tag.doStart(properties));&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;if(tag.equals(FormTagTemplate.textarea)&amp;nbsp;||&amp;nbsp;tag.equals(FormTagTemplate.div))&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;sb.append(value&amp;nbsp;+&amp;nbsp;tag.doEnd());&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;return&amp;nbsp;sb.toString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(IllegalAccessException&amp;nbsp;e)&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;nbsp;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Cannot&amp;nbsp;get&amp;nbsp;value&amp;nbsp;of&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;property&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;bean&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(InvocationTargetException&amp;nbsp;e)&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;nbsp;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Cannot&amp;nbsp;get&amp;nbsp;value&amp;nbsp;of&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;property&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;bean&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(NoSuchMethodException&amp;nbsp;e)&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;nbsp;throw&amp;nbsp;new&amp;nbsp;HTMLTagException(&amp;quot;Cannot&amp;nbsp;get&amp;nbsp;value&amp;nbsp;of&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;property&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;bean&amp;nbsp;);&lt;br /&gt;&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;}&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The utility only has four functions. filter() is identical to ResponseUtils.filter() in Struts. value() retrieves the String value of a property in a bean.  select() and input() is used in select and input tag files in my next post.</content><link rel='replies' type='application/atom+xml' href='http://outofkatieshead.blogspot.com/feeds/5189721705225795726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4882327673297017980/5189721705225795726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/5189721705225795726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4882327673297017980/posts/default/5189721705225795726'/><link rel='alternate' type='text/html' href='http://outofkatieshead.blogspot.com/2008/05/html-tag-templates-with-enum-and-tag_2204.html' title='HTML Tag Template - Utility'/><author><name>Katie</name><uri>http://www.blogger.com/profile/05722274954035442826</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>