问题描述
两个模板在不同的文件夹里面,在其中的一个模板里用<#import"a/a.ftl"askk>时,总是报错:Errorreadingimportedfilea/a.ftl到底是哪里出错了?请指教。
解决方案
解决方案二:
没有人知道吗
解决方案三:
如果是在同一个包下面,你可以把它改成<#import'a.ftl'askk>我考虑你那不仅仅报Errorreadingimportedfilea/a.ftl这个错可能堆栈里面还有FileNotFound
解决方案四:
下面是LibraryLoad类的构造函数和accept方法的源码LibraryLoad(Templatetemplate,ExpressiontemplateName,Stringnamespace){this.namespace=namespace;StringtemplatePath1=template.getName();intlastSlash=templatePath1.lastIndexOf('/');templatePath=lastSlash==-1?"":templatePath1.substring(0,lastSlash+1);this.templateName=templateName;}voidaccept(Environmentenv)throwsTemplateException,IOException{StringtemplateNameString=templateName.getStringValue(env);if(templateNameString==null){Stringmsg="Error"+getStartLocation()+"Theexpression"+templateName+"isundefined.";thrownewInvalidReferenceException(msg,env);}TemplateimportedTemplate;try{if(!env.isClassicCompatible()){if(templateNameString.indexOf("://")>0){;}elseif(templateNameString.length()>0&&templateNameString.charAt(0)=='/'){intprotIndex=templatePath.indexOf("://");if(protIndex>0){templateNameString=templatePath.substring(0,protIndex+2)+templateNameString;}else{templateNameString=templateNameString.substring(1);}}else{templateNameString=templatePath+templateNameString;}}importedTemplate=env.getTemplateForImporting(templateNameString);}catch(ParseExceptionpe){Stringmsg="Errorparsingimportedtemplate"+templateNameString;thrownewTemplateException(msg,pe,env);}catch(IOExceptionioe){Stringmsg="Errorreadingimportedfile"+templateNameString;thrownewTemplateException(msg,ioe,env);}env.importLib(importedTemplate,namespace);}
关于模板的加载一定要看几句代码:LibraryLoad(Templatetemplate,ExpressiontemplateName,Stringnamespace){//获取<#import>所在模板的名称StringtemplatePath1=template.getName();intlastSlash=templatePath1.lastIndexOf('/');//获取<#import>所在模板的名称的路径templatePath=lastSlash==-1?"":templatePath1.substring(0,lastSlash+1);//<#import>中的表达式,也就是另外一个模板的路径this.templateName=templateName;}
然后在看accept中的代码,主要是几个if条件的判断,它们分别代表集中不同了路径的加载方式:1、if(templateNameString.indexOf("://")>0){;}这一种是绝对路径的书写格式,不做任何处理,后面直接执行env.getTemplateForImporting(templateNameString);2、if(templateNameString.length()>0&&templateNameString.charAt(0)=='/'){intprotIndex=templatePath.indexOf("://");if(protIndex>0){templateNameString=templatePath.substring(0,protIndex+2)+templateNameString;}else{templateNameString=templateNameString.substring(1);}}这一种是表达式以"/"开头的情况,表示是加载在该模板下的文件夹中的模板如:a.ftl中:<#import"/c/b.ftl"askk>b.ftl和a.ftl是同级的,都在c文件夹下3、最后一个else表示通模板在该模板的下一级文件中:templateNameString=templatePath+templateNameString;如:a.ftl中:<#import"c/b.ftl"askk>表示c文件夹和a.ftl同级,b.ftl在c文件夹中
解决方案五:
路径,应该是<#import"/a/a.ftl"askk>