`
yao_2110
  • 浏览: 23797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

一般使用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;
//得到最后一次修改模板的时间,不知道什么时间修改的就传-1
public long getLastModified(Object templateSource);
//得到template对象的reader
public 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_CN
					String 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文件。

5
0
分享到:
评论
2 楼 yao_2110 2008-11-26  
没有试过,但我猜测应该没有问题,遇到包含的标签,freemarker就用调用你的文件加载器,你的文件加载器就会在数据库里面查找,所以应该没有问题。
1 楼 bojianpc 2008-10-13  
如果模板内有嵌套怎么做呢 

相关推荐

    freemarker实例,真实

    这个实例是一个不依赖数据库、使用相对路径生成文件的基础示例,非常适合初学者了解和学习Freemarker的基本用法。 1. **Freemarker简介** Freemarker是一个开源的模板语言,它与编程语言解耦,允许开发者将业务...

    java iText 实现从数据库中导出数据到已有的PDF模板

    在实际项目中,为了提高效率和灵活性,我们可能会使用模板引擎,如FreeMarker或Velocity,将数据库数据和PDF模板进行绑定,生成中间的XML或HTML,再由iText将其转换为PDF。 在处理大量数据时,需要注意性能优化,...

    Java利用Freemarker模板自动生成dto、dao、rowmapper、bo、service代码

    主程序会读取数据库表结构,使用Freemarker解析模板,生成相应的Java类文件。这种方式可以帮助开发者快速构建基于Spring框架的应用,减少手动编写重复代码的时间。 总的来说,Java利用Freemarker模板生成代码是一种...

    Java freemarker 模板生成word动态表格

    5. **数据模型**:在Java程序中,你需要创建一个数据模型,通常是一个Map或一个自定义的Java对象,其中包含了将要填充到模板中的数据。这些数据可以是列表、数组或其他复杂的数据结构。 6. **模板与数据合并**:...

    Freemarker代码生成器实体映射xml的ftl模板文件

    在实际使用中,开发者会提供一个包含数据库元数据(如表名、字段名、类型等)的Java对象或数据结构给Freemarker模板,然后Freemarker会根据`XML.ftl`中的规则,生成一个完整的XML映射文件。这个生成的XML文件可以...

    springboot+webflux+mongodb+freemarker

    在Spring Boot应用中,FreeMarker与Web层结合,允许开发者用简单的模板语言来定义页面布局,然后在后台填充动态数据,生成最终的网页。 这个小demo展示了如何将这些技术融合在一起,实现一个完整的Web应用流程。...

    基于Freemarker模板的代码生成器前台页面模板文件

    Freemarker模板中的`<#list>`指令用于遍历数据集合,`<#if>`、`<#else>`则用于条件判断,而`<@include>`可以包含其他公用部分的模板。 2. **EditPage.ftl**:编辑页面模板,用于展示和修改已有数据。通常会包含表单...

    freemarker_servlet_demo

    - **读取模板**:使用`Freemarker`的`Template`类加载模板文件,通常这些模板文件放在Web应用的`/WEB-INF/templates`目录下。 - **数据模型**:创建一个数据模型,包含要传递给模板的所有变量或对象,这将使模板...

    freemarker的分页功能

    - **Freemarker模板中的分页逻辑**:在Freemarker模板中,使用`<#list>`指令遍历分页后的数据列表,并在模板中展示。此外,还需要添加分页导航,包括当前页码显示、上一页/下一页链接等,以便用户操作。 #### 2. ...

    数据库表结构导出word文档.zip

    "sql2doc"可能是实现数据转换的脚本或程序,它读取MySQL数据库的表结构信息,然后使用FreeMarker模板生成Word文档。SQL查询通常用于获取数据库的元数据,如表名、列名、数据类型等。这个工具可能执行了类似"DESCRIBE...

    SpringBoot+JPA+Freemarker 生成动态SQL

    在这个模板中,你可以用${...}来引用Java对象的属性,使用Freemarker语法构造动态SQL。 5. **编写Service**:创建一个Service类,使用@Autowired注入Repository,然后编写一个方法来处理业务逻辑。在这个方法中,...

    根据读取数据库自动生成实体bean

    4. **填充模板**:使用获取到的数据库元数据填充FreeMarker模板。这通常涉及创建一个数据模型,其中包含关于表的信息,然后使用`Template`类的`process`方法将数据模型与模板合并。 5. **生成源代码**:合并后的...

    SSH项目 有Freemarker模版

    在SSH项目中,Hibernate通过配置文件定义实体类与数据库表的映射,提供了一种简单的方式来执行CRUD(创建、读取、更新、删除)操作。此外,Spring与Hibernate的整合使得事务管理更加方便,可以全局控制一次操作中的...

    freemarker

    3. **安全**:由于FreeMarker模板中不包含业务逻辑,因此可以避免XSS(跨站脚本攻击)等安全问题。模板只负责展示,降低了因模板错误导致的安全风险。 4. **灵活性**:FreeMarker 支持多种数据类型,包括基本类型、...

    java+Freemarker生成word

    在给定的压缩包文件"java+Freemarker生成word"中,可能包含了示例代码、模板文件以及相关的读取和生成Word文档的工具。通过研究这些文件,你可以更好地理解和实践这一技术,从而在实际项目中灵活运用。

    Freemarker 学习笔记一 【乱码解决】

    在Freemarker模板中,可以通过`<#ftl>`指令指定模板的编码,如`<#ftl encoding="UTF-8">`。同时,Java代码中创建`Template`对象时,也可以通过`Template`类的构造函数明确指定编码: ```java Template template = ...

    FreeMarker 生成Java、mybatis文件

    在实际应用中,使用FreeMarker生成代码时,应遵循一些最佳实践,如保持模板简洁、易于维护,确保模板的可复用性,以及合理组织模板目录结构。此外,为了防止模板错误导致生产问题,开发过程中应有充足的测试和验证...

    SpringMVC+Hibernate+Freemarker 干净的框架

    开发者在Freemarker模板中定义变量和控制结构,这些模板在运行时会被填充实际的数据,生成最终的HTML页面。Freemarker支持条件判断、循环、函数调用等,使得模板文件能够包含复杂的逻辑。与JSP相比,Freemarker更...

Global site tag (gtag.js) - Google Analytics