`

使用FreeMarker/Jsp(WebWork2) 生成静态/动态RSS文件

    博客分类:
  • rss
阅读更多

scud(飞云小侠)  http://www.jscud.com 转载请注明作者/来源关键字:rss,freemarker,rss.xml,webwork2RSS在网络上大行其道,各种网站都加上RSS支持,我最近也研究了一下,给我的文章也加上了RSS订阅.RSS目前用的也有几个版本,很是混乱,下面以RSS2.0为例来说明.网络上有个rsslibj库,是用来生成rss支持文件的,不过已经好久没有更新了,它是用xml的方式生成的.本文的例子不用到任何xml解析器,不过当然要知道最后生成的XML文件的格式才行,关于RSS规范,可以浏览一下 http://blogs.law.harvard.edu/tech/rss .在计划生成RSS文件的时候,顺便搜索了一下JIRA和Confluence的程序,发现它们分别是用模板方式和JSP动态页面来展示的.于是我也想到两种方式:
1.用FreeMarker生成静态文件,适用于更新不是很频繁的内容.
2.用JSP动态展示,适合更新频率高,种类繁多的内容.还是以本站的新闻举例,其中的新闻信息类参考 http://www.jscud.com/srun/news/viewhtml/3_2005_8/76.htm ,此处不在列出.(一) 先说FreeMarker方式.根据RSS的规范,得到模板如下:<?xml version='1.0' encoding='UTF-8' ?>
 <rss version='2.0'>
 <channel>
  <title>JScud Develop</title>
  <link>http://www.jscud.com/</link>
  <language>zh-cn</language>
  <description >JScud Develop By Scud</description>
  <webMaster>xxx@21cn.com(scud)</webMaster>
  <lastBuildDate>${rssutil.formatRssDate(now)}</lastBuildDate>
   
   <#list newslist as onenews>
  <item>
   <title>${onenews.title?xml}</title>
   <link>http://www.jscud.com/srun/news/viewhtml/${onenews.htmlFilePath}/${onenews.nid}.htm</link>
   <pubDate>${rssutil.formatRssDate(onenews.addtime)}</pubDate>
   <description><![CDATA[
  ${rssutil.formatRssCData(onenews.showContent)}
   ]]>
   </description>
   </item>
 </#list>
  </channel>
 </rss>其中的网址和网站名称可以根据自己的实际情况修改.我每次取出最新的20条文章来生成RSS,不过内容比较多,生成的RSS文件比较大,看到有的网站的description只是放了文章摘要的内容,这样文件就小多了.总之是根据自己的需求设计吧.其中用到的RssUtil函数库的函数如下(日期的函数参考上一篇文章):
    /**
     * 把]]>替换为]]&gt;
     * @param content 内容
     * @return 格式化后的内容
     */
    public static String formatRssCData(String content)
    {
        String result = StringFunc.replace(content,'\\]\\]>',']]&gt;');
       
        return result;
    }
   
    /**
     * 格式化为xml需要的字符串
     * @param field 内容
     * @return 格式化后的串
     */
    public static String formatString2XML(String field)
    {
        return StringFunc.str2TextXML(field);
    }
   
    public static String getNowDateTime()
    {
        return formatRssDate(DateTime.getNowTimestamp());
    }

利用FreeMarker生成静态文件的代码如下: private Configuration freemarker_cfg = null;
 
    protected Configuration getFreeMarkerCFG()
    {
        if (null == freemarker_cfg)
        {
            // Initialize the FreeMarker configuration;
            // - Create a configuration instance
            freemarker_cfg = new Configuration();            freemarker_cfg.setClassForTemplateLoading(this.getClass(), '/htmlskin');            freemarker_cfg.setDefaultEncoding('GBK');
        }        return freemarker_cfg;
    }    public boolean geneFileByFreeMarker(String templateFileName, Map propMap, String filePath,
                    String fileName, String encode)
    {
        try
        {
            Template t = getFreeMarkerCFG().getTemplate(templateFileName);            File afile = new File(filePath + '/' + fileName);            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(afile),
                            encode));            propMap.put('baseurl', PropSet.getStringProp('url.root'));            t.process(propMap, out);
        }
        catch (TemplateException e)
        {
            LogMan.error('Error while processing FreeMarker template ' + templateFileName, e);
            return false;
        }
        catch (IOException e)
        {
            LogMan.error('Error while generate File ' + fileName, e);
            return false;
        }        return true;
    }

新闻系统中调用重新生成RSS文件的代码如下:    /**
     * 重新生成RSS文件.
     *
     * @param nid 更新的新闻的id,如果不包含在最新的新闻里,则不更新RSS.nid <1则更新
     *
     * @return 是否成功
     */
    private boolean renewRSS(int nid)
    {
        List newsList = 装载新闻的代码        boolean shouldUpdate = false;
        if (nid > 0)
        {
            for (int i = 0; i < newsList.size(); i++)
            {
                NewsItem aNews = (NewsItem) newsList.get(i);
                if (aNews.getNid() == nid)
                {
                    shouldUpdate = true;
                    break;
                }
            }
        }
        else
        {
            shouldUpdate = true;
        }        //不更新,则返回
        if (!shouldUpdate)
        {
            return true;
        }        Map root = new HashMap();
       
        root.put('rssutil',new RSSUtil());        root.put('newslist', newsList);
       
        root.put('now',DateTime.getNowTimestamp());        geneFileByFreeMarker('/news/rss.ftl', root, PropSet.getStringProp('rss.rssdir'), PropSet
                        .getStringProp('rss.rssfile'), 'UTF-8');        return true;
    }


在增加或者更新/删除新闻的地方需要调用这个renewRSS函数.(二)JSP动态方式相对静态方式而言,简单的多,不过效率上可能就不太好了.webwork2的Action代码如下:        newsList = 装载新闻代码
        return SUCCESS; 
视图Jsp如下:
<%@ page contentType='text/xml; charset=UTF-8'%>
<%@ taglib uri='jscud' prefix='jscud' %>
<%@ taglib uri='webwork' prefix='ww' %>
<ww:bean name='’com.jscud.www.util.RSSUtil’' id='rssUtil' />
<?xml version='1.0' encoding='UTF-8' ?>
 <rss version='2.0'>
 <channel>
  <title>JScud Develop</title>
  <link>http://www.jscud.com/</link>
  <language>zh-cn</language>
  <description >JScud Develop By Scud</description>
  <webMaster>xxx@21cn.com(scud)</webMaster>
  <lastBuildDate><ww:property value='#rssUtil.nowDateTime' /></lastBuildDate>
   
   <ww:iterator value='newsList'>
  <item>
   <title><ww:property value='#rssUtil.formatString2XML(title)'/></title>
   <link>http://www.jscud.com/srun/news/viewhtml/<ww:property  value='htmlFilePath' />/<ww:property  value='nid' />.htm</link>
   <pubDate><ww:property  value='#rssUtil.formatRssDate(addtime)' /></pubDate>
   <description><![CDATA[
  <ww:property value='#rssUtil.formatRssCData(showContent)'/>
   ]]>
   </description>
   </item>
 </ww:iterator>
  </channel>
 </rss>
jsp的方式简单多了,上面的jsp里面还演示了ww:bean的使用 :)
上面的类里面引用了很多其他的工具类,这里不一一列出,可以自己实现它们,都是很简单的类. :)

分享到:
评论

相关推荐

    使用FreeMarker生成Html静态文件

    5. **静态文件生成**: 渲染后的HTML内容可以写入到文件系统,生成静态HTML文件。这样,Web服务器可以直接返回这些静态文件,提高网站的访问速度。 6. **优化与调试**: FreeMarker支持缓存机制,可以提高模板的加载...

    freemarker把jsp静态化简单应用

    通过以上步骤,你就可以在MyEclipse中使用FreeMarker实现JSP页面的静态化。记住,良好的分层设计和模板使用习惯能显著提高代码质量,使项目更加易于维护和扩展。继续深入学习FreeMarker的高级特性,你将能够更高效地...

    FreeMarker与struts2整合生成静态页面

    FreeMarker与Struts2的...通过这个案例,开发者可以学习到如何将FreeMarker与Struts2结合起来,实现动态生成静态页面,以及如何使用c3p0和dbUtils进行数据库操作。这对于理解Web应用的架构和提高开发效率具有重要意义。

    生成静态页面 freemarker模板

    在IT行业中,生成静态...总之,使用Freemarker和Struts2生成静态页面能够提高网站的访问速度,降低服务器压力,同时简化了开发流程。结合合理的缓存策略和自动化更新机制,可以实现高效、自动化的静态页面生成方案。

    Java中使用 FreeMarker 生成pdf盖章合同文件

    本篇文章将深入探讨如何在Java中使用FreeMarker生成带有盖章的PDF合同文件。 首先,让我们了解FreeMarker的基本概念。FreeMarker是一个基于模板的语言,它与Java代码分离,允许开发者用简单的模板语法来表示数据。...

    freemarker生成静态网页

    本篇文章将深入探讨如何使用Freemarker来生成静态网页,并通过一个简单的小例子进行说明。 首先,理解Freemarker的基础概念是必要的。Freemarker是一个基于模板的、声明式的模板语言,它的主要任务是将数据模型和...

    freemarker根据模版生成文件使用例子

    通过上述案例,我们可以看到Freemarker在生成动态文件方面的强大能力。它不仅能够灵活地处理各种数据模型,还能高效地生成格式化的文本文件。对于像Hibernate这样的框架而言,这无疑提供了一种便捷的方式来管理其...

    FreeMarker教你如何生成html静态页面源码

    5. **生成静态文件**:一旦HTML源码生成,你可以将其写入到磁盘上的一个文件中,从而创建静态页面。确保选择合适的路径,并正确处理文件的创建和覆盖。 6. **优化和调试**:在实际应用中,你可能需要对模板进行优化...

    springboot中使用freemarker动态生成word文档,以及使用POI导出自定义格式Excel

    Springboot项目中: 1. 使用Apache POI 3.9 自定义样式导出Excel文件...2. 使用freemarker动态生成word .doc文档(带图片Word以及复杂格式word) 详细说明见个人博客及 github: https://github.com/DuebassLei/excel-poi

    struts2+freemarker 生成静态页面

    总之,“struts2+freemarker 生成静态页面”是一个旨在提升Web应用性能的技术实践,通过结合Struts2的MVC框架和FreeMarker的模板引擎,实现了动态内容到静态HTML的转化,为用户提供更快的加载速度和更好的浏览体验。...

    springboot整合freemarker生成静态html的demo.zip

    在本项目"springboot整合freemarker生成静态html的demo.zip"中,我们将探讨如何将SpringBoot框架与FreeMarker模板引擎结合,以实现动态数据驱动的静态HTML页面生成。FreeMarker是一个强大的、开源的模板语言,它允许...

    freemarker + xml模板动态生成word 文档 源码

    Freemarker动态生成word,包含文字替换,freemarker嵌入自定义java函数,动态生成表格列,插入图片的示例,同时使用spire将wordxml格式转换成word文档(doc格式),还包含文件下载示例

    freemarker+xml动态模板生成doc文件技术

    本篇文章将深入探讨如何利用`Freemarker`和XML来动态生成DOC文件,以及这种方式相比其他技术的优势。 首先,`Freemarker`是一个开源的模板引擎,它的主要用途是将数据模型与HTML或其他格式的模板结合,生成最终的...

    Struts2整合Freemarker生成静态页面

    8. **静态页面生成**:整合Struts2和Freemarker的一个常见应用是生成静态页面,提高网站性能。这通常通过在Action中触发静态化逻辑,将Freemarker渲染后的HTML保存到磁盘,然后直接返回这些静态页面。 9. **错误和...

    FreeMarKer+jsp使用(Struts2+Servlet).

    Struts2默认使用FreeMarker作为其模板技术,所有的主题模板文件都是基于FreeMarker编写的。例如,当配置一个Struts2动作(Action)时,结果(Result)可以指向一个FreeMarker模板文件(`.ftl`)而不是传统的JSP页面...

    freemarker生成xml示例

    在Java中,Freemarker与数据模型结合,通过模板文件生成输出。对于XML生成,首先我们需要准备以下几个部分: 1. **数据模型(Model)**:这是你要生成XML所依赖的数据,可以是Java对象、Map或者其他集合类型。例如...

    freemarker生成静态html示例

    本示例项目是在Eclipse环境中创建的一个工程,目的是演示如何使用Freemarker来生成静态HTML页面。 在了解这个项目之前,首先需要知道什么是Freemarker。Freemarker是一个开源的Java库,它允许开发者通过定义模板(....

    springboot+mybatisplus+逆向工程+jsp/freemarker/thymeleaf+bootstrap+layer整合

    【SpringBoot + MybatisPlus + 逆向工程 + JSP/Freemarker/Thymeleaf + Bootstrap + Layer 整合】 SpringBoot 是一个由 Pivotal 团队开发的框架,它旨在简化 Spring 应用程序的初始搭建以及开发过程。SpringBoot ...

Global site tag (gtag.js) - Google Analytics