Jsf 2 从JSF提交时,datatable中的CDIBean列表为空
请注意:这个问题是关于CDI作用域的,因为我们在应用程序中使用CDI作用域,而不是JSF作用域 1) 当我们第一次来到这个页面时,位于requestScope(企业上下文)中的控制器Bean(TestController.java)被称为index_cut.xhtml 2) 在“加载”按钮上,我们加载以下方法以填充sapFinancialPeriodList,该列表工作正常并显示数据 >“> >“> >“> 3) 更改页面内容并提交后,Jsf 2 从JSF提交时,datatable中的CDIBean列表为空,jsf-2,cdi,Jsf 2,Cdi,请注意:这个问题是关于CDI作用域的,因为我们在应用程序中使用CDI作用域,而不是JSF作用域 1) 当我们第一次来到这个页面时,位于requestScope(企业上下文)中的控制器Bean(TestController.java)被称为index_cut.xhtml 2) 在“加载”按钮上,我们加载以下方法以填充sapFinancialPeriodList,该列表工作正常并显示数据 >“> >“> >“> 3) 更改页面内容并提交后,sapFinancialPeriodList在以下方法中显
sapFinancialPeriodList
在以下方法中显示为空-
>“>
>“>
有什么建议吗?您的bean是请求范围的,您只在操作而不是(post)上加载数据模型构造。当加载数据的操作完成后的HTTP响应时,bean将被丢弃。随后的请求将获得一个全新的bean实例,其所有属性都设置为默认值。但是,由于在(post)构造期间没有保留相同的数据模型,因此它将保持为空 在JSF2中,您可以使用
@ViewScoped
解决这个问题。这样,只要您通过回发(返回null
或void
)与同一视图交互,bean就会一直存在
在CDI中,您需要使用@ConversationScoped
解决此问题,这反过来需要一些额外的@injectconversation
样板,并在适当的时候完成begin()
和end()
调用。有关具体示例,请参见
另一种方法是通过命令链接/按钮中的
将负责创建数据模型的参数传递给后续请求,如下所示
<h:commandButton value="save" ...>
<f:param name="period" value="#{bean.period}" />
</h:commandButton>
String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);
然后在请求范围bean的(post)构造函数中重新创建完全相同的数据模型,如下所示
<h:commandButton value="save" ...>
<f:param name="period" value="#{bean.period}" />
</h:commandButton>
String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);
String period=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(“period”);
List sapFinancialPeriodList=someservice.List(期间);
(顺便说一句,如果您使用的是标准JSF,那么使用@ManagedProperty
可以更好地解决上述问题;据我所知,CDI没有能够将HTTP请求参数设置为bean属性的注释)
另见:
与具体问题无关,即将推出的JSF 2.2通过使用新的
@FlowScoped
注释和新的xmlns:j=”的新特性,以更好的方式解决了这一功能需求http://java.sun.com/jsf/flow“
标记。第3步提交的表单accounts基本上发送一个全新的HTTP请求。您的bean是请求范围的。你现在看到了吗@巴卢斯克:我们也试过对话范围。我一经要求就明白了这一点。你有什么建议?回答得好。我建议您查看ViewAccessScope,而不是使用ConversationScope。您可以在下一个版本中从Deltaspike获得它,或者现在从myfaces codi.Reqarding注入http请求参数获得它。我觉得没有人回答得足够清楚,所以我对它进行了问答@BalusC:它与ConversationScope一起工作——但我看到的奇怪的事情是,如果我保持RequestScope,并在提交时使用PostConstruct中的DB中的原始值重新加载bean,那么bean就能够保存并显示屏幕上更改的值。不使用f:param。这是ArrayList特有的—因此我尝试在Postconstruct中为Submit创建一个空ArrayList,但它不会从submitdata()中的屏幕中获取新值。它将只替换ArrayList中的任何现有值,前提是在Postconstruct中创建一个这样的ArrayList。提交的和本地的输入值存储在UI组件树状态中(其本身基本上位于视图范围内)。