2017-01-25 44 views
0

我想將值傳遞給託管bean。所以我有這樣的託管bean:使用JSF自動設置託管bean變量的值

@ManagedBean(name = "mbWorkOrderController") 
@SessionScoped 
public class WorkOrderController { 

    // more attributes... 

    private WorkOrder workOrderCurrent; 

    // more code here... 

    public WorkOrder getWorkOrderCurrent() { 
     return workOrderCurrent; 
    } 

    public void setWorkOrderCurrent(WorkOrder workOrderCurrent) { 
     this.workOrderCurrent = workOrderCurrent; 
    } 
} 

它擁有自定義類型WorkOrder的參數workOrderCurrent。類別WorkOrder具有類型的屬性applicant

目前我在我的inputtext裏面使用placeholder向用戶顯示他需要在inputText內鍵入的內容。

<p:inputText id="applicant" 
    value="#{mbWorkOrderController.workOrderCurrent.applicant}" 
    required="true" maxlength="6" 
    placeholder="#{mbUserController.userLoggedIn.username}" /> 

我想要做的,是自動的mbUserController.userLoggedIn.username值傳遞給mbWorkOrderController.workOrderCurrent.applicant從我的形式完全刪除inputTextapplicant

我試圖用c:set

<c:set value="#{mbUserController.userLoggedIn.username}" target="#{mbWorkOrderController}" property="workOrderCurrent.applicant" /> 

但可惜的是,我得到一個javax.servlet.ServletException與消息:

類 'WorkOrderController' 沒有財產 'workOrderCurrent.applicant'。

有沒有人有建議?

回答

2

類'WorkOrderController'沒有屬性'workOrderCurrent.applicant'。

您的<c:set>語法不正確。

<c:set value="#{mbUserController.userLoggedIn.username}" 
     target="#{mbWorkOrderController}" 
     property="workOrderCurrent.applicant" /> 

你似乎認爲的一部分。這在幕後

value="#{mbWorkOrderController.workOrderCurrent.applicant}" 

..works如下:

WorkOrderCurrent workOrderCurrent = mbWorkOrderController.getWorkOrderCurrent(); 
workOrderCurrent.setApplicant(applicant); 
mbWorkOrderController.setWorkOrderCurrent(workOrderCurrent); 

這是不正確的。它的工作原理在幕後如下:

mbWorkOrderController.getWorkOrderCurrent().setApplicant(applicant); 

正確<c:set>語法因此,如下圖所示:

<c:set value="#{mbUserController.userLoggedIn.username}" 
     target="#{mbWorkOrderController.workOrderCurrent}" 
     property="applicant" /> 

那說,這一切是不是正確的方法來the concrete problem you actually tried to solve。您應該在模型本身中執行模型預填充。這可以通過使用@ManagedProperty引用另一個bean屬性並使用@PostConstruct來基於它執行初始化來實現。

@ManagedBean(name = "mbWorkOrderController") 
@SessionScoped 
public class WorkOrderController { 

    @ManagedProperty("#{mbUserController.userLoggedIn}") 
    private User userLoggedIn; 

    @PostConstruct 
    public void init() { 
     workOrderCurrent.setApplicant(userLoggedIn.getUsername()); 
    } 

    // ... 
} 
+0

非常感謝您廣泛的職位!這解決了我的問題。 – antarkt1s

0

也許你可以解釋一下上下文,但這是另一種解決方案。如果您要從其他頁面導航,則可以在URL中傳遞WorkOrder中的某個標識,如http://host:port/context/page.xhtml?workOrderId=1

然後,您可以設置標識符在這樣的託管bean:

<h:html> 
    <f:viewParam name="workOrderId" value="#{mbWorkOrderController.id}"/> 
</h:html> 

您將有一個新的屬性添加到你的bean:

public class WorkOrderController { 
    private long id; 
    public long getId() { return id; } 
    public void setId(long id) { this.id = id; } 

    // ... 
} 

,然後在後財產已由JSF設置,您可以在生命週期事件中找到工作訂單:

<h:html> 
    <f:viewParam name="workOrderId" value="#{mbWorkOrderController.id}"/> 
    <f:event type="preRenderView" listener="#{mbWorkOrderController.findWorkOrder()}"/> 
</h:html> 

public class WorkOrderController { 
    private long id; 
    public long getId() { return id; } 
    public void setId(long id) { this.id = id; } 

    public void findWorkOrder() { 
     this.workOrderCurrent = null /* some way of finding the work order */ 
    } 

    // ... 
} 

此策略具有a讓您擁有可收藏的網址的好處。