有没有一种简单的方法可以在JSF中实现路由?

有没有一种简单的方法可以在JSF中实现路由?,jsf,jsf-2,url-routing,url-redirection,Jsf,Jsf 2,Url Routing,Url Redirection,我试图实现一个“通用”视图,其中(部分)显示的内容取决于URL。例如 如果/somepath/somepage.xhtml指向一个不存在的文件,我想尝试使用通用视图/genericview.xhtml>从数据库中检索/somepath/somepage.xhtml的内容,而不是直接返回404错误,其中我有如下内容: <h:outputText value="#{genericViewBean.content_lg}" escape="false" />

我试图实现一个“通用”视图,其中(部分)显示的内容取决于URL。例如

如果
/somepath/somepage.xhtml
指向一个不存在的文件,我想尝试使用通用视图
/genericview.xhtml>从数据库中检索
/somepath/somepage.xhtml
的内容,而不是直接返回404错误,其中我有如下内容:

<h:outputText value="#{genericViewBean.content_lg}"
                escape="false" />
如果在该表中找不到视图内容,则将返回标准404错误

我得到的最接近的方法是克隆
/genericview.xhtml
仅更改文件路径(例如,到
/somepath/somepage.xhtml
)。但这会让我在每个视图中获得一个文件的精确副本,这相当混乱,而且它不允许我仅仅通过向数据库添加条目来创建新的url

如果不克隆
/genericview.xhtml
,如何获得相同的结果

(附言:我读过关于漂亮脸蛋的书,但没有更简单的解决办法吗?

对于这一点,通常使用的是a。),也要这样做

您可以通过获取请求URI。您可以检查是否存在web资源,通过该资源将对不存在的资源返回
null
。如果资源存在,只需通过继续请求,否则通过将请求转发到通用视图

总之,过滤器的外观如下所示:

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

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String relativeRequestURI = request.getRequestURI().substring(request.getContextPath().length());

        boolean resourceExists = request.getServletContext().getResource(relativeRequestURI) != null;
        boolean facesResourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER));

        if (resourceExists || facesResourceRequest) {
            chain.doFilter(request, response);
        }
        else {
            request.getRequestDispatcher("/genericview.xhtml").forward(request, response);
        }
    }

    // ...
}
/genericview.xhtml
中,原始请求URI可用作键控为的请求属性。您可以在与视图关联的backingbean的
@PostConstruct
中使用它,以便从数据库中提取正确的内容

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

所以前端控制器?不像
FacesServlet
已经在做的那样?Prettyfaces或编写自己的前端控制器(必须对应于现有页面或servlet)几乎是您唯一的选择。在您自己的前端控制器中,您现在可以灵活地使用各种机制将请求发送到适当的视图。请输入选项,最好是部署prettyfaces并设置一个faces配置,将/dynamic/*路径重定向到/genericview.xhtml?path=*或类似的东西……尽管我已经完成了超级简单重写()配置提供程序类的实现(prettyfaces的家伙们肯定已经找到了prettyfaces的伟大继承者:我的pom上只有一个额外的依赖项,并且在我的项目中实现了配置提供程序类,以便在不需要任何额外更改的情况下将其准备就绪),您的回答准确地描述了我想要的。非常感谢!
String originalRequestURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
// ...