3

この質問は 100 万回尋ねられており、500 万件の回答があることを私は知っています。どれもこの問題を解決していません。

私の目標は、他の多くの目標と似ています。Web アプリの実行環境で、ファイル (画像、svgfile、テンプレートなど) にアクセスしたいのです。ディレクトリパスを配線するだけで機能させることができます。ただし、他に理由がなければ、Windows で開発し、Linux にデプロイする場合は、サーブレットを移植可能にし、相対参照を使用してこれらのリソースにアクセスしたいと考えています。

基本的な問題は、getServletContext() が null であり、その理由を特定できないことです。

以下は、エラー メッセージ、それを生成したコード、および環境の詳細です。開発と本番の両方で同じエラーが発生します。リクエストがあれば、追加の詳細を提供させていただきます。

これを機能させるために何をする必要があるか説明してください。私は永遠に感謝します。よろしく

     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>

次に、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 7 JRE 7

本番環境 Linux Apache Tomcat 7 JRE 8

4

2 に答える 2

3

スタック トレースの最後の要素に基づく

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

メソッドが呼び出され、クラスgetServletContext()の行で例外が発生します。125javax.servlet.GenericServlet

getServletContext()が返された場合null、最後のスタック トレース要素は

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

メソッドのこのコードによると、 を返すものです。つまり、サーブレットは構成されていません。javax.servlet.GenericServletgetServletConfig()null

これは、jsp でサーブレットを Bean として (誤って) 使用していることが原因である可能性があります。

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

そのサーブレットは正しく初期化されていません。

サーブレットは、そのように使用するためのものではありません。単純なJavaBeanを使用して、それにメソッドを持たせたい場合がありgetGreeting()ます。

ServletContextjsp の内部を取得するには、暗黙的なオブジェクトを使用できます。jsp で使用可能なその他の暗黙的なオブジェクトについては、こちらapplicationを参照してください。

于 2013-11-04T23:44:10.593 に答える
0

最終的な解決策はモデル 2 パターンを実装することですが (完成したら含める予定です)、質問に対する有効な回答があります。道を示してくれたA4Lに感謝します。

jsp エンジンが jsp をサーブレットにコンパイルし、それをサーブレット エンジンにロードするという理解に基づいて作業すると、jsp 暗黙的オブジェクトを使用して、インスタンス化された javax.servlet オブジェクトにアクセスできます。

HelloWorld の例は次のように変更されます。1) import javax.servlet.http.HttpServlet; を削除します。これは何もしないため、HttpServlet を拡張します。2) タイプ ServletContext の属性を追加し、jsp ページからセッターを使用して属性を設定します。

サーブレットで使用できるオブジェクトはすべて、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>";
}
}
于 2013-11-05T16:36:18.717 に答える