Improve Velocity tag syntax and performance
-------------------------------------------
Key: WW-2807
URL: https://issues.apache.org/struts/browse/WW-2807
Project: Struts 2
Issue Type: Improvement
Affects Versions: 2.1.2, 2.1.1, 2.1.0, 2.0.11.2, 2.0.11.1, 2.0.11, 2.0.10,
2.0.9, 2.0.8, 2.0.7, 2.0.6, 2.0.5, 2.0.4, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.12,
2.1.3, 2.1.4, 2.2.x, Future
Environment: Apache Velocity 1.5+
Reporter: Christopher Schultz
Priority: Minor
Currently, Velocity "tags" are implemented by passing a number of "name=value"
strings to S2's Velocity tag implementation in order to pass named parameters
(which are not directly supported by Velocity). This leads to a somewhat
awkward syntax and requires that the tag implementation re-parse these strings
for every template evaluation, loop execution, etc.
Starting with Velocity 1.5, template authors can create Map objects on the fly
using a simple syntax. I believe that supporting this syntax in the Velocity S2
integration code will make templates easier to read and run more quickly.
Example of current Velocity tag usage (this is the example from
http://struts.apache.org/2.0.11.2/docs/velocity-tags.html):
#sform ("action=updatePerson")
#stextfield ("label=First name" "name=firstName")
#ssubmit ("value=Update")
#end
The new, proposed syntax would be this:
#sform({'action' : 'updatePerson' })
#stextfield({'label' : 'First name', 'name' : 'firstName'})
#ssubmit({'value' = 'Update'})
#end
The tag implementation has change from supporting an unknown number of unnamed
string parameters to accepting a single Map parameter containing name/value
pairs. S2's code will no longer hand to parse each of the string parameters
into their separate name and value, and should therefore run faster.
It also allows template designers to use single-quote syntax for their
parameter names (single-quoted strings are never interpreted) and either
double-quote syntax for their values (which /will/ interpret their contents) or
pass the objects directly (possibly as non-String objects). I believe this will
also increase performance as well as flexibility, since some tags will prefer
non-String parameters and will no longer be required to parse a String unless
absolutely necessary.
Such a change would require one of the following strategies:
1. Implement a second Velocity tag library whose tags accept a single Map
parameter
2. Augment the current Velocity tag library to accept /either/ a single Map
parameter /or/ a series of String values
I believe #2 would be a better solution: users can choose which syntax they
prefer and don't have to go through any messy re-configuration steps to switch
syntax. It also supports legacy users with no changes at all. The only downside
is that you'd have to restrict any future tags such that they do not accept a
single Map parameter and then behave differently. I think this is a reasonable
trade-off.
I would be happy to submit a sample implementation for one or two tags, but
I'll probably need help doing /every/ tag.
Thanks,
-chris
Please see the following mailing list threads for reference:
[struts-dev]
http://www.nabble.com/-s2--Improved-Velocity-Integration-td19541213.html
[struts-user] http://www.nabble.com/-S2--Velocity-Integration-td19520425.html
[velocity-dev] http://www.nabble.com/Named-macro-parameters-td19459070.html
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.