gpt4 book ai didi

jsf - Java EE Web 应用程序中的动态目录

转载 作者:行者123 更新时间:2023-12-04 21:03:08 26 4
gpt4 key购买 nike

我创建了一个使用 JSF 的 Java EE 应用程序。在我的 web目录,我有一个名为 index.xhtml 的文件.我的目标是根据父目录的名称在此网页上提供不同的内容。

例如:
http://localhost:8080/myapp/1/index.xhtml会打印 You accessed through "1" .http://localhost:8080/myapp/1234/index.xhtml会打印 You accessed through "1234" .

我不想为每个可能的数字创建一个目录;它应该是完全动态的。

此外,我需要我的导航规则仍然可用。因此,如果我有这样的导航规则:

<navigation-rule>
<display-name>*</display-name>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>index</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>

那么如果我在目录 1234 中,它仍然会重定向到 index.xhtml内页 1234 .

这可能吗?我怎样才能做到这一点?

最佳答案

为了转发/[number]/index.xhtml/index.xhtml由此[number]被存储为请求属性,你需要一个 servlet filter . doFilter()实现可以是这样的:

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

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String[] paths = request.getRequestURI().substring(request.getContextPath().length()).split("/");

if (paths.length == 3 && paths[2].equals("index.xhtml") && paths[1].matches("[0-9]{1,9}")) {
request.setAttribute("directory", Integer.valueOf(paths[1]));
request.getRequestDispatcher("/index.xhtml").forward(req, res);
}
else {
chain.doFilter(req, res);
}
}

// ...
}
它确保数字匹配 1 到 9 个拉丁数字并将其存储为由 directory 标识的请求属性。最后转发到 /index.xhtml在上下文根中。如果没有任何结果,它只是继续请求,就好像没有发生任何特殊情况一样。
/index.xhtml您可以通过 #{directory} 访问该号码.
<p>You accessed through "#{directory}"</p>
然后,为了确保 JSF 导航(和 <h:form> !)继续工作,您需要自定义 view handler它覆盖了 getActionURL() 在 URL 前面加上 directory 表示的路径请求属性,如果有的话。这是一个启动示例:
public class YourViewHandler extends ViewHandlerWrapper {

private ViewHandler wrapped;

public YourViewHandler(ViewHandler wrapped) {
this.wrapped = wrapped;
}

@Override
public String getActionURL(FacesContext context, String viewId) {
String actionURL = super.getActionURL(context, viewId);

if (actionURL.endsWith("/index.xhtml")) {
Integer directory = (Integer) context.getExternalContext().getRequestMap().get("directory");

if (directory != null) {
actionURL = actionURL.substring(0, actionURL.length() - 11) + directory + "/index.xhtml";
}
}

return actionURL;
}

@Override
public ViewHandler getWrapped() {
return wrapped;
}

}
为了让它运行,请在 faces-config.xml 中注册如下。
<application>
<view-handler>com.example.YourViewHandler</view-handler>
</application>
这也几乎是 JSF 如何针对 URL 重写引擎,例如 PrettyFaces工作。
也可以看看:
  • How to use a servlet filter in Java to change an incoming servlet request url?
  • How to create user-friendly and seo-friendly urls in jsf?
  • Get rewritten URL with query string
  • 关于jsf - Java EE Web 应用程序中的动态目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38408703/

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