1

一直在研究 xslts 并发现使用 JAXP 缓存的 xsl 文件TransformerFactory.newTemplates(source)是 Web 应用程序的方式,使用相同的 xsl 进行了很多转换。

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

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

用同样的方法调用newTransformer

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

谢谢

4

2 回答 2

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取决于您使用的框架。

于 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 回答