Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用自定义标记包装spring mvc select标记时发生IlleagalStateException_Java_Jsp_Spring Mvc_Jsp Tags - Fatal编程技术网

Java 使用自定义标记包装spring mvc select标记时发生IlleagalStateException

Java 使用自定义标记包装spring mvc select标记时发生IlleagalStateException,java,jsp,spring-mvc,jsp-tags,Java,Jsp,Spring Mvc,Jsp Tags,基本问题 我在编写自己的定制JSP标记来包装SpringMVC表单标记时遇到了一点问题。我已经成功地包装了其他标记,但由于select和options标记的出现,这将抛出一个IlleagalStateException。我调试了spring代码,发现options标记查找祖先选择标记。我使用标记文件执行此操作,因此spring select标记实际上位于不同的标记文件中。我想这就是它找不到它的原因 所以问题是我能做些什么来绕开这个 可能的解决办法 我试着寻找解决方案,但我发现其他人也有同样的问题

基本问题 我在编写自己的定制JSP标记来包装SpringMVC表单标记时遇到了一点问题。我已经成功地包装了其他标记,但由于select和options标记的出现,这将抛出一个IlleagalStateException。我调试了spring代码,发现options标记查找祖先选择标记。我使用标记文件执行此操作,因此spring select标记实际上位于不同的标记文件中。我想这就是它找不到它的原因

所以问题是我能做些什么来绕开这个

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

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

简化JSP中所需的标记 分解常见代码,例如输入后的form:errors或从spring:message获得翻译 封装外观CSS有很长的路要走,但通常也需要更改标记 能够构建扩展spring标记功能的增强组件,例如,将multi-select呈现为拾取列表或将只读输入显示为文本标签 我很想听听人们的想法。
谢谢

首先,我不知道你想要控制造型是什么意思。我想您可以将class和id属性传递给Spring标记,然后将它们复制过来尽管我可能会对Grail标记感到困惑,因为我最近一直在编写Grails应用程序。编辑:此外,还可以通过引用外部元素来设置弹簧生成的标记的样式。例如,用div环绕表单元素,然后将表单元素设置为:myDiv input{color:red;}

根据我10多年的webapp开发经验,不值得付出额外的努力来尝试和验证你的应用程序。当你选择一个像SpringMVC这样的框架时,你会得到很多免费的东西,通常你必须自己编写。正如你所说,这种免费的东西的成本是一定数量的锁定。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>

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

放弃并直接使用JSP中的spring标记 根本不使用spring标记,在我自己的标记中复制它们的逻辑 可能编写一个扩展或使用spring标记类的标记类 扩展“我的标记”的范围以包装“选择”和“选项”标记 考虑到我现在在问题中已经阐明的想要这样做的原因,我决定选择最后一个选项。最初我并不热衷于此,因为我认为我可能会得到数百个参数,但实际上并不太糟糕。标记文件是为包装常见的标记位而设计的,所以这就是它们的用途。我还进一步包装了我自己的标记,因此有一个picklist标记,它输出我的自定义select标记,然后写入初始化它所需的JS


我认为这是我所遇到的基于我想要实现的目标的最好的解决方案。这就是我要说的,但如果其他人认为他们有更好的解决方案,我仍然有兴趣听到他们的解决方案。

也许你是对的。为了避开样式设置,我可能可以使用较少的代码将TB样式与我自己的站点规则混合,或者为每个页面上的每个组件传递TB类。这使得改变CSS样式成为一个主要的痛苦,因为我现在与TB高度耦合。这个答案迫使我后退一步,重新思考我试图实现的目标。谢谢