2012-09-26 85 views
3

我使用Seam標記<s:decorate>,它具有enclose屬性。默認情況下,它被設置爲true(您可以在HtmlDecorate類中看到它)。更改Seam中的標記默認屬性值

在我的應用程序中,所有的標籤都不應該被包含,因此每個標籤上的屬性應該設置爲false。但是要在每個標籤上指定它並不是非常漂亮的解決方案。

我想在一個地方將默認enclose = true更改爲false。有可能通過注射或其他方式嗎?

回答

4

我發現的唯一方法是覆蓋Seam的decorate組件與你的。雖然聽起來很複雜,但實現起來相對簡單,並且比每<s:decorate/>enclose="false"要好。該解決方案依賴於以下事實:位於項目的faces-config.xml中的組件定義優先於位於庫罐內的faces-config.xml文件中的定義。

創建自定義組件類,它擴展HtmlDecorate:我們在<component-class />標籤指定您的自定義組件類

public class MyDecorate extends HtmlDecorate { 

    // Default value is false, as opposed to HtmlDecorate 
    private boolean _myenclose = false; 

    // Default constructor 
    public MyDecorate() { 
     super(); 
    } 

    // Override setEnclose() and isEnclose() so that they use your variable 
    public boolean isEnclose() { 
     return _myenclose; 
    } 
    public void setEnclose(boolean enclose) { 
     this._myenclose = enclose; 
    } 
} 

聲明你的類作爲類的裝飾組件,在您的faces-config.xml(注意,在使用平時縫渲染器):

<component> 
    <description>"Decorate" a JSF input field when validation fails or when required="true" is set.</description> 
    <component-type>org.jboss.seam.ui.Decorate</component-type> 
    <component-class>com.example.myapp.MyComponent</component-class> 
    <component-extension> 
     <component-family>org.jboss.seam.ui.Decorate</component-family> 
     <renderer-type>org.jboss.seam.ui.DecorateRenderer</renderer-type> 
    </component-extension> 
</component> 

使用<s:decorate/>標籤像往常一樣在你的網頁:

<s:decorate template="..."> 
    .... 
</s:decorate> 
+0

你很酷!我試圖用Seam組件描述符來覆蓋它,但它不起作用。謝謝 :) –