2011-04-02 65 views
1

我的jsf appication被设计为通过点击菜单项,相应的页面显示在新创建的选项卡中。显示在选项卡上的页面有其自己的表单元素&支持bean。 通常这工作得很好,但无法找到一种方式来解决同时使用同一表单的多个实例的情况,例如。同时打开更多“添加新员工”选项卡。 我尝试使用一个@SessionScoped托管bean与表单数据(目前仅一个串为简单起见)的Map含有实例是这样的:使用多个表单实例jsf 2.0

@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}那么总是提交第一个打开的选项卡的数据。 (在页面上具有相同ID的多个表单)。

我想我的组件树有问题。 我使用PrimefacesTabView组件(基于jquery),我在jquery javascript函数中为选项卡组件添加了新选项卡。

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

非常感谢

+0

可能不是最好的解决方案,但我设法提交我所有的选项卡。诀窍是我对所有表单使用相同的id,并且用我自己的AjaxRequest替换了'PrimeFaces.ajax.AjaxRequest',它总是发布当前的表单(其中'CommandLink'被按下)而不是第一个。 – gulygab 2011-04-03 21:07:02

回答

2

您是否需要一个会话scoped bean?例如。你想从其他页面访问bean内容吗?如果没有,也许你可以简单地使你的EmployeeBean请求范围。比你不需要在你的employeeBean里面有一个地图,而你valuebindings也可能更简单...