RequestDispatcher 是否可以在多个 Web 应用程序上工作?
我这么问是因为我有一个 Web 应用程序工作正常,它使用 RequestDispatcher 而不是重定向,因此在显示错误和反馈消息时状态不会丢失。
但是,我现在需要在两个 Web 应用程序之间拆分一些功能,因此初始调用是从 webapp1 上托管的网页进行的,调用 webapp2,最终将用户返回到 webapp1 上托管的页面。
显然,如果 webapps 和 webapp2 位于不同的网站上,则使用 RequestDispatcher 是不可能的,但如果两个 webapps 都部署在 servlet 容器的同一个实例中(tomcat 7),则可能会出现这种情况
更新
让请求调度程序部分按照答案中的说明工作,但无法检索放入我的 webapp2 中的数据,这就是我使用它的原因
即
webapp2 调用,进行一些处理,然后分派(dispatch)到 webapp1 上的 jsp
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
HttpSession userSession = request.getSession(true);
String emailAddress = ......
String nextPage = /finish.jsp
userSession.setAttribute("DATA", emailAddress);
ServletContext otherContext = getServletContext().getContext("/webapp1");
otherContext.getRequestDispatcher(nextPage).forward(request, response);
}
webapp2 jsp 文件包含
...
<p>Email(<%=((String)session.getAttribute("DATA"))%>)</p>
...
但总是显示 null
更新 2 **
我想知道我是否误解了 crossContext="true"的实际作用。它是否使相同的 HttpSession 在不同的 web 应用程序中可用,或者只是使 ServletContext 从一个 webapp 到另一个 web 应用程序可用,从而允许一个 web 应用程序查看另一个 web 应用程序的 HttpSession ?
我开始认为我所做的事情是一个坏主意,因为我一直热衷于使用普通的 servlet 设置,并且不想将自己束缚在特定的实现上。我认为如果我解释一下为什么我首先不需要拆分网络应用程序,这可能会有所帮助。
我有一个 Web 应用 (webapp1),这是一个关于我开发的产品的网站,并编写了使用 Google Checkout(现在的 Google 电子钱包)购买该产品的代码。
然后,我添加了为新产品 (webapp2) 创建的新 Web 应用程序。
然后,我尝试将新产品的 Google Checkout 添加到 webapp2 中,但意识到我无法轻松做到这一点,因为 Google Checkout 要求我向它提供一个网址,一旦处理完付款,应用程序就可以调用该网址,以便我可以发送 用户许可证。 url 已设置为 webapp1 中的 servlet,但是 webapp1 处理产品 2 的付款是没有意义的。
一种选择是将 webpp1 和 webapp2 合并到一个 webapp 中,但这违背了我保持模块化的一般观点,它 也意味着每次我都想为一个人做出改变 产品 ID 必须重新部署所有内容。这也意味着大 对 webapp1 的修改,我真的不想修改它 工作正常且稳定。
另一种方法是创建 webapp3,然后 google url 可以指向它,并使用它来处理产品 1 的购买 和产品2,这就是我所做的。但问题是当 购买产品 1 起始页面位于 webapp1 中,并且一次 购买已发生 我想返回 webapp1 中的页面,但是 只有 webapp3 具有刚刚创建的用户的详细信息 购买我想在 webapp1 的页面上显示的内容。
最佳答案
由于安全原因,默认情况下这是不可能的。您首先需要配置 Tomcat 以将当前 Web 应用程序的 ServletContext 公开给其他 Web 应用程序。这可以通过设置the crossContext
attribute of context.xml
来完成。为true
。
<Context ... crossContext="true">
完成后,您可以使用ServletContext#getContext()
通过上下文路径获取其他 Servlet 上下文,最后使用 ServletContext#getRequestDispatcher()
获取的 RequestDispatcher
就像您对通过 HttpServletRequest#getRequestDispatcher()
获取的方法所做的通常方式一样。
例如
ServletContext otherContext = getServletContext().getContext("/otherContext");
otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
关于java - RequestDispatcher 是否可以在一个 servlet 容器中的多个 Web 应用程序上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435678/