Jsf 豆类的再利用
在仪表板上,每个用户都可以看到一些基本统计数据。让我们以“上次登录”日期为例。(但还有更多的统计数据/值/设置要显示) XHTML文件简化如下:Jsf 豆类的再利用,jsf,javabeans,Jsf,Javabeans,在仪表板上,每个用户都可以看到一些基本统计数据。让我们以“上次登录”日期为例。(但还有更多的统计数据/值/设置要显示) XHTML文件简化如下: <h:outputText value="statisticController.lastLoginDate()" /> @Named @RequestScoped public StatisticController{ public void init(User user){ //load stats for u
<h:outputText value="statisticController.lastLoginDate()" />
@Named
@RequestScoped
public StatisticController{
public void init(User user){
//load stats for user;
}
}
<ui:repeat var="user" value="#{userDataService.getAllUsers()}">
<h:outputText value="statisticController.lastLoginDate(user)" />
...
</ui:repeat>
现在,我想生成一个列表,例如某个角色可以在其中查看所有用户的值。因此,我不能再使用会话注入,因为StatisticController现在需要为多个用户生成
拥有常规类这不会是一个大问题-将userEntity添加到构造函数中。在JSF中解决这个问题的“最佳实践”是什么
如果我将StatisticController修改为以下内容:
<h:outputText value="statisticController.lastLoginDate()" />
@Named
@RequestScoped
public StatisticController{
public void init(User user){
//load stats for user;
}
}
<ui:repeat var="user" value="#{userDataService.getAllUsers()}">
<h:outputText value="statisticController.lastLoginDate(user)" />
...
</ui:repeat>
当然,我需要手动调用init(user)
。如何在XHTML文件的迭代中实现这一点
我可以重构它,以便在实际的getter方法中进行值加载,并进行如下迭代:
<h:outputText value="statisticController.lastLoginDate()" />
@Named
@RequestScoped
public StatisticController{
public void init(User user){
//load stats for user;
}
}
<ui:repeat var="user" value="#{userDataService.getAllUsers()}">
<h:outputText value="statisticController.lastLoginDate(user)" />
...
</ui:repeat>
...
但是我需要单独加载“every”值,这很糟糕
因此,这样的方式会“更好”:
statisticController.init(用户);
...
然而,这看起来也不是很舒服。进一步做类似的事情,会将几乎“所有”后端内容移到渲染响应阶段,这感觉是错误的
任何想法/技巧如何解决这个问题,而不是让人感觉“像是一个解决办法”创建一个新的模型来包装这些模型
public class UserStatistics {
private User user;
private Statistics statistics;
// ...
}
这样你就可以使用
public class UserStatisticsBacking {
private List<UserStatistics> list;
@EJB
private UserService userService;
@EJB
private StatisticsService statisticsService;
@PostConstruct
public void init() {
list = new ArrayList<UserStatistics>();
for (User user : userService.list()) {
list.add(new UserStatistics(user, statisticsService.get(user)));
}
}
// ...
}
使用BalusC提出的包装模型的另一种方法是使用模型数据存储两个单独的列表。使用这种方法,您不需要引入修改 按照这条路线,您将使用
迭代一个列表,并确保两个列表的大小相等,通过索引获取第二个列表元素,然后通过导出迭代状态变量的varStatus
属性获得该元素
<ui:param name="stats" value="#{bean.stats}/>
<ui:repeat value="#{bean.users}" var="user" varStatus="status">
<h:outputText value="#{user}/>
<h:outputText value="#{stats[status.index]}/>
</ui:include>
谢谢,这让事情更清楚了。我总是把模型和服务混为一谈,这样就不能很好地融入到应用程序中:)这似乎是松散耦合的。特别是在对统计数据进行排序时,我需要以某种方式维护与用户的连接。