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的页面上。
这是由于安全原因,默认情况下不可能。您需要先配置Tomcat,才能将ServletContext当前Web应用程序公开给其他Web应用程序。这是通过设置来完成的crossContext属性context.xml来true。
ServletContext
crossContext
context.xml
true
<Context ... crossContext="true">
完成该操作后,您就可以ServletContext#getContext()通过其上下文路径来获取另一个servlet上下文,并最终使用RequestDispatcher通过ServletContext#getRequestDispatcher()常规方式获得的。
ServletContext#getContext()
RequestDispatcher
ServletContext#getRequestDispatcher()
例如
ServletContext otherContext = getServletContext().getContext("/otherContext"); otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);