簡體   English   中英

JSF 2:直接調用托管bean

[英]JSF 2: invoking managed bean directly

我是JSF的新手(2)。

在Struts中,我們可以從app.action這樣的URL調用一個動作。 這會調用一個動作並返回一個結果頁面,比如一個JSP(最初沒有JSP / HTML)。

如何在JSF中完成同樣的事情? (我知道如何從.xhtml調用一個動作)即直接從URL調用托管bean並獲取結果頁面。

如果它正在為初始GET請求准備數據,那么只需在請求的(post)構造函數中執行該作業,或者查看與該頁面關聯的作用域托管bean。

@ManagedBean
@RequestScoped
public class Bean {

    public Bean() {
        // Here.
    }

    @PostConstruct
    public void init(){ 
        // Or here, certainly if you rely on injected dependencies like @EJB.
    }

}

如果它正在控制請求/響應並且可能重定向/導航到另一個頁面,則在preRenderView執行該作業。

<f:event type="preRenderView" listener="#{bean.listener}" />

public void listener() {
    // ...

    // You want to redirect?
    externalContext.redirect(newURL);

    // Or you want to navigate?
    navigationHandler.handleNavigation(context, null, "newOutcome");
}

或者,如果要掛鈎所有請求,請使用過濾器

@WebFilter("/*")
public class MyFilter implements Filter {

    // ...

}

也可以看看:

您詢問的模式並不是JSF工作方式的原生模式。

基於請求的框架(如Struts和Spring MVC )以及較舊的基於Model-2 Servlet / JSP的方法確實如此工作。

在JSF中,首先它是自動映射到請求URL的頁面(視圖)。 沒有一個bean直接映射到URL的概念,也沒有一個bean的概念,它具有與視圖強制1:1關系的框架。 雖然有一個支持bean的概念,但這是按照慣例。 對於JSF,所有bean都是“輔助bean”,僅由視圖引用。

BalusC在他的回答中概述了當今可用於從JSF中基於請求的框架獲得某些行為的流行方法。 通過引入視圖操作 ,JSF 2.2將稍微擴展這種支持,該操作正式化了preRenderViewEvent的一些典型用例。

也就是說,JSF是一個非常靈活的框架,很少有東西是一成不變的。 可以通過精心設計的插件和裝飾系統替換或添加許多JSF的行為。

對於此用例,可以覆蓋JSF將URL綁定到(Facelets)視圖的事實,實際上您可以讓bean直接對請求做出反應。 雖然目的略有不同,但我通過覆蓋所謂的視圖處理程序來實現JavaVDL

您必須問自己這是否真的是您想要做的,如果您想以這種方式工作,JSF是否是您的最佳選擇。 但是通過JavaVDL( 源代碼 )中概述的方法,您應該能夠做到這一點。 請注意,最后一種方法不適合初學者,如果你想自己解決這個問題需要相當多的JSF經驗。 (如果您或其他任何人希望擁有此功能,請考慮在OmniFaces問題列表中為其創建問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM