2012-09-09 46 views
3

有没有办法动态地添加属性到struts 2标签UI标签,如文本框?动态添加属性到struts2 UI标签

原因是我想添加一个readOnly表单域属性到<s:textfield/>,这取决于一个操作的方法结果。我不能使用readOnly="%{isReadOnly()}",因为一旦定义属性,表单元素就是只读的,不管它具有什么值。并且将每个表单字段包装为<s:if/>标记非常麻烦,并导致大量代码重复。

我也想避免JavaScript的互操作性的原因和不依靠浏览器的脚本设置。

+1

我不确定,如果我已经理解了你的问题,有两种方法来操纵DOM,你可以从服务器端生成它,然后转移它,或者你可以使用JS来操纵它。你可以发布一些代码来显示你的问题。 – Jaiwo99

+0

重写了这个问题,所以应该更容易理解。很好的问题btw,我可以看到在这个价值,我不认为有明显的答案... – Quaternion

+0

@ Jaiwo99正如我所说我想避免JS,但使用服务器端评估。在action类中有一个'boolean isReadOnly()'方法。所以如果这个方法返回true,那么应该有一个'',如果它返回false,struts元素应该是'' – Dani

回答

2

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

如果您使用的是约定,那么您只需创建一个扩展名为“.ftl”的文件,如果您使用的是xml,那么使用freemarker结果类型也很容易(请参见here说明):

<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标签但极为有用唉它目前不是我mplemented。

备注:在上面的链接中有一个错误/遗漏。它告诉你添加下面一行,在我的环境中导致一个错误(简单的说就是不需要这一行)。

<#assign s=JspTaglibs["/WEB-INF/struts.tld"] /> 

也就是说,在一个文件该行的所有由它的自我足够用于渲染文本元素,没有明确的标签库需要声明!

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

有许多优点,使用freemarker的通过纯JSP的,所以花点时间来探索语法和使用它的这个情况以后可能证明是有用的。

+0

从我的'据了解,您只能设置属性的_value_,而不是动态设置_entire_属性。我尝试了像'<@ s.textfield dynamicAttributes = {getReadOnlyAttribute()} />方法(用自定义方法返回字符串'\“readonly \”:\“readonly \”')和'<@ s.textfield getReadOnlyAttribute ()} />'(返回字符串'readonly = \“只读\”')。这两种尝试都使用$和%{}表示法。每次发生struts或freemarker解析异常。 – Dani

+0

您必须返回地图,而不是可以解释为地图的字符串。 – Quaternion

+0

谢谢。不幸的是,仍然没有成功。这里是我尝试过的:'dynamicAttributes = ...',然后是'%{getReadOnlyAttribute()},{%{getReadOnlyAttribute()}},{$ {getReadOnlyAttribute()}},{{getReadOnlyAttribute()},{ $ {action.getReadOnlyAttribute()}},$ {action.getReadOnlyAttribute()},{%{#action.getReadOnlyAttribute()}},%{#action.getReadOnlyAttribute()}';该方法返回一个Map 。然而,该方法永远不会被称为Freemarker总是“期望其他符号”。我如何调用传递这些属性值的方法? – Dani