2013-04-10 12 views
0

在儀表板上,每個用戶可以看到一些基本統計信息。讓我們舉例來說,「最後登錄」日期。 (但也有更多的統計/值/設置來顯示)Bean的重用

的XHTML文件看起來simplidfied這樣的:

<h:outputText value="statisticController.lastLoginDate()" /> 

豆本身使用@Inject獲取會話,因此當前用戶:

@Named 
@RequestScoped 
public StatisticController{ 
    @Inject 
    private mySessionBean mySession; 

    @PostConstruct 
    private void init(){ 
     //load stats for mySession.currentUser; 
    } 
} 

現在,我想要生成一個列表,例如某個角色可以查看所有用戶的值。因此我不能再使用會話注入,因爲現在需要爲多個用戶生成StatisticController。

有規律的類,這不會是一個大問題 - 將userEntity添加到構造函數。在JSF中解決這個問題的「最佳實踐」是什麼?

如果我修改StatisticController到這樣的事情:

@Named 
@RequestScoped 
public StatisticController{ 

    public void init(User user){ 
     //load stats for user; 
    } 
} 

我將需要手動調用init(user)當然。從XHTML文件的迭代中如何實現這一點?

我可以重構它,因此valueLoading在實際的getter方法發生,並重復這樣的:

<ui:repeat var="user" value="#{userDataService.getAllUsers()}"> 
    <h:outputText value="statisticController.lastLoginDate(user)" />   
    ... 
</ui:repeat> 

但後來我就需要加載「每一個」獨立的價值,這是不好的。

所以這樣的方法是「更好」:

<ui:repeat var="user" value="#{userDataService.getAllUsers()}"> 
    statisticController.init(user); 
    <h:outputText value="statisticController.lastLoginDate()" />   
    ... 
</ui:repeat> 

然而,這並不看起來非常舒服無論是。進一步做這樣的事情,會將幾乎所有的後端資料移動到渲染響應階段,這是錯誤的。

任何想法/ Tipps如何解決這個問題,而不是感覺「像解決方法」?

回答

2

創建包裝這些模型的新模型。

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))); 
     } 
    } 

    // ... 
} 

(更好是在一個新的UserStatisticsService雖然以執行它)

<ui:repeat value="#{userStatisticsBacking.list}" var="userStatistics"> 
    <h:outputText value="#{userStatistics.user.name}" /> 
    <h:outputText value="#{userStatistics.statistics.lastLoginDate}" /> 
    ... 
</ui:repeat> 
+0

謝謝,使得它的方式更清晰。我總是混合模型和服務,然後不適合應用程序非常好:) – dognose 2013-04-12 11:43:44

0

替代使用由BalusC提出了一種包裹模型是存儲兩個單獨的列表與模型數據。採用這種方法,您無需引入修改。

按照這條路線,你會遍歷一個列表與<ui:repeat>,並確保這兩個列表的大小均等,通過指標,這又是可以通過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> 

人口可以事先在PostConstruct方法來完成:

private List<User> users; 
private List<Statistic> stats; 

@PostConstruct 
public void init() { 
    users = userService.list(); 
    stats = statService.list(); 
} 
+0

這似乎鬆散耦合。特別是在排序統計時,我以某種方式需要維護與用戶的連接。 – dognose 2013-04-12 11:45:07

相關問題