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>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…