用freemarker生成静态网页,数据模型替换的问题

shshy39 2009-06-11 04:39:05
用freemarker生成静态网页,可以把一个单独的String数据模型放到map替换生成静态页,但这个数据模型太简单,如果涉及到自定义标签,特别是里面还有属性的情况,单单的用变量放到map替换是不现实的,例如:

Configuration freemarkerCfg = new Configuration();  
freemarkerCfg.setClassForTemplateLoading(this.getClass(), "/");
freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
Template template;
try {
template = freemarkerCfg.getTemplate("Hello.ftl");
template.setEncoding("UTF-8");
File htmlFile = new File("webapp/jsp/t.html");
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(htmlFile), "UTF-8"));
HashMap propMap = new HashMap();
propMap.put("title", "文章标题"); //数据模型替换
template.process(propMap, out);
out.flush();
}

Hell.ftl文件代码一:
<title>查看---文章: ${title} </title>

Hell.ftl文件代码二:

<div class="list_content">
[@cms.ArtiList count='20' sysContent='1-1' titLen='50' lineHeight='7' dateFormat='1' datePosition='2' headMark='4' bottomLine='1' sysPage='3' isPage='1' pageClass='pagination'/]
</div>


暂不考虑使用获得流的方式,来生成静态页,此方式仅仅用到生成文章页可以;但对于栏目页面需要定时生成,必须从数据库取数据,替换页面的标签,所以获取流就不现实了.

----------如何解决这个问题呢?大家谈谈下,谢谢~!
...全文
2849 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
liguoxina 2011-06-16
  • 打赏
  • 举报
回复
求解中。。。。。。。。。。。
疯狂椰子 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 liangfeilonglfl 的回复:]

你好。我想问问你这个问题解决了没有。。我也有同样的问题。。我放在数据模型里的数据时动态的(从数据库里取)。但是之后就一直这个值。。变不了
[/Quote]

求解...
liangfeilonglfl 2011-04-27
  • 打赏
  • 举报
回复
你好。我想问问你这个问题解决了没有。。我也有同样的问题。。我放在数据模型里的数据时动态的(从数据库里取)。但是之后就一直这个值。。变不了
ql987654321 2009-09-21
  • 打赏
  • 举报
回复
如果页面有动态的内容或者设计,纯静态的页面要实现估计很难。再说也不一定就需要全部都做成静态的吧!!!
tiandiqing 2009-08-05
  • 打赏
  • 举报
回复
我曾经写的一个解析方法:


String templeHtml = "<ul>{Tag:type=体育&pagesize=5}</ul><ul>{Tag:type=娱乐&pagesize=5}</ul>";
String htmlCode = "";
String beginTag = "{Tag:";
String endTag = "}";
boolean isFind = false;
int myPos = 0;
int myPosE = 0;
int StartPos = 0; //'在循环中记录当前已经处理到的位置
String tagName = "";

while (!isFind) {
myPos = templeHtml.indexOf(beginTag,StartPos);
if (myPos ==-1 ) {
htmlCode += templeHtml.substring(StartPos);
isFind = true;
} else {
//如果找到了标记起点
//先将这个标记起点和上一个标记终点之间的代码保存到HtmlCode
htmlCode += templeHtml.substring(StartPos,myPos);
myPosE = templeHtml.indexOf(endTag,myPos);
tagName = templeHtml.substring(myPos+5, myPosE);
// tagName = templeHtml.substring(myPos, myPosE+1);
String[] arrayTagName = tagName.split("&");
String context = "";
for (int i = 0; i < arrayTagName.length;i++) {
String[] arrayArgs = arrayTagName[i].split("=");
String argsName = arrayArgs[0]; //参数名称
String argsValue = arrayArgs[1]; //参数值
if (argsName.equals("type")) {
if (argsValue.equals("体育"))
context = "<li>李宁冠军</li>";
else
context = "<li>刘德华演唱会</li>";

}
if (argsName.equals("pagesize")) {
for ( int k = 0; k < Integer.valueOf(argsValue); k++) {
htmlCode += context;
}
}
}

String ss = templeHtml.substring(myPosE);
StartPos = (myPosE+1);
}
System.out.println("---------->"+htmlCode);
}
}



大型网站基本都是根据标记生成静态页的,几乎没有跳转之类的。只不过实现的方式不一样罢了。
静态页的好处就不用说了吧,可以减轻系统压力,可以便于搜索引擎,可以分发到CDN...
apache 或者nginx 对静态页的吞吐能力是非常大的。
shshy39 2009-06-16
  • 打赏
  • 举报
回复
基本思路为:利用Struts2对自定义result type的支持,自定义能够生成静态页面的result type,结合模板引擎Freemarker可以实现大批量静态页面的生成。
大体根据上面的思路.
shshy39 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 imyourgod 的回复:]
引用 31 楼 shshy39 的回复:
引用 30 楼 imyourgod 的回复:
我一直没搞懂你到底要做什么事?没看懂你的 Hell.ftl文件代码二


@cms.ArtiList是个模板自定义标签,是另外一个ftl文件有定义,该标签有很多属性已经设置好,现在引用该标签,只需要写入需要的属性即可.
要做的事就是把该标签替换为根据属性得来的相应值.不知道你了解清楚没?



呵呵。不好意思,可能我理解力较低,我确实没有明白你到底要干什么?要…
[/Quote]
目前大概可以这么说:主要是通过一套模板在显示页面的同时,自动生成静态页面,并保存在用户自己的目录中。
zhoushaolan 2009-06-16
  • 打赏
  • 举报
回复
标记下
w515142 2009-06-16
  • 打赏
  • 举报
回复
asdsadfsdfsdfdsf
imyourgod 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 shshy39 的回复:]
引用 30 楼 imyourgod 的回复:
我一直没搞懂你到底要做什么事?没看懂你的 Hell.ftl文件代码二


@cms.ArtiList是个模板自定义标签,是另外一个ftl文件有定义,该标签有很多属性已经设置好,现在引用该标签,只需要写入需要的属性即可.
要做的事就是把该标签替换为根据属性得来的相应值.不知道你了解清楚没?
[/Quote]

呵呵。不好意思,可能我理解力较低,我确实没有明白你到底要干什么?要实现一种什么样的结果?还是你想用一个模版实现所有的页面静态化?
shshy39 2009-06-15
  • 打赏
  • 举报
回复
考虑如此方式:参考struts2源代码

		public void doExecute(String location, ActionInvocation invocation) throws IOException, TemplateException {
this.location = location;
this.invocation = invocation;
this.configuration = getConfiguration();
this.wrapper = getObjectWrapper();
this.fileName = (String) conditionalParse(fileName, invocation);
this.staticTemplate = (String) conditionalParse(staticTemplate, invocation);
this.filePath = ((String) conditionalParse(filePath, invocation)) == null ?"":((String) conditionalParse(filePath, invocation));
if (!location.startsWith("/")) {
ActionContext ctx = invocation.getInvocationContext();
HttpServletRequest req = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST);
String base = ResourceUtil.getResourceBase(req);
location = base + "/" + location;
}
//跳转页面的模板类
Template template = configuration.getTemplate(location, deduceLocale());
//转换静态页面的的模板类
Template staticTemplate = configuration.getTemplate(this.staticTemplate,deduceLocale());
TemplateModel model = createModel();
String path = ServletActionContext.getServletContext().getRealPath(filePath)+ File.separator;
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path + fileName)));
if (preTemplateProcess(template, model)) {
try {
//在指定路径生成静态页面
staticTemplate.process(model, out);
//生成跳转的页面
template.process(model, getWriter());
} finally {
postTemplateProcess(template, model);
postTemplateProcess(staticTemplate, model);
}
}
}

hbsoft2008 2009-06-15
  • 打赏
  • 举报
回复
顶一哈
mengtianyalll 2009-06-15
  • 打赏
  • 举报
回复
一群高手,学习中
shshy39 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 imyourgod 的回复:]
我一直没搞懂你到底要做什么事?没看懂你的 Hell.ftl文件代码二
[/Quote]
@cms.ArtiList是个模板自定义标签,是另外一个ftl文件有定义,该标签有很多属性已经设置好,现在引用该标签,只需要写入需要的属性即可.
要做的事就是把该标签替换为根据属性得来的相应值.不知道你了解清楚没?
imyourgod 2009-06-15
  • 打赏
  • 举报
回复
我一直没搞懂你到底要做什么事?没看懂你的 Hell.ftl文件代码二
shshy39 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 shuai45 的回复:]
那你就把 动态的部分也写成静态的。
有新数据就在生成。
A.html引用B.html
[/Quote]
不引用啊~!就是页面上的标签替换相应的数据就可以,我感觉是可以实现的;
有QQ没,加起聊
shuai45 2009-06-11
  • 打赏
  • 举报
回复
那你就把 动态的部分也写成静态的。
有新数据就在生成。
A.html引用B.html
shshy39 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 shuai45 的回复:]
引用 23 楼 shshy39 的回复:
有个叫CMS4J的做出来了,但是需要购买的价格高达9800RMB,实在让人感慨啊~!


有相关资料没
[/Quote]
看看这个网站吧:http://www.cms4j.com/sell/index.html
shshy39 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 shuai45 的回复:]
我估计你的思路是这样的:
实现一个静态
1、A。html
2、A。htlm中有动态变量
3、你想将动态变量也变成静态的
从而实现挣页静态化,是不。
如果动态变量 都被静态和谐了,那还谈什么动态变量。
[/Quote]
我要是全静态啊,不是被和谐了。。。
//1 修改文章即把数据流获取,自动生成静态页 response.getWriter()
//2 非修改文章即定时生成静态页 需要根据模板+数据模型
shuai45 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 shshy39 的回复:]
有个叫CMS4J的做出来了,但是需要购买的价格高达9800RMB,实在让人感慨啊~!
[/Quote]
有相关资料没
加载更多回复(24)
第1章 JAVAPMS概述 1.1. 系统简介 JAVAPMS是JAVA门户管理系统(JAVA Portal Management System)的简称,以Sping+Hibernate+Freemarker+Html5+jQuery为技术核心架构,集系统管理、文档管理、审核工作流、基于模板的文档发布、页面静态化、内容检索、多媒体文档管理于一身,面向广大站长、软件开发者、程序爱好者、网页设计师,适用于个人站长、商业企业、政府机构、教育机构和其它各种单位组织的信息门户网站建设,是一款技术先进、安全稳定、操作友好、注重用户体验的JAVA门户管理系统,倾力打造JAVA、JSP门户管理系统品牌。 1.2. 安全高效的Java语言开发 Java是一种被广泛使用的网络编程语言,主要应用于企业、政府部门、电信、银行、手机平台开发等多个领域,是现在大型软件项目开发中的主角,长期占据《TIOBE世界编程语言排行榜》第一的宝座。随着Internet的发展,Java语言以其强大的生命力得到了越来越广泛的应用。Java语言之所以受人推崇,是因为它确实称得上是一种新一代编程语言,具有面向对象、可移植性好、与硬件无关、系统强健安全、提供了并发机制、性能高的众多优点,并提供了分布性、多线程、动态性的支持。 Java作为一种重要的开发工具,它具有七个主要特性:安全性、核心API、开放式标准、分布式和动态结构、面向对象、多线程、内存管理。 TIOBE发布的编程语言排行榜 1.3. 完善合理的技术架构 系统选用了经过java社区长时间使用,被证明稳定、可靠、安全、高性能的开源框架,包括Spring、Hibernate、Freemarker、jQuery、Shiro等框架。使用这些框架可以使软件开发更加高效、易于维护,而且具有更好的性能、更高的安全性。 1.4. 全面稳定的平台兼容性 在操作系统平台兼容性方面,系统可以在Linux、UNIX、Windows等系统上运行。客户可以根据自身情况选择自己熟悉的或正在使用的操作系统,减小维护成本。 在数据库平台兼容性方面,系统数据库持久层采用hibernate实现,使得系统可以支持几乎所有的数据库平台,包括Oracle、DB2、Microsoft SQL Server、MySQL、PostgreSQL等。这对于已经购买或熟悉某一类型数据库产品的用户非常有利,用户不必购买或维护多套不同的数据库,大幅度减低成本。 在应用服务器平台兼容性方面,系统支持跨应用服务器,如Tomcat、Weblogic、Webspere、JBoss等应用服务器,很好的满足了各层次用户的需求。 在浏览器兼容性方面,目前多种浏览器并存,使用非IE浏览器的用户越来越多,即使是IE浏览器也有多种版本。系统所有web页面制作遵循w3c标准制作,采用最新的html5规范,基于div+css布局,所有标签生成的html代码都经过跨浏览器测试。javascript脚本基于jquery和javascript标准编写,有效的解决了js跨浏览器的问题,系统可以在IE6、IE7、IE8、IE9、FireFox、Chrome、Opera、Safari浏览器下平稳运行。 1.5. 强大的中文采集与检索技术 系统支持强大的中文检索组件,可以对内容进行高效的全文检索,支持所有流行文档格式的检索,能够自动提取文本正文、生成内容摘要,能够自定义检索结果展现形式,以满足不同行业的特殊要求,构建细分领域内的垂直搜索引擎。 第2章 系统功能介绍 2.1. 系统登录 管理员对网站进行日常维护前须先进入管理后台登录页面,在输入帐号和密码后即可进入后台管理中心,如果登录信息输入错误超过三次,系统将要求输入验证码,防止恶意登录行为,加强系统安全性,登录界面如下图: 2.2. 我的工作台 2.2.1. 个人资料 在我的工作台中,管理员可以点击左侧的“个人资料”修改和完善自己的帐户信息,如真实姓名、电子邮箱、联系电话等,如下图所示: 2.2.2. 修改密码 点击我的工作台左侧的“修改密码”,可以对管理员登录密码进行修改,系统要求输入原密码,然后输入两次新密码,界面如下: 2.3. 文档中心 文档中心主要管理全站信息的发布,是系统的一个核心功能,可以对全站文档进行管理,栏目管理,模型管理,文档属性管理。 2.3.1. 文档管理 点击“文档中心”左侧功能菜单的“文档管理”,文档按所属栏目树形组织管理,点击相应的栏目将会在右边显示改栏目下的文章列表,配合多样化的文章搜索功能,可根据文档标题、文档状态(草稿、审核与否、回收站等)、文章属性(普通、图文、焦点、头条等)、进行文档搜索,文档列表界面如下所示: 添加或修改文章时,可设置文档所属栏目、标题、外部链接、副标题、标题颜色、短标题、自动T

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧