【发布时间】:2014-07-11 09:56:46
【问题描述】:
我有一个自定义 jsp 标记,它输出一个弹簧表单输入字段(以及其他布局元素)。我需要做的是能够接受动态属性并按原样在输入字段中使用它们。
使用举例:
<mytag:myinputtag arbitraryAttribute="value"/>
应该输出
<input:form arbitraryAttribute="value" />
不幸的是,它没有按预期工作,因为它引发了一个未终止的表单:输入标记异常。 以下是我使用的代码:
<%@ tag dynamic-attributes="attributes" %>
<c:set var="expandedAttributes">
<c:forEach var="a" items="${ attributes }">
${a.key}="${a.value}"<%= " " %>
</c:forEach>
</c:set>
<form:input (...) ${expandedAttributes} />
我可以理解为什么这不能按预期工作,因为 EL expr 和标签的解析顺序。因此我也测试了直接使用scriptlets注入
<form:input (...) <%= (String)jspContext.getAttribute("expandedAttributes")%> --%>
所以我需要解决这个问题,因为我无法预览可以添加到输入中的所有属性。于是我想到了以下几种可能:
- 使用
<input而不是<form:input,这意味着我必须完全复制“路径”属性的弹簧代码(不是好主意) - 扩展表单:输入标签,将动态属性复制到默认属性中并进行标准标签渲染(不知道是否可行,如果spring更改其输入标签实现则无法正常工作)
- 枚举我需要的所有属性,这会使标记代码变得庞大且不易维护
我想知道是否有更好的解决方案我还没有想到,或者第二种可能性是否可行。
谢谢
【问题讨论】:
-
差点忘了,我想到了另一种解决方案:从 scriptlet 输出
<form:input,然后再次强制解析标签输出。 -
我以为我通过使用 jsp:attribute 找到了解决方案,但由于我有许多属性,我必须将它们封装在 foreach 中,因此 jsp:attribute 应用于 c:forEach 元素形式:输入元素! :-( 看起来不存在可行的解决方案。 示例代码:
-
还在等待这个答案..
标签: spring jakarta-ee spring-mvc tags dynamic-attributes