【问题标题】:IlleagalStateException when wrapping spring mvc select tag with custom tag使用自定义标签包装 spring mvc 选择标签时出现 IllegalStateException
【发布时间】:2012-10-29 12:56:32
【问题描述】:

基本问题
在编写自己的自定义 JSP 标记以“包装”spring MVC 表单标记时,我遇到了一些问题。我已经成功地包装了其他标签,但与 select 和 options 标签分离,这会引发 IllegalStateException。我调试了spring代码,发现options标签寻找祖先选择标签。我正在使用标签文件执行此操作,因此弹簧选择标签实际上位于不同的标签文件中。我想这就是它找不到它的原因。

那么问题是我能做些什么来解决这个问题?

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

这样做的原因
自从第一次提出这个问题以来,我已经考虑了一周,现在我更清楚我想要实现的目标。

  • 为了简化我的 JSP 中所需的标记
  • 分解通用代码(例如输入后的 form:errors 或从 spring:message 获取翻译)
  • 封装外观(CSS 有很长的路要走,但您通常也需要更改标记)
  • 能够构建扩展弹簧标签功能的增强组件(例如,将多选呈现为选项列表或将只读输入显示为文本标签)

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

【问题讨论】:

    标签: java jsp spring-mvc jsp-tags


    【解决方案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>
    

    【讨论】:

    • 也许你是对的。为了绕过样式,我可以使用 LESS 将 TB 样式与我自己的站点规则混合,或者放弃为每个页面上的每个组件传递 TB 类。这使得更改 CSS 样式成为一大难题,因为我现在与 TB 高度耦合。
    • 这个答案确实迫使我退后一步,重新思考我想要实现的目标。谢谢
    【解决方案2】:

    我已经考虑了一周,这是入围名单:

    • 放弃直接使用我JSP中的spring标签
    • 根本不使用spring标签,在我自己的标签中复制它们的逻辑
    • 可能写一个标签类,扩展或利用spring标签类
    • 扩展我的标签范围以包装选择和选项标签

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

    根据我想要实现的目标,我认为这是我遇到的最好的解决方案。这就是我要解决的问题,但如果其他人认为他们有更好的解决方案,我仍然很想听听他们的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多