2013-11-04 57 views
2

我知道這個問題已經被問了萬次,有500萬個的答案 - 有些或非常翔實。沒有一個解決了這個問題。的getServletContext NullPointerException異常

我的目標是類似於許多其他人的 - 我要訪問的文件 - 在Web應用程序運行時環境中的圖像,svgfiles,模板等。如果我簡單地連線目錄路徑,我可以使它工作。不過,我想提出我的servlet便攜和使用相對引用來訪問這些資源 - 如果沒有其他原因,我在Windows開發和Linux上部署。

的基本問題是,getServletContext()方法是空,我無法確定原因。

下面是該錯誤消息,產生它的代碼,接着環境的信息。在開發和生產中產生相同的錯誤。如果有要求,我會很樂意提供任何額外的細節。

請解釋什麼,我需要做的就是這個工作?我會永遠感激。問候

 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應用程序的工作原理 - 產生不需要的錯誤 - 完全一樣真實的東西。

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

隨後的Servlet的JSP調用

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

開發環境 的Windows 的Eclipse JEE 的Apache Tomcat的 JRE 7

生產環境 Linux的 的Apache Tomcat的 JRE 8

回答

2

根據您的堆棧跟蹤

at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125) 

方法getServletContext()的最後一個元素上被調用,異常發生在行125在類javax.servlet.GenericServlet

如果getServletContext()已經回到null那麼最後的堆棧跟蹤元素本來

at HelloWorld.Greeting.getGreeting(Greeting.java:23) 

javax.servlet.GenericServlet這種code方法getServletConfig()是一個返回null,即你的servlet沒有配置。使用servlet作爲一個bean在JSP

<jsp:useBean id="wtGreet" scope="page" class="HelloWorld.Greeting"> 

和servlet的

這可能是因爲你(MIS)沒有正確初始化。

Servlet並不意味着要這樣使用。您可能想要使用簡單的JavaBean,並讓它有一個方法getGreeting()

爲了讓你的JSP您可以使用隱式對象application,在JSP中其他可用的隱式對象見hereServletContext

+0

你正確感知我誤解的核心。這幫助我構思了我的研究以得出答案。基本的解決方案集中在模型1和模型2的概念上。我在其間實現了一個意外模型,但並不真正符合任何模型(我的前提是MVC - 與模型分開的觀點)。我的理解是模型2是最普遍的最佳實踐,因此我的目標是實現這種模式。我希望你能分享一些有關這方面的觀點。問候。 – Threadid

+0

有興趣的人可以參考相關參考資料:[here](http://www.oracle.com/technetwork/articles/javase/servlets-jsp-140445.html) – Threadid

0

儘管最終的解決方案是實現模型2模式(我將在完成時包含),但對於所問的問題有一個很好的工作答案。感謝A4L展示道路。

根據jsp引擎將jsp編譯成servlet並將其加載到servlet引擎的理解,可以使用jsp隱式對象來訪問實例化的javax.servlet對象。

如下HelloWorld示例被改變: 1)取下進口javax.servlet.http.HttpServlet;並且擴展了HttpServlet,因爲這沒有任何作用。 2)添加一個ServletContext類型的屬性,並使用jsp頁面中的setter填充屬性。

任何可用於servlet的對象都可以通過jsp隱式對象提供給bean。

JSP

{<%@ 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.setSc(application.getContext("/HelloWorld"));%> 
<%=wtGreet.getGreeting()%> 
</body> 
</html>} 

package HelloWorld; 
import javax.servlet.ServletContext; 
public class Greeting { 
private String who; 
private String greet; 
private ServletContext sc; 
public void setSc(ServletContext sc) { 
    this.sc = sc; 
} 
public void setWho(String who) { 
    this.who = who; 
} 
public void setGreet(String greet) { 
    this.greet = greet; 
} 
public String getGreeting() { 
    return "<p>" + this.greet + " " + this.who + " from \"Context Path\" " + sc.getContextPath() + "</P>"; 
} 
}