4

Velocity を使用して、いくつかの異なる環境用の構成ファイルをテンプレート化しています。このプロセスは非常にうまく機能しますが、存在しないファイルの解析に関して簡単な質問があります。

私の質問は次のとおりです。ファイルを解析する前に、ファイルが存在するかどうかをどのように確認しますか?

したがって、この例では、ファイル default.user.properties が正当に存在しない可能性があり、存在しない場合、ファイルの残りの部分は解析されません。

#parse("./default.user.properties")

ファイルが常にそこにあることを確認することが1つの解決策であることは知っていますが、そうする必要がなければいいでしょう。

前もって感謝します。

4

3 に答える 3

4

ちょうどこれをばねと速度で行いました:

イベントハンドラーを取得する速度を取得する際に問題が発生し、最終的にサーブレットxmlファイルで指定しました。

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="WEB-INF/templates"/>
        <property name="velocityPropertiesMap">
            <map>
                <entry key="eventhandler.include.class"><value>com.velocity.events.OptionalIncludeEventHandler</value></entry>
            </map>
        </property>
    </bean>

それは単に私がそれをプロパティファイルに入れることを受け入れません-それはクラスをインスタンス化しますが、それをイベントリスナーとして登録しません。とてもイライラします。

クラス自体は単純で、既存の速度クラス「org.apache.velocity.app.event.implementIncludeNotFound」からかなり露骨に引き裂かれています。既存の速度実装はファイルの存在をチェックし、存在しない場合は構成可能な代替(デフォルト:notfound.vm)を返します。

鉱山はまったく同じですが、ファイルが存在しない場合はnullを返し、パーサーはこのinclude/parseディレクティブをスキップします。

public class OptionalIncludeEventHandler implements IncludeEventHandler, RuntimeServicesAware {

    private RuntimeServices rs;

    @Override
    public void setRuntimeServices(RuntimeServices rs) {
        this.rs = rs;
    }

    @Override
    public String includeEvent(String includeResourcePath, String currentResourcePath, String directiveName) {
        return rs.getLoaderNameForResource(includeResourcePath) != null ? includeResourcePath : null;
    }

}

チャームのように機能します。

お役に立てば幸いです。

于 2011-03-23T15:51:40.127 に答える
1

私が使用した解決策は、テンプレートの存在を確認するためのユーティリティ メソッドを作成することです。

public synchronized boolean templateExists(String templateFilename) {
    Boolean templateExists = this.templateExistsCache.get(templateFilename);
    if (templateExists != null) {
        return templateExists;
    }
    String absoluteFilename = this.request.getSession().getServletContext().getRealPath(
            "/WEB-INF/templates/" + templateFilename);
    File templateFile = new File(absoluteFilename);
    templateExists = templateFile.exists();
    this.templateExistsCache.put(templateFilename, templateExists);
    return templateExists;
}

private Map<String, Boolean> templateExistsCache = new HashMap<String, Boolean>();

から

https://github.com/okohll/agileBase/blob/master/gtpb_server/src/com/gtwm/pb/model/manageData/ViewTools.java

于 2010-12-13T20:02:27.220 に答える
1

新しいタイプのイベント ハンドラ「IncludeEventHandler」。これにより、開発者は #parse または #include が評価されるたびに呼び出されるクラス (IncludeEventHandler を実装) を定義できます。イベント ハンドラーの目的は、テンプレートが存在するかどうかを確認し、存在しない場合は呼び出し元のコードにエラー フラグを設定することです。自分でテストしていませんが、詳細についてはドキュメントを確認してください

于 2009-07-14T11:22:23.520 に答える