Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 豆类的再利用_Jsf_Javabeans - Fatal编程技术网

Jsf 豆类的再利用

Jsf 豆类的再利用,jsf,javabeans,Jsf,Javabeans,在仪表板上,每个用户都可以看到一些基本统计数据。让我们以“上次登录”日期为例。(但还有更多的统计数据/值/设置要显示) XHTML文件简化如下: <h:outputText value="statisticController.lastLoginDate()" /> @Named @RequestScoped public StatisticController{ public void init(User user){ //load stats for u

在仪表板上,每个用户都可以看到一些基本统计数据。让我们以“上次登录”日期为例。(但还有更多的统计数据/值/设置要显示)

XHTML文件简化如下:

<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>

谢谢,这让事情更清楚了。我总是把模型和服务混为一谈,这样就不能很好地融入到应用程序中:)这似乎是松散耦合的。特别是在对统计数据进行排序时,我需要以某种方式维护与用户的连接。