首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获取RequestDispatcher

无法获取RequestDispatcher
EN

Stack Overflow用户
提问于 2016-09-15 20:23:48
回答 3查看 5.8K关注 0票数 2

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

代码语言:javascript
复制
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。我的项目目录具有以下层次结构:

代码语言:javascript
复制
webApp/
   pom.xml
      src/
         main/
            java/
               test/web/servlet/
                        TestServlet.java
         webapp/
            index.html
            WEB-INF/
               views/
                  home.jsp
               web.xml

下面是TestServlet代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
<?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代码:

代码语言:javascript
复制
<%@ 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的一些有用的代码行:

代码语言:javascript
复制
    <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> 

感谢您的帮助!

EN

回答 3

Stack Overflow用户

发布于 2016-09-15 21:38:38

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-09-16 08:35:47

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

WEB-INF目录不是应用程序公共文档树的一部分。容器不能将WEB-INF目录中包含的任何文件直接提供给客户端。在我的例子中,views文件夹位于WEB-INF内部(用于从外部访问用户的限制)。

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

代码语言:javascript
复制
...
<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

代码语言:javascript
复制
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/homepg");

另外,感谢gsl为我们指明了正确的方向!

票数 0
EN

Stack Overflow用户

发布于 2016-09-16 13:36:01

您正在将请求分派到/ WEB-INF/views /home.jsp url,但是在WEB-INF/views文件夹中有Home.jsp。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39510952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档