2012-04-23 20 views
1

我剛開始深入研究JSF 2.0,它是以組件爲中心的體系結構,具有一組固定視圖以構建具有豐富用戶界面的Web應用程序。但是,JSF 2.0是否也可以用於具有動態頁面創建和多頁面的網站?一個例子:基於URL的GET請求處理和使用JSF 2.0動態創建頁面

我有一個不完整的國家數據庫和不同年份的這些國家的統計數據。一組國家和可用的統計數據可能每天都在變化。我想提供像URL:

這將沒有任何意義爲每個國家創建一個視圖,例如WEB-INF/pages/country/germany.xhtml或/country/germany.xhtml。我想我真的需要基於對給定URL進行深入處理的動態頁面創建。但是JSF 2.0爲這種用例而構建?

我真的在考慮切換到像Velocity這樣的模板引擎組合的普通舊Servlet。我對JSF 2.0的瞭解非常有限,我不知道我是否應該使用它。

回答

1

最簡單的方法是,您可以創建一個filter,它映射到/country/*的URL模式,並將所有請求轉發到單個JSF視圖。

String originalUri = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 
// ... 

你可以動態地進一步利用它在bean /視圖:

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

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     req.getRequestDispatcher("/WEB-INF/country.xhtml").forward(req, res); 
    } 

    // ... 
} 

在(後)與country.xhtml相關的管理bean的構造函數,你可以按如下搶原始請求URI預填充/呈現所需的HTML輸出。

對於進一步的抽象和更細粒度的配置,您可能想要看看PrettyFaces,它基本上在封面下做了相同的深度。

+0

非常有趣的方法,但不幸的是FacesContext.getCurrentInstance()。getExternalContext()。getRequestMap()。get(RequestDispatcher.FORWARD_REQUEST_URI)返回null。我不確定,但也許這是因爲階段「應用請求值」沒有得到執行?我正在切換到基於動作的框架(Spring MVC),但我想我會給JSF 2.0第二次機會。 – user1351150 2012-04-23 17:50:57

+0

那麼,如果它返回'null'那麼過濾器根本就不被調用。 – BalusC 2012-04-23 17:59:57

+0

你說得對,在我的WEB-INF/web.xml中發現了一個錯字。非常感謝您快速有用的解決方案! – user1351150 2012-04-23 18:11:44