1

我想做一个从 JSF Web 应用程序到非 JSF Web 应用程序的服务器端转发,部署在同一个 EAR 中。有没有办法做到这一点?我似乎无法通过 FacesContext 简单地做到这一点。(注意,为了获得更多上下文,我将在转发之前将数据放入请求对象中)

4

1 回答 1

1

这对任何 JSF API 都不可用。您需要退回到原始的 Servlet API。

首先你需要配置服务器启用“cross context”选项,以便能够通过ServletContext#getContext(). 在大多数服务器上默认禁用此功能。不清楚您使用的是哪个服务器,所以这里只是一些提示:对于 Tomcat,检查 的crossContext属性,对于context.xmlGlassfish,检查.crossContextAllowedglassfish-web.xml

完成后,您将能够ServletContext通过其在 JSF 中的上下文路径获取另一个,如下所示:

ServletContext currentServletContext = (ServletContext) externalContext.getContext();
ServletContext otherServletContext = currentServletContext.getContext("/otherContextPath");

然后,您需要RequestDispatcher从它获取所需资源的路径上的 a 并调用forward()它,从而传递当前的 HTTP servlet 请求和响应。

HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
otherServletContext.getRequestDispatcher("/path/to/other.xhtml").forward(request, response);

最后,您需要通知 JSF 响应的呈现已被接管,而 JSF 不需要这样做。

facesContext.responseComplete();

您只需要确保此操作不是由 ajax 请求调用,而是由正常的同步请求调用,仅仅是因为您完全超越了对呈现来自 JSF 的响应的控制,并且通过这种方式 JSF JS/Ajax 引擎完全不知道会返回非 XML 响应。

(免责声明:我从来没有将它与 JSF 结合使用,但它与“普通”JSP/Servlet 一起使用,理论上应该在 JSF webapp 中工作,因为它只是建立在 Servlet API 之上)

于 2012-06-13T15:07:16.460 回答