2016-09-15 3 views
0

Я прочитал много похожих вопросов и попробовал все предложенные методы для устранения проблемы, однако это безуспешно. Теперь я действительно не имею какие-либо идеи, что делать с этим (локальным хостом: 8080/testWebApp/дома):Не удается получить RequestDispatcher

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.xm l:

<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> 

Благодарим за помощь!

+1

Если вы просто спрашиваете о 'NullPointerException', это является [duplicate] (/ questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it). То, что вы должны спрашивать, - это почему «RequestDispatcher» имеет значение null. – EJP

+0

Спасибо за исправление! – user3856196

ответ

2

Вы не можете получить RequestDispatcher для произвольных файлов в своем приложении. Аргумент для getRequestDispatcher() должен быть допустимым URL-адресом для вашего приложения, а не относительной файловой системой. Вот почему dispatcher имеет значение NULL.

Если вы хотите, чтобы ваши JSP-серверы находились под WEB-INF (что является хорошей идеей), вы должны создать для них соответствующие <servlet-mapping> элементы.

0

После более глубокого изучения документации сервлетов (особенно для отображения темы) я внесла некоторые изменения в web.xml и TestServlet.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. Thanks gsl для указания в правильном направлении!

+1

Да, thx! :-) Еще один: взгляните на 'ServletContext.getNamedDispatcher (name)': этот дает диспетчер на основе сервлета ** name **. Вы получаете сервлет, ссылаясь на его имя «home»; то нет необходимости определять сервлет-сопоставление, которое не требуется в любом случае, так как вы действительно не хотите создавать для него URL-адрес пространства. – gsl

0

Вы отправляете запрос на /WEB-INF/views/home.jsp url, но в вашей папке WEB-INF/views у вас есть H ome.jsp.

Просто измените имя файла из H ome.jsp к ч ome.jsp и повторного развертывания приложения, он должен работать нормально.

Output

Примечание: Вы отправляющий запрос на правильный путь, т.е., /WEB-INF/views/home.jsp

+0

Хм, когда я получил ошибку, первое, что я пробовал, - проверял все пути. Также в моем случае это была не проблема, и у меня были view/home.jsp, а не views/Home.jsp. В любом случае, спасибо за ответ! – user3856196

+1

Вы упомянули «код Home.jsp:» –

+0

Извините, это похоже на заглавную букву в начале строки, а затем это действительно выглядит как ошибка. Я отредактирую это. – user3856196

Смежные вопросы