如何在没有请求的 servlet 的情况下在 jsf 托管 Bean 中获取请求 url?

2022-08-31 22:21:55

假设 URL 是 http://localhost:8080/project-name/resource.xhtml

我想在 JSF 受管 Bean 中获取以下 http://localhost:8080/project-name


答案 1

我假设您正在使用JSF 2和Java EE 6来回答这个答案。

实际机制的实现将根据您需要原始 URL 的程度而有所不同。

您首先需要访问底层 Servlet 容器(假定为一个,而不是 Portlet 容器)生成的 HttpServletRequest 对象。使用以下方式使用 FacesContext 对象访问 HttpServletRequest 对象:

HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

提供了几种实用工具方法来获取原始请求的近似表示形式:

  • getRequestURL(),它提供原始请求,不包括查询字符串
  • getScheme、、、、、和其所有输出可以按顺序组合以获得原始请求。如果您想要 URL 的较小片段,则可能必须省略后面的调用。getServerNamegetServerPortgetContextPathgetServletPathgetPathInfogetQueryString

答案 2

您可以按如下方式获取它:

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String url = req.getRequestURL().toString();
return url.substring(0, url.length() - req.getRequestURI().length()) + req.getContextPath() + "/";
// ...

请注意,可能有更好的方法来满足要求。在 JSF 托管 Bean 中获取原始 Servlet API 是一个代码异味警报。


推荐