gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:12:14 27 4
gpt4 key购买 nike

我正在尝试实现一个“通用” 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com