You know, Spring Web Flow could be the most aggravating library I have ever worked with. Well, it is at least in the top 5.

Riddle me this:

How do you retrieve the current request URI from within a currently running flow?  And how do you use that in your flow xml?

You see, Web Flow (rightly) swallows up the normal J2EE API that are available to you: request, response, etc.

So why in the world would you want to retrieve the request URI?? Well, flows can contain sub flows. And flows can be reused in different locations within your app. So what if you need to display some text or UI or links based on what part of your application the flow is running in? Well you can’t given the Web Flow API.

Supposedly, there is an External Context available to you in all flows that allows access to the original request and response. But there is no documentation surrounding it.  Getting dirty and firing up a debugger, I was able to examine craziness held within the External Context.  It turns out the parameters and attributes are stored in a RequestMap property of the context.  The standard servlet API request properties are stored here under the standard fancy names like javax.servlet.forward.WhatYouNeed.

Here is the solution I came up with:

Create an “Action” to use old Web Flow 1.0 parlance.  This action has a method: getLocation() that will handle looking up the value in the map:

public class HecticBoredom {
	/**
	 * Because WebFlow is the worst documented, worst edge case software
	 *
	 * EVER.
	 * 
	 * @param map The ExternalContext.requestMap object
	 * @return The URI as a string
	 */
	public String getRequestURI(MutableAttributeMap map) {
		return map.get("javax.servlet.forward.servlet_path").toString();
	}
}

Make sure you add a bean for this in your flows.xml:

<bean id="hecticBoredom" class="com.abc.HecticBoredom"/>

Now in your web flow definition, you can use the following to retrieve the Flow URI:

<evaluate expression="hecticBoredom.getRequestURI(externalContext.requestMap)" result="location" result-type="java.lang.String"/>

Note: you could probably skip the action class and do the map.get() within the OGNL of your flow (as long as you are using Web Flow 2.x). However, I didn’t have time to explore that for my needs.

About the Author:

Learned something? Great! Need help on your development project? I'm available for hire:

  • Ruby on Rails
  • iOS Development
  • System Architecture & Performance

Get in touch:

Discussion

  1. marketing says:

    So there you have it, my 5 great internet marketing tips to create content
    for your online business. s brain, You – Tube therefore
    has built itself like a great website that is used by many people webmasters these days to promote their own online businesses and
    merchandise and providers that they have available.
    Even if you have the best web layout, a poor product or misguided demographics can yield results that are below average.

Leave a Comment