7

この質問はよく聞かれますが、正解はなかったので、もう一度質問することにしました。だから私がこれを持っているなら:私が入っていて私がいるA.xhtmlなら

<ui:include src="B.xhtml">
    <ui:param name="formId" value="awesome Id"/>
</ui:include>

だからB.xhtml、私はこれを行うことができます

<h:outputText value="#{formId}"/>

実行するA.xhtmlawesome Id、画面に印刷されます。formIdただし、バッキングBeanの値にアクセスするにはどうすればよいですか。中を見るFacesContext.getCurrentInstance().getAttributes()FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()、見つけられないようです。もう少し先に進むために、私は試してみます:

B.xhtmlに、私は今持っています

<h:inputHidden id="hiddenFormId" value="#{formId}"/>
<h:outputText value="#{formId}"/>

formIdアイデアは、RequestParameterMapアンダーキーのの値にアクセスできるということですhiddenFormId。しかし今私が持っている場合:

<h:form id="myForm">
        <ui:include src="B.xhtml">
            <ui:param name="formId" value="awesome Id"/>
        </ui:include>
        <a4j:commandButton render="myForm" value="My Button"/>
</h:form>

次に、POSTリクエストの内部を見ると、このエラーが発生します(chromeまたはffデバッグモードの場合)

<partial-response><error><error-name>class javax.faces.component.UpdateModelException</error-name><error-message><![CDATA[/B.xhtml @9,61 value="${formId}": /index.xhtml @27,61 value="awesome Id": Illegal Syntax for Set Operation]]></error-message></error></partial-response>

では、マネージドBeanのui:param値にアクセスするにはどうすればよいですか?

4

1 に答える 1

12

が隠蔽されている場所<ui:param>は、実際には実装に依存します。Mojarraでは、の属性として保存されるため、FaceletContext次のようにバッキングBeanで使用できます。

FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
String formId = (String) faceletContext.getAttribute("formId");

ただし、値が利用可能かどうかはタイミングによって異なります。インクルードのレンダリングの実行中にバッキングコードが実行されている場合は、それが使用可能になります。それ以外の場合は、になりますnull

MyFacesの動作が少し違うことを思い出しますが、詳細はもう思い出せず、現在そのソースは手元にありません。

あなたの<h:inputHidden>試みに関しては<h:inputHidden>、フォームの送信とともにビューで定義された非表示のパラメーターを渡すという唯一の目的には適していません。代わりにプレーンHTMLを使用してください。

<input type="hidden" name="hiddenFormId" value="#{formId}" />

まさにこの名前のリクエストパラメータとして利用できるようになります。

于 2012-09-21T16:47:55.153 に答える