动态地将属性添加到struts2 UI标记

动态地将属性添加到struts2 UI标记,struts2,attributes,Struts2,Attributes,有没有一种方法可以动态地将属性添加到struts 2标记UI标记(如textfield)中 原因是我想根据操作的方法结果,向添加一个只读表单字段属性。我不能使用readOnly=“%{isReadOnly()}”,因为一旦定义了属性,表单元素就是只读的,不管它有什么值。将每个表单字段包装到一个标记中非常麻烦,并且会导致大量代码重复 出于互操作性的原因以及不依赖浏览器的脚本设置,我也希望避免使用JavaScript。如果问题是使用内置的struts2功能,那么一个简单的选择就是使用freemark

有没有一种方法可以动态地将属性添加到struts 2标记UI标记(如textfield)中

原因是我想根据操作的方法结果,向
添加一个
只读
表单字段属性。我不能使用
readOnly=“%{isReadOnly()}”
,因为一旦定义了属性,表单元素就是只读的,不管它有什么值。将每个表单字段包装到一个
标记中非常麻烦,并且会导致大量代码重复


出于互操作性的原因以及不依赖浏览器的脚本设置,我也希望避免使用JavaScript。

如果问题是使用内置的struts2功能,那么一个简单的选择就是使用freemarker呈现视图,它很容易支持动态添加属性

如果您使用的是约定,则非常简单,只需创建一个扩展名为“.ftl”的文件,如果您使用的是xml,则使用freemarker结果类型也非常简单(有关详细说明,请参阅):


/WEB-INF/content/testView.ftl
下面是使用映射动态添加属性的示例视图(示例也取自页面):


DynamicAttribute在所有JSP UI标记中都非常有用,但遗憾的是,它目前尚未实现

注意:上述链接中有一个错误/遗漏。它告诉您添加以下行,这会在我的环境中导致错误(只是不需要该行)


也就是说,文件中的这一行本身就足以呈现文本元素,不需要显式的标记库声明

<@s.textfield name="test" dynamicAttributes={"placeholder":"input","foo":"bar"}/>


与普通JSP相比,使用freemarker有许多优点,因此花点时间研究一下语法并将其用于这一案例可能会在以后证明是有用的

我不确定,如果我理解了您的问题,有两种方法可以操作DOM,您可以从服务器端生成它,然后传输它,或者使用JS操作它。你能发布一些代码来说明你的问题吗?重新编写问题,使它更容易理解。好问题,顺便说一句,我可以看到这其中的价值,我不认为有一个明显的答案…@Jaiwo99,正如我所说的,我想避免使用JS,但使用服务器端评估。action类中有一个
boolean isReadOnly()
方法。因此,如果这个方法返回true,那么应该有一个
,如果它返回false,struts元素应该是
,据我所知,您只能设置属性的值,而不能动态地设置整个属性。我尝试了类似
(自定义方法返回字符串
\'readonly\':\'readonly\'
)和
(返回字符串
readonly=\'readonly\'
)。两次尝试都使用$and%{}符号。每次都会发生struts或freemarker解析异常。您必须返回映射,而不是可以解释为映射的字符串。谢谢。不幸的是,仍然没有成功。以下是我尝试过的:
dynamicAttribute=…
然后是
%{getReadOnlyAttribute()}、{%{getReadOnlyAttribute()}、{${getReadOnlyAttribute()}、${getReadOnlyAttribute()}、{${action.getReadOnlyAttribute()}、${action.getReadOnlyAttribute()}、{%{{action.getReadOnlyAttribute()}、%{{{action.getReadOnlyAttribute()};方法返回一个映射。然而,该方法从未被称为Freemarker,它总是“预期的其他符号”。我如何调用方法来传递这些属性值呢?我研究了它并尝试了尽可能多的排列!最后的结果是没有运气。我想用一个动态属性参数扩展struts2 textfield jsp标记,该参数接受一个映射,并执行您和我期望它对该映射所做的操作。
<@s.textfield name="test" dynamicAttributes={"placeholder":"input","foo":"bar"}/>
<#assign s=JspTaglibs["/WEB-INF/struts.tld"] /> 
<@s.textfield name="test" dynamicAttributes={"placeholder":"input","foo":"bar"}/>