我有两个项目(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给出空指针异常。
答案 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>