I am looking for a way to inject values from the fragment (#) of a URL into bean(JSF), in the same way query-parameter values are injected. I am using Ben Alman’s Bookmarkable jQuery plugin (http://benalman.com/projects/jquery-bbq-plugin/) to create the URL fragments. I was hoping that Custom regex patterns from prettyFaces could be a way to solve my problem but until now I have been unsuccessful.
(http://ocpsoft.com/docs/prettyfaces/snapshot/en-US/html_single/#config.pathparams.regext)
I would like to define here my situation and if any one has an idea, i
would love to try them out.
I am using
RichFaces: 3.3.3,
Spring: 3.0.2.RELEASE,
Hibernate: 3.5.3-Final,
JSF: 2.0.2-FCS,
PrettyFaces: 3.0.1
The web application generates, following kind of URL where parameters
are listed after a hash(#). The idea is to have an ajax based
Bookmarkable URL. So every time I click on an element that changes the
state of the system, the value is sent to the server via ajax and the
URL after the hash is rewritten. There can be 1 to 3 parameters after
the hash, the number of parameters are optional.
My goal is, when the user bookmarks the URL (with hash) and than
revisits the saved page, the page should inject the correct values
into the system and visualize the page in the previous state (like
query-parameter).
Below, I have a regular expression that would catch all the parameters
after the hash.
//URL:
http://localhost:8080/nymphaea/workspace/#node=b48dd073-145c-4eb6-9ae0-e1d8ba90303c&lod=75e63fcd-f94a-49f5-b0a7-69f34d4e63d7&ln=en
//Regular Expression:
\#(\w*\=(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}))|\&(\w*\=(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}))|\&(\w*\=\w{2})
I know there are websites that some how send the URL fragment into there server side logic,
- http://maps.yahoo.com/#mvt=m&lat=36.952736&lon=-95.84758&zoom=11&tt=starbucks&tp=1&ioride=us
- http://www.cbc.ca/video/#/Shows/Death_Comes_to_Town/ID=1365210427
Is there anyway to inject values from the URL fragments into server side beans?
You can do this with help of
window.onhashchangewhich fills an input field of a hidden form which submits itself asynchronously when the input field has changed.Here’s a kickoff example of the Facelets page:
Here’s how the appropriate bean look like:
That’s all.
Note that the
onhashchangeevent is relatively new and not supported by the older browsers. In absence of the browser support (undefinied and so on), you’d like to checkwindow.location.hashat intervals usingsetInterval()instead. The above code example should at least give a good kickoff. It works at at least FF3.6 and IE8.