2011-02-04 113 views
4

我已經看到關於調用bean構造函數和ViewScope的其他問題,我仍然有困難。我看到的問題涉及到我的應用程序中的兩個特定頁面。第一個是dataTable(現在它充滿了隨機生成的數據,但最終會調用數據庫),第二個頁面是一個相當簡單的顯示頁面,其中來自所選行的信息以表單的形式顯示,供編輯或查看 - 這是我的detail.xhtml頁面。這是這個頁面的問題;它的構造函數被調用兩次:第一次當我導航到頁面時,再次按下commandButton是否提交更改或取消更改無關緊要時,detail.xhtml輔助bean的構造函數被第二次調用。ViewScope的構造函數調用兩次,不知道爲什麼

我的豆子是@ViewScoped,導入javax.faces.bean.ViewScoped。其他一些細節可能會有所作爲,但如果他們這樣做,我不明白爲什麼:我的UserDetailBean.java繼承自一個基本bean(我最初調用UIBaseBean.java)。現在,我的UIBaseBean是@RequestScoped。據我所知,這不應該有所作爲,因爲我的UserDetailBean是@ViewScoped,請糾正我,如果我錯了。

可能有所作爲的其他細節是在UIBaseBean和UserDetailBean的構造函數中設置一個變量。我想在我的頁面頂部的工具欄中顯示用戶的位置。爲此,我在UIBaseBean中創建了一個變量:

protected String toolbarDescription; 

我還在UIBaseBean中提供了setter和getter。在UIBaseBean的構造函數我定義變量:

toolbarDescription = "fix me"; 

這個定義只是讓我知道要覆蓋在支持Bean的變量在我的應用程序的任何特定頁面。在我的UserDetailBean中,我爲字符串toolbarDescription分配一個新值。該值顯示在detail.xhtml頁面上。否則,我的detail.xhtml頁面的bean非常流行,它會獲取並設置detail.xhtml頁面上表單中數據的顯示屬性。

設置詳細信息頁面,以便重定向發生導航,導航(按下commandButton時)導航發生重定向。我嘗試過使用faces-config導航規則,有和沒有重定向,隱式導航有和沒有重定向,但UserDetailBean構造函數總是被調用兩次。

哦,我在我的UserDetailBean構造函數的toolbarDescription變量上設置了一個斷點,該程序停止了兩次程序:首次調用頁面時,以及在詳細信息頁面上按下commandButton之後再次停止該程序。

從我所描述的,誰能告訴我爲什麼我的構造函數被調用兩次?我是否錯誤地設計了我的bean,還是我的應用程序中的問題更深?

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.faces.event.ActionEvent; 
import [package name].UIBaseBean;  
import java.util.Locale; 
import javax.faces.bean.ManagedProperty; 


@ManagedBean 
@ViewScoped 

public class UserDetailBean extends UIBaseBean { 

@ManagedProperty(value = "#{param.action}") 
private String action; 

private String firstName; 
private String lastName; 
private String jobTitle; 
private String DOH; 
private String location; 
private String status; 
private String comments; 
@ManagedProperty(value = "#{param.id}") 
private String id; 
private String tabTitle; 

private boolean editMode; 
private boolean viewMode; 

private ClUserDetail dBUserDetail;  

    /** Creates a new instance of UserDetailBean */ 
    public UserDetailBean() { 
     toolbarDescription = CoreMsgBundle.getMessageFromResourceBundle("UserDetail", Locale.ENGLISH); 
    } 

回答

4

您需要從UIBaseBean刪除@RequestScoped和其他相關注釋(並使其abstract)。

一旦做到這一點,還需要通過<f:viewParam>固定在#{param}@ManagedProperty被定義或要由ExternalContext#getRequestParameterMap(),而不是獲得。將具有較短範圍的東西注入具有較大範圍的東西是不可能的(因爲在接受者範圍內可能存在更多東西,因此不清楚應該注入哪一個)。 JSF會在bean的構建過程中拋出一個例外。

+0

非常感謝你,這正如我希望原始代碼能夠工作一樣。至於@ManagedProperty - 這是一個沒有很好理解的小信息的例子,是一件壞事。我讀[這個答案](http://stackoverflow.com/questions/4888942/viewparam-vs-managedpropertyvalue-param-id),並認爲,「哦,這是一個好主意,我會在我的應用程序中做到這一點」。 – Sean 2011-02-04 18:34:53

相關問題