In struts2, I took advantage of built-in OGNL in struts2, naming my inputs like
Which went to getters/setters
It turns out that they hardened restrictions on parameter names to boost security.
So I had to add to my struts.xml:
[a-zA-Z0-9\.\]\[\(\)_'\s"/]+
(I had "s and /s in my parameter names) File upload ceased working after that (interceptor stacks are madness), so I had to add it explicity either.
Update: These days I strongly suggest using JSON to pass complex structures instead of rich OGNL forms. Of course you would need some JS.