<p:wizard> jsf тег скрывает значение параметра?

225
09 июля 2018, 08:30

У меня есть jsf страница, в нее запросом передается входной параметр hide. Я могу его прочитать и использовать, но он становится недоступным и возвращает null.

Пример JSF страницы

   <h:form id="FORM">
        <h:outputText id="point1" value="#{param['hide']}" escape="false"/>
        <h:outputText id="ppoint11" value="POINT1" escape="false"/>
        <p:panel id="PANEL" header="какой-то заголовок">
            <h:outputText id="point2" value="#{param['hide']}" escape="false"/>
            <h:outputText id="ppoint22" value="POINT2" escape="false"/>
            <p:wizard nextLabel="Далее" backLabel="Назад" flowListener="#{test.wizardHandleFlow}">
                <h:outputText id="consoleOutput3" value="#{param['hide']}" escape="false"/>
                <h:outputText id="consoleOutputfsf3" value="POINT3" escape="false"/>
                <p:tab id="s-p" title="tab1">
                    <h:outputText id="consoleOutput4" value="#{param['hide']}" escape="false"/>
                    <h:outputText id="consoleOutputfsf4" value="POINT4" escape="false"/>
                    <p:messages globalOnly="true"/>
                    <p:dataTable value="#{test.payments}" var="rowTest" editable="true" editMode="cell" emptyMessage="не найдены."
                                 style="margin-bottom: 10px;" rowHover="true">
                        <p:column headerText="№" width="3%">
                            <h:outputText value="#{rowTest.spPrId}"/>
                        </p:column>
                        <p:column headerText="поле1" width="4%">
                            <h:outputText value="#{rowTest.test1}"/>
                        </p:column>
                        <p:column headerText="поле2" width="5%">
                            <h:outputText value="#{rowTest.test2}"/>
                        </p:column>
                        <p:column headerText="поле3" width="8%">
                            <h:outputText value="#{rowTest.test3}"/>
                        </p:column>
                        <p:column headerText="поле4" width="41%">
                            <h:outputText value="#{rowTest.test4}"/>
                        </p:column>
                        <p:column headerText="Контрагент" width="20%">
                            <h:outputText value="#{rowTest.test5}"/>
                        </p:column>
                        <p:column headerText="заголовок2" width="20%">
                            <p:selectOneMenu value="#{rowTest.test5}" converter="#{someConverter}"
                                             style="width: 300px">
                                <f:selectItem itemLabel="Выберите..." noSelectionOption="true"/>
                                <f:selectItems value="#{test.test6}" var="acc" itemValue="#{acc}" itemLabel="#{acc.name}"/>
                                <p:ajax/>
                            </p:selectOneMenu>
                        </p:column>
                        <p:column headerText="НДС" width="5%">
                            <p:selectBooleanCheckbox value="#{rowTest.vatIncluded}">
                                <p:ajax/>
                            </p:selectBooleanCheckbox>
                        </p:column>
                    </p:dataTable>
                    <p:button value="Отменить" icon="ui-icon-cancel" outcome="d-pay" style="float: left;"/>
                </p:tab>
                <p:tab id="select-referer" title="Выбор привязки">
                    <h:outputText id="consoleOutput5" value="#{param['hide']}" escape="false"/>
                    <h:outputText id="consoleOutputfsf5" value="POINT5" escape="false"/>
                    <h:outputText value="привязка." styleClass="ui-message-info" style="margin: 10px; display: inline-block;"/>
                    <p:messages globalOnly="true"/>
                    <p:selectOneListbox id="bulk-referer" value="#{test.test7}" converter="#{nonProjectItemConverter}"
                                        style="width: 300px; margin-bottom: 10px;" required="true">
                        <f:selectItem itemLabel="Выберите..." noSelectionOption="true"/>
                        <f:selectItems value="#{test.test8}" var="npi" itemLabel="#{npi.name}"/>
                    </p:selectOneListbox>
                    <p:button value="Отменить" icon="ui-icon-cancel" outcome="d-p" style="float: left;"/>
                </p:tab>

При этом, переменная еще видна в POINT4, но уже недоступна в POINT5 То есть проблема в передаче параметра между Tab внутри Wizard.

Answer 1

Похоже у вас проблема в реализации p:wizard, поскольку Вы не вставляете p:tab. Если вставить этот недостающий тег, то все должно заработать. Например, так:

<p:wizard nextLabel="Далее" backLabel="Назад" flowListener="#
                  {payment.wizardHandleFlow}">
      <p:tab id="pointTab">
      <h:outputText id="POINT2" value="#{param['hide']}"
                     escape="false"/>
      </p:tab>
</p:wizard>

Надеюсь поможет.

UPD:

У primefaces действительно есть проблемы с передачей параметра запроса на вкладки, и по-моему даже есть открытый improvement для другого похожего компонента tabView. Предлагаю Вам следующий workaround c использованием remoteCommand. Так будет выглядеть Ваш фейслет.

<h:form id="FORM">
        <p:remoteCommand name="callRemoteMethod"
                         actionListener="#{materiaBean.myBeanMethod}"/>
        <p:wizard nextLabel="Далее" backLabel="Назад" flowListener="#{materiaBean.onFlowProcess}"
                  onnext="passParameters();">
            <p:tab id="s-p" title="tab1">
                <h:outputText id="consoleOutput3" value="#{param['hide']}" escape="false"/>
            </p:tab>
            <p:tab id="select-referer" title="Выбор привязки">
                <h:outputText id="consoleOutput5" value="#{materiaBean.hide}" escape="false"/>
            </p:tab>
        </p:wizard>
</h:form>
<script type="text/javascript">
        function passParameters(){
            callRemoteMethod([{name:'hide', value:#{param['hide']}}]);
        }   
</script>

А managed bean будет выглядеть следующим образом:

@ManagedBean
@ViewScoped
public class MateriaBean implements Serializable {
    private String hide;
    ...
    public void myBeanMethod() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map<String, String> params = context.getExternalContext()
                .getRequestParameterMap();
        setHide(params.get("hide"));
    }
    public String getHide() {
        return hide;
    }
    public void setHide(String hide) {
        this.hide = hide;
    }
    ...
}

В результате параметр запроса будет передаваться и сохраняться в managed бине, откуда и будет считываться на других вкладках. И похоже пока другого варианта сделать они пока не имеют. Надеюсь теперь Ваша задача решена.

Я бы, кстати, обновил название вопроса на что-то типа: "Передача параметра запроса между вкладками для p:wizard компонента primefaces" - это более четко отражает суть Вашего запроса.

READ ALSO
Как return&#39;уть это?

Как return'уть это?

Скорее всего, тут всё элементарно, но как return'уть 1-й элемент ArrayList'a?

249
java вывод объекта в консоль

java вывод объекта в консоль

В код особо не вдавайтесь скопипастил с сайтаВопрос:почему помеченные строки println не выводят, как обычно, при попытке напечатать в консоль...

175
Ищу online курсы по Java

Ищу online курсы по Java

Посоветуйтепожалуйста хорошие online курсы по Java, котррые выдают сертификат об окончании

206
Создание csv-файла

Создание csv-файла

Дорогие друзья! Мне надо создать программу, которая будет считывать данные из txt-файла и записывать в csv(csv-файл она также создаёт сама)Я понимаю,...

176