我在我的 JSF 应用程序中使用 Myfaces CODI @ViewAccessScoped 支持 bean。好处之一是我不需要使用视图参数来在视图之间传递信息。作为记录,@ViewAccessScoped 确保 bean 是可访问的,直到新视图的第一个请求不访问它。以我想将字符串值从 page1 传递到 page2 的情况为例:
Page1Bean.java(page1.xhtml 的支持 bean)
@Inject private Page2Bean page2Bean;
private String source = "Hello, World!";
...
page2Bean.setTarget(source);
Page2Bean.java(page2.xhtml 的支持 bean)
private String target;
如果我直接从 page1 导航到 page2,那么当我从 page2 访问 #{page2Bean.target} 时,它的值是“hello, world!”。
实际上,我将数据从 page1 视图推送到 page2 视图。另一种选择是将数据从 page1 视图拉到 page2 视图中,因此在 page2Bean 中我 @Inject Page1Bean 和 @ViewAccessScoped 确保我可以访问 page1Bean.getSource() (只要它在前一个视图中)。
这一切都很好,但在现实世界中,我可能想从 page1 导航到许多其他页面中的任何一个,具体取决于用户输入。所以 Page1Bean.java 最终看起来像这样:
Page1Bean.java(已修改)
@Inject private Page2Bean page2Bean;
@Inject private Page3Bean page3Bean;
@Inject private Page4Bean page4Bean;
@Inject private Page5Bean page5Bean;
@Inject private Page6Bean page6Bean;
@Inject private Page7Bean page7Bean;
@Inject private Page8Bean page8Bean;
现在我的问题是:page1Bean 的内存占用是否总是包含 page2Bean-page8Bean?还是仅在我在运行时访问@Inject ed bean 之一时才使用内存?
我希望这不是一个太天真的问题,但我不确定它究竟是如何工作的,如果第一个问题的答案是肯定的,我或多或少最终会使用@SessionScoped!。
感谢您的任何澄清。