У меня есть 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.
Похоже у вас проблема в реализации 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" - это более четко отражает суть Вашего запроса.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Скорее всего, тут всё элементарно, но как return'уть 1-й элемент ArrayList'a?
В код особо не вдавайтесь скопипастил с сайтаВопрос:почему помеченные строки println не выводят, как обычно, при попытке напечатать в консоль...
Посоветуйтепожалуйста хорошие online курсы по Java, котррые выдают сертификат об окончании
Дорогие друзья! Мне надо создать программу, которая будет считывать данные из txt-файла и записывать в csv(csv-файл она также создаёт сама)Я понимаю,...