使用多个表单实例jsf 2.0

时间:2011-04-02 11:40:33

标签: jsf jsf-2 facelets primefaces

我的jsf appication旨在通过单击menuitem,相应的页面显示在新创建的选项卡中。选项卡上显示的页面有自己的表单元素&支持豆。 通常这很好用,但是当同时使用同一表单的多个实例时,无法找到解决问题的方法,例如。同时打开更多“添加新员工”标签。 我尝试使用@SessionScoped托管bean和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中不会调用任何其他方法。 如果我使用fixed formId而不是随机#{employeebean.formId}那么总是提交第一个打开的标签的数据。 (页面上具有相同ID的多个表单)。

我想我的组件树有问题。 我使用Primefaces的{​​{1}}组件(基于jquery),并在jquery javascript函数中向选项卡组件添加新选项卡。

谁能告诉我我做错了什么?或建议一个更好的方法来解决问题?处理这种情况的正确方法是什么?

提前多多感谢

1 个答案:

答案 0 :(得分:2)

这里你需要一个会话范围的bean吗?例如。你想从其他页面获取bean内容吗?如果没有,那么您可以简单地将EmployeeBean请求作为范围。比你employeeBean中不需要地图,你valuebindings也可以更简单......