1 Freemarker网站静态化的实现(转)
首页:
1.
<
body
>
2.
<
div
id
="wrap"
>
3.
<!--
头部开始
-->
4.
<
jsp:include
page
="/html/top.html"
flush
="true"
></
jsp:include
>
5.
<!--
头部结束
-->
6.
<!--
导航开始
-->
7.
<
jsp:include
page
="/html/channel.html"
flush
="true"
></
jsp:include
>
8.
<!--
导航结束
-->
9.
<
jsp:include
page
="/html/center.html"
flush
="true"
></
jsp:include
>
10.
<!--
友情连接开始
-->
11.
<
jsp:include
page
="/html/index_link.html"
flush
="true"
></
jsp:include
>
12.
<!--
友情结束
-->
13.
<!--
底部开始
-->
14.
<
jsp:include
page
="/html/bottom.html"
flush
="true"
></
jsp:include
>
15.
<!--
底部结束
-->
16.
</
div
>
17.
</
body
>
整个网站首页的基本结构是通过jsp的include标签将所有通过freemarker生成的静态页面组织起来。后台控制各个部分的静态页生成。这样做将首页进行了拆分,便于了静态页面的维护,当我们需要生成“友情链接”部分的时候就只生成友情链接部分,而不需要将整个页面都从新生成一次。
以下是我生成静态页最核心的方法,使用freemarker。
/** */
/** * 生成静态页面主方法 * @param context ServletContext * @param data 一个Map的数据结果集 * @param templatePath ftl模版路径 * @param targetHtmlPath 生成静态页面的路径 */
public
static
void
crateHTML(ServletContext context,Map
<
String,Object
>
data,String templatePath,String targetHtmlPath)
{ Configuration freemarkerCfg = new Configuration(); // 加载模版 freemarkerCfg.setServletContextForTemplateLoading(context, " / " ); freemarkerCfg.setEncoding(Locale.getDefault(), " UTF-8 " ); try { // 指定模版路径 Template template = freemarkerCfg.getTemplate(templatePath, " UTF-8 " ); template.setEncoding( " UTF-8 " ); // 静态页面路径 String htmlPath = context.getRealPath( " /html " ) + " / " + targetHtmlPath; File htmlFile = new File(htmlPath); Writer out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(htmlFile), " UTF-8 " )); // 处理模版 template.process(data, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); }
其实很简单,只要Google一下就有很多这方面的代码。我也是Google的代码然后自己再根据实际情况修改。简单说明一下参数:
ServletContext :这个不用说了吧。做java web的应该都知道,只不过struts2中这样获取ServletActionContext.getServletContext()
Map<String,Object> data : 模版的数据来源。freemarker通过一个Map给ftl模版送数据。
现在已友情链接为列子详细介绍静态页面如何生成。其他模块以此类推。
String templatePath : ftl所在的路径。我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。
String targetHtmlPath : 最后生成静态页的路径:我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。
友情链接根据这段代码<jsp:include page="/html/index_link.html" flush="true"></jsp:include>我们需要freemarker生成一个index_link.html文件。友情链接数据来源通过数据库查询获取。
然后再写一个方法专门生成友情链接静态页面:
/** */
/** * 生成友情链接的静态页index_link.html * @param context * @param data */
public
static
void
createIndexFriendLink(ServletContext context,Map
<
String,Object
>
data)
{ crateHTML(context,data, " index_link.ftl " , " index_link.html " );
此方法调用上面的createHTML方法。
然后根据以上方法我们就可以再Struts2的action里面从数据库查询数据放入map调用createIndexFriendLink()方法生成静态页了。
这是action中的一个方法:
/** */
/** * 生成友情链接静态页index_link.html * @return */
public
String createLink()
{ // 权限验证 if ( ! this .isAccess()) return " error " ; try { // 得到友情链接 List links = friendLinkDAO.findAll(); // 准备数据 HashMap < String,Object > data = new HashMap < String,Object > (); data.put( " links " , links); // 调用静态页面方法 HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data); addActionMessage( " 静态页面生成成功! " ); return " message " ; } catch (Exception e) { e.printStackTrace(); return " failure " ; } }
List links = friendLinkDAO.findAll();通过spring注入action的hiberate DAO获取数据给list然后通过以下代码
HashMap<String,Object> data = new HashMap<String,Object>();
data.put("links", links);
准备数据调用createIndexFriendLink()方法。
以下是:ftl模版源码:
<
#if
links?size !
= 0>
<div class
="link"
>
<
strong
>
友情链接:
</
strong
>
<
#list
links as link
>
<
a
href
="${link.linkUrl}"
target
="_blank"
title
="${link.linkName}"
>
${link.linkName}
</
a
>
</
#list
>
</
div
>
<
#else
>
<
div
class
="link"
></
div
>
</
#if
>
这样友情链接静态页就生成了。然后其他静态页依此葫芦画瓢。