<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8490560996581853484</id><updated>2011-07-30T19:32:02.834-07:00</updated><title type='text'>grailsbubbles</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://grailsbubbles.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8490560996581853484/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://grailsbubbles.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>sebi</name><uri>http://www.blogger.com/profile/12733848923850880550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8490560996581853484.post-7271855098115815920</id><published>2009-09-10T10:49:00.000-07:00</published><updated>2009-09-10T13:04:14.987-07:00</updated><title type='text'>Happy birthday Griffon, your are the sultan of Swing !</title><content type='html'>Today &lt;a href="http://griffon.codehaus.org/"&gt;Griffon &lt;/a&gt;is one year old ! For those who don' t know what is griffon here is my short blurb about this new framework :&lt;br /&gt;&lt;br /&gt;Griffon can be considered as a clone of the grails framework, except that instead of rendering html pages on a web browser it renders a Swing application.&lt;br /&gt;&lt;br /&gt;So all these Groovy scritps that you made but that requires a lot of interactions , inputs from the user can now be wrapped in Griffon. You don' t have anymore to type incredible long command lines to include all you parameters, even a non-IT guy can use your scripts !!!&lt;br /&gt;&lt;br /&gt;In my opinion, griffon will firstly helps developers teams who wants to increase their productivity and to prove this I have a personal experience that I will share with you now :&lt;br /&gt;I'm currently working for a customer who build educational games for children, it's written in Flex. They are a using a custom MVC framework that is quite robust and efficient but each time you start developing a new game (we build 2 games on a 3 week iteration) you have to writes about 10 actionscript classses/MXML components  that all requires to implements specific interfaces, create resources bundle, CSS files etc ... Well before you can really start working on the core functionality of the game you spend at least a half day to get the skeleton  right (forget to implements some methods, syntax errors etc ...) !&lt;br /&gt;&lt;br /&gt;So I rapidly start thinking about a code generator application that could do all this stuff for my team.&lt;br /&gt;These were my requirements :&lt;br /&gt;- Access easily the local file system (create the files in your workspace)&lt;br /&gt;- Using a simple template engine&lt;br /&gt;- A friendly user interface&lt;br /&gt;&lt;br /&gt;The same week I started my mission I discovered Griffon and it was the perfect candidate for my requirements : Swing app for the UI, Groovy templates and I have a lot of experience with the grails framework. I built the application in less than a day and show this to my project leader , he was very impressed : starting a new game project was now a matter of a few seconds instead of a half day of work ! About more than 300% productivity gain !&lt;br /&gt;&lt;br /&gt;We are using this griffon app for each new game we start and everybody in the team  is very happy to focus on the  core functionality and not setting up the skeleton !&lt;br /&gt;&lt;br /&gt;So everybody who loves groovy/grails and use it inside teams for support purpose (analyzing/extracting logs patterns), code generation etc .. I really recommend you to take a look at griffon !&lt;br /&gt;&lt;br /&gt;Happy birthday Griffon !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8490560996581853484-7271855098115815920?l=grailsbubbles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grailsbubbles.blogspot.com/feeds/7271855098115815920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grailsbubbles.blogspot.com/2009/09/happy-birthday-griffon-your-are-sultan.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8490560996581853484/posts/default/7271855098115815920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8490560996581853484/posts/default/7271855098115815920'/><link rel='alternate' type='text/html' href='http://grailsbubbles.blogspot.com/2009/09/happy-birthday-griffon-your-are-sultan.html' title='Happy birthday Griffon, your are the sultan of Swing !'/><author><name>sebi</name><uri>http://www.blogger.com/profile/12733848923850880550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8490560996581853484.post-7394368473919379405</id><published>2009-09-02T09:50:00.000-07:00</published><updated>2009-09-02T10:06:46.623-07:00</updated><title type='text'>Grails Exchange 2009</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://skillsmatter.com/event/java-jee/groovy-grails-exchange-2009/wd-231"&gt;&lt;img src="http://skillsmatter.com/custom/images/groovy-grails-exchange_home_300x84.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Last week I was wondering how I could convince my boss to send me to the Grails Exchange in London. I went on the grails exchange site and I saw that many slots were still empty, Then a crazy idea crossed my mind "Maybe I can send a talk proposal ?", this way I will be sure to go there.&lt;br /&gt;&lt;br /&gt;So I sent an email to Russ Miles (the programme lead) the next day, and Oh surprise ! after a few hours I received a very enthusiastic email from Russ. (Also thanks to Wendy !)&lt;br /&gt;&lt;br /&gt;So now I'm officially planned in : &lt;a href="http://skillsmatter.com/event/java-jee/groovy-grails-exchange-2009/wd-231" target="_blank"&gt;http://skillsmatter.com/event/&lt;wbr&gt;java-jee/groovy-grails-&lt;wbr&gt;exchange-2009/wd-231&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And I also have a banner ;-)              &lt;a href="http://skillsmatter.com/event/java-jee/groovy-grails-exchange-2009/wd-231"&gt;&lt;img src="http://skillsmatter.com/custom/images/groovy-grails-exchange_im-speaking-100x84.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am very happy with this great opportunity but also a little bit stressed !It's a Premiere for me , at least for a such big audience of experts !&lt;br /&gt;&lt;br /&gt;I announced that I will build a complete mobile web application from scratch during the presentation, that will be very cool ! I do not yet have a exact idea of the application but it will include orientation support and geolocalization ! If you have ideas, don't hesitate to post it in the comments or tweet it (@sebi2706) !&lt;br /&gt;&lt;br /&gt;Ok , see you all in London ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8490560996581853484-7394368473919379405?l=grailsbubbles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grailsbubbles.blogspot.com/feeds/7394368473919379405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grailsbubbles.blogspot.com/2009/09/grails-exchange-2009.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8490560996581853484/posts/default/7394368473919379405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8490560996581853484/posts/default/7394368473919379405'/><link rel='alternate' type='text/html' href='http://grailsbubbles.blogspot.com/2009/09/grails-exchange-2009.html' title='Grails Exchange 2009'/><author><name>sebi</name><uri>http://www.blogger.com/profile/12733848923850880550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8490560996581853484.post-8158236378263229867</id><published>2009-07-24T01:19:00.000-07:00</published><updated>2009-07-27T01:52:58.176-07:00</updated><title type='text'>Getting started with the iWebkit grails plugin - part 1</title><content type='html'>A few weeks ago I gave a workshop for the NLGUG on using the iWebkit plugin for Grails. This plugin will help you to built web application targeted for the iPhone, but also for Android based devices !&lt;br /&gt;&lt;br /&gt;During this workshop we built a twitter client and we had some issues with the twitter plugin which doesn' t work with the API changes twitter brings this last weeks. So I choose for this tutorial to built a twitter &lt;em&gt;search&lt;/em&gt; &lt;em&gt;client&lt;/em&gt; that won't use anymore the twitter plugin.&lt;br /&gt;&lt;br /&gt;Our application will be a clone of the &lt;a href="http://search.twitter.com/"&gt;http://search.twitter.com/&lt;/a&gt; website but designed for a mobile use. We will start with basic functionnalities and in upcoming posts we will enhance this first app.&lt;br /&gt;&lt;br /&gt;Let's starts directly :&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 27px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;grails create-app TweetSearch&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Go into your project directory and install the iWebKit plugin :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 19px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;grails install-plugin iwebkit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Okay ! You are ready to built a real mobile web application, setting things up wasn't too hard, no ?&lt;br /&gt;&lt;br /&gt;Now we want to use the search twitter API, a quick look on the API page shows that's it is a REST based API and that the response format can be json, nice grails&amp;amp;groovy are perfect candidates to implement this kind of APIs.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;To have more control on the returning json response we will convert it into a custom made domain object, so let's create a new domain class :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 23px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;grails create-domain-claas tweet&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;We will keep it simple and convert only 3 properties from the json response. Open the Tweet class and add these properties :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 84px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;class Tweet {&lt;br /&gt;    String status&lt;br /&gt;    String user_id&lt;br /&gt;    String image_url&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Let's grails generate all the stuff we need :&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;grails generate-all tweet&lt;/code&gt;&lt;/pre&gt;Now we have a standard grails project structure with controllers and views.&lt;br /&gt;&lt;br /&gt;Let's start to write the request, we will use the fantastic Httpbuilder library that make writing httprequest as easy as pie!&lt;br /&gt;To use this libray you have some options :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dzone.com/links/rss/tip_for_using_httpbuilder_in_grails.html"&gt;Use Ivy support&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://rapidshare.de/files/47942264/lib.zip.html"&gt;Use the zip I provide&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://snapshots.repository.codehaus.org/org/codehaus/groovy/modules/http-builder/http-builder/0.5.0-SNAPSHOT/"&gt;Use the httpbuilder snapshot release&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Make sure all dependencies are in the lib folder of your app.&lt;br /&gt;The request needs only one parameter : the search criteria , so something like that will do the trick :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 338px; BACKGROUND-COLOR: #eee"&gt;&lt;p&gt;&lt;code&gt;    def list = {&lt;br /&gt;        def http = new HTTPBuilder( 'http://search.twitter.com')&lt;br /&gt;        def jsonresultshttp.request( GET, JSON ) {&lt;br /&gt;            uri.path = '/search.json?'&lt;br /&gt;            uri.query = [ q: 'grails' ]&lt;br /&gt;            headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'&lt;br /&gt;            &lt;/code&gt;&lt;code&gt;response.success = { resp, json -&amp;gt;&lt;br /&gt;             jsonresults = json.results&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;           response.failure = { resp -&amp;gt;&lt;br /&gt;             println "Unexpected error:${resp.statusLine.statusCode}"&lt;br /&gt;            }&lt;br /&gt;         }&lt;br /&gt;        List listItems = new ArrayList()&lt;br /&gt;        Tweet tweet&lt;br /&gt;        jsonresults.each {&lt;br /&gt;          tweet = new Tweet(status:it.text,user_id:it.user_id,image_url:it.profile_image_url)&lt;br /&gt;          listItems.add(tweet)&lt;br /&gt;        }&lt;br /&gt;      return [ results : listItems ]&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Don't forget to include the imports in the controller : &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 68px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;import groovyx.net.http.*;&lt;br /&gt;import static groovyx.net.http.ContentType.JSON&lt;br /&gt;import static groovyx.net.http.Method.GET&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;For now as you can see we use a hardcoded search criteria "grails" to test the first part the UI : showing the list of tweets ! Let's start with the exciting stuff :&lt;br /&gt;&lt;br /&gt;We will modify the list.gsp file to make it "mobile" compliant. The first thing you have to do is set the " iphone" layout :&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 98px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt; &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&amp;gt;&lt;br /&gt;    &amp;lt;meta name="layout" content="iphone" /&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Tweet List&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;By setting this layout the plugin take care of :&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Setting references to the css, javascript and images files&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Setting the right viewport&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;We can now starting writing the content of the view :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 149px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;iphone:topbar  title="Results"/&amp;gt;&lt;br /&gt;    &amp;lt;iphone:content&amp;gt;&lt;br /&gt;      &amp;lt;iphone:section&amp;gt;&lt;br /&gt;         &amp;lt;iphone:list action="show" descriptionField="status" list="${results}"  customid="status"/&amp;gt;&lt;br /&gt;      &amp;lt;/iphone:section&amp;gt;&lt;br /&gt;   &amp;lt;/iphone:content&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;As you can see we make extensive use of the iphone tag library which take care of setting the right css classes and binding stuff with our domain model and actions.&lt;br /&gt;&lt;br /&gt;A iphone webpage will always have a structure like the code above : A topbar, then content that consists of sections. Sections can hold List , text areas etc ...&lt;br /&gt;&lt;br /&gt;Start the application&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 48px; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;grails run-app&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;and browse to &lt;a href="http://localhost:8080/tweetsearch/tweet"&gt;http://localhost:8080/tweetsearch/tweet&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You should see something like that :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_IIpe7JQYSog/SmtkqoMklGI/AAAAAAAAAFg/WuZjwtaqCuE/s1600-h/list.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5362490464822137954" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 214px; CURSOR: hand; HEIGHT: 320px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_IIpe7JQYSog/SmtkqoMklGI/AAAAAAAAAFg/WuZjwtaqCuE/s320/list.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's nice no ?&lt;br /&gt;&lt;br /&gt;But let's add some user interaction support, we will add a search input field. Go edit your view list.gsp and add this new section before the list section : &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;&amp;lt;iphone:section&amp;gt;&lt;br /&gt;      &amp;lt;g:formRemote name="myForm"&lt;br /&gt;          action="list" url="${[action:'list']}"&amp;gt;&lt;br /&gt;      Search : &amp;lt;input type="text" name="searchTerm"/&amp;gt;&lt;br /&gt;      &amp;lt;/g:formRemote&amp;gt;&lt;br /&gt;&amp;lt;/iphone:section&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Now we have to modify our list action to use the "searchTerm" parameter :&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; HEIGHT: 358px; BACKGROUND-COLOR: #eee"&gt;&lt;p&gt;&lt;code&gt;    def list = {&lt;br /&gt;        def searchTerm = params["searchTerm"]&lt;br /&gt;        def http = new HTTPBuilder( 'http://search.twitter.com')&lt;br /&gt;        def jsonresultshttp.request( GET, JSON ) {&lt;br /&gt;            uri.path = '/search.json?'&lt;br /&gt;            uri.query = [ q: searchTerm]&lt;br /&gt;            headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4&lt;br /&gt;           response.success = { resp, json -&amp;gt;&lt;br /&gt;             jsonresults = json.results&lt;br /&gt;           }&lt;br /&gt;           response.failure = { resp -&amp;gt;&lt;br /&gt;             println "Unexpected error:${resp.statusLine.statusCode}"&lt;br /&gt;           }&lt;br /&gt;         }&lt;br /&gt;        List listItems = new ArrayList()&lt;br /&gt;        Tweet tweet&lt;br /&gt;        jsonresults.each {&lt;br /&gt;          tweet = new Tweet(status:it.text,user_id:it.user_id,image_url:it.profile_image_url)&lt;br /&gt;          listItems.add(tweet)&lt;br /&gt;        }&lt;br /&gt;      return [ results : listItems ]&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Ok restart your application, you will now see an empty list but also a search input text , enters whatever you want and submit, you should see something like this :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_IIpe7JQYSog/Smtv3B23MeI/AAAAAAAAAFw/0GWlzkmPf5s/s1600-h/search.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5362502772496740834" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 214px; CURSOR: hand; HEIGHT: 320px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_IIpe7JQYSog/Smtv3B23MeI/AAAAAAAAAFw/0GWlzkmPf5s/s320/search.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Okay that will be it for this first part of this serie, I encourage you to modify the show,gsp view by yourself to render a tweet in its whole ... &lt;p&gt;&lt;/p&gt;&lt;p&gt;I hope that in the next posts I could introduce the new version of the iwebkit plugin with orientation support and also .... Geolocalization support !!!!!&lt;/p&gt;Source code of this project can be found &lt;a href="http://www.mediafire.com/?sharekey=a36c7fd62f6f3aca2fb2ca15d7ea42d9e04e75f6e8ebb871"&gt;here&lt;/a&gt; ! The project will also soon be hosted into Github&lt;br /&gt;You can follow me on twitter : twitter.com/sebi2706&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8490560996581853484-8158236378263229867?l=grailsbubbles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grailsbubbles.blogspot.com/feeds/8158236378263229867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://grailsbubbles.blogspot.com/2009/07/getting-started-with-iwebkit-grails.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8490560996581853484/posts/default/8158236378263229867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8490560996581853484/posts/default/8158236378263229867'/><link rel='alternate' type='text/html' href='http://grailsbubbles.blogspot.com/2009/07/getting-started-with-iwebkit-grails.html' title='Getting started with the iWebkit grails plugin - part 1'/><author><name>sebi</name><uri>http://www.blogger.com/profile/12733848923850880550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_IIpe7JQYSog/SmtkqoMklGI/AAAAAAAAAFg/WuZjwtaqCuE/s72-c/list.jpg' height='72' width='72'/><thr:total>5</thr:total></entry></feed>
