是否RequestDispatcher的工作在多个web应用在一个servlet容器?(Does R

2019-07-03 21:57发布

是否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在页面上显示的。

Answer 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);


Answer 2:

是。

你需要做的第一件事是获得的举行ServletContext为其他Web应用程序。 你做到这一点与ServletContext::getContext你自己ServletContext ,超过了其他Web应用程序的上下文路径。

然后,你只需要做ServletContext::getRequestDispatcher上正常的外交环境。

我还没有真正尝试这一点,但我100%保证它会工作。



Answer 3:

我不知道不同的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 =“真”。

假设你有一个名字InterServletComm1InterServletComm2分别具有每个Web应用程序的servlet Servlet1Servlet1两个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?