Я не уверен, что вы прочитали мой ответ на одном из своих предыдущих вопросов.Вы никогда не давали никаких отзывов и приняли другой ответ.Я уже предупреждал, что такой подход - хакерский.
Вы в основном злоупотребляете valueChangeListener
здесь.Его единственная цель состоит в том, чтобы предоставить точку для одновременного доступа к и старому и новому значению, чтобы при необходимости можно было выполнять конкретные бизнес-действия, например регистрировать оба значения.
Использование его с единственной целью для "автоматического" заполнения другого компонента / элемента на основе только нового значения (вас совершенно не интересует старое значение) является хаком.Если вы уже используете JSF 2.0, я настоятельно рекомендую подход <f:ajax>
, упомянутый в связанном ответе.
Возвращаясь к вашей конкретной проблеме, вы должны понимать, что valueChangeListener
будет всегда запускается всякий раз, когда представленное значение отличается от исходного значения модели.Это не зависит от всей этой помощи JavaScript.onchange="submit()"
специально не вызывает прослушиватель, он просто отправляет на сервер форму whole .Это просто происходит, когда конечный пользователь меняет раскрывающийся список, поэтому изменение гарантировано, и слушатель будет вызываться на стороне сервера.
Ваша проблема предполагает, что вы не входите в набор valueChangeListener
значение модели с введенным значением и то, что вы звоните FacesContext#renderResponse()
.Этот подход почти такой же, как продемонстрированный в первом способе моего связанного ответа: ожидайте строки, которая устанавливает представленное значение в качестве значения модели.Поскольку вы не установили его, любая последующая отправка формы всегда будет запускать слушателя (потому что переданное значение отличается от значения модели!).Кроме того, поскольку FacesContext#responseComplete()
пропускает фазу действия invoke, метод действия никогда не вызывается.
Теперь перечитайте мой связанный ответ еще раз, как правильно его реализовать.