一直在研究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?
由于
答案 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");