Как получить доступ к значению ui:param в управляемом компоненте

Я видел, как этот вопрос задавали много раз, однако ни один из них не получил правильного ответа, поэтому я решил спросить еще раз. Итак, если у меня есть это: если я нахожусь в A.xhtml и я

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

так что в B.xhtml я могу это сделать

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

когда я запускаю A.xhtml, я вижу, что awesome Id печатается на экране. Однако как мне получить доступ к значению formId в компоненте поддержки. Я заглядываю внутрь 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>

Итак, Как получить доступ к значению ui:param в управляемом компоненте?


person Thang Pham    schedule 21.09.2012    source источник
comment
этот вопрос похож на ваш?   -  person ElderMael    schedule 21.09.2012
comment
@mael: сейчас я пробую его код, но есть вещи, которые я не понимаю. если вы понимаете его / ее коды, не могли бы вы помочь мне немного больше, пожалуйста? hiddenValue это идентификатор outputLabel, а что такое UiTreeWalker?   -  person Thang Pham    schedule 21.09.2012


Ответы (1)


Где <ui:param> хранится под обложками, на самом деле зависит от реализации. В модхарре он хранится как атрибут FaceletContext< /a> и, таким образом, доступны в вашем вспомогательном компоненте следующим образом:

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}" />

Он будет доступен как параметр запроса именно с таким именем.

person BalusC    schedule 21.09.2012
comment
Спасибо BalusC. Есть небольшая проблема, о которой я забыл упомянуть: мне нужно значение formId на этапе проверки. Поэтому, когда я получаю доступ к этому значению из FaceletContext, оно равно нулю. Ранее, если я использую h:inputHidden, эта информация появляется в моей карте RequestParameterMap, поэтому я могу получить правильное значение, но я переключаюсь на ‹input type=hidden›. Я больше не вижу это значение в моей RequestParameterMap на этапе проверки. Есть идеи, почему, BalusC? - person Thang Pham; 21.09.2012
comment
Вы получили скрытое входное значение по точному имени "hiddenFormId"? Обратите внимание, что в имени нет префикса идентификатора формы. - person BalusC; 21.09.2012
comment
о, извините, это работает, это name="hiddenFormId", но я поставил id="hiddenFormId". Спасибо большое. - person Thang Pham; 21.09.2012