- 浏览: 2160391 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 2323最近在调试会发现“ No operations allow ... -
mysql 执行计划优化
2013-04-07 17:46 1538一条简单的SQL 语句竟花了15.87 sec, ... -
ThreadLocal 引起的内存泄露
2012-10-18 17:48 2412最近在用LOADRUNNER做性能测试, 运行几个小时后, ... -
lucene 反向索引原理
2012-07-20 12:47 1989lucene是一个高性能的全文搜索工具, 使用反向索引结构。 ... -
tomcat7在UBUNTU上自动启动
2012-06-11 12:55 2761为了让tomcat自动启动当电脑重起时, 你必须添加一个脚本, ... -
hadoop中的Writable分析
2012-06-07 11:27 3367hadoop 要使一个类能序例化, 要实现Writabl ... -
在UBUNTU安装NUTCH(十个简单的步骤)
2012-06-06 17:32 4018下面十个步骤能安装Nutch, 并且能爬行你的网站, 创建你自 ... -
深入Lucene的索引文件
2012-02-01 16:50 6880Lucene的索引里面存了些什么,如何存放的,也即Luc ... -
EasyMock and IllegalStateException
2012-01-31 15:09 1338When writing a portlet and tryi ... -
Java Enum的原理
2011-05-03 09:19 1822Java Enum 类型的语法结构尽管和 java 类的语法不 ... -
用JAXB从对象生成XML
2011-04-26 08:54 2982import java.io.FileOutputStream ... -
jdk6 WebService入门
2011-03-10 23:04 3391一、 Web Services简介 ... -
dom4j处理超大XML
2010-12-26 23:35 4844英文原文 : http://dom4j.sourceforge ... -
httpclient3 自动登陆淘宝, 开心网
2010-11-09 22:09 10002前提:需要用到的java包 commons-httpclien ... -
Lucene实时索引构建
2010-11-06 23:11 7421Lucene可以增量的添加一 ... -
分享Java并发最佳书籍Java Concurrency in Practice Java并发最佳书籍 下载
2010-10-21 08:31 13443好久没有上来更新过了,最近在学习线程池实现,参考了 Tomc ... -
Spring Hibernate3 配置 C3P0
2010-10-15 00:31 7558由于Hibernate3不推荐使用DBCP, 所以把连接池换成 ... -
将依赖包加入到本地maven库
2010-07-22 16:47 2894要将依赖包加入到本地maven库 mvn instal ... -
Maven Dependency设置,详解!
2010-07-21 17:08 2509用了Maven,所需的JAR包 ... -
Inner Join with hibernate and HQL
2010-07-18 12:24 2176String queryStri ...
相关推荐
本示例将详细介绍如何使用Freemarker生成静态HTML页面。 1. **Freemarker基本概念** - **模板**: Freemarker的核心是模板,它定义了输出文件的结构和样式,其中包含了一系列指令和变量。 - **数据模型**: 数据...
在本项目"springboot整合freemarker生成静态html的demo.zip"中,我们将探讨如何将SpringBoot框架与FreeMarker模板引擎结合,以实现动态数据驱动的静态HTML页面生成。FreeMarker是一个强大的、开源的模板语言,它允许...
5. **静态文件生成**: 渲染后的HTML内容可以写入到文件系统,生成静态HTML文件。这样,Web服务器可以直接返回这些静态文件,提高网站的访问速度。 6. **优化与调试**: FreeMarker支持缓存机制,可以提高模板的加载...
本示例项目是在Eclipse环境中创建的一个工程,目的是演示如何使用Freemarker来生成静态HTML页面。 在了解这个项目之前,首先需要知道什么是Freemarker。Freemarker是一个开源的Java库,它允许开发者通过定义模板(....
这可能是一个动态HTML的示例,或者是一个自定义的类,用于处理Freemarker生成静态页的过程。具体功能需要查看源代码才能明确。 通过以上步骤,你可以使用Freemarker轻松地将动态数据转化为静态网页。这种方式在网站...
以下是一个简单的Java代码示例,展示了如何使用FreeMarker生成静态页面: 1. 导入所需的FreeMarker库和IO相关的类。 2. 创建一个名为`FreeMarkerUtil`的公共类。 3. 定义一个静态方法`analysisTemplate`,接收模板...
5. **配置和优化**:在实际项目中,配置Struts2和FreeMarker生成静态页面时,需要考虑目录结构、文件命名规则、缓存控制等多个方面。例如,静态页面可能存储在特定的目录下,文件名可能包含URL参数以区分不同的动态...
以上就是Struts2整合Freemarker生成静态页面所涉及的主要知识点。通过熟练掌握这些,开发者可以有效地构建动态、高性能的Web应用。在提供的链接中,可能有更具体的示例和教程,帮助你深入理解和实践这一技术。
总结来说,Java集成Freemarker生成静态HTML的过程包括:引入Freemarker依赖、配置模板相关设置、编写模板文件、在Controller中处理请求并返回模板名、以及使用工具类将模板渲染为HTML并保存到磁盘。这个过程在Web...
本篇文章将深入探讨Freemarker的工作原理、配置、语法以及在生成静态页面中的应用。 一、Freemarker的工作原理 Freemarker是一个基于Java的模板语言,它与后端服务器通过模板引擎进行交互。当用户请求页面时,...
通过使用Freemarker生成静态HTML文件,不仅可以显著提高系统的响应速度,还能减少服务器的压力,提升用户体验。同时,这种做法还能够提高代码的可维护性和可扩展性,是非常值得推荐的做法。对于开发者而言,熟悉并...
在生成静态页面的场景中,Struts2可以作为数据和模板之间的桥梁,将处理后的业务数据传递给Freemarker,由Freemarker生成静态HTML。 **生成静态页面的流程** 1. **配置Struts2**: 首先,我们需要在Struts2的配置...
当获取到`httpclient`请求的数据后,这些数据会被填充到模板中,生成最终的静态HTML页面。`freemarker`的语法简洁,支持条件判断、循环、变量操作等,使得动态数据的渲染变得非常灵活。 实现静态化分页的步骤通常...
5. **生成静态文件**:一旦HTML源码生成,你可以将其写入到磁盘上的一个文件中,从而创建静态页面。确保选择合适的路径,并正确处理文件的创建和覆盖。 6. **优化和调试**:在实际应用中,你可能需要对模板进行优化...
3. **处理模板**:使用Freemarker API的`Configuration`和`Template`类,将数据模型应用到模板上,生成HTML字符串。 4. **调用wkhtmltox**:通过Java绑定库,将生成的HTML字符串转换为PDF。 5. **保存PDF**:将生成...
3. 个人觉得freemarker 和taglib,jsf至少在使用层面上很像,但是freemarker 的macro容易写,几行代码就搞定了,taglib和jsf需要写一堆java文件和tld文件,繁琐得很 4.freemarker 不能直接调用java对象的method. 这点...
在Java中生成静态HTML,我们可以使用模板引擎(如FreeMarker或Thymeleaf)或直接操作字符串来构建HTML内容。这些方法在构建静态站点、生成报告或者构建API文档时特别有用。下面,我们将深入探讨这两种方法: 1. **...
在Java中使用Freemarker生成Word文档的过程主要包括以下几个步骤: 1. **环境配置**:首先,你需要在项目中引入必要的库,包括Apache POI用于处理Word文档,以及Freemarker库。在Maven项目中,可以在pom.xml文件中...