jsf с всплывающими окнами, проблемы с таким же viewid - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть приложение tomcat с jsf 1.1

Корпус: В моем приложении есть jsp (пусть назовем его /create.jsp), который содержит форму для создания бизнес-объекта (представьте тип person). Одним из атрибутов этого бизнес-объекта является отношение к себе (у человека BO есть атрибут отца, который также имеет тип человека). Для этой свиньи в JSP у меня есть выбор и кнопка. Кнопка позволяет создать новый бизнес-объект (в данном случае человек). Следовательно, jsp-шоу во всплывающем окне совпадает с показанным в главном окне

Проблема: Я сталкиваюсь с неправильным поведением в главном окне.

Причина: Я изучил этот случай, и причина проблемы заключается в идентификаторах представлений, хранящихся на сервере. Когда пользователям требуется новая страница, сервер создает представление (ViewRoot) и сохраняет его в сеансе. Путь JSP используется в качестве идентификатора представления. Когда пользователь отправляет форму, он повторно использует то же представление, которое хранится в сеансе. Проблема в моем случае заключается в том, что всплывающее окно ViewRoot и главное окно ViewRoot имеют одинаковый идентификатор. Поэтому, когда показано главное окно, его viewRoot будет сохранен (скажем, id /create.jsp), но, когда появится всплывающее окно, его viewRoot перезапишет основное в сеансе. После закрытия всплывающего окна пользователь попытается отправить главную страницу, но на сервере такого ViewRoot нет.

Возможное решение: Я думал об изменении создания идентификатора ViewRoot, но мне кажется, что это невозможно (по крайней мере, если я не изменю библиотеку jsf).

--- СТАРЫЙ ТЕКСТ --- У меня есть JSP с формой (пусть назовите его /create.jsp), который открывает всплывающее окно. Это всплывающее окно также будет использовать /create.jsp. Из-за того, что JSF view-id основан на пути jsp, обе страницы будут иметь один и тот же идентификатор. Поэтому, когда отображается всплывающее окно, представление, сохраненное в сеансе для главной страницы, перезаписывается новым. Из-за этого приложение не работает должным образом.

Есть ли способ изменить идентификаторы видов? у кого-нибудь есть решение?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Мое окончательное решение заключается в следующем:

  1. Создайте имя jsp popup_create.jsp, которое содержит только вход в файл create.jsp
  2. Дублируйте запись create.jsp в FaceSconfigwith popup_create.jsp
  3. Создайте ViewHandler (добавьте его в config) с расширением ViewHandlerImpl, где методы createView & restoreView переписаны, так что viewId, в случае, если это create.jsp, и мы находимся ввсплывающее окно, оно изменит viewId на poup_create.jsp.

Поскольку я думаю, что это может быть сделано более элегантным способом, это единственный способ, который я нашел.

0 голосов
/ 01 сентября 2011

Вы, вероятно, хотите изучить использование подпредставления. Вы можете назначить пространство имен внутри этого, которое по существу создаст новое пространство имен на странице. В фейслетах это будет:

<f:view id="main">
  <ui:include "myOtherJsp.jsp" /> <!-- This containing a subview -->
</f:view>

В качестве альтернативы, я думаю, вам может понадобиться разделить страницу на несколько просмотров:

<f:view id="mainpage">
  <p>Page content</p>
</f:view>
<f:view id="popup">
  <p>My Popup</p>
</f:view>

Я не знаю специфики вашего приложения, но я не вижу ситуации, когда есть причина не иметь несколько представлений / форм. Я предполагаю, что разделение решит вашу проблему. Вы можете использовать некоторые элементы JSF вне представления (поэтому нет причин использовать одно представление для каждой страницы, если вы не принуждены.

Предостережение: я по большей части разработчик JSF2 и долгое время не делал приложения JSF1.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...