我正在尝试实现一个“通用” 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 , UrlRewriteFilter和 FacesViews也这样做。
您可以通过 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/