无法获取RequestDispatcher

时间:2016-09-15 12:23:48

标签: servlets tomcat7 requestdispatcher

我已经阅读了很多类似的问题,并尝试了所有建议的方法来解决问题,但是它没有成功。现在我真的不知道如何处理这个问题(localhost:8080 / testWebApp / home):

HTTP Status 500 -
...    
exception

java.lang.NullPointerException
    test.web.servlet.TestServlet.doGet(TestServlet.java:37)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我使用maven 3.3.9和tomcat7 7.0.70-1。我的项目目录具有以下层次结构:

webApp/
   pom.xml
      src/
         main/
            java/
               test/web/servlet/
                        TestServlet.java
         webapp/
            index.html
            WEB-INF/
               views/
                  home.jsp
               web.xml

这是TestServlet代码:

package test.web.servlet;


import java.io.IOException;

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;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;


@WebServlet(urlPatterns = { "/home"})

public class TestServlet extends HttpServlet {

    @Override    
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    public TestServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/views/home.jsp");
        //The following attempts are unsuccessful too:
        //RequestDispatcher dispatcher = request.getRequestDispatcher("/home.jsp");
        //RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/home.jsp");
        dispatcher.forward(request, response); // error (37 line)
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

这是web.xml代码:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_4.dtd">

<web-app>

    <welcome-file-list>  
        <welcome-file>home</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>  

</web-app>

home.jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>    
<html>
    <head>
        <meta charset="UTF-8">
        <title>Home Page</title>
    </head>

    <body>    
<%--         <jsp:include page="main.jsp"></jsp:include> --%>

        <h3>Home</h3>
        <br><br>
        <b>You have the following options:</b>
        <ul>
            <li>Login</li>
        </ul>    
    </body>    
</html>

pom.xml中的一些有用的行:

    <plugin>
        <groupId>org.apache.tomcat.maven</groupId> 
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <server>tomcat-7.0.70-1</server>
            <url>http://localhost:8080/manager/text</url>
            <path>/testWebApp</path>
        </configuration>
    </plugin> 

谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

您无法在应用程序中获取任意文件的RequestDispatcher。 getRequestDispatcher()的参数必须是应用程序的有效URL路径,而不是相对文件系统位置。这就是dispatcher为空的原因。

如果你想让你的JSP驻留在WEB-INF下(这是一个好主意),那么你必须为它们创建适当的<servlet-mapping>元素。

答案 1 :(得分:0)

在深入研究servlet文档(特别是映射主题)之后,我对web.xmlTestServlet.java进行了一些修改。 It's important那个:

  

WEB-INF目录不是公共文档树的一部分   应用。不能提供WEB-INF目录中包含的文件   由容器直接发送给客户端。   在我的情况下,views文件夹位于WEB-INF内(对于来自外部的用户访问限制)。

因此,需要添加以下行(web.xml):

...
<servlet>
    <servlet-name>home</servlet-name>
    <jsp-file>/WEB-INF/views/home.jsp</jsp-file>
    <init-param>
        <param-name>home</param-name>
        <param-value>Home Page</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>home</servlet-name>
    <url-pattern>/homepg</url-pattern>
</servlet-mapping>
...

并更正了TestServlet.java

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/homepg");

P.S。 感谢gsl指向正确的方向!

答案 2 :(得分:0)

您正在将请求发送到/WEB-INF/views/home.jsp网址,但是在您的WEB-INF / views文件夹中,您有 H ome.jsp。

只需将文件名从 H ome.jsp更改为 h ome.jsp并重新部署应用程序,它应该可以正常工作。

Output

注意:您正在将请求分发到有效路径,即/WEB-INF/views/home.jsp