一尘不染

RequestDispatcher是否可以在一个servlet容器中跨多个Web应用程序工作?

tomcat

RequestDispatcher是否可以在多个Web应用程序上工作?

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

但是,我现在需要在两个Web应用程序之间拆分一些功能,因此最初的调用是从Webapp1上托管的网页进行的,调用Webapp2最终使用户返回到Webapp1上托管的页面。

显然,如果无法使用RequestDispatcher将webapps和webapp2放在不同的网站上,但是如果两个webapp都部署在servlet容器的同一实例中,则是这样(tomcat
7)

更新资料

使请求分配器部分按照答案中的说明工作,但无法检索放入我的webapp2中的数据,这就是为什么我使用它

名为的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”的实际作用。是在不同的Web应用程序中使同一个HttpSession可用,还是只是使一个Webap的ServletContext对另一个Webap可用,从而允许一个WebApp看到另一个WebApp的HttpSession?

我开始认为我在做什么是一个坏主意,因为我一直热衷于使用普通的servlet设置,并且从不希望将自己绑定到特定的实现上。我认为如果我解释为什么我首先不需要拆分Webapp,这可能会有所帮助。

我有一个webapp(webapp1),该网站是有关我开发的产品的网站,并使用Google
Checkout(现在称为Google电子钱包)购买该产品的代码。

然后,我添加了为新产品(webapp2)创建的新webapp。

然后,我尝试将适用于新产品的Google Checkout添加到webapp2中,但意识到我无法轻松做到这一点,因为Google
Checkout要求我提供它一个可以在处理付款后由应用程序调用的网址,这样我就可以向用户发送执照。该URL已在webapp1中设置为servlet,但对于webapp1处理产品2的付款而言,这没有意义。

一种选择是将webpp1和webapp2合并到一个webapp中,但这违背了我将事物保持模块化的一般观点,这也意味着我要花费很多时间为一种产品ID进行重新部署。这也意味着对webapp1进行了很大的修改,但我确实不想修改它,因为它可以正常工作且稳定。

另一种方法是创建webapp3,然后google
url可以指向此,并用它来处理Ive完成的产品1和产品2的购买。但是问题是,当购买产品1时,起始页面位于webapp1中,一旦发生购买,我想返回至webapp1中的页面,但是只有webapp3包含刚刚购买了我想要购买的用户的详细信息以显示在webapp1的页面上。


阅读 347

收藏
2020-06-16

共1个答案

一尘不染

这是由于安全原因,默认情况下不可能。您需要先配置Tomcat,才能将ServletContext当前Web应用程序公开给其他Web应用程序。这是通过设置来完成crossContext属性context.xmltrue

<Context ... crossContext="true">

完成该操作后,您就可以ServletContext#getContext()通过其上下文路径来获取另一个servlet上下文,并最终使用RequestDispatcher通过ServletContext#getRequestDispatcher()常规方式获得的。

例如

ServletContext otherContext = getServletContext().getContext("/otherContext");
otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
2020-06-16