0

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

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

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

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

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

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

4

2 回答 2

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>
于 2012-10-29T23:05:22.030 回答
0

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

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

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

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

于 2012-11-05T16:08:07.430 回答