网站开发列表,阜阳企业做网站,专业的led网站建设,毕业设计h5网站制作一直以来#xff0c;有个目标是#xff1a;使用Beetl的时候#xff0c;如果web root 里有模板文件#xff0c;则beetl从web root里加载。如果没有#xff0c;则从jar里加载#xff0c;或者从Db里加载。这样#xff0c;工程里大量相同的模板模板可以共用(当你的应用…一直以来有个目标是使用Beetl的时候如果web root 里有模板文件则beetl从web root里加载。如果没有则从jar里加载或者从Db里加载。这样工程里大量相同的模板模板可以共用(当你的应用有N个客户的时候特别需要这个更新一个jar重启一下即可)。最后确认CompositeResourceLoader 无法满足自己的需求。于是磕磕碰碰的自己实现了一个ResourceLoader自定义加载模板。直接贴代码吧package com.jfinal.ext.beetl;import java.io.File;import java.net.URL;import java.util.Map;import org.beetl.core.GroupTemplate;import org.beetl.core.Resource;import org.beetl.core.ResourceLoader;import org.beetl.core.misc.BeetlUtil;/*** 自定义的ResourceLoader用于支持从文件jar和数据库里加载模板。* author Neoman*/public class AppResourceLoader implements ResourceLoader{private String root null;boolean autoCheck false;//模板来自文件boolean fromFile true;//模板来自Dbboolean fromDb false;//模板来自jar包boolean fromJar false;protected String charset UTF-8;String functionRoot functions;GroupTemplate gt null;String functionSuffix fn;ClassLoader classLoader null;/*** 使用加载beetl.jar的classloader以及默认root为根目录*/public AppResourceLoader(){//保留用于通过配置构造一个ResouceLoaderclassLoader this.getClass().getClassLoader();this.root ;}/** 使用指定的classloader* param classLoader*/public AppResourceLoader(ClassLoader classLoader){this.classLoader classLoader;this.root ;}/**使用指定的classloader和root* param classLoader* param root 模板路径如/com/templates/*/public AppResourceLoader(ClassLoader classLoader, String root){this.classLoader classLoader;this.root root;}/*** param classLoader* param root* param charset*/public AppResourceLoader(ClassLoader classLoader, String root, String charset){this(classLoader, root);this.charset charset;}/*** param root /com/templates/如其后的resourceId对应的路径是root/resourceId*/public AppResourceLoader(String root){this();if (root.equals(/)){this.root ;}else{this.root root;}}public AppResourceLoader(String root, String charset){this(root);this.charset charset;}/** (non-Javadoc)** see org.beetl.core.ResourceLoader#getResource(java.lang.String)*/Overridepublic Resource getResource(String key){AppResource resource new AppResource(root, key, this);resource.setFromFile(fromFile);resource.setFromDb(fromDb);resource.setFromJar(fromJar);return resource;}/** (non-Javadoc)** see org.beetl.core.ResourceLoader#close()*/Overridepublic void close(){// TODO Auto-generated method stub}Overridepublic boolean isModified(Resource key){if (this.autoCheck){return key.isModified();}else{return false;}}public boolean isAutoCheck(){return autoCheck;}public void setAutoCheck(boolean autoCheck){this.autoCheck autoCheck;}public String getRoot(){return root;}Overridepublic void init(GroupTemplate gt){Map resourceMap gt.getConf().getResourceMap();if (resourceMap.get(root) ! null){String temp resourceMap.get(root);if (temp.equals(/) || temp.length() 0){}else{if (this.root.endsWith(/)){this.root this.root resourceMap.get(root);}else{this.root this.root / resourceMap.get(root);}}}if (this.charset null){this.charset resourceMap.get(charset);}this.functionSuffix resourceMap.get(functionSuffix);this.autoCheck Boolean.parseBoolean(resourceMap.get(autoCheck));this.functionRoot resourceMap.get(functionRoot);//初始化functionsURL url classLoader.getResource();this.gt gt;if (url!nullurl.getProtocol().equals(file)){File fnRoot new File(url.getFile() File.separator root File.separator this.functionRoot);if (fnRoot.exists()){String ns ;String path /.concat(this.functionRoot).concat(/);BeetlUtil.autoFileFunctionRegister(gt, fnRoot, ns, path, this.functionSuffix);}}}Overridepublic boolean exist(String key){URL url this.classLoader.getResource(root key);if(urlnull){//兼容以前的url this.classLoader.getClass().getResource(root key);}return url!null;}public String getCharset(){return charset;}public void setCharset(String charset){this.charset charset;}Overridepublic String getResourceId(Resource resource, String id){if (resource null)return id;elsereturn BeetlUtil.getRelPath(resource.getId(), id);}public ClassLoader getClassLoader() {return classLoader;}public void setClassLoader(ClassLoader classLoader) {this.classLoader classLoader;}Overridepublic String getInfo() {return ClassLoader:this.classLoader Path:root;}public boolean isFromFile() {return fromFile;}public void setFromFile(boolean fromFile) {this.fromFile fromFile;}public boolean isFromDb() {return fromDb;}public void setFromDb(boolean fromDb) {this.fromDb fromDb;}public boolean isFromJar() {return fromJar;}public void setFromJar(boolean fromJar) {this.fromJar fromJar;}}AppResourceLoader基本复制之前org.beetl.core.resource.WebAppResourceLoader的。init 注册函数的时候还是仅仅读取web root里的目录。因为我自己的是代码里注册了所以也没去实现从jar加载functionpackage com.jfinal.ext.beetl;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.io.UnsupportedEncodingException;import java.net.URL;import org.beetl.core.Resource;import org.beetl.core.ResourceLoader;import org.beetl.core.exception.BeetlException;import com.jfinal.kit.PathKit;/*** 模板资源读取支持从db文件classpathjar 里读取模板资源* 先从webroot的文件里读取如果没有则读取数据库如何还找不到读取jar或者classpath里的* author Neoman**/public class AppResource extends Resource{String root null;File file null;long lastModified 0;//模板来自文件boolean fromFile true;//模板来自Dbboolean fromDb false;//模板来自jar包boolean fromJar false;public AppResource(String root, String key, ResourceLoader resourceLoader){super(key, resourceLoader);this.root root;}Overridepublic Reader openReader(){InputStream is null;Reader br;AppResourceLoader loader (AppResourceLoader) this.resourceLoader;try{//从文件里读取一般的web root里file new File(PathKit.getWebRootPath() root, id);if (file.exists() fromFile) {is new FileInputStream(file);}//从数据库里读取,暂未实现if (is null fromDb) {}//从jar 或者classpath里读取if (is null fromJar) {ClassLoader cs loader.getClassLoader();URL url cs.getResource(root id);if(urlnull){//兼容以前的写法url resourceLoader.getClass().getResource(root id);}if (url null){BeetlException be new BeetlException(BeetlException.TEMPLATE_LOAD_ERROR);be.resourceId this.id;throw be;}is url.openStream();}if (is null) {BeetlException be new BeetlException(BeetlException.TEMPLATE_LOAD_ERROR, 模板不存在: loader.getInfo());be.resourceId this.id;throw be;}br new BufferedReader(new InputStreamReader(is, loader.charset));return br;}catch (UnsupportedEncodingException e){return null;} catch (FileNotFoundException e) {// TODO Auto-generated catch blockBeetlException be new BeetlException(BeetlException.TEMPLATE_LOAD_ERROR, 模板根目录为 loader.getRoot());be.resourceId this.id;throw be;} catch (IOException e) {// TODO Auto-generated catch blockBeetlException be new BeetlException(BeetlException.TEMPLATE_LOAD_ERROR, 模板根目录为 loader.getRoot());be.resourceId this.id;throw be;}}/*** 目前只能跟踪文件的变化*/Overridepublic boolean isModified(){if (fromFile file ! null file.exists()){return file.lastModified() ! this.lastModified;}//String refresh SysConfig.dao.queryConfig(beetl.template.refresh, 0);//if (!0.equals(refresh)) {//不等于0刷新模板//SysConfig.dao.updateConfig(beetl.template.refresh, 0);//return true;//}//jar里肯定要重启了if (fromJar){return false;}//db里 判断时间--暂未 实现if (fromDb){return false;}return false;}Overridepublic String getId(){return id;}public boolean isFromFile() {return fromFile;}public void setFromFile(boolean fromFile) {this.fromFile fromFile;}public boolean isFromDb() {return fromDb;}public void setFromDb(boolean fromDb) {this.fromDb fromDb;}public boolean isFromJar() {return fromJar;}public void setFromJar(boolean fromJar) {this.fromJar fromJar;}}暂时未用到从db加载所以没去实现了。不过也很简单了。AppResource 主要是 openReader 里面判断资源从哪里加载。博客粗略记录一下希望对大家有用欢迎交流,微信:netsafer