六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 42|回复: 0

使用freemarker从数据库中读取模板

[复制链接]

升级  20%

2

主题

2

主题

2

主题

童生

Rank: 1

积分
10
 楼主| 发表于 2013-1-27 05:14:34 | 显示全部楼层 |阅读模式
一般使用freemarker读取模板文件都是从文件系统中读取的,指定一下目录和文件名,就可以得到template对象,代码的写法就像:
cfg=new Configuration();cfg.setDirectoryForTemplateLoading("d:\\");Template t = cfg.getTemplate("1373"); 如果想要实现从数据库中读取就需要实现TemplateLoader接口,并把它传递给Configuration对象,TemplateLoader有四个方法。
//关闭模板源public void closeTemplateSource(Object templateSource) throws IOException;//查找模板源,也可以理解为打卡一个模板源public Object findTemplateSource(String param) throws IOException;//得到最后一次修改模板的时间,不知道什么时间修改的就传-1public long getLastModified(Object templateSource);//得到template对象的readerpublic Reader getReader(Object templateSource, String encodeType) throws IOException; 
重新实现templateloader,将其传递给Configuration后的完整代码:
cfg=new Configuration();cfg.setTemplateLoader(new TemplateLoader(){Connection conn=null;public void closeTemplateSource(Object templateSource) throws IOException{System.out.println("closeTemplateSource");try{conn.close();}catch (SQLException e){e.printStackTrace();}}public Object findTemplateSource(String param) throws IOException{System.out.println("findTemplateSource");Statement s=null;ResultSet rs=null;try{if(conn==null||conn.isClosed()){Class.forName("oracle.jdbc.driver.OracleDriver");conn= DriverManager.getConnection("jdbc:oracle:thin:@xx.xx.xx.xx:xx:xxxx","xxx", "xxx");}s=conn.createStatement();//传进来的字符串后面会加地区的信息,比如这个地方得到的字符串实际是1373_zh_CNString id=param.substring(0, param.indexOf("_"));System.out.println(id);s.execute(" select * from xx where id= "+id);rs=s.getResultSet();rs.next();return rs.getClob(5);}catch (Exception e){e.printStackTrace();throw new RuntimeException(e);}finally{try{rs.close();s.close();}catch(Exception e){}}}public long getLastModified(Object templateSource){System.out.println("getLastModified");return -1l;}public Reader getReader(Object templateSource, String encodeType)throws IOException{System.out.println("getReader");Clob c=(Clob)templateSource;try{return c.getCharacterStream();}catch (SQLException e){e.printStackTrace();throw new RuntimeException(e);}}});        Map root = new HashMap();        root.put("name", "freemarker"); root.put("msg" , "您已经完成了第一个FreeMarker的示例");cfg.setDirectoryForTemplateLoading("d:\\");        Template t = cfg.getTemplate("1373");        t.process(root, new OutputStreamWriter(System.out)); 
这样就可以实现从数据库中读取tfl文件。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表