2016-09-15 2 views
0

Ich habe viele ähnliche Fragen gelesen und alle vorgeschlagenen Methoden zur Behebung des Problems versucht, aber es ist erfolglos. Jetzt nicht habe ich keine Ideen wirklich, was damit zu tun (localhost: 8080/testWebApp/home):Ich kann keinen RequestDispatcher bekommen

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) 

Ich verwende Maven 3.3.9 und tomcat7 7.0.70-1. Mein Projektverzeichnis hat die folgende Hierarchie:

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

Hier ist der TestServlet Code:

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); 
    } 
} 

Hier web.xml Code:

<?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 Code:

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

Einige nützliche Zeilen von 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> 

Vielen Dank für Ihre Hilfe!

+1

Wenn Sie nur über die 'NullPointerException' fragen, diese ist ein [Duplikat] (/ questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it). Was Sie fragen sollten, ist, warum der 'RequestDispatcher' null ist. – EJP

+0

Danke für die Korrektur! – user3856196

Antwort

2

Sie können keinen RequestDispatcher für beliebige Dateien in Ihrer Anwendung abrufen. Das Argument für getRequestDispatcher() muss ein gültiger URL-Pfad für Ihre Anwendung und kein relativer Dateisystemstandort sein. Aus diesem Grund ist dispatcher null. Wenn Sie möchten, dass Ihre JSPs unter WEB-INF liegen (was eine gute Idee ist), müssen Sie entsprechende <servlet-mapping> Elemente für sie erstellen.

0

Nach eingehender Untersuchung der Servlet-Dokumentation (speziell Mapping-Thema) habe ich einige Modifikationen von web.xml und TestServlet.java vorgenommen. It's important dass:

Das WEB-INF-Verzeichnis ist nicht Teil des öffentlichen Dokumentenbaum der Anwendung. Keine Datei, die im WEB-INF-Verzeichnis enthalten ist, kann vom Container direkt an einen Client geliefert werden. In meinem Fall views Ordner ist innerhalb WEB-INF (für Benutzer Zugriffsbegrenzung von außen).

Also, es müssen die folgenden Zeilen (web.xml) hinzuzufügen:

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

Und TestServlet.java korrigiert:

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

P. S. Danke gsl für in die richtige Richtung zeigen!

+1

Ja, danke! :-) Noch eins: Sehen Sie sich 'ServletContext.getNamedDispatcher (name)' an: Dieser gibt einen Dispatcher basierend auf dem Servlet ** Namen **. Sie erhalten das Servlet, indem Sie auf seinen Namen "home" verweisen; Dann müssen Sie kein Servlet-Mapping definieren, das ohnehin nicht benötigt wird, da Sie eigentlich keinen URL-Space-Eintrag dafür anlegen wollen. – gsl

0

Sie senden die Anfrage an /WEB-INF/views/home.jsp URL, aber in Ihrem Ordner WEB-INF/Ansichten haben Sie H ome.jsp.

Ändern Sie einfach den Dateinamen von H ome.jsp zu h ome.jsp und erneut bereitstellen, die Anwendung, sollte es funktionieren.

Output

Hinweis: Sie sind die Anforderung an einen gültigen Pfad Dispatching dh /WEB-INF/views/home.jsp

+0

Hm, als ich den Fehler bekam, prüfte ich zuerst alle Wege. Auch in meinem Fall war es nicht das Problem und ich hatte views/home.jsp, nicht views/Home.jsp. Wie auch immer, danke für die Antwort! – user3856196

+1

Sie erwähnten "Home.jsp Code:" –

+0

Entschuldigung, es ist etwas wie ein Großbuchstabe am Anfang der Zeile und dann sieht es wirklich wie ein Fehler aus. Ich werde das bearbeiten. – user3856196

Verwandte Themen