Да, это определенно возможно. Просто добавьте хороший фрагмент JavaScript и / или CSS, чтобы показать / скрыть и оформить всплывающее окно. Это также то, что делает средняя библиотека компонентов, такая как RichFaces, с той лишь разницей, что она заключена в простой компонент JSF.
В простейшем случае вы можете использовать JS window.open()
по нажатию кнопки / ссылки.
<h:commandButton value="Edit" onclick="window.open('edit.jsf?id=#{item.id}'); return false;" />
window.open()
позволяет точно настраивать окно, например, размер и панели браузера, которые должны отображаться / скрываться. Прочтите документацию MDN , чтобы узнать о них. Возврат false
обязателен для предотвращения ненужной отправки кнопкой формы.
Затем в конструкторе базового компонента, связанного с edit.jsf
, вы можете получить элемент с помощью id
, который был передан в качестве параметра запроса.
private Item item;
public EditItemBean() {
String id = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
this.item = someItemService.find(Long.valueOf(id));
}
Неприятно, но это то, что вы получаете с JSF 1.1, который не предлагает аннотацию @PostConstruct
с поддержкой JSF 1.2 или тег <f:viewParam>
с поддержкой JSF 2.0.
Наконец, в edit.jsf
вам нужно добавить какой-то условно отредактированный фрагмент JavaScript, который перезагружает родительское окно (так, чтобы отредактированные данные отображались повторно) и закрывало всплывающее окно.
<h:form>
...
<h:commandButton value="Save" action="#{editItem.save}" />
</h:form>
<h:panelGroup rendered="#{editItem.success}">
<script type="text/javascript">
window.opener.location.reload(true);
window.close();
</script>
</h:panelGroup>
Установите логическое значение success
в методе действия при успешном сохранении.
public void save() {
// ...
this.success = true;
}
Существуют также решения, использующие так называемое диалоговое окно «Наложение окна», которое в основном представляет собой <div>
, которое позиционируется с помощью CSS position: fixed;
и охватывает все окно браузера с прозрачным фоном, а затем - еще одно <div>
, которое по центру и содержит реальную форму. Это, однако, требует большего JS / CSS. Это также то, чем обычно занимается средняя библиотека компонентов JSF и инфраструктура / плагин JavaScript (такие как jQuery или YUI). Только сложнее заставить его работать без проблем вместе с JSF, поскольку вы, конечно, хотели бы снова отобразить всплывающее окно, когда возникает ошибка проверки во всплывающей форме и тому подобное. Намного проще, если вы используете реализацию / библиотеку JSF с поддержкой ajax.