1

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

我可以看到styleClass来自 css 的属性正在正确地传递给标记组件。正如我上面提到的,组件在没有应用传递的样式类的情况下被渲染。

如果我将我的风格硬编码如下,那么它就可以工作。

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");

    }
4

1 回答 1

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>

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

于 2012-10-23T06:37:22.963 回答