So, just wanted to toss this into the mix and see what you all thought. Here's the issue I had:

Vertigo has a Money object that is a value and currency. I wanted to set the value from a form. I wanted the currency code to be definable for that specific form element. Oh, and Money is immutable.

I wrote up a simple TypeConverter to convert to the Money object. Only problem was getting the currency code. After trying a few different things, I decided to sub-class the parameters interceptor and add a concept that I call parameter attributes. These get added to the ValueStack context and then are accessible to the converter. They look like this:

<s:hidden name="[EMAIL PROTECTED]" value="EUR"/>
<s:textfield key="child.allowance"/>

For each HTTP parameter, I assume that if the parameter contains an at-sign (@) it is an attribute of another parameter. This gets placed into a Map of attributes. Once all the attributes are found for each parameter, I iterate over the parameters and then add all of that parameters the attributes to the ValueStack context Map.

I picked the at-sign because it looks like an 'a', which makes it easy to remember it is an attribute and isn't a valid Java identifier character. This does conflict with OGNL class and member accessors, but we shouldn't be evaluating the parameter names in that manner, so it should be fine.

I've found that this is really useful for loads of different situations including free form date input fields where you need to convert to a Date and then back to a String and want the format to be preserved. I use Joda rather than the JDK (go Joda!) and this works really nicely for that case. Looks like:

<c:hidden name="[EMAIL PROTECTED]" value="MM/dd/yyyy"/>
<s:textfield key="subscription.expireDate"/>

Essentially, this is really helpful for immutable types that have multiple values such as phone numbers and money and types that have tricky parsing semantics like dates. I think this would be a good addition to core, but I wanted to toss it out there first.

Thoughts?

-bp

p.s. Oh and if someone knows of a standard way to do this that I missed, let me know!

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to