日期:2014-05-19  浏览次数:20700 次

j2ee页面静态生成方案,我的解决办法
接手一个在appfuse框架下开发的多站点管理系统,现在内容客户必须要生成静态页面,我知道这是老生常谈的问题,但是,我想在java开源的模板引擎中,一定有办法直接利用模板引擎将数据结合页面模板生成静态页面,有没高手做过类似案例,可供借鉴!
网上大多是根据动态链接获取数据生成静态页面,个人认为不是最好的解决方案!
还有页面静态化需要注意哪些问题?希望有过经验的朋友给介绍下!

网上流传一种方案是:


利用freemaker生成静态页面
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写

         FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序

         虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)

         FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件

         FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境

         FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库

   我们可以使用freemaker制作需要生成的静态页面样式。然后可利用动态绑定数据,将数据绑定到
一个simpleHash中后,使用template.process()生成一张静态页面。或者其他页面的。

然后写到文件系统中。利用这种机制我们就可以轻松的实现模板生成静态页面了。

public static String xmlGenerate(TableDecorator table)throws Exception{
  StringWriter writer = new StringWriter();
  FreemakerEngine engine = FreemakerEngine.getInstance();
  freemarker.template.Template template = engine.getTemplate("hibernate.ftl");
  SimpleHash model = new SimpleHash();
  model.put("table", table);
  template.process(model, writer);

  ByteArrayOutputStream os = new ByteArrayOutputStream();
  os.write(writer.getBuffer().toString().getBytes());
  os.flush();
  os.close();
  return new String(os.toByteArray());


但是,spring框架自身的mvc,可否在此基础上获取流,做页面静态化呢?
欢迎大家讨论!

以下是我结合楼下的经验,思考并实现的方案,现简要总结如下:



楼上三位同志,说的都很好,给我很大启发,总结三位经验,俺这里两天思考并实现的解决方案如下:
1、考虑到java众多开源模板引擎的强大功能,绝对在项目中不可丢弃而自己来写一套类似的标签,有点浪费的感觉,而且也得不偿失,项目时间也不允许!
2、其实仔细分析web mvc框架,不难发现,其中的模板引擎大都是将视图层准备好的数据用模板引擎将数据展现出来,模板引擎自身不会告诉视图层我需要哪些数据来展现在页面上,
也就是说,模板标签中没有跟视图层交互的标签,告诉视图层我需要哪些数据,你准备好给我来展现。
3、我在此思路上,加上这样的自定义标签,写一个统一的接口程序,在视图层先解析这些标签,然后交由控制层,由控制层来根据这些标签准备好数据提供给视图层,视图层把数据
传给模板引擎,由模板引擎解析数据,完成页面数据展现,这样现有所有程序无需任何改动。
4、在开发自定义标签时,需要设计动态传参,让一个模板适应不同栏目的需要,那么栏目id就需要动态传入,而每个自定义标签跟一个类绑定,根据标签提供的参数获取数据,并按标签指定的方式返回数据;
5、如何实现网页静态,我是动态创建静态页,一篇文章在添加时并没有真正生成静态页面,只是内含一个script,调用公共生成静态页接口,我是通过楼上的所说的用filter实现这样的接口,截获流输出页面,大家都很熟悉的了,
如此这般,三下子就搞定了基本的难题,现在想想,这其中有几个好处是:
1、不需要动手写自己的标签,能很好的利用现有的模板引擎!
2、程序显示逻辑简单容易开发,俺不懂的也就一天搞定,如果是你俩小时恐怕就搞定了,时间用的少就是最大的优惠啦!
3、容易扩展,如果随着模块的增加,往页面上展示的数据的不同,可以多定义一个简单的标签并多写一个类去获取数据就可以了;
4、网站页面、生成静态页程序、动态显示接口和系统管理程序都可分布部署.
文笔不好,描述的也许不清楚,大体就这个意思吧!
欢迎讨论更好方案!

1 楼 coolwasp 2007-12-18  
怎么没人顶啊!自己顶一下!
2 楼 xly_971223 2007-12-18  
以前做过 是用servlet + volicity生成的
生成任务多的话 可以单独用一台生成服务器
使之物理上 逻辑上都解耦
3 楼 timerri 2007-12-18  
只需要做一个filter,并在其中做ResponseWrap重定向输出流,就可以截获所有的servlet生成的response(包括jsp,struts,甚至静态文件),把它们保存到文件里就可以了。
这也是一般应用服务器的缓存方案...
4 楼 leadyu 2007-12-18  
生成是很容易的,不管采用静态Html还是内存缓存,关键是缓存的策略,和更新的策略,对于大的网站,更新是最大的问题,还有就是缓存的粒度。对于一个首页,可能显示的内容包罗大部分的模块,是否整体缓存,还是切割缓存,都是问题。
5 楼 coolwasp 2007-12-21  
楼上三位同志,说的都很好,给我很大启发,总结三位经验,俺这里两天思考并实现的解决方案如下:
1、考虑到java众多开源模板引擎的强大功能,绝对在项目中不可丢弃而自己来写一套类似的标签,有点浪费的感觉,而且也得不偿失,项目时间也不允许!
2、其实仔细分析web mvc框架,不难发现,其中的模板引擎大都是将视图层准备好的数据用模板引擎将数