1

xsltsを調査していて、JAXPでキャッシュされたxslファイルを見つけたのTransformerFactory.newTemplates(source)は、同じxslを使用して多くの変換を行うWebアプリケーションを探す方法です。

ほとんどの例で、コードは次のようになっています。

        Source xsltSource = new StreamSource(xsltFile);
        TransformerFactory transFact = TransformerFactory.newInstance();
        Templates cachedXSLT = transFact.newTemplates(xsltSource);
        Transformer trans = cachedXSLT.newTransformer();

newTransformer同じメソッドでを呼び出します。

サーブレットのメソッドがそれらをキャッシュし、さまざまなクラスのcachedXSLTをinit()使用しての新しいインスタンスを作成するための最良のアプローチは何でしょう か。Transformer外部でcachedXSLTを参照するにはどうすればよいinit()ですか?

ありがとう

4

2 に答える 2

1

cachedXSLTインスタンスをServletContextに追加できます。Web XMLにServletContextListenerを登録する必要があり、 contextInitializedメソッドがコンテナによって1回呼び出されます。したがって、インスタンスをに追加すると、ServletContextすべてのアプリケーションで利用できるようになります。

これを行うには、 ServletContextListenerを実装するクラスを作成します。

public class YourContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {      
        //This method is called by the container on start up
        //Your code should look something like this:
       Source xsltSource = new StreamSource(xsltFile);
       TransformerFactory transFact = TransformerFactory.newInstance();
       Templates cachedXSLT = transFact.newTemplates(xsltSource);
       Transformer trans = cachedXSLT.newTransformer();

       ServletContext context = sce.getServletContext();
       context.setAttribute("cashedXSLT", cachedXSLT);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {        
    }   

}

あなたのにそれを登録してくださいweb.xml

<listener>
    <listener-class>your.package.YourContextListener</listener-class>
</listener>

contextInitializedメソッドでは、以下を使用してサーブレットコンテキストを取得し、属性を追加できます。

ServletContext context = sce.getServletContext();
context.setAttribute("cashedXSLT", cachedXSLT);

次に、次を使用できます。

Templates cashedXSLT = (Templates) context.getAttribute("cashedXSLT");

インスタンスを取得しcachedXSLTます。アプリケーションでServletContextを取得するかどうかは、使用しているフレームワークによって異なります。

于 2012-11-06T13:48:49.367 に答える
1

キーに対してオブジェクトをキャッシュするだけTemplatesです(たとえば、ファイル名へのフルパスなど)。グアバのLoadingCache例:

private final LoadingCache<String, Templates> cache = CacheBuilder.newBuilder()
   .build(
       new CacheLoader<String, Templates>() {
         public Graph load(String fileName) throws IOException {
             Source xsltSource = new StreamSource(fileName);
             TransformerFactory transFact = TransformerFactory.newInstance();
             return transFact.newTemplates(xsltSource); 
         }
       });

  ...then, somewhere in the method...

  Templates template = cache.get("/path/to/file.xslt");
于 2012-11-06T13:51:25.087 に答える