gpt4 book ai didi

java - RequestDispatcher 是否在一个 servlet 容器中处理多个 Web 应用程序?

转载 作者:行者123 更新时间:2023-11-28 22:06:45 25 4
gpt4 key购买 nike

RequestDispatcher 是否在多个网络应用程序上工作?

我问是因为我有一个使用 RequestDispatcher 而不是重定向的 webapp 工作正常,所以在显示错误和反馈消息时状态不会丢失。

但是我现在需要在两个 webapp 之间拆分一些功能,所以初始调用是从 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 从一个 WebAP 可用到另一个 Web 应用程序,从而允许一个 Web 应用程序查看另一个 Web 应用程序的 HttpSession?

我开始认为我所做的是一个坏主意,因为我一直热衷于使用 vanilla servlet 设置并且从不想将自己束缚于特定的实现。我认为,如果我解释一下为什么我首先需要拆分 Web 应用程序,这可能会有所帮助。

我有一个单一的网络应用程序 (webapp1),这是一个关于我开发的产品的网站,并编写了使用 Google Checkout(现在的 Google 电子钱包)购买该产品的代码。

然后我添加了为新产品 (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 的页面上显示的购买。

最佳答案

由于安全原因,默认情况下这是不可能的。您需要先配置 Tomcat 以允许将当前 webapp 的 ServletContext 暴露给其他 webapp。这将通过设置 the crossContext attribute of context.xml 来完成。为 true

<Context ... crossContext="true">

完成后,您就可以使用 ServletContext#getContext()通过其上下文路径获取其他 servlet 上下文,最后使用通过 ServletContext#getRequestDispatcher() 获取的 RequestDispatcher通常的方式。

例如

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/

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