有没有办法动态地将属性添加到struts 2,标记UI标记,例如文本字段?
原因是我想将readOnly
表单字段属性添加到<s:textfield/>
,具体取决于操作的方法结果。我不能使用readOnly="%{isReadOnly()}"
,因为一旦定义了属性,表单元素就是只读的,无论它具有什么值。将每个表单字段包装到<s:if/>
标记中非常麻烦,导致大量代码重复。
出于互操作性原因以及不依赖于浏览器的脚本设置,我还想避免使用JavaScript。
答案 0 :(得分:2)
如果问题是使用内置的struts2功能,那么一个简单的选择是使用freemarker渲染视图,它可以轻松支持动态添加属性。
如果你正在使用约定,那么你只需要创建一个带有“.ftl”扩展名的文件是非常简单的,如果你使用的是xml,那么使用freemarker结果类型也很容易(见{{3})为了更好的描述):
<action name="test" class="package.Test">
<result name="success" type="freemarker">/WEB-INF/content/testView.ftl</result>
</action>
以下是使用地图动态添加属性的示例视图(示例也取自喜欢的页面):
<@s.textfield name="test" dynamicAttributes={"placeholder":"input","foo":"bar"}/>
dynamicAttributes在所有JSP UI标记中都非常有用,但是目前还没有实现。
注意:上述链接中有一个错误/遗漏。它告诉您添加以下行,这会在我的环境中导致错误(只需要该行)。
<#assign s=JspTaglibs["/WEB-INF/struts.tld"] />
也就是说,文件中的这一行全部由它自己足以呈现文本元素,不需要显式标记库声明!
<@s.textfield name="test" dynamicAttributes={"placeholder":"input","foo":"bar"}/>
使用freemarker优于普通JSP有许多优点,因此花点时间探索语法并将其用于这种情况可能会在以后证明是有用的。