1

以下のカスタム コンポーネントを使用して、ページに何らかのガイダンスを表示しています。textこのコンポーネントにstyleClass属性を渡すように求められました。ただし、残念ながらstyleClass、このコンポーネントがページにレンダリングされるときに属性だけが適用されることはありません。したがって、タグコンポーネントでハードコーディングしました。そして今回のスタイルはちゃんと適用されています。理由がわからない。誰でも提案できますか?

styleClasscss の属性がタグ コンポーネントに適切に渡されていることがわかります。上で述べたように、コンポーネントは渡されたスタイル クラスを適用せずにレンダリングされます。

以下のようにスタイルをハードコーディングすると、うまくいきます。

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 に答える