0

Web アプリケーションでテンプレート ファイルが見つかりません。この記事の資料を読みましたが、問題が解決しないようです。私のWEB-INFディレクトリにインストールされているvelocity.propertiesファイルには、次の行が含まれています

resource.loader=class
resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

Javaサーブレットは

package test;

import java.io.*;
import javax.servlet.http.*;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.VelocityViewServlet;
import org.apache.velocity.app.Velocity;

import org.apache.commons.lang.StringEscapeUtils;

public class Recipes extends VelocityViewServlet {

    public Template handleRequest(HttpServletRequest request,
                                  HttpServletResponse response,
                                  Context context) {
        Velocity.init();
        Template template=null;
        try {
            context.put("recipeList","r1");
            template = Velocity.getTemplate("Recipes.vm");
        } catch (Exception e) {
            System.err.println("Exception caught: " + e.getMessage());
        }
        return template;
    }
}

その URL に移動すると失敗します。vm ファイルを WEB-INF ディレクトリ、classes サブディレクトリ、lib ディレクトリ、および lib ディレクトリの jar に配置しようとしました。物事が失敗した後、 catalina.out には次が含まれます

Jan 12, 2013 6:35:25 PM org.apache.velocity.runtime.log.CommonsLogLogChute log
SEVERE: ResourceManager : unable to find resource 'Recipes.vm' in any resource loader.
Exception caught: Unable to find resource 'Recipes.vm'

そしてlocalhost.logに

Jan 12, 2013 6:35:25 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet recipes threw exception
java.lang.NullPointerException
at org.apache.velocity.tools.view.VelocityView.performMerge(VelocityView.java:942)
at org.apache.velocity.tools.view.VelocityView.merge(VelocityView.java:902)
at org.apache.velocity.tools.view.VelocityViewServlet.mergeTemplate(VelocityViewServlet.java:318)
at org.apache.velocity.tools.view.VelocityViewServlet.doRequest(VelocityViewServlet.java:220)
at org.apache.velocity.tools.view.VelocityViewServlet.doGet(VelocityViewServlet.java:182)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)

誰かが私に何が起こっているのか説明できますか? ありがとう。

4

1 に答える 1

0

以下を使用する必要があります。

class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

リソース ローダーの「タイプ」は、ローダー クラスを定義するプロパティ名の前にあります。

Velocity Developer Guide to Resource Loaders を参照してください。リンク先の回答は正しいドキュメントを指していますが、正しい構成が含まれていない (表示されない) ことに注意してください

(これで、VelocityViewServlet を使用する方法は本当にそれでよろしいですか? 通常は *.vm ファイルを要求し、fillContext.


VelocityViewServlet 内から呼び出していますがVelocity.init()、これはおそらくやりたいことではありません。それはさておき、ドキュメントから:

Velocity ディストリビューションのデフォルト プロパティを使用して、Velocity ランタイム エンジンを初期化します。

以下を実行すると、私が示す構成が機能します。

String propFile = getServletContext().getRealPath("/WEB-INF/velocity.properties");
Velocity.init(propFile);

そうは言っても、あなたがこれを正しい方法で行っているとは確信していませんが、間違っている可能性があります.これまでスタンドアロンのWebアプリで使用したことはありませんが、これは正しいとは思いません.

他に何もないとしても、少なくとも次のようなものを基本クラスに移動します。

public abstract class BaseVelocityServlet extends VelocityViewServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        Velocity.init(getServletContext().getRealPath("/WEB-INF/velocity.properties"));
    }

    @Override
    protected Template getTemplate(HttpServletRequest request, HttpServletResponse response) {
        return Velocity.getTemplate(getTemplateName());
    }

    public abstract String getTemplateName();

}

次に、各 URL のサーブレットは、コンテキストを入力してテンプレート名を提供するだけです。

public class Recipes extends BaseVelocityServlet {

    @Override
    protected void fillContext(Context context, HttpServletRequest request) {
        context.put("recipeList", "r1");
    }

    @Override
    public String getTemplateName() {
        return "Recipes.vm";
    }

}

繰り返しますが、私はこれが正しいとは確信していません。デフォルトでは WEB-INF の下にある構成ファイルを見つける必要があるという印象をまだ受けていますが、少なくとも私にとってはそうではありません。

于 2013-01-13T02:23:34.067 に答える