有没有办法将属性动态添加到 struts 2,标记 UI 标记,例如文本字段?
原因是我想将readOnly
表单字段属性添加到 中<s:textfield/>
,具体取决于操作的方法结果。我不能使用readOnly="%{isReadOnly()}"
,因为一旦定义了属性,表单元素就是只读的,不管它有什么值。并且将每个表单字段包装到一个<s:if/>
标签中非常麻烦,并且会导致大量代码重复。
出于互操作性和不依赖浏览器脚本设置的原因,我还想避免使用 JavaScript。
有没有办法将属性动态添加到 struts 2,标记 UI 标记,例如文本字段?
原因是我想将readOnly
表单字段属性添加到 中<s:textfield/>
,具体取决于操作的方法结果。我不能使用readOnly="%{isReadOnly()}"
,因为一旦定义了属性,表单元素就是只读的,不管它有什么值。并且将每个表单字段包装到一个<s:if/>
标签中非常麻烦,并且会导致大量代码重复。
出于互操作性和不依赖浏览器脚本设置的原因,我还想避免使用 JavaScript。
如果问题是使用内置的 struts2 功能,那么一个简单的选择是使用 freemarker 呈现您的视图,它很容易支持动态添加属性。
如果您使用约定,这非常简单,您只需要创建一个扩展名为“.ftl”的文件,如果您使用 xml,只需使用 freemarker 结果类型也很容易(更多描述请参见此处):
<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"}/>
与普通的 JSP 相比,使用 freemarker 有许多优点,因此花点时间研究一下语法并在这种情况下使用它可能会在以后证明是有用的。