<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;Ak4ARH4zfSp7ImA9WhdRFU8.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527</id><updated>2011-08-05T12:52:25.085+05:30</updated><title>EasyWeb4J Blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://easyweb4j.blogspot.com/" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Easyweb4jBlog" /><feedburner:info uri="easyweb4jblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0ACRHcyeSp7ImA9WxBWE0Q.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-5807812174307446573</id><published>2010-02-05T21:54:00.000+05:30</published><updated>2010-02-05T23:12:45.991+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-05T23:12:45.991+05:30</app:edited><title>Annotated Dynamic Titles</title><content type="html">Web applications usually have two parts in their title.  One indicating the current page and the other describing the entire application.  It would be nice to put the application wide title and parameterize the page level title within your applications' layout.  Starting from 0.5, EasyWeb4J allows you to annotate your action methods with custom annotation and access them easily within any part of your controller.&lt;br /&gt;&lt;br /&gt;This sample application would have two pages with titles "Home - Dynamic Title Demo" and "Admin - Dynamic Title Demo".  Here, "Home" and "Admin" are specific to the particular page while the rest of the title is common to the entire application.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_g5hM85MTy7c/S2xYiYSfRKI/AAAAAAAAAcQ/MLw-zlGUgYA/s1600-h/title.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://3.bp.blogspot.com/_g5hM85MTy7c/S2xYiYSfRKI/AAAAAAAAAcQ/MLw-zlGUgYA/s320/title.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5434816197988140194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cloud.github.com/downloads/tuxychandru/easyweb4j_tutorials/title.zip"&gt;Download&lt;/a&gt; the complete source code for this application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Layout and Controller&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The layout specifies the application wide title as template text and uses an EL expression to include the page specific title before it.  It also provides the navigation links for the 2 pages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic"&gt;src/main/webapp/WEB-INF/layouts/Application.jsp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/295991.js?file=Application.jsp"&gt;&lt;/script&gt;&lt;br /&gt;The controller has 2 actions corresponding to the application's pages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic"&gt;src/main/java/org/title/controllers/HomeController.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/295991.js?file=HomeController.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Making it Work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's create a custom annotation specific to this application which will be used on the action methods to specify the page specific title&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic"&gt;src/main/java/org/title/annotations/Title.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/295991.js?file=HomeController.java"&gt;&lt;/script&gt;&lt;br /&gt;Next, we must override the &lt;a href="http://easyweb4j.sourceforge.net/apidocs/net/sf/easyweb4j/controller/Controller.html#filterRequest()"&gt;filterRequest()&lt;/a&gt; method to make use of the Title annotation when available on action methods.  EasyWeb4J 0.5 and above provide the &lt;a href="http://easyweb4j.sourceforge.net/apidocs/net/sf/easyweb4j/controller/Controller.html#getActionAnnotation(java.lang.Class)"&gt;getActionAnnotation()&lt;/a&gt; method, which can be used in our filter to access the annotations on the current request's action method.&lt;br /&gt;&lt;br /&gt;We then annotate our action methods with &lt;span style="font-style: italic"&gt;@Title("Home")&lt;/span&gt; and &lt;span style="font-style: italic"&gt;@Title("Admin")&lt;/span&gt; to specify their titles as shown below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic"&gt;src/main/java/org/title/controllers/HomeController.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/295991.js?file=annotated_HomeController.java"&gt;&lt;/script&gt;&lt;br /&gt;In a real-world application the filter can be moved to an abstract super class to setup the appropriate titles for actions across all controllers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-5807812174307446573?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/U8EYGpsAoxI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/5807812174307446573/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2010/02/annotated-dynamic-titles.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/5807812174307446573?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/5807812174307446573?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/U8EYGpsAoxI/annotated-dynamic-titles.html" title="Annotated Dynamic Titles" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_g5hM85MTy7c/S2xYiYSfRKI/AAAAAAAAAcQ/MLw-zlGUgYA/s72-c/title.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2010/02/annotated-dynamic-titles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIBR387eip7ImA9WxBXFUQ.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-3577638814971050303</id><published>2010-01-27T12:21:00.001+05:30</published><updated>2010-01-27T16:39:16.102+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-27T16:39:16.102+05:30</app:edited><title>EasyWeb4J 0.5 Released</title><content type="html">We're proud to announce the release of EasyWeb4J 0.5.  This release includes several important changes to further simplify development of web applications using EasyWeb4J.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Components of the request URL after the action name are passed to the action method as parameters.  These are also converted to the appropriate basic type of the parameters. getIntegerId(), getLongId(), getStringId(), etc. need not be used any more.  See the "Parameters in Action Methods" section of this &lt;a href="http://easyweb4j.sourceforge.net/tutorial/controllers_and_views/controllers.html"&gt;tutorial page&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;You can define and use application-specific custom annotations on action methods.  These annotations can be obtained within your controller using the getActionAnnotation() and getActionAnnotations() methods.  This can be very handy to do things like action specific authorization and for setting up action specific request attributes like title, stylesheet, etc.&lt;/li&gt;&lt;li&gt;A ResponseHandler interface is provided which can be used to generate raw responses cleanly within the view rendering transaction.  See the "Generating Raw Response" section of this &lt;a href="http://easyweb4j.sourceforge.net/tutorial/controllers_and_views/controllers.html"&gt;tutorial page&lt;/a&gt;.  Closures should hopefully allow a lot cleaner syntax for this when Java 7 is out.&lt;/li&gt;&lt;li&gt;Attributes of your application's ServletContext can be injected into your controllers' fields using @ContextAttribute annotation.&lt;/li&gt;&lt;li&gt;Model class provides validateRequired() methods which can be used to validate presence of value in fields.&lt;/li&gt;&lt;li&gt;Starting from this release EasyWeb4J will be available from its own maven repository and hence need not be installed to maven manually.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;hbm2ddl.auto&lt;/b&gt; hibernate property is set to &lt;b&gt;update&lt;/b&gt; when a new project is created to simplify initial development.  You might want to &lt;b&gt;disable this before taking your application to production&lt;/b&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Contributing to EasyWeb4J also got simpler as the source repository has been &lt;a href="http://github.com/tuxychandru/easyweb4j/"&gt;moved to GitHub&lt;/a&gt;.  :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If that caught your attention, get yourself started with the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt; and hit the &lt;a href="http://groups.google.com/group/easyweb4j"&gt;mailing list&lt;/a&gt; for any further assistance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-3577638814971050303?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/4V6JjVjq838" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/3577638814971050303/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2010/01/easyweb4j-05-released.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/3577638814971050303?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/3577638814971050303?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/4V6JjVjq838/easyweb4j-05-released.html" title="EasyWeb4J 0.5 Released" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2010/01/easyweb4j-05-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ENR3g8fyp7ImA9WxBQGEw.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-1084887571376196364</id><published>2009-12-01T18:40:00.000+05:30</published><updated>2010-01-18T16:18:16.677+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-18T16:18:16.677+05:30</app:edited><title>Simple Authentication and Authorization with EasyWeb4J</title><content type="html">This post demonstrates the implementation of a simple password based Authentication and Authorization system built with EasyWeb4J.  This post will demonstrate the hashing API of EasyWeb4J (including salt generation) and put to use EasyWeb4J's simplified request filtering for authorization.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When a user signs up his password is combined with a random salt of 10 bytes.  This is then hashed using MD5 algorithm.  The salt and the password hash are stored.  During login the user is retrieved by his username and the entered password is hashed and compared against the original hash.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://cloud.github.com/downloads/tuxychandru/easyweb4j_tutorials/auth.zip"&gt;Download&lt;/a&gt; the complete source code for this application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Create a new EasyWeb4J Hibernate Project as described in the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt;.  Configure hibernate as shown below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;src/main/resources/hibernate.xml&lt;/i&gt;&lt;/div&gt;&lt;script src="http://gist.github.com/279933.js?file=hibernate.xml"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Model&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;src/main/java/net/auth/models/User.java&lt;/i&gt;&lt;/div&gt;&lt;script src="http://gist.github.com/279933.js?file=User.java"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;i&gt;encryptPassword&lt;/i&gt; method generates a random salt and encrypts the clear text password using MD5 algorithm and the salt, using EasyWeb4J's hashing API.  The &lt;i&gt;matchesPassword&lt;/i&gt; method takes a clear text password input by the user, hashes it using the previously generated salt and compares it with the original hashed password.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Controllers&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This sample application has three controllers.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;UsersController&lt;/i&gt; - Handles user signup.&lt;/li&gt;&lt;li&gt;&lt;i&gt;SessionsController&lt;/i&gt; - Handles login and logout.&lt;/li&gt;&lt;li&gt;&lt;i&gt;HomeController&lt;/i&gt;  - The actual application which needs to be secured by requiring login.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;i&gt;src/main/java/net/auth/controllers/UsersController.java&lt;/i&gt;&lt;/div&gt;&lt;script src="http://gist.github.com/279933.js?file=UsersController.java"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not much magic there.  Just a standard controller to create a user after encrypting the entered password.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Authentication&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;src/main/java/net/auth/controllers/SessionsController.java&lt;/i&gt;&lt;/div&gt;&lt;script src="http://gist.github.com/279933.js?file=SessionsController.java"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This controller authenticates a user from login screen and redirects them to the secure home page after storing the user ID in session.  If login fails, it redirects to the login page back after setting a message in flash.  Also, while displaying the login page it checks whether the user has already logged in and if so directly redirects them to home page without requesting credentials.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Authorization&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While there is only one controller in this example whose requests need to be secured, in real applications there would be several.  Hence we create an abstract controller which will override the &lt;i&gt;&lt;a href="http://easyweb4j.sourceforge.net/apidocs/net/sf/easyweb4j/controller/Controller.html#filterRequest()"&gt;filterRequest()&lt;/a&gt;&lt;/i&gt; method to perform authorization during each request.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;src/main/java/net/auth/controllers/SecureController.java&lt;/i&gt;&lt;/div&gt;&lt;script src="http://gist.github.com/279933.js?file=SecureController.java"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It verifies whether a user is currently logged in and if so, sets the real user as a request attribute.  This would be used to greet the user by his full name.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally we have the home controller which in this sample does nothing other than rendering the &lt;i&gt;index&lt;/i&gt; view.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;src/main/java/net/auth/controllers/HomeController.java&lt;/i&gt;&lt;/div&gt;&lt;script src="http://gist.github.com/279933.js?file=HomeController.java"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There we have a complete DB based login system.  :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-1084887571376196364?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/TKS_sP8Zjao" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/1084887571376196364/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/12/simple-authentication-and-authorization.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/1084887571376196364?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/1084887571376196364?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/TKS_sP8Zjao/simple-authentication-and-authorization.html" title="Simple Authentication and Authorization with EasyWeb4J" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/12/simple-authentication-and-authorization.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08NRn85cSp7ImA9WxNaFUU.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-5883698669188247112</id><published>2009-11-30T16:58:00.001+05:30</published><updated>2009-11-30T17:21:37.129+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-30T17:21:37.129+05:30</app:edited><title>EasyWeb4J 0.3 is Out with Support for Cleaner URLs</title><content type="html">After quite a long time of silence, &lt;a href="http://easyweb4j.sourceforge.net/"&gt;EasyWeb4J&lt;/a&gt; 0.3 has been released.  Some of the major changes in this release include,&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;The "/dispatcher" part is dropped from the URLs as EasyWeb4J now uses a filter instead of a servlet for dispatching requests.&lt;/li&gt;&lt;li&gt;An improved API for hashing with support for easy salt generation.&lt;/li&gt;&lt;li&gt;Unified handling of both muti-database and single-database projects.&lt;/li&gt;&lt;li&gt;A significantly improved code architecture.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;This release breaks compatibility with 0.2 in few minor ways.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;/src/main/resources/repositories.properties must be present even for single-database projects.  This file would be auto-generated when creating new projects.&lt;/li&gt;&lt;li&gt;The "dispatcherRoot" attribute is not set anymore as it does not exist.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;All previous samples in this blog have been updated to use the new version.  &lt;a href="http://sourceforge.net/projects/easyweb4j/files/"&gt;Grab it&lt;/a&gt; and enjoy web development with Java!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-5883698669188247112?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/vAyPlVqYZiY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/5883698669188247112/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/11/easyweb4j-03-is-out-with-support-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/5883698669188247112?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/5883698669188247112?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/vAyPlVqYZiY/easyweb4j-03-is-out-with-support-for.html" title="EasyWeb4J 0.3 is Out with Support for Cleaner URLs" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/11/easyweb4j-03-is-out-with-support-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8CQ34-fip7ImA9WxNTGU4.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-463688452943839276</id><published>2009-08-22T14:41:00.001+05:30</published><updated>2009-08-22T14:51:02.056+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-22T14:51:02.056+05:30</app:edited><title>EasyWeb4J 0.2 Supports Multiple Databases and Simplifies Validations</title><content type="html">We're proud to announce the release of EasyWeb4J 0.2.  This release focussed on supporting &lt;a href="http://easyweb4j.sourceforge.net/multi_db.html"&gt;multiple databases&lt;/a&gt; within a single application and also simplifies validations in models.&lt;br /&gt;&lt;br /&gt;Some of the significant changes in this release include,&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Repository management code is re-designed to simplify support for multiple databases and to support more persistence mechanisms.&lt;/li&gt;&lt;li&gt;Support for multiple DBs has been added to Hibernate and JPA repositories.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is just one validate method to perform all validations.&lt;/li&gt;&lt;li&gt;Validation of basic types are handled automatically.&lt;/li&gt;&lt;li&gt;This release also creates projects with a default message bundle to facilitate internationalization.&lt;/li&gt;&lt;/ol&gt;This release breaks compatibility with 0.1.  The tutorial and all previous posts in this blog have been updated for the new version.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/easyweb4j/files/"&gt;Download&lt;/a&gt; the new release and give the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt; a shot.  We're sure you'd love it.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-463688452943839276?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/79D3k1sW23w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/463688452943839276/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/08/easyweb4j-02-supports-multiple.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/463688452943839276?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/463688452943839276?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/79D3k1sW23w/easyweb4j-02-supports-multiple.html" title="EasyWeb4J 0.2 Supports Multiple Databases and Simplifies Validations" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/08/easyweb4j-02-supports-multiple.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08MSX47cCp7ImA9WxBQGE0.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-3965197365759855684</id><published>2009-07-31T22:32:00.000+05:30</published><updated>2010-01-18T15:48:08.008+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-18T15:48:08.008+05:30</app:edited><title>Porting Rails Shoutbox to EasyWeb4J</title><content type="html">It is a widely held belief that Java unnecessarily penalizes simple web applications.  This post demonstrates that by using EasyWeb4J, you can "almost" achieve the productivity of Rails without missing Java's raw performance.&lt;br /&gt;&lt;br /&gt;This tutorial is inspired by &lt;a href="http://net.tutsplus.com/tutorials/ruby/from-codeigniter-to-ruby-on-rails-a-conversion/"&gt;this article&lt;/a&gt; on Nettuts+.  I have  included the stylesheets and images from Dan's post to retain the look and feel of the final result.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cloud.github.com/downloads/tuxychandru/easyweb4j_tutorials/shoutbox.zip"&gt;Download&lt;/a&gt; the complete source code for this application.&lt;br /&gt;&lt;br /&gt;Create a new EasyWeb4J Hibernate Project as described in the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt;, with settings as shown below.&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=proj_details"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MySQL Setup&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Run this script to create a database for shoutbox&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=db.sql"&gt;&lt;/script&gt;Edit your pom.xml and add a dependency for MySQL JDBC driver as below.&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=pom.xml"&gt;&lt;/script&gt;Point Hibernate to the newly created database as below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/resources/hibernate.xml&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=hibernate.xml"&gt;&lt;/script&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;The model specifies the validations for each shout and also generates an MD5 hash of the email used in the shout.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/shoutbox/models/Shout.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=Shout.java"&gt;&lt;/script&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Repository&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Unlike Rails EasyWeb4J uses repositories to load models from database.  However, for this simple app, the repository can be an empty class.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/shoutbox/repositories/ShoutRepository.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=ShoutRepository.java"&gt;&lt;/script&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Controller&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;We create a separate method to load all available shouts as it is needed both in the home action and if an error occurs during shout creation.&lt;/span&gt;&lt;span&gt;  Edit &lt;span style="font-style: italic;"&gt;web.xml&lt;/span&gt; and specify &lt;span style="font-weight: bold;"&gt;Shouts&lt;/span&gt; as the &lt;span style="font-style: italic;"&gt;ROOT_CONTROLLER&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/shoutbox/controllers/ShoutsController.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=ShoutsController.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Layout&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Just like Rails, EasyWeb4J also supports layouts.  To know more on EasyWeb4J layouts, see &lt;a href="http://easyweb4j.blogspot.com/2009/07/dry-views-with-nested-templates-in.html"&gt;this post&lt;/a&gt;.&lt;/span&gt;&lt;span&gt;  We specify the top level elements and include the stylesheet in our layout.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/layouts/Application.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=Application.jsp"&gt;&lt;/script&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;View&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;EasyWeb4J applications use JSTL to loop through elements and errors to be displayed to the user.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/views/Shouts/index.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279921.js?file=index.jsp"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where EasyWeb4J differs from Rails?&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;EasyWeb4J uses the Respository pattern (through Hibernate/JPA) instead of ActiveRecord for persistence.&lt;/li&gt;&lt;li&gt;EasyWeb4J does not provide migrations as DDLs need to be optimized anyway in any non-trivial application.&lt;/li&gt;&lt;li&gt;EasyWeb4J needs a bit of XML for config (but way less than many other Java frameworks).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;EasyWeb4J allows you to use standard HTML for forms fields and for referencing stylesheets by offering few convenient request parameters.&lt;/li&gt;&lt;li&gt;And yeah, EasyWeb4J app would run way faster than the Rails version.  ;)&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-3965197365759855684?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/Fz8kW1xL88U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/3965197365759855684/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/07/porting-rails-shoutbox-to-easyweb4j.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/3965197365759855684?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/3965197365759855684?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/Fz8kW1xL88U/porting-rails-shoutbox-to-easyweb4j.html" title="Porting Rails Shoutbox to EasyWeb4J" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/07/porting-rails-shoutbox-to-easyweb4j.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEGRnc7cCp7ImA9WxBQGE0.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-7250243736583542056</id><published>2009-07-30T22:24:00.000+05:30</published><updated>2010-01-18T14:53:47.908+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-18T14:53:47.908+05:30</app:edited><title>Highlighting and Placing Focus on Errors in EasyWeb4J</title><content type="html">Highlighting fields with input errors is a common technique used in web applications to gain users attention to the errors.  It is also helpful to place the focus on the first field with error so that the user can start correcting the input right away.&lt;br /&gt;&lt;br /&gt;This can be implemented in an EasyWeb4J applciation by checking for the presence of error on the field of your model, represented by the input field.  If an error is present, use a different CSS class for the input field which does the highlighting.  To place the focus on the first field with error, you can use jQuery to select the first field with the CSS class representing errors.  The completed application would look like this.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g5hM85MTy7c/SnHShnicGJI/AAAAAAAAAXk/_dl52j62PLU/s1600-h/error_demo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 141px;" src="http://2.bp.blogspot.com/_g5hM85MTy7c/SnHShnicGJI/AAAAAAAAAXk/_dl52j62PLU/s320/error_demo.png" alt="" id="BLOGGER_PHOTO_ID_5364300106165917842" border="0" /&gt;&lt;/a&gt;&lt;a href="http://cloud.github.com/downloads/tuxychandru/easyweb4j_tutorials/error.zip"&gt;Download&lt;/a&gt; the complete source code for this application.&lt;br /&gt;&lt;br /&gt;Create a new EasyWeb4J Hibernate Project as described in the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt;. Since we do not need a database for this demo, delete src/main/resources/repositories.properties from the newly created project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/error/models/Person.java &lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279904.js?file=Person.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The View &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/views/Person/index.jsp &lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279904.js?file=index.jsp"&gt;&lt;/script&gt;&lt;br /&gt;The view uses EL expression to determine whether an error is present on the field represented by each input.  If present, it sets the CSS class of the input element to &lt;span style="font-style:italic;"&gt;errorField&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Javascript &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/js/script.js&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279904.js?file=script.js"&gt;&lt;/script&gt;&lt;br /&gt;The script places the focus on the first field with error.  If none of the fields have an error in input, it places the focus on the first input field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-7250243736583542056?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/pTFJEjuoGmQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/7250243736583542056/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/07/highlighting-and-placing-focus-on.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/7250243736583542056?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/7250243736583542056?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/pTFJEjuoGmQ/highlighting-and-placing-focus-on.html" title="Highlighting and Placing Focus on Errors in EasyWeb4J" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_g5hM85MTy7c/SnHShnicGJI/AAAAAAAAAXk/_dl52j62PLU/s72-c/error_demo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/07/highlighting-and-placing-focus-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YMRHc-fyp7ImA9WxBQF0Q.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-3137454483722221253</id><published>2009-07-27T23:50:00.000+05:30</published><updated>2010-01-18T12:49:45.957+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-18T12:49:45.957+05:30</app:edited><title>AJAX with jQuery and EasyWeb4J</title><content type="html">All modern web applications use AJAX to communicate asynchronously with the web server.  EasyWbe4J does not include any tag library for AJAX support.  Instead it allows you to use any JavaScript library to communicate with your application and perform AJAX operations.  One of the benefits of this approach to AJAX is that it allows the developers to use &lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;Unobtrusive JavaScript&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We'd be using jQuery along with EasyWeb4J to build a simple adder which adds two numbers on the server and provides the sum in the response.  The completed application would look like this.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g5hM85MTy7c/Sm3zQZONlrI/AAAAAAAAAW0/0nXxHwZk7vQ/s1600-h/ajax_demo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 175px;" src="http://2.bp.blogspot.com/_g5hM85MTy7c/Sm3zQZONlrI/AAAAAAAAAW0/0nXxHwZk7vQ/s320/ajax_demo.png" alt="" id="BLOGGER_PHOTO_ID_5363210194242082482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cloud.github.com/downloads/tuxychandru/easyweb4j_tutorials/ajax.zip"&gt;Download&lt;/a&gt; the complete source code for this application.&lt;br /&gt;&lt;br /&gt;The primary difference between the response for a normal request and an AJAX request is that, the response for the AJAX response does not contain the layout components of the page.  It would send only the content which needs to be updated in the browser by JavaScript.&lt;br /&gt;&lt;br /&gt;Create a new EasyWeb4J Hibernate Project as described in the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt;. Since we do not need a database for this demo, delete src/main/resources/repositories.properties from the newly created project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The JavaScript&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;/src/main/webapp/js/script.js&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279851.js?file=script.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Layout File&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/layouts/Application.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279851.js?file=Application.jsp"&gt;&lt;/script&gt;&lt;br /&gt;It is important to notice how we pass the context's root path to our script which would use it to post the input to the "add" action.  We create a global variable named "contextRoot" just before including our script.  The script can use this variable to post the request to our action.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/ajax/models/Adder.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279851.js?file=Adder.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Controller&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/ajax/controllers/HomeController.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279851.js?file=HomeController.java"&gt;&lt;/script&gt;&lt;br /&gt;The add action in our controller renders its default view (&lt;span style="font-style: italic;"&gt;add.jsp&lt;/span&gt;) without the layout using the &lt;span style="font-style: italic;"&gt;renderWithoutLayout()&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Home View&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/views/Home/index.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279851.js?file=index.jsp"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AJAX Response View&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/views/Home/add.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279851.js?file=add.jsp"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-3137454483722221253?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/JDDMDhJrTJE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/3137454483722221253/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/07/ajax-with-jquery-and-easyweb4j.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/3137454483722221253?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/3137454483722221253?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/JDDMDhJrTJE/ajax-with-jquery-and-easyweb4j.html" title="AJAX with jQuery and EasyWeb4J" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_g5hM85MTy7c/Sm3zQZONlrI/AAAAAAAAAW0/0nXxHwZk7vQ/s72-c/ajax_demo.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/07/ajax-with-jquery-and-easyweb4j.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MERXg8fSp7ImA9WxBQGE0.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-6225231385733101001</id><published>2009-07-20T23:26:00.000+05:30</published><updated>2010-01-18T13:26:44.675+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-18T13:26:44.675+05:30</app:edited><title>DRY Views with Nested Templates in EasyWeb4J</title><content type="html">The content of pages in any web application will be composed of three parts.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The elements common across all pages (header, main navigation and footer).&lt;/li&gt;&lt;li&gt;The elements common to specific group of pages (sidebar).&lt;/li&gt;&lt;li&gt;The actual content of the page.&lt;/li&gt;&lt;/ol&gt;At first glance, it may appear that EasyWeb4J does not support nested layout components as there is only one layout file (Application.jsp).  However, since it is a plain JSP page, you can do anything you do with plain old JSP pages in it.&lt;br /&gt;&lt;br /&gt;This post, demonstrates how filters of EasyWeb4J can be used along with the EasyWeb4J's templating system to achieve nested layouts.  There are two controllers (Products &amp;amp; Services) in this application each with their own sidebar links.&lt;br /&gt;&lt;br /&gt;The completed application would look like this&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_g5hM85MTy7c/SmXzl2UfO_I/AAAAAAAAAWs/BjvAsoa8jIc/s1600-h/layout_demo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 88px;" src="http://2.bp.blogspot.com/_g5hM85MTy7c/SmXzl2UfO_I/AAAAAAAAAWs/BjvAsoa8jIc/s320/layout_demo.png" alt="" id="BLOGGER_PHOTO_ID_5360958763016600562" border="0" /&gt;&lt;/a&gt;&lt;a href="http://cloud.github.com/downloads/tuxychandru/easyweb4j_tutorials/layout.zip"&gt;Download&lt;/a&gt; the complete source code for this application.&lt;br /&gt;&lt;br /&gt;The trick to create nested layout components, is using the filter to setup a request attribute, which will provide the nested layout page.   This can then be used within &lt;span style="font-style: italic;"&gt;Application.jsp&lt;/span&gt; to include the nested layout page.  By using a filter you do not have to do this in each action within the controller.  Thus both our controllers and views would be DRY.&lt;br /&gt;&lt;br /&gt;Create a new EasyWeb4J Hibernate Project as described in the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt;.  Since we do not need a database for this demo, delete &lt;span style="font-style: italic;"&gt;src/main/resources/repositories.properties&lt;/span&gt; from the newly created project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Master Layout&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/layouts/Application.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279871.js?file=Application.jsp"&gt;&lt;/script&gt;&lt;br /&gt;As it is seen here, the master layout specifies the header, main vaigation and the copyright notice.  It then includes the sidebar specific to the controller and the actual view of the action invoked during the request.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Sidebars&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/layouts/ProductsBar.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279871.js?file=ProductsBar.jsp"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/layouts/ServicesBar.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279871.js?file=ServicesBar.jsp"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Filters in Controllers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/layout/controllers/ProductsController.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279871.js?file=ProductsController.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/layout/controllers/ServicesController.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279871.js?file=ServicesController.java"&gt;&lt;/script&gt;&lt;br /&gt;The filters in the controllers setup the request attribute ("sidebar") with the appropriate page containing the sidebar for the actions of this controller.  The filters may also provide different sidebars for groups of actions if needed, by determining which action has been invoked using the &lt;span style="font-style: italic;"&gt;getActionInvoked()&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;If your application needs to have the view of the action within the nested layout page, move the include for &lt;span style="font-style: italic;"&gt;${view}&lt;/span&gt;, from &lt;span style="font-style: italic;"&gt;Application.jsp&lt;/span&gt; to your nested layout page.&lt;br /&gt;&lt;br /&gt;Template out as much of your views as possible and DRY them up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-6225231385733101001?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/rvtuUSWATVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/6225231385733101001/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/07/dry-views-with-nested-templates-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/6225231385733101001?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/6225231385733101001?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/rvtuUSWATVQ/dry-views-with-nested-templates-in.html" title="DRY Views with Nested Templates in EasyWeb4J" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_g5hM85MTy7c/SmXzl2UfO_I/AAAAAAAAAWs/BjvAsoa8jIc/s72-c/layout_demo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/07/dry-views-with-nested-templates-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEBRX4ycSp7ImA9WxBQGE0.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-1403322117020875355</id><published>2009-07-18T16:43:00.000+05:30</published><updated>2010-01-18T13:14:14.099+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-18T13:14:14.099+05:30</app:edited><title>Handling File Uploads with EasyWeb4J</title><content type="html">Most web applications require handling upload of files.  A good example of this is an online shopping application which displays an icon for every product available for online purchase.&lt;br /&gt;&lt;br /&gt;EasyWeb4J makes handling file uploads in Java web applications really simple.  We'd be building a sample application in this post to demonstrate how it can be done.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Every product has a name and a description.&lt;/li&gt;&lt;li&gt;An icon is associated with every product.&lt;/li&gt;&lt;li&gt;The home page lists the icon, name and the description of all the products currently available.&lt;/li&gt;&lt;/ol&gt;The completed application would look like this&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_g5hM85MTy7c/SmIQ2peinPI/AAAAAAAAAWM/Gp03FMiHukU/s1600-h/upload_demo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 177px;" src="http://1.bp.blogspot.com/_g5hM85MTy7c/SmIQ2peinPI/AAAAAAAAAWM/Gp03FMiHukU/s320/upload_demo.png" alt="" id="BLOGGER_PHOTO_ID_5359865037557243122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cloud.github.com/downloads/tuxychandru/easyweb4j_tutorials/upload.zip"&gt;Download&lt;/a&gt; the complete source code for this application.&lt;br /&gt;&lt;br /&gt;Create a new EasyWeb4J Hibernate Project as described in the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;tutorial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MySQL Script&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279865.js?file=db.sql"&gt;&lt;/script&gt;&lt;br /&gt;Edit the newly created project's hibernate.xml and update the DB connection information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/upload/models/Product.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279865.js?file=Product.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Repository&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/upload/repositories/ProductRepository.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279865.js?file=ProductRepository.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Add Product View&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unlike normal forms, the encoding of forms involving file fields must be "multipart/form-data".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/views/Products/add.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279865.js?file=add.jsp"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Product List View&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An interesting thing to note here is that, we use the URL of an action to retrieve the icon of the corresponding product by passing it the product's ID in each row.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/webapp/WEB-INF/views/Products/index.jsp&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279865.js?file=index.jsp"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Controller&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;src/main/java/org/upload/controllers/ProductsController.java&lt;/span&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/279865.js?file=ProductsController.java"&gt;&lt;/script&gt;&lt;br /&gt;Some of the points to note in the controller's implementation are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;updateModel() does not process file fields even if they follow the object.property naming convention and hence need to be processed separately in controllers.&lt;/li&gt;&lt;li&gt;Controllers can directly send output to servlets' response and EasyWeb4J will not try to render a view if the action closes the response.  This is exactly how the icon() action works.&lt;/li&gt;&lt;/ol&gt;As it can be seen, EasyWeb4J makes working with file uploads and streaming back uploaded files extremely simple.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-1403322117020875355?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/3H0fkrbJTKg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/1403322117020875355/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/07/handling-file-uploads-with-easyweb4j.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/1403322117020875355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/1403322117020875355?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/3H0fkrbJTKg/handling-file-uploads-with-easyweb4j.html" title="Handling File Uploads with EasyWeb4J" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_g5hM85MTy7c/SmIQ2peinPI/AAAAAAAAAWM/Gp03FMiHukU/s72-c/upload_demo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/07/handling-file-uploads-with-easyweb4j.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDR3o8fSp7ImA9WxJUGUw.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-5810024906317948727</id><published>2009-07-17T22:23:00.000+05:30</published><updated>2009-07-18T17:27:56.475+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-18T17:27:56.475+05:30</app:edited><title>EasyWeb4J-0.1 is Finally Out in the Wild</title><content type="html">After close to two months of development, EasyWeb4J 0.1 is stable enough to break away from BETA.  :)&lt;br /&gt;&lt;br /&gt;This release fixes a couple of bugs from the BETA release.  Some of the benefits offered by EasyWeb4J over other Java web application stacks are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Minimal XML configuration (needed only for Servlet and Hibernate/JPA configuration).&lt;/li&gt;&lt;li&gt;Out of the box support for pretty URLs.&lt;/li&gt;&lt;li&gt;Does not require using custom tags where standard HTML elements work just fine. So HTML from designers can be used directly with very little modification.&lt;/li&gt;&lt;li&gt;Simple and yet very effective layout system.&lt;/li&gt;&lt;li&gt;Handles transactions and lazy initializations without the developer having to worry about them.&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://sourceforge.net/projects/easyweb4j/files/"&gt;Grab it&lt;/a&gt;, give the &lt;a href="http://easyweb4j.sourceforge.net/tutorial/tutorial_intro.html"&gt;Tutorial&lt;/a&gt; a shot and re-discover fun in Java web development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-5810024906317948727?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/8k42Wmm-hQU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/5810024906317948727/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/07/easyweb4j-01-is-finally-out-in-wild.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/5810024906317948727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/5810024906317948727?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/8k42Wmm-hQU/easyweb4j-01-is-finally-out-in-wild.html" title="EasyWeb4J-0.1 is Finally Out in the Wild" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/07/easyweb4j-01-is-finally-out-in-wild.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkECQXg7eyp7ImA9WxJVEU0.&quot;"><id>tag:blogger.com,1999:blog-8159731392602937527.post-8800242185428953709</id><published>2009-06-27T16:22:00.000+05:30</published><updated>2009-06-27T16:34:20.603+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-27T16:34:20.603+05:30</app:edited><title>EasyWeb4J-0.1-ALPHA1 is Here</title><content type="html">EasyWeb4J's design is greatly influenced by RoR and integrates with Hibernate and JPA for ORM.  It is an open-source project and licensed under, Apache License, Version 2.0.&lt;br /&gt;&lt;br /&gt;Home Page: &lt;a href="http://easyweb4j.sourceforge.net/"&gt;http://easyweb4j.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is significantly simpler than many other Java web frameworks and includes a complete tutorial to get you started.  Give it a shot and post your feedback on its design at the &lt;a href="http://sourceforge.net/apps/phpbb/easyweb4j/viewforum.php?f=2"&gt;EasyWeb4J Developer Discussion&lt;/a&gt; forum.&lt;br /&gt;&lt;br /&gt;If you like it, spread the word among your geekmates.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8159731392602937527-8800242185428953709?l=easyweb4j.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Easyweb4jBlog/~4/7DS0i1hgbEo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://easyweb4j.blogspot.com/feeds/8800242185428953709/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://easyweb4j.blogspot.com/2009/06/easyweb4j-01-alpha1-is-here.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/8800242185428953709?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8159731392602937527/posts/default/8800242185428953709?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Easyweb4jBlog/~3/7DS0i1hgbEo/easyweb4j-01-alpha1-is-here.html" title="EasyWeb4J-0.1-ALPHA1 is Here" /><author><name>Chandru</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="23" src="http://2.bp.blogspot.com/-923RMquqZtA/TjuZ2YsDjgI/AAAAAAAAAxc/cU5DmoySE-c/s220/pengtypes.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://easyweb4j.blogspot.com/2009/06/easyweb4j-01-alpha1-is-here.html</feedburner:origLink></entry></feed>

