2012-09-09 72 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