2012-04-23 21 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