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

抛砖:用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使用缓存技术来提升性能。