`
colonel
  • 浏览: 30913 次
  • 性别: 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  
顶起来!

相关推荐

    抛砖引路单片机----

    《抛砖引路单片机》是一本针对初学者的单片机学习指南,旨在引领读者逐步走进单片机的世界。书中的内容分为四个主要部分,涵盖了从理论基础到实践操作的各个环节,对于想要深入了解单片机技术的人来说,无疑是一份...

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

    一字螺丝刀在某些情况下可以用作撬棍,但应选择薄型的,以保证强度的前提下尽可能薄,以便使用。此外,镊子在对付某些细小部件时也有很好的效果,但并非必须。 在拆卸笔记本时,还应注意保护内部零件,比如在拆卸...

    WMS系统操作手册

    浙江三花智能控制股份有限公司自主开发的WMS系统操作手册旨在帮助用户快速掌握WMS系统的操作和使用方法。 软件概述 WMS系统是一款基于Web的仓储管理系统,旨在帮助仓库管理员和供应链管理者更好地管理仓库的日常...

    factoryio2.5工厂流水线仿真程序,期末专周可用,多个场景可以咨询 使用简单的梯形图与SCL语言编写,通俗易懂,起到抛砖

    使用简单的梯形图与SCL语言编写,通俗易懂,起到抛砖引玉的作用,比较适合有动手能力的入门初学者。 软件环境: 1、西门子编程软件:TIA Portal V15(博图V15) 2、FactoryIO 2.4.0 内容清单: 1、FactoryIO中文说明...

    USBoot 2.11

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

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

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

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

    尽管在这个特定的示例中没有成功,但攻击者可以通过各种方法,如枚举、猜测或利用其他数据库对象的信息,来尝试获取数据库名。 SQL注入的危害极大,攻击者可以利用它窃取、修改或删除数据库中的数据,甚至完全控制...

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

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

    抛砖引玉的近义词及意思精选.doc

    【抛砖引玉】是一个汉语成语,源自古代建筑工艺中的一种说法,比喻用自己不成熟的意见或作品引出别人更好的意见或作品。这个成语通常用于谦虚地提出自己的见解或建议,希望他人能够提出更优秀的想法或解决方案。近义...

    【工程文档】-砌砖工程安全技术交底记录表.doc

    使用φ9毫米小铁闩固定,严禁用铁钉代替,每条桥枋最多允许两人站立,上下脚手架需使用木梯,禁止攀爬。 6. **材料堆放与荷载**:楼层面材料堆放,尤其是砖块,不得超过设计荷载,脚手架上的砖块堆放不超过三皮侧砖...

    SelectorDemo.7z

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

    用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: 对于更多命令...

    PHP简洁函数小结

    PHP简洁函数 主题:类菌体PHP简洁函数 简述:PHP简单明了函数语法 适合人群:对开源社区感兴趣,对php感兴趣,有一点时间了解下php 备注:希望大家抛砖,仍蛋,呵呵 1、与mysql相关 mysql_connect 建立一个与MySQL...

Global site tag (gtag.js) - Google Analytics