1

これが私のxhtmlページです:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Index</title>
    <style>
.error {
    background-color: #fdd;
}
</style>
</h:head>
<h:body>
    <h:messages style="color: orange" />
    <h:form>
        <h:inputText value="#{myBacking.um}" required="true" />
        <h:commandButton value="Submit" action="#{myBacking.acme}" />
    </h:form>
</h:body>
</html>

mojarra 2.0.9 と mojarra 2.1.8 でテストしましたが、どちらもh:inputTextコンポーネントの ID を生成しません。JSFのバグですか?

4

1 に答える 1

2

Mojarraは、エンドユーザーがIDを単独で指定した場合、またはコンポーネントにクライアントの動作が(によって<f:ajax>)指定されている場合にのみIDを設定します。

HtmlBasicRendererソースコードの関連性の抜粋は次のとおりです。

protected String writeIdAttributeIfNecessary(FacesContext context, ResponseWriter writer, UIComponent component) {
    String id = null;
    if (shouldWriteIdAttribute(component)) {
        try {
            writer.writeAttribute("id", id = component.getClientId(context), "id");
        } catch (IOException e) {
            if (logger.isLoggable(Level.WARNING)) {
                String message = MessageUtils.getExceptionMessageString (MessageUtils.CANT_WRITE_ID_ATTRIBUTE_ERROR_MESSAGE_ID, e.getMessage());
                logger.warning(message);
            }
        }
    }
    return id;
}

そして、コメントに注意してください

protected boolean shouldWriteIdAttribute(UIComponent component) {

    // By default we only write the id attribute if:
    //
    // - We have a non-auto-generated id, or...
    // - We have client behaviors.
    //
    // We assume that if client behaviors are present, they
    // may need access to the id (AjaxBehavior certainly does).

    String id;
    return (null != (id = component.getId()) &&
                (!id.startsWith(UIViewRoot.UNIQUE_ID_PREFIX) ||
                    ((component instanceof ClientBehaviorHolder) &&
                      !((ClientBehaviorHolder)component).getClientBehaviors().isEmpty())));
}

つまり、これは予想される動作です。

于 2012-05-29T21:21:09.860 に答える