RequestDispatcher 是否可以在多个 webapps 上工作?
我之所以问,是因为我有一个使用 RequestDispatcher 而不是重定向的 webapp 运行良好,因此在显示错误和反馈消息时状态不会丢失。
但是我现在需要在两个 webapps 之间拆分一些功能,所以初始调用是从 webapp1 上托管的网页进行的,调用 webapp2 最终将用户返回到 webapp1 上托管的页面。
显然,如果 webapps 和 webapp2 使用 RequestDispatcher 在不同的网站上是不可能的,但是如果两个 webapps 都部署在同一个 servlet 容器实例中(tomcat 7)
更新
让请求调度程序部分按照答案中的说明工作,但无法检索放入我的 webapp2 的数据,这就是我使用它的原因
IE
webapp2 调用,进行一些处理,然后分派到 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>
...
但总是显示空
更新 2 **
我想知道我是否误解了 crossContext="true" 的实际作用。它是否使相同的 HttpSession 在不同的 webapps 中可用,或者它只是使 ServletContext 从一个 webap 可用到另一个,从而允许一个 webapp 看到另一个 webapp 的 HttpSessions?
我开始认为我正在做的事情是个坏主意,因为我一直热衷于使用 vanilla servlet 设置,并且从不想将自己束缚于特定的实现。我认为如果我解释为什么我一开始就不需要拆分 webapps 可能会有所帮助。
我有一个 webapp (webapp1),这是一个关于我开发的产品的网站,以及使用 Google Checkout(现在的 Google Wallet)购买该产品的代码。
然后我添加了为新产品(webapp2)创建了一个新的 webapp。
然后,我尝试将新产品的 Google Checkout 添加到 webapp2 中,但意识到我不能轻易做到这一点,因为 Google Checkout 要求我提供一个 URL,一旦它处理了付款,它就可以由应用程序调用,这样我就可以向用户发送一个执照。该 url 已经设置为 webapp1 中的一个 servlet,但是 webapp1 处理产品 2 的付款是没有意义的。
一种选择是将 webpp1 和 webapp2 合并到一个 webapp 中,但这违背了我保持模块化的一般观点,这也意味着每次我想为一个产品 Id 进行更改时都必须重新部署所有内容。这也意味着对 webapp1 的重大修改,我真的不想修改它,因为它工作且稳定。
另一种方法是创建 webapp3,然后 google url 可以指向它,并使用它来处理产品 1 和产品 2 的购买,这就是我所做的。但问题是购买产品 1 时,起始页面位于 webapp1 中,一旦购买完成,我想返回 webapp1 中的页面,但只有 webapp3 有我想要的刚刚购买的用户的详细信息在 webapp1 的页面上显示。