基本问题
在编写自己的自定义JSP标记以“包装”spring MVC表单标记时,我遇到了一些问题。我成功地包装了其他标签,但是使用了select和options标签,这会引发一个IlleagalStateException。我调试了spring代码,发现options标签查找祖先select标签。我正在使用标记文件执行此操作,因此spring select标记实际上位于不同的标记文件中。我猜这就是为什么它找不到它。
所以我可以做些什么来解决这个问题?
可能的解决方案
我试过寻找解决方案,但我发现其他人都有同样的问题,但没有找到解决方案。我在考虑编写自己的select和options标签时没有使用spring标签,但我真的不想复制它免费提供的绑定。我不介意更改使用Java类而不是标记文件,但我之前发现输出不会被评估为JSP,因此您无法输出另一个JSP标记。
执行此操作的原因
自从第一次提出这个问题以来我已经考虑了这个问题,我现在对我想要达到的目标更清楚了。
我很想听听人们的想法。 感谢
答案 0 :(得分:1)
首先,我不确定你想要控制造型是什么意思。我认为你可以将class和id属性传递给Spring标签并将它们复制过来(? - 尽管我可能会对Grail标签感到困惑,因为我最近一直在编写Grails应用程序)。编辑:另外,您可以通过引用外部元素来设置Spring生成的标记的样式。例如。用div包围表单元素,然后设置表单元素的样式,如:#myDiv input { color: red; }
。
根据我的经验(10年以上的webapp开发),不值得额外努力尝试和未来证明您的应用程序。当你选择像Spring MVC这样的框架时,你会得到很多免费的东西,你通常需要自己编写。这个免费的东西的成本是一定量的锁定(如你所说)。对于这方面来说,Spring非常好 - 您可以根据需要尽可能少地使用它,如果将来需要的话,通常可以直接设计它。
所以我的看法是:“按原样”使用Spring标签。您将来需要删除Spring方面的可能性非常小。因此,如果/直到那种情况出现,那么“推迟”是一个值得冒险的风险。您可能已经花费了大量时间和代码来尝试设计未来的解决方案,因为您将花费去除Spring标签 - 它可能超过它可能提供的任何好处。除此之外 - 你已经编写了代码,你和/或其他人必须立即维护代码 - 而不是让Spring开发人员为你维护代码。
最后,如果您真的不想拥有此锁定并希望完全控制样式,那么请手动编写表单元素。
<select name="foo_select">
<option value="">-- select a foo type --</option>
<c:forEach var="foo" items="${fooGroups}">
<option value="${foo}">${foo}</option>
</c:forEach>
</select>
答案 1 :(得分:0)
我已经考虑过这个好一周了,这就是候选名单:
考虑到想要这样做的原因(我现在已经在问题中澄清了),我决定选择最后一个选项。我最初并不热衷于此,因为我认为最终可能会有数百个参数,但实际上并不是太糟糕。标记文件用于包装标记的常见位,因此这就是它们的用途。我还进一步包装了自己的标签,因此有一个picklist标签输出我的自定义选择标签,然后编写初始化所需的JS。
我认为这是我根据自己想要达到的目标而遇到的最好的解决方案。这就是我要去的地方,但如果他们认为他们有更好的东西,我仍然有兴趣听听其他人的解决方案。