是否RequestDispatcher的工作在多个web应用?
我问,因为我有一个使用RequestDispatcher的,而不是重定向,以便显示错误,并反馈消息时的状态心不是失去了一个web应用程序工作正常。
但是我现在需要两个web应用,所以初始呼叫从托管在webapp1网页制作之间拆分的一些功能,来电webapp2的最终用户返回到托管在webapp1的页面。
显然,如果web应用和webapp2的是使用的RequestDispatcher是不可能的不同网站,但它是如果两个都的webapps一个servlet容器的同一实例中部署(Tomcat的7)
更新
拿到请求调度部分在回答上班解释,但我无法检索把我webapp2的数据,ISS为什么即时通讯使用它
即
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 =“真”实际上做。 它使相同的HttpSession中不同的webapps availble的,还是只是让从一个webap availble的ServletContext的另一个,从而允许一个web应用程序,看看其他Web应用程序的的HttpSession?
林开始觉得我做的事情是一个坏主意,因为我总是热衷于使用香草的servlet设置和永远不想自己绑在一个特定的实现。 我想这可能帮助,如果我解释为什么我FLET的需要摆在首位分裂的webapps。
我有一个Web应用程序一个(webapp1),这是一个关于一个产品我开发和代码购买使用谷歌Checkout的(现在的谷歌钱包),该产品的网站。
我然后加入创造了一个新的产品(webapp2的)一个新的Web应用程序。
然后我试图添加谷歌Checkout的新产品投入webapp2的,但意识到我不能很容易地做到这一点,因为谷歌Checkout要求我向它提供一个网址,它可以通过应用程序一旦处理付款,这样我就可以发送用户的呼叫执照。 该网址已经被设置为webapp1一个servlet,但它是没有意义的webapp1进行支付s有关产品2。
一种选择是webpp1和webapp2的合并成一个Web应用程序,但是这违背了我让事情模块化的总的看法,这也将意味着埃维一次我想使chnages一个产品ID重新部署的一切。 这也意味着大的修改webapp1,我真的没有想修改,因为它是工作稳定。
另一种方法是创建webapp3,然后谷歌URL可以指向这一点,用这个加工产品1和产品2这是香港专业教育学院做了什么的采购。 但问题是,购买产品1起始页是当webapp1,一旦购买已经发生我想回去到一个页面中webapp1,但只有webapp3有谁刚刚发表,我想购买的用户的详细信息在webapp1在页面上显示的。
这是因为在默认情况下无法安全原因。 首先,您需要配置Tomcat,使露出ServletContext
当前的web应用到其他的web应用的。 这是通过设置来完成的crossContext
的属性context.xml
以true
。
<Context ... crossContext="true">
一旦做到这一点,那么你可以使用ServletContext#getContext()
通过其上下文路径,以获得其他servlet上下文最后使用RequestDispatcher
通过所获得ServletContext#getRequestDispatcher()
通常的方式。
如
ServletContext otherContext = getServletContext().getContext("/otherContext");
otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
是。
你需要做的第一件事是获得的举行ServletContext
为其他Web应用程序。 你做到这一点与ServletContext::getContext
你自己ServletContext
,超过了其他Web应用程序的上下文路径。
然后,你只需要做ServletContext::getRequestDispatcher
上正常的外交环境。
我还没有真正尝试这一点,但我100%保证它会工作。
我不知道不同的servlet容器。 但是,它用getServletContext()方法适用于同一容器中。的getContext()方法。
首先,你需要做下面的文件更改
(Windows)中C:\ Program Files文件\ Apache软件基金会\ Tomcat的7.0 \的conf \ context.xml的设置crossContext的值设置为true。
的context.xml
<Context crossContext="true">
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
</Context>
请注意,crossContext =“真”。
假设你有一个名字InterServletComm1和InterServletComm2分别具有每个Web应用程序的servlet Servlet1和Servlet1两个Web应用程序。 然后在每个servlet的代码去如下:
Servlet1.java
package interServletComm1;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Servlet1
*/
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Servlet1() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
request.setAttribute("name", "WebApp1");
ServletContext context = getServletContext().getContext("/InterServletComm2");
RequestDispatcher rd = context.getRequestDispatcher("/Servlet2");
rd.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
Servlet2.java
package interServletComm2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Servlet2
*/
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Servlet2() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
String name = (String) request.getAttribute("name");
pw.println("This is web application 2.");
pw.println("<br>The value received from web application one is: " + name);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
上面的代码从InterServletComm1发送属性名称 ,它是在InterServletComm2接收。 请让我知道,如果这个答案是不明确的。
文章来源: Does RequestDispatcher work over multiple webapps in one servlet container?