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

标签 jsf jsf-2 url-routing url-redirection

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

/somepath/somepage.xhtml指向一个不存在的文件,而不是直接进入 404 错误,我想尝试检索 /somepath/somepage.xhtml使用通用 View 从数据库中获取内容,/genericview.xhtml ,我有类似的东西:

<h:outputText value="#{genericViewBean.content_lg}"
                escape="false" />

如果被支持 bean 找到,它将从 tgenericcontent 输出数据库条目的内容。表,取决于最初请求的 viewId:
 webpath                              | content
 /somepath/somepage.xhtml             | <p>This is a test</p>
 /someotherpath/someotherpage.xhtml   | <p>A different test</p>

如果在该表中找不到 View 内容,则将返回标准 404 错误。

最接近我浪费的克隆 /genericview.xhtml仅更改文件路径(例如,更改为 /somepath/somepage.xhtml )。但这让我每个 View 都有一个文件的精确副本,它非常困惑,并且不允许我仅通过向我的数据库添加条目来创建新的 url。

如何在不克隆的情况下获得相同的结果 /genericview.xhtml ?

(P.S:我读过漂亮脸蛋,但没有更简单的解决方案吗?)

最佳答案

为此,通常是 servlet filter正在使用。 PrettyFaces , UrlRewriteFilterFacesViews也这样做。

您可以通过 HttpServletRequest#getRequestURI() 获取请求 URI .您可以通过 ServletContext#getResource() 检查网络资源是否存在这将返回 null在不存在的资源上。如果资源存在,直接通过 FilterChain#doFilter() 继续请求, 否则通过 RequestDispatcher#forward() 将请求转发到通用 View .

总而言之,这就是过滤器的样子:

@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 可用作以 RequestDispatcher#FORWARD_REQUEST_URI 为键的请求属性。 .您可以在 @PostConstruct 中使用它与 View 关联的支持 bean,以便从数据库中提取正确的内容。
String originalRequestURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
// ...

关于jsf - 有没有一种简单的方法可以在 JSF 中实现路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27906271/

相关文章:

javascript - Angular ui 路由器 : Links are not clickable

jsf - 我需要 jsf-api 或 jsf-impl 还是两者都需要才能开始使用 JSF?为什么不合并?

java - 正则表达式用于过滤电子邮件、数字和重复输入

jsf - 将RICHFACES添加到现有的JSF2项目

jsf-2 - JSF2 的外部属性文件

javascript - Angular 路由器。如何使用不同的参数导航到当前 URL?

jsf - 使用 HTTPS 无法直接访问 protected JSF 页面

jsf - 如何动态添加输入字段

ajax - 什么是<f :ajax execute ="@all"> really supposed to do?它仅过帐封闭表格

url - 如何从 Sinatra 中的 URL 检测语言