如何从init()以外的类调用缓存的xsl模板

时间:2012-11-06 13:19:30

标签: java xml java-ee xslt tomcat

一直在研究xslts,并在TransformerFactory.newTemplates(source)中使用JAXP缓存的xsl文件找到Web应用程序的方法,使用相同的xsl进行大量转换。

在大多数示例中,我发现代码看起来像这样。

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

以相同的方法调用newTransformer

让我的init()方法在servlet上缓存它们并在不同的类中使用cachedXSLT创建Transformer的新实例的最佳方法是什么?如何在init()之外引用cachedXSLT?

由于

2 个答案:

答案 0 :(得分:1)

您可以将cachedXSLT个实例添加到ServletContext。您需要在Web XML中注册ServletContextListener,并且容器将调用contextInitialized方法一次。因此,如果您将实例添加到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方法中,您可以使用如下方法获取servlet上下文并添加属性。

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

然后你可以使用:

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

获取cachedXSLT个实例。在应用程序中获取ServletContext取决于您正在使用的框架。

答案 1 :(得分:1)

只需根据密钥缓存Templates对象(例如文件名的完整路径或其他内容)。 guava's 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");