getServletContext NullPointerException
Ich weiß, diese Frage wurde gebeten, eine million mal, und es gibt 5-Millionen-Antworten - einige oder die sind sehr informativ. Keiner von denen hat dieses problem gelöst.
Mein Ziel ist ähnlich wie viele andere - ich möchte den Zugriff auf Dateien - Bilder, svgfiles, Vorlagen, etc. in der web-app run-time-Umgebung. Ich kann es funktionieren, wenn ich einfach hart verdrahten Sie den Verzeichnis-Pfad. Allerdings würde ich gerne meine servlet-tragbare und einen relativen Bezug verwenden, um auf diese Ressourcen zugreifen -wenn aus keinem anderen Grund entwickle ich in Windows und Implementierung in Linux.
Das grundlegende problem ist, dass getServletContext() ist null und ich bin nicht in der Lage zu bestimmen,, warum.
Unten ist die Fehlermeldung, der code, den es produziert, gefolgt von Umwelt details. Produziert die gleichen Fehler in Entwicklung und Produktion. Ich werde glücklich sein, um etwaige zusätzliche details wenn gewünscht.
Bitte erklären was ich tun muss, damit dies funktioniert? Ich werde ewig dankbar sein. Hinsichtlich
SEVERE: Servlet.service() for servlet [jsp] in context with path [/HelloWorld] threw exception [An exception occurred processing JSP page /hello.jsp at line 19
16: <title>Hello World</title>
17: </head>
18: <body>
19: <%=wtGreet.getGreeting()%>
20: </body>
21: </html>
Stacktrace:] with root cause
java.lang.NullPointerException
at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125)
at HelloWorld.Greeting.getGreeting(Greeting.java:23)
at org.apache.jsp.hello_jsp._jspService(hello_jsp.java:91)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
HelloWorld-Anwendung arbeiten - erzeugt unerwünschte Fehler - genau das gleiche wie die Reale Sache.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF 8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="wtGreet" scope="page"
class="HelloWorld.Greeting">
<jsp:setProperty name="wtGreet" property="who" value="World"/>
<jsp:setProperty name="wtGreet" property="greet" value="Hello"/>
</jsp:useBean>
<jsp:setProperty name="wtGreet" property="*"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title>
</head>
<body>
<%=wtGreet.getGreeting()%>
</body>
</html>
Dann Servlet, das die jsp aufruft,
package HelloWorld;
import javax.servlet.http.HttpServlet;
public class Greeting extends HttpServlet {
private static final long serialVersionUID = 1298516959968350334L;
private String who;
private String greet;
public void setWho(String who) {
this.who = who;
}
public void setGreet(String greet) {
this.greet = greet;
}
public String getGreeting() {
System.out.println("getServletContext() == null :" + getServletContext().getContextPath());
return "<p>" + this.greet + " " + this.who + "</P>";
}
}
Entwicklungsumgebung
Windows
Eclipse JEE
Apache
Tomcat 7
JRE 7
Produktionsumgebung
Linux
Apache
Tomcat 7
JRE 8
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf dem letzten element der stack-trace
die Methode
getServletContext()
aufgerufen und die Ausnahme passiert in der Zeile125
in der Klassejavax.servlet.GenericServlet
.Wenn
getServletContext()
zurückgekehrt warnull
dann das Letzte stack-trace-element gewesen wäre,Gemäß dieser code von
javax.servlet.GenericServlet
die MethodegetServletConfig()
ist die eine Rückkehrnull
, d.h. Sie servlet ist nicht konfiguriert.Dies könnte daran liegen, dass du (mis)mit einem servlet als eine Bohne in Ihre jsp -
... und das servlet wird nicht richtig initialisiert.
Servlets sind nicht gedacht, um verwendet werden, wie, dass. Sie möchten möglicherweise verwenden Sie einen einfachen JavaBean und haben es haben eine Methode
getGreeting()
.Um die
ServletContext
in Ihrem jsp benutzen, können Sie das implizite Objektapplication
Finden Sie hier für andere zur Verfügung stellen implizite Objekte in jsp.Obwohl die endgültige Lösung ist die Umsetzung eines Modell-2-Muster (ich werde auch, wenn fertig), es ist eine gute, funktionierende Antwort für die Frage nach dem wie gefragt. Dank A4L um den Weg zu zeigen.
Arbeiten aus dem Verständnis, dass die jsp-engine kompiliert die jsp in ein servlet und lädt Sie in die servlet-engine die jsp-implizite Objekte können verwendet werden um Zugriff auf eine instanziiert javax.servlet-Objekt.
Dem HelloWorld-Beispiel wird wie folgt geändert:
1) Entfernen Sie import javax.- servlet.http.HttpServlet; und erstreckt HttpServlet, weil dieser nichts tut.
2) Fügen Sie ein Attribut vom Typ ServletContext, und füllen Sie die attribute über die setter von der jsp-Seite.
Jedes Objekt, das verfügbar ist, um dem servlet zur Verfügung stehen kann die Bohne durch jsp-implizite Objekte.
jsp
Bean