мое приложение jsf разработано так, что при нажатии на элемент меню соответствующая страница отображается во вновь созданной вкладке. страницы, отображаемые на вкладках, имеют собственный элемент формы и компонент поддержки.
обычно это работает довольно хорошо, но не может найти способ, как решить ситуацию, когда несколько экземпляров одной и той же формы используются одновременно, например. больше вкладок «добавить нового сотрудника» открываются одновременно.
я пытаюсь использовать управляемый бин @SessionScoped
с Map
, содержащим экземпляры данных формы (в настоящее время для простоты используется только одна строка), например:
@ManagedBean(name="employeeBean")
@SessionScoped
public class EmployeeBean extends BaseManagedBean implements Serializable{
private Map<String, String> fields = new HashMap<String, String>();
private String formId;
public void newForm(){
this.formId=RandomStringUtils.randomAlphabetic(10);
logger.debug("newForm: formId: " + formId);
this.fields.put(formId, new String());
}
//... etc
}
когда я нажимаю на элемент меню, генерируется новый случайный formId
и на карту fields
добавляется новый держатель данных формы.
Страница JSF это:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:p="http://primefaces.prime.com.tr/ui">
<div class="dataContainer clearfix">
<h:form id = "#{employeeBean.formId}">
<h:inputText id="empField1" value="#{employeeBean.fields[employeeBean.formId]}" />
<p:commandLink action="#{employeeBean.action}" value="Action" id="actionLink">
</p:commandLink>
</h:form>
</div>
</html>
последний открытый экземпляр вкладки работает отлично, а старые - нет. если на старых вкладках нажимается commandLink
, то отправляется правильная форма и метод getFormId
вызывается один раз на этапе восстановления, но в моем EmployeeBean
больше ничего не вызывается.
если я использую фиксированный formId, а не случайный #{employeebean.formId}
, то всегда передаются данные первой открытой вкладки. (несколько форм с одинаковым идентификатором на странице).
Полагаю, что-то не так с моим деревом компонентов.
Я использую Primefaces
TabView
компонент (на основе jquery), и я добавляю новые вкладки к компоненту вкладки в функции jquery javascript.
Может кто-нибудь сказать мне, что я делаю не так? или предложить лучший способ решения проблемы? Как правильно подходить к таким ситуациям?
заранее большое спасибо