首页纯静态化,频道及其他页面通过urlrewrite伪静态。现在废话少说。我先给出首页jsp body源代码: Java代码


整个网站首页的基本结构是通过jsp的include标签将所有通过freemarker生成的静态页面组织起来。后台控制各个部分的静态页生成。这样做将首页进行了拆分,便于了静态页面的维护,当我们需要生成“友情链接”部分的时候就只生成友情链接部分,而不需要将整个页面都从新生成一次。 以下是我生成静态页最核心的方法,使用freemarker。 Java代码 /** * 生成静态页面主方法 * @param context ServletContext * @param data 一个Map的数据结果集 * @param templatePath ftl模版路径 * @param targetHtmlPath 生成静态页面的路径 */ ublic static void crateHTML(ServletContext context,Map 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(); } /** * 生成静态页面主方法 * @param context ServletContext * @param data 一个Map的数据结果集 * @param templatePath ftl模版路径 * @param targetHtmlPath 生成静态页面的路径 */ public static void crateHTML(ServletContext context,Map 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 data : 模版的数据来源。freemarker通过一个Map给ftl模版送数据。 现在已友情链接为列子详细介绍静态页面如何生成。其他模块以此类推。 String templatePath : ftl所在的路径。我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 String targetHtmlPath : 最后生成静态页的路径:我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 友情链接根据这段代码我们需要freemarker生成一个index_link.html文件。友情链接数据来源通过数据库查询获取。 然后再写一个方法专门生成友情链接静态页面: Java代码 /** * 生成友情链接的静态页index_link.html * @param context * @param data */ ublic static void createIndexFriendLink(ServletContext context,Map data){ crateHTML(context,data,"index_link.ftl","index_link.html"); /** * 生成友情链接的静态页index_link.html * @param context * @param data */ public static void createIndexFriendLink(ServletContext context,Map data){ crateHTML(context,data,"index_link.ftl","index_link.html"); } 此方法调用上面的createHTML方法。 然后根据以上方法我们就可以再Struts2的action里面从数据库查询数据放入map调用createIndexFriendLink()方法生成静态页了。 这是action中的一个方法: Java代码 /** * 生成友情链接静态页index_link.html * @return */ public String createLink(){ //权限验证 if(! this.isAccess()) return "error"; try{ //得到友情链接 List links = friendLinkDAO.findAll(); //准备数据 HashMap data = new HashMap(); data.put("links", links); //调用静态页面方法 HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data); addActionMessage("静态页面生成成功!"); return "message"; }catch(Exception e){ e.printStackTrace(); return "failure"; } } /** * 生成友情链接静态页index_link.html * @return */ public String createLink(){ //权限验证 if(! this.isAccess()) return "error"; try{ //得到友情链接 List links = friendLinkDAO.findAll(); //准备数据 HashMap data = new HashMap(); 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 data = new HashMap(); data.put("links", links); 准备数据调用createIndexFriendLink()方法。 以下是:ftl模版源码: Java代码 <#if links?size != 0>


友情链接: <#list links as link> ​​${link.linkName}​​


<#else>

<#if links?size != 0>


友情链接: <#list links as link> ​​${link.linkName}​​


<#else>

这样友情链接静态页就生成了。然后其他静态页依此葫芦画瓢。 总结:虽然静态页访问速度快,但实现起来毕竟还是比较麻烦了,维护也是一个麻烦事情。如果您的站点更新速度快那么就需要在你的后台数据更新部分调用相应的createHTML方法实时的生成静态页面。如果更新速度不慢可以在后台手动更新或者利用操作系统的定时任务功能去执行你的静态页面生成程序