在JSP文件中如何使用Request dispatcher访问另一个项目的Servlet

时间:2016-11-17 10:28:34

标签: jsp servlets

我有两个项目(Project1,Project2)。 Project1包含一个jsp页面“index.jsp”,而Project2包含一个servlet“HelloServlet”。 从jsp页面我试图转发/包含“HelloServlet”。以下是代码..

的index.jsp

<body>
<a href="/Project2/HelloServlet">Goto project2 servlet</a><!--This works Fine-->
<%
try{RequestDispatcher=null;
rd = request.getRequestDispatcher("../Project2/HelloServlet");//gives -> java.lang.NullPointerException
//rd = request.getRequestDispatcher("/Project2/HelloServlet");//gives -> The requested resource (/Project1/Project2/HelloServlet) is not available 
//rd.forward(request,response);
rd.include(request,response);
}
catch(Exception e){out.println("Exception occured: "+e);}
%>
</body>

HelloServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("Hello from project 2 servlet");
}

锚标记工作正常,但RequestDispatcher给出空指针异常。

1 个答案:

答案 0 :(得分:0)

不幸的是,这是根据Servlet规范强制执行的。 ServletRequest.getRequestDispacher的Javadoc很清楚(强调我的):

  

RequestDispatcher getRequestDispatcher(String path)

     

...指定的路径名​​可能是相对的,但它不能扩展到当前的servlet上下文之外。

作为转发内部调用该方法,您无法转发到其他应用程序的页面。你必须在这里进行重定向。重定向将起作用,因为您将新URL发送到浏览器,要求它去那里。这可能是:

<body>
    <c:redirect url="/Project2/HelloServlet"/>
</body>

使用漂亮而干净的JSTL标记而不是scriptlet。

如果由于任何原因你不能使用JSTL,这个scriptlet会相同(但JSTL更短更好):

<body>
    <%
        response.sendRedirect("/Project2/HelloServlet");
    %>
</body>