3

我正在使用 Seam 标签<s:decorate>,它有一个enclose属性。默认情况下,它设置为true(您可以在HtmlDecorate课堂上看到它)。

在我的应用程序中,不应包含所有标签,因此应将属性设置为false每个标签。但是在每个标签上都指定它并不是很漂亮的解决方案。

我想将默认设置更改为enclose = truefalse处。是否有可能通过注射或其他方式?

4

1 回答 1

4

我发现的唯一方法是decorate用你的覆盖 Seam 的组件。虽然听起来很复杂,但实现起来相对简单,而且比必须enclose="false"在每个<s:decorate/>. 该解决方案依赖于这样一个事实,即位于项目中的组件定义faces-config.xml优先于faces-config.xml位于库 jar 内的文件中的定义。

创建扩展的自定义组件类HtmlDecorate

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-class />标签中指定您的自定义组件类,同时使用通常的 Seam 渲染器):

<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>
于 2012-09-27T00:55:56.167 回答