I wanted to share a solution to a problem a client of mine had–needing the same (or very similar) content in two places–in a lightbox, managed by GWT, and in an HTML page. The content itself had GWT widgets inside it (that would need to be functional in both places).
The solution was to expose the HTML content as a JSONP file for GWT consumption (and just have the HTML displayed for the HTML page). To do this,
- we build the HTML page (in this case, using JSTL and JSP, but any other HTML view technology would work).
- then we build code that retrieves the page (I used HttpClient)
- and encodes the entire HTML content as an attribute of a json object (I used json-simple)
- and exposes it to the world via a URL
Now that we have the content as JSON encoded HTML, we need to consume it:
- first, create a JSONP consumer, as outlined here
- then, when you get the content, pull it into an HTMLPanel, not just a HTML widget
- create new instances of your GWT widgets and attach them to your known span ids using the HTMLPanel.add() method.
- if your content depends on external css files, you’ll need to add and remove them via JSNI when the lightbox is shown (if you can’t integrate the CSS into the existing site)
- if your lightbox and html content differ slightly, you can hide or show spans via your server side presentation layer to configure your in lightbox widgets
Benefits
- One location for display–one place to make changes
- No layout in GWT–everything happens in HTML
- Cross domain–since the content is exposed via JSONP, it can be consumed by javascript on any domain.
Detriments
- Security–you’re exposing yourself to some possible security issues, though since you control both the endpoints, they shouldn’t be too bad. Read this excellent document carefully to understand the implications.
- Complexity–lots of moving pieces
- Caching–JSONP calls are cached by the browser, and a control refresh doesn’t seem to refresh them. I end up clearing my cache a lot when debugging.
- Two calls to the server for every lightbox shown.
- Not sure if it would work in developer mode–possibly with an external server. Haven’t tried this.
I haven’t played around with any of the GWT templating solutions, but I don’t believe they would work in this case, because of the need for a plain, crawlable HTML page.