基本问题
我在编写自己的自定义 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/