- 浏览: 2113195 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sunzeshan:
找了很久,用了这个插件解决问题啦。谢谢
eclipse jetty debug source not found -
xiaosong0112:
您好,请问为什么要这样设置呢,原理是什么?在网上很多转帖都没有 ...
maven的jetty插件提示No Transaction manager found导致启动慢的解决方法 -
eimhee:
tjzx 写道畅搜谷歌:http://dian168.cc/打 ...
Google 镜像站搜集 -
tjzx:
畅搜谷歌:http://dian168.cc/打开的是“最火源 ...
Google 镜像站搜集 -
eimhee:
finallygo 写道你这属于"头痛医头脚痛医脚& ...
解决linux下too many file问题
先看生成静态html文件:
FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度。
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
FreeMarker被设计用来 生成HTML Web页面,特别是基于MVC模式的应用程序
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据
FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件
FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境
FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库
FreeMarker是免费的
模板: <html> <head> <title>查看文章: ${newsitem.title} </title> </head> <body> <table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF"> <tr><td> <table width="95%" border="0" align="center" cellpadding="2" cellspacing="6" > <tr> <td height="10" align="left" colspan=2 ></td> </tr> <tr> <td align="left" width="538" > <strong>${newsitem.title}</strong> ( ${newsitem.addtime} ) </td> <td align="right"> <a href="index.jsp">返回</a> </td> </tr> <tr> <td align="left" valign=top colspan=2> <hr align="left" width="95%" size="1" noshade color="#cc0000" > </td> </tr> <tr> <td colspan=2>${newsitem.showContent} </td> </tr> </table> <br> </td></tr> </table> </body> </html>
代码: import java.io.*; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import freemarker.template.*; /* * Created on 2005-4-7 * */ /** * 测试FreeMarker. * * @author scud * */ public class FreeMarkerTest { private final Log logger = LogFactory.getLog(getClass()); private Configuration freemarker_cfg = null; public static void main(String[] args) { //@todo 自己的一个类 NewsItem aItem = null; //@todo 装入新闻 //NewsItem = loadNewsItem(1); FreeMarkerTest test = new FreeMarkerTest(); Map root = new HashMap(); root.put("newsitem", aItem); String sGeneFilePath = "/tpxw/"; String sFileName = "1.htm"; boolean bOK = test.geneHtmlFile("/tpxw/view.ftl",root, sGeneFilePath,sFileName); } /** * 获取freemarker的配置. freemarker本身支持classpath,目录和从ServletContext获取. */ protected Configuration getFreeMarkerCFG() { if (null == freemarker_cfg) { // Initialize the FreeMarker configuration; // - Create a configuration instance freemarker_cfg = new Configuration(); // - FreeMarker支持多种模板装载方式,可以查看API文档,都很简单:路径,根据Servlet上下文,classpath等等 //htmlskin是放在classpath下的一个目录 freemarker_cfg.setClassForTemplateLoading(this.getClass(), "/htmlskin"); } return freemarker_cfg; } /** * 生成静态文件. * * @param templateFileName 模板文件名,相对htmlskin路径,例如"/tpxw/view.ftl" * @param propMap 用于处理模板的属性Object映射 * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 "/tpxw/1/2005/4/" * @param htmlFileName 要生成的文件名,例如 "1.htm" */ public boolean geneHtmlFile(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName ) { //@todo 从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用 String sRootDir = "e:/webtest/htmlfile" ; try { Template t = getFreeMarkerCFG().getTemplate(templateFileName); //如果根路径存在,则递归创建子目录 creatDirs(sRootDir,htmlFilePath); File afile = new File(sRootDir +"/" +htmlFilePath + "/" + htmlFileName); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(afile))); t.process(propMap, out); } catch (TemplateException e) { logger.error("Error while processing FreeMarker template " + templateFileName,e); return false; } catch (IOException e) { logger.error("Error while generate Static Html File " + htmlFileName,e); return false; } return true; } /** * 创建多级目录 * * @param aParentDir String * @param aSubDir 以 / 开头 * @return boolean 是否成功 */ public static boolean creatDirs(String aParentDir, String aSubDir) { File aFile = new File(aParentDir); if (aFile.exists()) { File aSubFile = new File(aParentDir + aSubDir); if (!aSubFile.exists()) { return aSubFile.mkdirs(); } else { return true; } } else { return false; } } }
编码的问题
这里说的是编码的问题。项目使用的都是UTF-8编码,生成的文件在UTF-8编码下察看是乱码,而GBK正常(后来发现因为我用的中文操作系统所以用GBK查看正常)。
当然我把Freemarker的配置都改成了UTF-8,我的模版文件也是UTF-8编码的。下面是原来的代码
public void setTemplatePath(Resource templatePath) { this.templatePath = templatePath; //设置freemarker的参数 freemarkerCfg = new Configuration(); try { freemarkerCfg.setDirectoryForTemplateLoading(this.templatePath.getFile()); freemarkerCfg.setObjectWrapper(new DefaultObjectWrapper()); freemarkerCfg.setDefaultEncoding("UTF-8"); } catch (IOException ex) { throw new SystemException("No Directory found,please check you config."); } } /** * 生成静态文件 * @param templateFileName 模版名称eg:(biz/order.ftl) * @param propMap 用于处理模板的属性Object映射 * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 "/biz/2006/5/" * @param htmlFileName 要生成的文件名,例如 "123.htm" * @return */ private boolean buildHtml(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName){ try { Template template = freemarkerCfg.getTemplate(templateFileName); template.setEncoding("UTF-8"); //创建生成文件目录 creatDirs(buildPath.getFilename(),htmlFilePath); File htmlFile = new File(buildPath + htmlFilePath + htmlFileName); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile))); template.process(propMap,out); out.flush(); return true; } catch (TemplateException ex){ log.error("Build Error"+templateFileName,ex); return false; } catch (IOException e) { log.error("Build Error"+templateFileName,e); return false; } } 下面是修改之后的代码 /** * 生成静态文件 * @param templateFileName 模版名称eg:(biz/order.ftl) * @param propMap 用于处理模板的属性Object映射 * @param htmlFilePath 要生成的静态文件的路径,相对设置中的根路径,例如 "/biz/2006/5/" * @param htmlFileName 要生成的文件名,例如 "123.htm" * @return */ private boolean buildHtml(String templateFileName,Map propMap, String htmlFilePath,String htmlFileName){ try { Template template = freemarkerCfg.getTemplate(templateFileName); template.setEncoding("UTF-8"); //创建生成文件目录 creatDirs(buildPath.getFilename(),htmlFilePath); File htmlFile = new File(buildPath + htmlFilePath + htmlFileName); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile),"UTF-8")); template.process(propMap,out); out.flush(); return true; } catch (TemplateException ex){ log.error("Build Error"+templateFileName,ex); return false; } catch (IOException e) { log.error("Build Error"+templateFileName,e); return false; } } 原因就在于OutputStreamWriter的不同构造方法 OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。 这个是中文JDK的文档说明,刚开始我使用默认的构造函数,所以使用了系统默认的编码,GBK,所以在生成静态文件的时候把UTF-8内容用GBK编码写入了,所以在UTF-8下浏览就有问题。 还有关于修改模版文件同样也要注意这个问题。 public String loadTemplate(String templateName) { StringBuffer sb = new StringBuffer(); try { File file = new File(templatePath+"/"+templateName); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8")); String line = reader.readLine(); while(line != null) { sb.append(line); sb.append("\r\n"); line = reader.readLine(); } reader.close(); } catch (IOException e) { throw new SystemException("Loading template Error:",e); } return sb.toString(); } public void saveTemplate(String templateName, String templateContent) { try { File file = new File(templatePath + "/" + templateName); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8")); out.write(templateContent); out.flush(); //扔出templatesave事件 TemplateSaveEvent evt = new TemplateSaveEvent(); evt.setTemplateName(templateName); dispatchTemplateEvent(evt); } catch (IOException e) { throw new SystemException("Write template Error",e); } }
评论
1 楼
arantam
2010-04-27
朋友你好,我有一个问题找了很久也没解决掉,想请教一下.
我也是用freemarker的template来生成静态页面而不是直接把ftl作为view.比较特殊的是,我想在ftl里面使用struts2的标签.
我的做法如下:
1.把struts-core-2.1.6.jar包里面的struts-tag.tld标签文件拷了出来放在web-inf下.由于copy出来的文件报错,于是我在<tablib></taglib>外套了一层<jsp-config></jsp-config>标签.好了.然后,在模板ftl头部声明了引用该标签文件:
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]>
2.在web.xml中配置了一个servlet:
3.最后,在action中处理.return null.
但问题来了,报异常:
找了很多资料,没发觉哪里不对.功力尚浅,所以请教一下,不知您有没这个问题的解决办法?
我也是用freemarker的template来生成静态页面而不是直接把ftl作为view.比较特殊的是,我想在ftl里面使用struts2的标签.
我的做法如下:
1.把struts-core-2.1.6.jar包里面的struts-tag.tld标签文件拷了出来放在web-inf下.由于copy出来的文件报错,于是我在<tablib></taglib>外套了一层<jsp-config></jsp-config>标签.好了.然后,在模板ftl头部声明了引用该标签文件:
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]>
2.在web.xml中配置了一个servlet:
引用
<servlet>
<servlet-name>JSPSupportServlet</servlet-name>
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-name>JSPSupportServlet</servlet-name>
<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
3.最后,在action中处理.return null.
但问题来了,报异常:
引用
Expression JspTaglibs is undefined on line 1, column 12 in typeList.ftl.
The problematic instruction:
----------
==> assignment: s=JspTaglibs["/WEB-INF/struts-tags.tld"] [on line 1, column 1 in typeList.ftl]
----------
Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression JspTaglibs is undefined on line 1, column 12 in typeList.ftl.
The problematic instruction:
----------
==> assignment: s=JspTaglibs["/WEB-INF/struts-tags.tld"] [on line 1, column 1 in typeList.ftl]
----------
Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression JspTaglibs is undefined on line 1, column 12 in typeList.ftl.
找了很多资料,没发觉哪里不对.功力尚浅,所以请教一下,不知您有没这个问题的解决办法?
发表评论
-
MySQLNonTransientConnectionException: No operations allowed
2015-05-19 16:47 2264最近在调试会发现“ No operations allow ... -
mysql 执行计划优化
2013-04-07 17:46 1483一条简单的SQL 语句竟花了15.87 sec, ... -
ThreadLocal 引起的内存泄露
2012-10-18 17:48 2370最近在用LOADRUNNER做性能测试, 运行几个小时后, ... -
lucene 反向索引原理
2012-07-20 12:47 1945lucene是一个高性能的全文搜索工具, 使用反向索引结构。 ... -
tomcat7在UBUNTU上自动启动
2012-06-11 12:55 2712为了让tomcat自动启动当电脑重起时, 你必须添加一个脚本, ... -
hadoop中的Writable分析
2012-06-07 11:27 3335hadoop 要使一个类能序例化, 要实现Writabl ... -
在UBUNTU安装NUTCH(十个简单的步骤)
2012-06-06 17:32 3955下面十个步骤能安装Nutch, 并且能爬行你的网站, 创建你自 ... -
深入Lucene的索引文件
2012-02-01 16:50 6750Lucene的索引里面存了些什么,如何存放的,也即Luc ... -
EasyMock and IllegalStateException
2012-01-31 15:09 1301When writing a portlet and tryi ... -
Java Enum的原理
2011-05-03 09:19 1776Java Enum 类型的语法结构尽管和 java 类的语法不 ... -
用JAXB从对象生成XML
2011-04-26 08:54 2921import java.io.FileOutputStream ... -
jdk6 WebService入门
2011-03-10 23:04 3291一、 Web Services简介 ... -
dom4j处理超大XML
2010-12-26 23:35 4770英文原文 : http://dom4j.sourceforge ... -
httpclient3 自动登陆淘宝, 开心网
2010-11-09 22:09 9921前提:需要用到的java包 commons-httpclien ... -
Lucene实时索引构建
2010-11-06 23:11 7374Lucene可以增量的添加一 ... -
分享Java并发最佳书籍Java Concurrency in Practice Java并发最佳书籍 下载
2010-10-21 08:31 13352好久没有上来更新过了,最近在学习线程池实现,参考了 Tomc ... -
Spring Hibernate3 配置 C3P0
2010-10-15 00:31 7494由于Hibernate3不推荐使用DBCP, 所以把连接池换成 ... -
将依赖包加入到本地maven库
2010-07-22 16:47 2836要将依赖包加入到本地maven库 mvn instal ... -
Maven Dependency设置,详解!
2010-07-21 17:08 2457用了Maven,所需的JAR包 ... -
Inner Join with hibernate and HQL
2010-07-18 12:24 2109String queryStri ...
相关推荐
springboot整合freemarker生成静态html的demo 主要讲解了通过模板生成html和通过字符串生成html
freemarker生成静态HTML例子
这是一个eclipse下创建的一个project,里面有一个freemarker生成html及一些语法示例
NULL 博文链接:https://goby2008.iteye.com/blog/627076
主要介绍了JAVA集成Freemarker生成静态html过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
FreeMarker教你如何生成html静态页面源码
3. 个人觉得freemarker 和taglib,jsf至少在使用层面上很像,但是freemarker 的macro容易写,几行代码就搞定了,taglib和jsf需要写一堆java文件和tld文件,繁琐得很 4.freemarker 不能直接调用java对象的method. 这点...
FreeMarker与struts2整合,一个小案例实现【增删改查】生成静态页面。内含数据库sql文件及效果图。数据库是mysql,c3p0+dbUtils实现数据操作。是一个完整的案例。
freemarker生成静态html实例,非常简单易懂,内含架包,可直接部署运行
Freemarker FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板...总结:freemarker 模版引擎,可以使用 Freemarker 模版生成 html 页面。 Freemarker 语法 /** * freemark入门案例 * freemark三要素: * 1.
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 FreeMarker与容器无关...
freemarker 简单项目示例,生成静态html过程
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 FreeMarker与容器...
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据。[1] FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web...
由FreeMarker生成页面,通过模板显示准备的数据 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境 ...
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 FreeMarker与容器无关...
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据。[1] FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web...
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 FreeMarker与容器无关...
FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来...但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据