我有一个自定义 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 和标签的解析顺序。因此,我还测试了直接使用 scriptlet 注入
<form:input (...) <%= (String)jspContext.getAttribute("expandedAttributes")%> --%>
所以我需要解决这个问题,因为我无法预览可以添加到输入中的所有属性。因此我想到了以下几种可能:
- 使用
<input
而不是<form:input
,这意味着我必须完全复制“路径”属性的弹簧代码(不是好主意) - 扩展 form:input 标签,将动态属性复制到默认属性中并进行标准标签渲染(不知道是否是一个可行的解决方案,如果 spring 更改其输入标签实现,那么它就无法正常工作了)
- 枚举我需要的所有属性,这会使标记代码变得庞大且不易维护
我想知道是否有更好的解决方案我还没有想到,或者第二种可能性是否可行。
谢谢