java - 使用自定义标签包装 spring mvc select 标签时出现 IllegalStateException

标签 java jsp spring-mvc jsp-tags

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

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

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

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

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

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

最佳答案

首先,我不确定您所说的想要控制样式是什么意思。我认为您可以将 class 和 id 属性传递给 Spring 标签,然后通过复制它们(? - 尽管我可能会对 Grail 标签感到困惑,因为我最近一直在编写 Grails 应用程序)。编辑:此外,您还可以通过引用外部元素来设置 Spring 生成的标签的样式。例如。用 div 包围表单元素,然后设置表单元素的样式,例如:#myDiv input { color: red; } .

根据我的经验(10 多年的 Web 应用程序开发经验),不值得付出额外的努力来尝试并证明您的应用程序面向 future 。当您选择像 Spring MVC 这样的框架时,您将免费获得很多通常需要您自己编写的东西。这些免费东西的成本是一定量的锁定(正如你所说)。 Spring 在这方面非常好 - 您可以根据需要使用尽可能少或尽可能多的内容,并且如果将来需要的话,通常可以很直接地对其进行设计。

所以我的看法是:“按原样”使用 Spring 标签。将来您需要删除 Spring 方面的可能性非常小。因此,如果/直到这种情况出现,“推迟”的风险是值得的。您可能已经花费了与删除 Spring 标签一样多的时间和代码来尝试设计面向 future 的解决方案 - 它超过了它可能提供的任何好处。除此之外,您已经编写了该代码,您和/或其他人现在必须维护该代码,而不是让 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>

关于java - 使用自定义标签包装 spring mvc select 标签时出现 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13122115/

相关文章:

java - Java 中输出流的意外结果

java - HIbernate saveorUpdate() 更新时插入新记录

java - 在使用 JUnit 和 MockMVC 时如何测试模型属性的属性不为 null?

java - API 描述未显示在 Swagger UI 中

java - Spring MVC 简介

java - Java int[] 压缩工具

java - 根据用户输入值在 MySql 中创建表

java - 管理多个选项卡的 webapp session 数据/ Controller 流

java - 我可以仅通过 xml 完全不使用注释来使用 Spring 吗?

java - 在java中使用字符串初始化的运行时差异是什么?