Spring MVC + freemarker实现半自动静态化
这里对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实现半自动静态化相关推荐
- 使用Freemarker来页面静态化,与Spring整合使用
页面静态化介绍 页面静态化其实就是将原来的动态网页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为 通过静态化技术生成的静态网页,这样用户在访问网页时,服务器直接给用户响应静态html页 ...
- 性能优化:用FreeMarker实现页面静态化
[IT168 技术]众所周知,随着网站的访问量增加,如何给用户以良好的访问体验就显得尤为重要.提升网站性能便成为一些网站面临的一大难题,像hao123这样的导航网站要提升网站的性能只要部署的web服务 ...
- html怎么转换成ftl模板,FreeMarker入门+模板静态化+模板字符串静态化
只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件) 数据模型:数据模型在java中可以是基本类型也可以List.Map.Pojo等复杂类型 模板 输出 ...
- freemarker之页面静态化
静态化? 这里我们以网页静态化技术之一的Freemarker 为例子.以电商为原型 对于电商网站的商品详情页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决 ...
- freemarker将xml转为html,Freemarker 实现Html 静态化
本文内容:介绍了freemarker 渲染HTML 页面的几种方式:通过模板生成Html 字符串静态化 数据渲染 1 引入依赖 pom.xmlorg.springframework.boot ...
- 【转】Spring mvc 统一异常处理和静态文件的配置
1.在spring mvc下实现统一异常处理很方便,只要在web.xml中配置异常时要显示的页面即可,如下: [html] view plaincopyprint? <error-page> ...
- Spring MVC入门示例教程--静态页面跳转
以下示例显示如何使用Spring MVC Framework编写一个简单的基于Web的应用程序,它可以使用<mvc:resources>标记访问静态页面和动态页面.首先使用Eclipse ...
- Spring MVC访问不到静态资源
运行Spring MVC项目,发现.css,js等文件加载不了,一般是spring MVC的拦截匹配导致的. 例如我在web.xml里这样配置: <servlet><servlet- ...
- CMS使用freemarker实现页面静态化
(一) FreeMarker的优点 可以彻底的分离表现层和业务逻辑.曾经在使用JSP 开发过程中发现在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难.但是, ...
- Spring MVC 如何加载静态html
在spring mvc的xml文件最后面加上下面这一行<mvc:deault-servlet-handler/> 转载于:https://www.cnblogs.com/LEEEEEASO ...
最新文章
- mysql实现pr曲线_ROC 曲线与 PR 曲线
- PCL点云库学习笔记 点云的欧式聚类
- python 读取文件读出来是什么格式-深入学习python解析并读取PDF文件内容的方法...
- linux文件系统简介
- webpack Entrypoint undefined = index.html
- 科大星云诗社动态20210521
- ubuntu deepin等debian系Linux发行版安装docker-ce命令
- python 重命名的方法_Python下OS模块重命名方法renames
- 51CTO首页改版上线 欢迎大家拍砖!
- PHP MySQL学生宿舍管理系统源代码_php高校学生宿舍管理系统
- 网络地址转换 NAT
- 【Java基本功】很多人经常忽视的Java基础知识点
- vscode,js代码片段配置
- 同义词挖掘的一些常用方法 及同义词替换程序
- DWL文件能改成DWG文件打开吗?
- 石油和天然气行业的大数据分析:新兴趋势Big Data analytics in oil and gas industry: An emerging trend
- MySQL数据库实现双向自动同步
- 专业档案门类代码编码方案
- 七牛首席布道师:Go不是在颠覆,就是在逆袭
- ios10使用 Clipboard点击无反应