【问题标题】:How getRequestDispatcher will work for servlet in different project in same server?getRequestDispatcher 如何在同一服务器的不同项目中为 servlet 工作?
【发布时间】:2013-12-07 00:16:59
【问题描述】:

在 servlet 中,我们可以使用 requestdispatcher,它会在同一个项目中从一个 servlet 转发到另一个具有相同会话的 servlet。但是如果我使用不同的项目 getRequestDispatcher 不起作用。它给出 404 错误。因为它在网址。如何在同一服务器的不同项目中实现 getRequestDispatcher?

RequestDispatcher rd = request.getRequestDispatcher("/v1/status1/toreply1"); 
rd.forward(request, response);

在同一个项目中 getRequestDispatcher 工作正常。但在不同的项目中它不起作用?谁能解释它为什么会发生..?

【问题讨论】:

    标签: java web-services rest servlets requestdispatcher


    【解决方案1】:

    您可以在同一服务器上的不同项目中实现getRequestDispatcher。

    查看https://stackoverflow.com/a/19273223/1428052

    它适用于不同项目的同一服务器,使用 getServletContext().getContext() 方法。

    您可以按照以下步骤进行详细实施。

    首先你需要在下面的文件中进行更改

    (Windows) C:\Program Files\Apache Software Foundation\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="true"

    假设您有两个名为 InterServletComm1InterServletComm2 的 Web 应用程序 在每个 Web 应用程序中分别具有 servlet Servlet1Servlet1。然后每个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发送属性name,并在InterServletComm2中接收。 如果这个答案不清楚,请告诉我。

    【讨论】:

      【解决方案2】:

      您必须使用其他 Web 应用程序的 ServletContext 来获取 RequestDispatcher。其他上下文可以通过ServletContext#getContext(String uri)查询:

      ServletContext otherContext = request.getServletContext().getContext("/other");
      RequestDispatcher rd = otherContext.getRequestDispatcher("/v1/status1/toreply1");
      

      【讨论】:

      • otherContext 在我们给出其他项目的上下文路径时给出 null。对于相同的项目上下文,它的工作正常
      • 出于安全原因,允许 servlet 容器返回 null:(...) 在有安全意识的环境中,servlet 容器可能会为给定的 URL 返回 null。 (...)。因此,如果应该可以进行跨上下文查找,也许您可​​以在某处进行配置。我认为取决于您使用的 servlet 容器。
      • 我们必须在tomcat中启用crossContext="true"。谢谢提前
      猜你喜欢
      • 2015-12-26
      • 2014-09-01
      • 2014-06-10
      • 1970-01-01
      • 2012-12-24
      • 2012-04-25
      • 1970-01-01
      • 2021-10-20
      • 2018-05-24
      相关资源
      最近更新 更多