0

请注意:这个问题是关于 CDI 范围的,因为我们在应用程序中使用 CDI 范围,而不是 JSF 范围。

1)RequestScoped(企业上下文)中的Controller Bean(TestController.java)称为index_cut.xhtml,当我们第一次来到这个页面时。

在此处输入图像描述

2)在“加载”按钮上,我们加载以下方法来填充 sapFinancialPeriodList 工作正常并显示数据

<<XHTML 代码>>

<<JAVA代码>>

<<XHTML 代码>>

3)更改页面内容并提交后,sapFinancialPeriodList在如下方法中显示为NULL——</p>

<<JAVA代码>>

<< XHTML 结果 >>

有什么建议么?

4

1 回答 1

2

您的 bean 是请求范围的,并且您仅在操作时加载数据模型,而不是在(后)构造时加载。当加载数据的操作完成后的 HTTP 响应时,该 bean 将被丢弃。随后的请求将获得一个全新的 bean 实例,所有属性都设置为默认值。但是,由于在(后)构造期间没有保留相同的数据模型,因此它保持为空。

在 JSF2 中,您可以使用@ViewScoped. 这样,只要您通过回发(返回nullor void)与相同的视图交互,bean 就会存在。

在 CDI 中,您需要使用 来解决这个问题@ConversationScoped,而这又需要一些额外的样板文件,并在适当的时候@Inject Conversation完成begin()并调用。end()有关具体示例,另请参阅在 JSF 2.0 中为向导模式使用什么范围?.

另一种方法是通过命令链接/按钮将负责创建数据模型的参数传递给后续请求<f:param>,如下所示

<h:commandButton value="save" ...>
    <f:param name="period" value="#{bean.period}" />
</h:commandButton>

然后在请求范围 bean 的(后)构造函数中重新创建完全相同的数据模型,如下所示

String period = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("period");
List<SapFinancialPeriod> sapFinancialPeriodList = someservice.list(period);

(如果您使用的是标准 JSF,那么上面的解决方法会更好@ManagedProperty;据我所知,CDI 没有注释可以让您将 HTTP 请求参数设置为 bean 属性)

也可以看看:


与具体问题无关,即将推出的 JSF 2.2 使用带有新注释和新标签的新“Faces Flow”特性以更好的方式解决了这一功能需求。@FlowScopedxmlns:j="http://java.sun.com/jsf/flow"

于 2012-11-05T18:04:30.857 回答