我有一个问题我不明白:在任何View后面我有一个RequestScoped控制器ManagedBean和一个数据ManagedBean,它保存视图的数据并且是SessionScoped。
所以有两个视图,分别用loginData和loginController登录,概述用overviewData和overviewController。
功能应该是这样的:
所以,重点是我想在登录后立即从loginController中填充overviewData! (如果可能的话,构成概述视图的???或者如果可能的话......)。
我尝试使用managedProperties,但是我在loginController中启动的是与overviewController中的managedProperty不同的对象,尽管它们具有相同的名称!怎么可能。
哦,小伙子,我怀疑你们明白我的意思,所以我需要发布一些代码:
LoginController.java
...
@ManagedBean
@RequestScoped
public class LoginController {
@ManagedProperty(value = "#{overviewData}")
private OverviewData overviewData;
OverviewController overviewController;
public LoginController(){
overviewController = new OverviewController ();
}
String login() throws Exception {
UsernamePasswordToken token = new UsernamePasswordToken(loginData.getName(), loginData.getPw().trim());
try {
currentUser.login(token);
overviewController.fillProjects();
...
OverviewController.java
...
@ManagedBean
@RequestScoped
public class OverviewController {
@ManagedProperty(value = "#{overviewData}")
private OverviewData overviewData;
public void fillProjects(){
if(overviewData == null){
overviewData = new OverviewData();
}
overviewData.setProjects(projectService.getProjects()); //retrieves data from business logic
}
...
OverviewData.java
...
@ManagedBean(name = "overviewData")
@SessionScoped
public class OverviewData {
private List<ProjectDTO> projects; //that's what the view needs to display the overview
public void setProjects(List<ProjectDTO> projects) {
this.projects = projects;
}
...
我希望这有助于显示我的问题,如果你不理解,请在评论中提问..
如果你可以帮助我会很好: - )
干杯...
答案 0 :(得分:2)
您正在使用new
自己创建bean,而不是让JSF完成工作。
overviewController = new OverviewController ();
和
overviewData = new OverviewData();
这是错误的。 JSF不会使用您自己创建的任何bean。删除这些行,并在@ManagedProperty
内的overviewController
上添加另一个LoginController
(并创建属性private
)。
@ManagedProperty(value="#{overviewController}")
private OverviewController overviewController;
JSF将创建bean本身并在父bean构造之后直接将其设置为托管属性。您只需要以通常的Java方式访问它(不需要nullchecks)。