использовать несколько экземпляров формы jsf 2.0 - PullRequest
1 голос
/ 02 апреля 2011

мое приложение 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.

Может кто-нибудь сказать мне, что я делаю не так? или предложить лучший способ решения проблемы? Как правильно подходить к таким ситуациям?

заранее большое спасибо

1 Ответ

2 голосов
/ 02 мая 2011

Вам нужен здесь сессионный компонент? Например. Вы хотите получить доступ к bean-контенту с других страниц? Если нет, то, возможно, вы могли бы просто сделать ваш запрос EmployeeBean ограниченным. Чем вам не нужна карта внутри вашего employeeBean, и вам valuebindings также может быть проще ...

...