当前位置: 代码迷 >> Web前端 >> 抛砖:用freemarker、webwork公布静态页面的方法
  详细解决方案

抛砖:用freemarker、webwork公布静态页面的方法

热度:248   发布时间:2012-11-03 10:57:44.0
抛砖:用freemarker、webwork发布静态页面的方法

方法一:(这个方法借鉴freemarker的docs文档Programmer's Guide 的quick start部分,详细请看相关的文档。

java 代码

?

  1. public?class?HtmlTemplateGenerator?{ ??
  2. ??
  3. ????Configuration?cfg?=?null; ??
  4. ???? ??
  5. ????public?HtmlTemplateGenerator(String?templatePath)?throws?IOException?{ ??
  6. ????????cfg?=?new?Configuration(); ??
  7. ????????cfg.setDefaultEncoding("UTF-8"); ??
  8. ????????cfg.setDirectoryForTemplateLoading(new?File(templatePath)); ??
  9. ????????cfg.setObjectWrapper(new?DefaultObjectWrapper()); ??
  10. ????} ??
  11. ???? ??
  12. ????/** ?
  13. ?????*?生成静态文件 ?
  14. ?????*?@param?ftlTemplate?ftl模版文件 ?
  15. ?????*?@param?contents????ftl要用到的动态内容 ?
  16. ?????*?@param?savePath????文件保存路径 ?
  17. ?????*?@param?saveFilename?保存文件名 ?
  18. ?????*?@throws?IOException ?
  19. ?????*?@throws?TemplateException ?
  20. ?????*/??
  21. ????public?void?create(String?ftlTemplate,?Map?contents,?String?savePath,?String?saveFilename)?throws?IOException,?TemplateException?{ ??
  22. ????????Template?temp?=?cfg.getTemplate(ftlTemplate); ??
  23. ????????/*?Merge?data?model?with?template?*/??
  24. ???????? ??
  25. ????????String?realPath?=?ServletActionContext.getServletContext().getRealPath(savePath); ??
  26. ????????System.out.println(?saveFilename?+?":"?+?realPath); ??
  27. ????????File?file?=?new?File(realPath); ??
  28. ????????if(!file.exists()) ??
  29. ????????????file.mkdirs(); ??
  30. ???????? ??
  31. ????????Writer?out?=?new?OutputStreamWriter(new?FileOutputStream(realPath?+?"/"?+?saveFilename),"UTF-8"); ??
  32. ????????temp.process(contents,?out); ??
  33. ????????out.flush(); ??
  34. ????} ??
  35. ???? ??
  36. }?????

??????? 如果用spring,可以将它配置成bean,然后在其他地方使用。第五行的 templatePath 是模版文件的路径,比如/WEB-INF/template。
??????? action中的使用:HtmlTemplateGenerator.create("html/magazine/search.ftl", null, "/magazine", "search.html"); 其中“html/magazine/search.ftl”是在“/WEB-INF/template”目录下。这里还需要注意的是。模版文件(search.ftl)中如果还要引用其他文件,它的路径也是不需要添加总路径“/WEB-INF/template”。

方法二:继承webwork的FreemarkerResult,改写getWriter方法:
不知有无好的法子。

java 代码
  1. protected?Writer?getWriter()?throws?IOException?{ ??
  2. ????????String?savePath?=?(String)?ActionContext.getContext().getSession().get("SAVE_PATH"); ??
  3. ????????String?saveFilename?=?(String)?ActionContext.getContext().getSession().get("SAVE_FILENAME"); ??
  4. ????????String?realPath?=?ServletActionContext.getServletContext().getRealPath(savePath); ??
  5. ????????System.out.println(?saveFilename?+?":"?+?realPath); ??
  6. ????????File?file?=?new?File(realPath); ??
  7. ????????if(!file.exists()) ??
  8. ????????????file.mkdirs(); ??
  9. ???????? ??
  10. ????????return?templateOut?=?new?OutputStreamWriter(new?FileOutputStream(realPath?+?"/"?+?saveFilename),"UTF-8"); ??
  11. ????}??

??????? 这里的路径和文件名通过webwork的session传入,不知有无其他好方法。
??????? 如果生成文件的同时还需要看到生成的页面,则要改写“doExecute”:

java 代码
  1. template.process(model,?getWriter()); ??
  2. template.process(model,?super.getWriter());?//添加这句 ??
  3. templateOut.flush();??

?

??????? 生成的文件格式不限于html,可以是其他文件格式,如js,text等。???????
??????? 比较这两种方法:
??????? 方法一:在需要生成分页文件时,比较合适。
??????? 方法二:可以象往常一样使用,一次需要生成多文件则不适合。

??????? 不知各位在做这些项目时,使用甚么好方法。

1 楼 idxkx 2007-01-06  
顶起来!
2 楼 qingzhuang 2007-01-19  
不错!
3 楼 jamesby 2007-01-19  
收藏先,有新的静态页面需求的时候再研究下FreeMarker,我目前用xslt转换实现的静态页面,唉老东西得舍得扔阿。
4 楼 ronghao 2007-01-19  
我用的差不多就是第一种方法,现在想的是如何把模板编辑也给可视化。开发dreamwearver插件?
5 楼 goby2008 2007-01-21  
不错,值得研究
6 楼 quaff 2007-02-06  
第二种方法,覆盖FreemarkerResult的
protected void postTemplateProcess(Template template, TemplateModel model)方法,在这个方法里面生成静态页面
7 楼 adablue77 2007-02-06  
其实我更想知道怎么管理大量的静态页面更好些,合适生成静态页面更好些,不过还是收藏了,谢谢先
8 楼 colonel 2007-02-08  
引用
quaff     1 天前
第二种方法,覆盖FreemarkerResult的
protected void postTemplateProcess(Template template, TemplateModel model)方法,在这个方法里面生成静态页面


嗯,有时间看看。
9 楼 colonel 2007-02-08  
我在开发相关项目的时候,也没有一个好的方法管理海量的静态页面,所以如果各位晓得的话,请多多指教。
10 楼 caocao 2007-02-09  
colonel 写道
我在开发相关项目的时候,也没有一个好的方法管理海量的静态页面,所以如果各位晓得的话,请多多指教。


我一个站点是按日期存静态文件目录,每天凌晨切换目录,所有文件的文件名是URL的32位MD5 Hash,对外链接不变,访问了才生成静态文件,一天有好几个G,切换目录后有另一个程序去删老的目录。
11 楼 CrayEye 2007-04-06  
关于第一个方法:

我想问一下这个 Map contents 这个data model在webwork的action中怎么得到?

是自己new一个Map 然后把数据put进去么?



想利用webwork构建好model只能用第二种方法么
12 楼 colonel 2007-04-11  
引用
关于第一个方法:

我想问一下这个 Map contents 这个data model在webwork的action中怎么得到?

是自己new一个Map 然后把数据put进去么?


就是这样。
13 楼 lyo 2007-05-08  
这个问题是及其复杂的,和具体技术无关,而是和策略有关:
论坛上的关于生成静态页面的帖子,大都回答的简单,不能用于实际项目中。单独生成一个静态页面肯定没问题,模板+数据就可以。但是真是场景是:我一个网页 A,里面包含一个网页B(就是 A中有B这篇文章)的标题。我给A生成静态页面的时候,如果知道给A里面的连接B也生成静态页面呢? 如果B文章的标题更新了,我如何知道把B重新生成静态页面的同时,也要重新把A生成静态页面呢,因为A里面包括了B的标题!因此B的标题更新后,一定要把引用B文章的所有页面都重新生成静态的html,这个如何做到呢? 多谢!
14 楼 OneEyeWolf 2007-05-08  
用JSP也可以,不需要模板。

方法是用过滤器,收到JSP页面的Response,然后,将response的内容,写在一个html文件当中。

就完事了。
15 楼 youcai 2007-05-08  
lyo 写道
这个问题是及其复杂的,和具体技术无关,而是和策略有关:
论坛上的关于生成静态页面的帖子,大都回答的简单,不能用于实际项目中。单独生成一个静态页面肯定没问题,模板+数据就可以。但是真是场景是:我一个网页 A,里面包含一个网页B(就是 A中有B这篇文章)的标题。我给A生成静态页面的时候,如果知道给A里面的连接B也生成静态页面呢? 如果B文章的标题更新了,我如何知道把B重新生成静态页面的同时,也要重新把A生成静态页面呢,因为A里面包括了B的标题!因此B的标题更新后,一定要把引用B文章的所有页面都重新生成静态的html,这个如何做到呢? 多谢!

提供静态页面的编辑功能,包括搜索替换等。
静态页面背后有数据库支持,重新输出相关联的静态页面。
这两种都是针对变化不频繁的情况,如果静态页面的某个部分变化频繁,最简单的就是包含一段动态的js。
而针对这段js使用缓存技术来提升性能。