使用自定义标记包装spring mvc select标记时出现IllegalStateException

时间:2012-10-29 12:56:32

标签: java jsp spring-mvc jsp-tags

基本问题
在编写自己的自定义JSP标记以“包装”spring MVC表单标记时,我遇到了一些问题。我成功地包装了其他标签,但是使用了select和options标签,这会引发一个IlleagalStateException。我调试了spring代码,发现options标签查找祖先select标签。我正在使用标记文件执行此操作,因此spring select标记实际上位于不同的标记文件中。我猜这就是为什么它找不到它。

所以我可以做些什么来解决这个问题?

可能的解决方案
我试过寻找解决方案,但我发现其他人都有同样的问题,但没有找到解决方案。我在考虑编写自己的select和options标签时没有使用spring标签,但我真的不想复制它免费提供的绑定。我不介意更改使用Java类而不是标记文件,但我之前发现输出不会被评估为JSP,因此您无法输出另一个JSP标记。

执行此操作的原因
自从第一次提出这个问题以来我已经考虑了这个问题,我现在对我想要达到的目标更清楚了。

  • 简化JSP的所需标记
  • 考虑公共代码(例如表单:输入后的错误或从spring获得翻译:消息)
  • 封装外观(CSS很长,但通常也需要更改标记)
  • 能够构建扩展弹簧标签功能的增强组件(例如,将多选选项呈现为选项列表或将只读输入显示为文本标签)

我很想听听人们的想法。 感谢

2 个答案:

答案 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)

我已经考虑过这个好一周了,这就是候选名单:

  • 放弃并直接使用我的JSP中的spring标签
  • 根本不要使用spring标签,并在我自己的标签中复制它们的逻辑
  • 可能编写一个扩展或使用spring标记类的标记类
  • 扩展我的代码范围以包装select和options标记

考虑到想要这样做的原因(我现在已经在问题中澄清了),我决定选择最后一个选项。我最初并不热衷于此,因为我认为最终可能会有数百个参数,但实际上并不是太糟糕。标记文件用于包装标记的常见位,因此这就是它们的用途。我还进一步包装了自己的标签,因此有一个picklist标签输出我的自定义选择标签,然后编写初始化所需的JS。

我认为这是我根据自己想要达到的目标而遇到的最好的解决方案。这就是我要去的地方,但如果他们认为他们有更好的东西,我仍然有兴趣听听其他人的解决方案。