Servlets 无法获取RequestDispatcher

Servlets 无法获取RequestDispatcher,servlets,tomcat7,requestdispatcher,Servlets,Tomcat7,Requestdispatcher,我读过很多类似的问题,并尝试过所有建议的解决问题的方法,但都没有成功。现在我真的不知道该怎么办(localhost:8080/testWebApp/home): 我使用maven 3.3.9和tomcat7.0.70-1。我的项目目录具有以下层次结构: webApp/ pom.xml src/ main/ java/ test/web/servlet/ Tes

我读过很多类似的问题,并尝试过所有建议的解决问题的方法,但都没有成功。现在我真的不知道该怎么办(localhost:8080/testWebApp/home):

我使用maven 3.3.9和tomcat7.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>

家
index.html
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> 

org.apache.tomcat.maven
tomcat7 maven插件
2.2
tomcat-7.0.70-1
http://localhost:8080/manager/text
/testWebApp

谢谢你的帮助

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


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

在深入研究servlet文档(特别是映射主题)之后,我对
WEB.xml
TestServlet.java
做了一些修改。即:

WEB-INF目录不是的公共文档树的一部分 应用无法提供WEB-INF目录中包含的任何文件 通过容器直接发送到客户端。 在我的例子中,
views
文件夹位于
WEB-INF
(用于限制用户从外部访问)

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

附言。
感谢您指出正确的方向

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

只需将文件名从Home.jsp更改为Home.jsp,然后重新部署应用程序,就可以了


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

如果您只是询问
NullPointerException
,这是一个错误。您应该问的是为什么
RequestDispatcher
为空。感谢您的更正!是的,谢谢!:-)还有一个:看一下
ServletContext.getNamedDispatcher(name)
:这一个基于servlet名称给出了一个调度器。通过引用servlet的名称“home”获得servlet;然后就不需要定义servlet映射了,反正也不需要,因为您并不真的想为它创建URL空间条目。嗯,当我遇到错误时,我尝试的第一件事就是检查所有路径。同样在我的例子中,这不是问题所在,我有views/home.jsp,而不是views/home.jsp。无论如何,谢谢你的回答!对不起,这有点像一行开头的大写字母,然后看起来真的是个错误。我会编辑这个。
    <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> 
...
<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>
...
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/homepg");