How to spefic the body id attribute in JSF 2?

2020-02-15 01:40发布

I need to set the id attribute of the html body-tag (for selenium test). But that JSF 2 body tag (<h:body>) has no id attribute.

So, how can I specify the id attribute for the html body in JSF 2?

标签: java jsf jsf-2
1条回答
爱情/是我丢掉的垃圾
2楼-- · 2020-02-15 02:16

The <h:body> does indeed not support it (admittedly also to my surprise; it's perfectly valid in HTML). I have reported it to the JSF guys as issue 2409.

In the meanwhile, assuming that you're using Mojarra, you could solve this by extending Mojarra's BodyRenderer as follows:

package com.example;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import com.sun.faces.renderkit.html_basic.BodyRenderer;

public class BodyWithIdRenderer extends BodyRenderer {

    @Override
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        super.encodeBegin(context, component);

        if (component.getId() != null) {
            context.getResponseWriter().writeAttribute("id", component.getClientId(context), "id");
        }
    }

}

To get it to run, register it as follows in faces-config.xml (no, the @FacesRenderer annotation magic won't work as to overriding the standard renderers).

<render-kit>
    <renderer>
        <component-family>javax.faces.Output</component-family>
        <renderer-type>javax.faces.Body</renderer-type>
        <renderer-class>com.example.BodyWithIdRenderer</renderer-class>
    </renderer>
</render-kit>
查看更多
登录 后发表回答