我正在研究由Spring MVC和JSTL驱动的动态表单生成器。生成器生成的表单包括简单的用户输入窗口小部件模板,这些模板可生成HTML文档/输入并使用HTTP表单数据。这里没什么特别的。现在,我需要实现一个动态窗口小部件以填充动态键/值条目,并且发现form:input
标记本质上是我需要绑定Map.Entry<String, String>
的标记。但是,在某些情况下,我不能使它起作用,因为输入键可能包含肯定会中断path
属性解析的特殊字符。假设存在一个带有customProperties
字段的表单,该表单被声明为字符串到字符串的映射。现在,在JSP中,我可以如下生成path
:path="customProperties['${entry.key}']"
具有简单的字符串插值。除非用户提供了一个名称,该名称的名称会破坏路径语法,否则这会很好地工作,例如将]foo[
扩展为path="customProperties[']foo[']"
,这会导致表单生成器由于路径语法损坏而无法正确生成表单。这绝对是生成动态path
值的一种肮脏方式,但是我找不到任何文档说明如何正确转义路径文字/组件。我假设,路径组件应遵循bean的命名约定。深入研究路径评估后,我发现方法PropertyAccessorUtils.canonicalPropertyName以原始方式“标准化”路径值,并且它似乎不支持任何转义。 Javadoc只是说:
从地图键中删除周围的引号:
map['key'] -> map[key]
map["key"] -> map[key]
嗯,这听起来像个坏消息。我正在考虑以下两种解决方法:
canonicalPropertyName
方法的方法。 (更改属性路径归一化方法到底会如何影响整个表达式的计算?)input
标签name
属性,但这听起来并不像是一个健壮而实际的解决方法:确切的规则是什么编写这样的名称并将这些名称从客户端转换回去,以便Spring框架不会拒绝它们?简而言之,如果Spring仅支持非常有限的路径语法,那么在接受用户表单数据时这将无济于事。还是因为任意地图都可以绑定到表单模型,我在这里错了吗?我的问题基本上是:是否可以在path
属性中支持不会破坏路径语法的任意属性名称?