Monday, June 14, 2010

Adding a custom GWT module in a Roo-project

So I started looking into Roo the other day. Seems like a nice tool (once it matures a little more). Anyway - I wanted to create a custom module in addition to the two being generated when adding GWT-support to the project. Not as easy as I thought, mainly because I hadn't seen the Url Rewrite Filter before. I ended up with a 404, no matter what I did, and couldn't figure out why. Frustration!

After reading up on the url rewrite stuff, I was ready to give it another try. Let's create a module called Application, based on the standard sample application you'll get using the GWT wizard in Eclipse. First of all, create the Roo project using the following instructions:

project --topLevelPackage com.technowobble
persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
entity --class com.technowobble.domain.MyEntity
gwt setup

(The "gwt setup" setup command generates some code that will not compile unless there's a persistence setup and at least one entity.)

Next, create the Application.gwt.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.1/distro-source/core/src/gwt-module.dtd">
<module rename-to="application">
  <inherits name="com.google.gwt.user.User" />
  <inherits name="com.google.gwt.user.theme.standard.Standard" />

  <inherits name="com.technowobble.gwt.ApplicationCommon" />

  <source path="client" />
  <source path='shared'/>
  
  <entry-point
    class="com.technowobble.gwt.client.Application" />
</module>

We also need to add the actual Application-class (Application.java) and the service classes (GreetingService.java, GreetingServiceAsync.java, GreetingServiceImpl.java and FieldVerifier) from the Eclipse GWT sample application. While we're at it, put the Application.html and Application.css into the src/main/webapp folder.

Of course, the service servlet needs to be added to web.xml:

<servlet>
    <servlet-name>greetServlet</servlet-name>
    <servlet-class>com.technowobble.gwt.server.GreetingServiceImpl</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>greetServlet</servlet-name>
    <url-pattern>/application/greet</url-pattern>
  </servlet-mapping>

Before we can access the new module we need to add the following rules to urlrewrite.xml:

<rule enabled="true">
        <from casesensitive="false">/application/**</from>
        <to last="true" type="forward">/application/$1</to>
    </rule>
    <rule enabled="true">
        <from casesensitive="false">/Application.html</from>
        <to last="true" type="forward">/Application.html</to>
    </rule>    

The html file contains a reference to the stylesheet, which needs to be updated due to the Url Rewrite Filter - just change the href to href="static/Application.css".

That's it. Of course, an interesting exercise would be to combine this with the use of the DispatcherServlet and a Spring/GWT-integration controller like the GwtRpcController being used in my blog entry about Spring Security and GWT

You can find the full source here.

1 comment: