如何在自定义组件中获取扩展UIOutput的标准styleClass属性

时间:2012-10-22 11:51:12

标签: jsf-2 attributes custom-component

我正在使用下面的自定义组件在我的页面中显示某种指导。我被要求将textstyleClass属性传递给此组件。但遗憾的是,当此组件在页面中呈现时,不会单独应用styleClass属性。因此我在我的标签组件中进行了硬编码。这种时间风格正在得到应用。不知道为什么。可以任何一个sugegst?

我可以看到来自css的styleClass属性正确传递给标记组件。正如我上面提到的那样,组件将在应用的传递样式类中进行渲染。

如果我硬编码我的风格如下,那么它正在发挥作用。

writer.writeAttribute("style", "background-color: #F1F5F2;font-size: 80%;left: 52em;position: absolute;text-align: left;width: 13.25em;z-index: 5;", null);

这是如何引起的?如何解决?

自定义组件使用如下

<mytags:guidanceBox text="#{FindPersonProps.MY_GUIDANCE_TEXT}" styleClass="guidance_css" />

源代码如下:

@FacesComponent(value="tags.guidanceBox")
public class GuidanceTag extends UIOutput {

    @Override
    public String getFamily() {
        return "javax.faces.NamingContainer";
    }

    public GuidanceTag() {
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {

        String guidanceText=(String) getAttributes().get("text");
        //String styleClass=(String) getAttributes().get("styleClass");
        //System.err.println("Text ["+guidanceText+"] Style ["+styleClass+"]");

        ResponseWriter writer=context.getResponseWriter();
        String clientId=getClientId(context);
        writer.startElement("p", this);
        writer.writeAttribute("style", "background-color: #F1F5F2;font-size: 80%;left: 52em;position: absolute;text-align: left;width: 13.25em;z-index: 5;", null);
        writer.writeAttribute("name", clientId, "clientId");

        writer.startElement("b", null);
        writer.writeText("Guidance:", null);
        writer.endElement("b");

        writer.startElement("br", null);
        writer.endElement("br");

        writer.writeText(guidanceText, null);

        writer.endElement("p");

    }

1 个答案:

答案 0 :(得分:2)

您应该实现TagHandler,即将属性传递给组件本身的实现。像这样:

public class GuidanceTagHandler extends ComponentHandler {

    public GuidanceTagHandler(ComponentConfig config) {
        super(config);
    }

    @Override
    protected void onComponentCreated(FaceletContext ctx, UIComponent c, UIComponent parent) {
        super.onComponentCreated(ctx, c, parent);

        TagAttribute styleClassAttribute = getRequiredAttribute("styleClass");
        c.getAttributes().put("styleClass", styleClassAttribute);
    }
}

在taglib.xml中,您应该拥有组件的签名:

<tag>
    <tag-name>guidanceTag</tag-name>
    <component>
        <component-type>guidance</component-type>
        <handler-class>yourpackages.GuidanceTagHandler</handler-class>
    </component>
</tag>

最后在faces.config中(它将绑定在component-type属性

<component>
    <component-type>guidance</component-type>
    <component-class>yourpackages.GuidanceTag</component-class>
</component>

我希望这个答案会对你有所帮助,因为我曾经遇到同样的问题。所以这就是我提出的解决方案。