`
colonel
  • 浏览: 30785 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

抛砖:用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等。       
        比较这两种方法:
        方法一:在需要生成分页文件时,比较合适。
        方法二:可以象往常一样使用,一次需要生成多文件则不适合。

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

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

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

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

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

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

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


就是这样。
11 楼 CrayEye 2007-04-06  
关于第一个方法:

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

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



想利用webwork构建好model只能用第二种方法么
10 楼 caocao 2007-02-09  
colonel 写道
我在开发相关项目的时候,也没有一个好的方法管理海量的静态页面,所以如果各位晓得的话,请多多指教。


我一个站点是按日期存静态文件目录,每天凌晨切换目录,所有文件的文件名是URL的32位MD5 Hash,对外链接不变,访问了才生成静态文件,一天有好几个G,切换目录后有另一个程序去删老的目录。
9 楼 colonel 2007-02-08  
我在开发相关项目的时候,也没有一个好的方法管理海量的静态页面,所以如果各位晓得的话,请多多指教。
8 楼 colonel 2007-02-08  
引用
quaff     1 天前
第二种方法,覆盖FreemarkerResult的
protected void postTemplateProcess(Template template, TemplateModel model)方法,在这个方法里面生成静态页面


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

相关推荐

    抛砖引路单片机----

    1.前言 2.硬件平台建立 3.软件平台建立 4.ISP下载线的制作与使用

    【抛砖篇】acer4736z笔记本拆机教程

    详细介绍了acer4736z的拆机步骤,方便的大家自己动手清理灰尘,了解本本的结构。

    关于sql注入的简要演示(入坑抛砖)

    主要介绍了关于sql注入的简要演示(入坑抛砖),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    USBoot 2.11

    对于把XP装进U盘或移动硬盘一直是个让人感兴趣的话题,对于要经常使用几台电脑移动办公的朋友更是意义不言而喻。许多时候,异地办公时资料和软件的不同步,更有甚者,系统的操作界面、主题等与习惯上的不一致,也...

    Web服务完整实例构建Web通道(Web服务端) 简单、规范、易学、易用

    本文所提供的资料中,有详细的安装、使用方法(其中也有Web服务端的收发规则),可参考、试用、交流。 由于笔者水平有限,疏漏之处难免,望网友指正,以便大家共同提高! QQ:527800911、微信:13947680916 2019.6...

    C++中精确计时的方法

    本文要介绍的,是另一种直接利用Pentium CPU内部时间戳进行计时的高精度计时手段。以下讨论主要得益于《Windows图形编程》一书,第 15页-17页,有兴趣的读者可以直接参考该书。...本文仅仅作抛砖之用。

    毕业论文-基于Delphi开发的c语言学习系统设计与实现

    2) 经典例题管理:收录了一些经典编程实例,并作了详细注释,给同学们起到抛砖 引玉的作用,使用户了解编程算法,并提高用户阅读程序的能力。 3) 章节试题管理:用户可以通过此模块测试自己,了解自己的不足,起到查...

    使用matlab做的简单网络爬虫-DataRetrieval.m

    代码如下,仅作交流使用,期望起到抛砖迎玉的效果,matlab其强大功能需要我们一起发觉。:D urlread获取的源文件貌似不支持中文字符,不知道怎么解决,求交流解决办法。 % 本程序用于获取网站中的表格 % written ...

    贪吃蛇(微信小程序游戏).rar

    微信小程序游戏源代码:贪吃蛇 学习小程序开发的同学可以下载学习,抛砖迎玉, 请使用微信最新版开发工具打开运行

    SelectorDemo.7z

    Moba等游戏中,需要进行框选物体,但是如果地面不平整,用常规的BOX就无法制作贴合地面的选择器,利用贴花来制作,则可以完全100%贴合地面。贴花还有很多用途,比如制作技能范围展示等等,这里只是抛砖引用。文章...

    浅谈QA所应该具备的知识

    在中国目前的中小软件企业,...另外,由于笔者资历尚浅,既没有丰富的经验与知识体系,也没有大师级的天分,写这些真是诚慌诚恐,权当笔者在这里抛砖吧,希望引出更多的玉来,我相信,您就是一块玉,希望聆听您的指正。

    用VS2008 ATL开发可以显示Gif的ActiveX控件源码.rar

    本文只是举例说明开发过程,抛砖而已。  2.样例只是框架,不能直接使用,所有代码没有经过测试  3.样例接收器GifSink和属性页卡片没有完成,懒了,呵呵  4.样例背景等很多属性没有实现  5.使用了GDI ,但GDI 的...

    Kivy-Display:基于Kivy的文物图片三维模型触屏展示软件

    借鉴的另一个人的代码,我这里抛砖引。 这个项目是要连接数据库,获取并展示文物信息,那么就让单独一个database.py文件获取到后,一直保留着就可以了。咱也不知道数据量有多大,炸了再说。 那没数据库也不是跑不了...

    传智播客扫地僧视频讲义源码

    03_用面向过程和面向对象方法求解圆形面积_类和对象的关系思考_传智扫地僧 04_类中不写成员函数易犯错误模型 05-易犯错误模型-为什么需要成员函数(补充资料)-传智扫地僧 06_课堂答疑类中写成员函数_调用的时才会执行...

    Monkey黑白棋 (C#源代码)

    主要我怕部分“懒人”修改本程序的界面,然后作为自己的东东去发布,还美其名曰“原创”(汗!),我想你不会是这样的人。 发源代码的目的是抛砖引玉(小弟我抛砖,有玉的尽量砸过来)。AI算法是通用的,并不...

    SuperSocket_WebSocket_WebSocket4Net服务器需要的DLL

    基于SuperSocket的服务器 和 客户端程序 所需要的DLL 服务器端<控制台Console程序> (.Net4.0)需要引用 ...本人菜鸟一枚,抛砖引入,欢迎一起来研究这个Socket开发框架 QQ:2360450496 SuperSocket官方QQ群373076764

    易语言超文本浏览框和程序交互源码

    利用超文本浏览框的即将跳转事件作为中转,就可以获得从网页上点击后要跳转的地址,这个地址将作为exe要执行什么操作的指令...本例程只做抛砖之用,高手飘过。。。。。。@易语言源码分享站。Tags:易语言超文本浏览框。

    【新】一个部分支持Unicode的精易模块-易语言

    文件目录部分(Unicode化了部分常用命令,一些使用核心库的命令无法处理): W版正则: W版文件搜索(该部分源码作者是:home.php?mod=spaceuid=320499 ,该命令可以无缝衔接核心库的文件搜索): PS: 对于更多命令...

    Java实战篇:设计自己的Annotation

    Annotation在java的世界正铺天盖地展开,有空写这一篇简单的annotations的文章,算是关于Annotation入门的文章吧,希望能各位们能抛砖,共同学习......

Global site tag (gtag.js) - Google Analytics