这里对freemarker的代码进行了修改,效果:
1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件
2,自由控制某个页面是否需要静态化
原理:对org.springframework.web.servlet.view.freemarker.FreeMarkerView类进行扩展
第一步:在web.xml中将*.do请求交给SpringMVC

XML code

<servlet><servlet-name>demo</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/demo-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>demo</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>

第二步:配置/WEB-INF/demo-servlet.xml

XML code

<!--freemarker页面解析器 --><bean id="viewResolver"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"><property name="suffix" value=".ftl"></property><property name="contentType" value="text/html;charset=UTF-8" /><!-- <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" /> --><!-- 将Spring的FreeMarkerView改成我们扩展的View --><property name="viewClass" value="com.myview.MyFreeMarkerView" /><property name="exposeRequestAttributes" value="true" /><property name="exposeSessionAttributes" value="true" /><property name="exposeSpringMacroHelpers" value="true" /></bean>
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" /><!--配置Freemarker -->
<bean id="freemarkerConfigurer"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><property name="templateLoaderPath" value="/WEB-INF/freemarker/"></property><property name="freemarkerVariables"><map><entry key="xml_escape" value-ref="fmXmlEscape" /></map></property><property name="freemarkerSettings"><props><prop key="template_update_delay">1</prop><prop key="defaultEncoding">UTF-8</prop></props></property></bean>

第三步:新建package,com.myview,新建一个MyFreeMarkerView,继承自org.springframework.web.servlet.view.freemarker.FreeMarkerView,在这里对原类进行扩展

Java code

package com.myview;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
import freemarker.template.SimpleHash;
import freemarker.template.Template;
import freemarker.template.TemplateException;public class MyFreeMarkerView extends FreeMarkerView{@Overrideprotected void doRender(Map<String, Object> model,HttpServletRequest request, HttpServletResponse response)throws Exception {// Expose model to JSP tags (as request attributes).
        exposeModelAsRequestAttributes(model, request);// Expose all standard FreeMarker hash models.SimpleHash fmModel = buildTemplateModel(model, request, response);if (logger.isDebugEnabled()) {logger.debug("Rendering FreeMarker template [" + getUrl() + "] in FreeMarkerView '" + getBeanName() + "'");}// Grab the locale-specific version of the template.Locale locale = RequestContextUtils.getLocale(request);       /** 默认生成静态文件,除非在编写ModelAndView时指定CREATE_HTML = false,* 这样对静态文件生成的粒度控制更细一点* 例如:ModelAndView mav = new ModelAndView("search");*       mav.addObject("CREATE_HTML", false);*/if(Boolean.FALSE.equals(model.get("CREATE_HTML"))){processTemplate(getTemplate(locale), fmModel, response);}else{createHTML(getTemplate(locale), fmModel, request, response);}}public void createHTML(Template template, SimpleHash model,HttpServletRequest request,HttpServletResponse response) throws IOException, TemplateException, ServletException {//站点根目录的绝对路径String basePath = request.getSession().getServletContext().getRealPath("/");String requestHTML = this.getRequestHTML(request);//静态页面绝对路径String htmlPath = basePath + requestHTML;         File htmlFile = new File(htmlPath);if(!htmlFile.getParentFile().exists()){htmlFile.getParentFile().mkdirs();}if(!htmlFile.exists()){htmlFile.createNewFile();}Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));//处理模版
            template.process(model, out);out.flush();out.close();/*将请求转发到生成的htm文件*/        request.getRequestDispatcher(requestHTML).forward(request, response);}/*** 计算要生成的静态文件相对路径* 因为大家在调试的时候一般在Tomcat的webapps下面新建站点目录的,* 但在实际应用时直接布署到ROOT目录里面,这里要保证路径的一致性。* @param request HttpServletRequest* @return /目录/*.htm*/private String getRequestHTML(HttpServletRequest request){//web应用名称,部署在ROOT目录时为空String contextPath = request.getContextPath();//web应用/目录/文件.doString requestURI = request.getRequestURI();//basePath里面已经有了web应用名称,所以直接把它replace掉,以免重复requestURI = requestURI.replaceFirst(contextPath, "");//将.do改为.htm,稍后将请求转发到此htm文件requestURI = requestURI.substring(0, requestURI.indexOf(".")) + ".htm";return requestURI;}}

到这里就基本完成了。
一个Controller类的例子:

Java code

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;@Controller
public class IndexController {@RequestMapping("/index.do")public ModelAndView index(){ModelAndView mav = new ModelAndView("index");mav.addObject("title", "网站标题");mav.addObject("origin", "freemarker");//在这里可以控制不生成静态htmmav.addObject("CREATE_HTML", false);return mav;}@RequestMapping("/abc/index.do")public ModelAndView abcindex(){ModelAndView mav = new ModelAndView("index");mav.addObject("origin", "html");//默认生成htm文件mav.addObject("title", "网站标题");return mav;}
}

测试结果如下:

源码下载地址:http://vdisk.weibo.com/s/kmkCC

转载于:https://www.cnblogs.com/fangqi/archive/2012/12/11/2812745.html

Spring MVC + freemarker实现半自动静态化相关推荐

  1. 使用Freemarker来页面静态化,与Spring整合使用

    页面静态化介绍 页面静态化其实就是将原来的动态网页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为 通过静态化技术生成的静态网页,这样用户在访问网页时,服务器直接给用户响应静态html页 ...

  2. 性能优化:用FreeMarker实现页面静态化

    [IT168 技术]众所周知,随着网站的访问量增加,如何给用户以良好的访问体验就显得尤为重要.提升网站性能便成为一些网站面临的一大难题,像hao123这样的导航网站要提升网站的性能只要部署的web服务 ...

  3. html怎么转换成ftl模板,FreeMarker入门+模板静态化+模板字符串静态化

    只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件) 数据模型:数据模型在java中可以是基本类型也可以List.Map.Pojo等复杂类型 模板 输出 ...

  4. freemarker之页面静态化

    静态化? 这里我们以网页静态化技术之一的Freemarker 为例子.以电商为原型 对于电商网站的商品详情页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决 ...

  5. freemarker将xml转为html,Freemarker 实现Html 静态化

    本文内容:介绍了freemarker 渲染HTML 页面的几种方式:通过模板生成Html 字符串静态化 数据渲染 1 引入依赖 pom.xmlorg.springframework.boot      ...

  6. 【转】Spring mvc 统一异常处理和静态文件的配置

    1.在spring mvc下实现统一异常处理很方便,只要在web.xml中配置异常时要显示的页面即可,如下: [html] view plaincopyprint? <error-page> ...

  7. Spring MVC入门示例教程--静态页面跳转

    以下示例显示如何使用Spring MVC Framework编写一个简单的基于Web的应用程序,它可以使用<mvc:resources>标记访问静态页面和动态页面.首先使用Eclipse ...

  8. Spring MVC访问不到静态资源

    运行Spring MVC项目,发现.css,js等文件加载不了,一般是spring MVC的拦截匹配导致的. 例如我在web.xml里这样配置: <servlet><servlet- ...

  9. CMS使用freemarker实现页面静态化

    (一) FreeMarker的优点 可以彻底的分离表现层和业务逻辑.曾经在使用JSP 开发过程中发现在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难.但是, ...

  10. Spring MVC 如何加载静态html

    在spring mvc的xml文件最后面加上下面这一行<mvc:deault-servlet-handler/> 转载于:https://www.cnblogs.com/LEEEEEASO ...

最新文章

  1. mysql实现pr曲线_ROC 曲线与 PR 曲线
  2. PCL点云库学习笔记 点云的欧式聚类
  3. python 读取文件读出来是什么格式-深入学习python解析并读取PDF文件内容的方法...
  4. linux文件系统简介
  5. webpack Entrypoint undefined = index.html
  6. 科大星云诗社动态20210521
  7. ubuntu deepin等debian系Linux发行版安装docker-ce命令
  8. python 重命名的方法_Python下OS模块重命名方法renames
  9. 51CTO首页改版上线 欢迎大家拍砖!
  10. PHP MySQL学生宿舍管理系统源代码_php高校学生宿舍管理系统
  11. 网络地址转换 NAT
  12. 【Java基本功】很多人经常忽视的Java基础知识点
  13. vscode,js代码片段配置
  14. 同义词挖掘的一些常用方法 及同义词替换程序
  15. DWL文件能改成DWG文件打开吗?
  16. 石油和天然气行业的大数据分析:新兴趋势Big Data analytics in oil and gas industry: An emerging trend
  17. MySQL数据库实现双向自动同步
  18. 专业档案门类代码编码方案
  19. 七牛首席布道师:Go不是在颠覆,就是在逆袭
  20. ios10使用 Clipboard点击无反应

热门文章

  1. async and await 简单的入门
  2. 专注于钢铁行业电子商务的服务网站,钢铁行业的网上贸易市场 一起成长
  3. [电影]十七岁的单车
  4. 到底如何保证线程安全,总结得太好了!
  5. 互联网行业,再卷就卷没了…
  6. 面试过程中,竟然遇到PUA,我不得不服这种“潜规则”~
  7. 双非本科:337家Java后台面试总结
  8. “干活的干不过写PPT 的”:新东方年会神曲刷屏背后:这3点值得我们思考
  9. 腾讯亿级排行榜系统实践及挑战
  10. 10 个实战与面试【常用 Shell 脚本】编写