Spring mvc 2.5.6 和Spring mvc 3.2的差别--对freemaker扩展的支持

文章标签: spring-mvc
2015-1-21 11:43:29     8 人阅读    

1、Spring MVC 2.5.6 对freemaker支持性不好,不支持扩展,或者不好扩展,而spring mvc 3则提供了 封装,方便扩展

package com.sinopec.mall.goods.view;


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{

        protected void doRender(Map model,
                        HttpServletRequest request, HttpServletResponse response)
                        throws Exception {
                // Expose model to JSP tags (as request attributes).
                exposeModelAsRequestAttributes(model, request);
                // Expose all standard FreeMarker hash models.
                //下面这段代码是Spring mvc 3中的,已经封装了 buildTemplateModel,方便扩展
                SimpleHash fmModel = buildTemplateModel(model, request, response);
                //下面这段代码是Spring mvc 2.5.6中的,没有封装,没办法扩展
                /*model.put("JspTaglibs", this.taglibFactory);
            model.put("Application", this.servletContextHashModel);
            model.put("Session", buildSessionModel(request, response));
            model.put("Request", new HttpRequestHashModel(request, response, getObjectWrapper()));
            model.put("RequestParameters", new HttpRequestParametersHashModel(request));*/

                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应用/目录/文件.do
                String requestURI = request.getRequestURI();
                //basePath里面已经有了web应用名称,所以直接把它replace掉,以免重复
                requestURI = requestURI.replaceFirst(contextPath, "");
                //将.do改为.htm,稍后将请求转发到此htm文件
                requestURI = requestURI.substring(0, requestURI.indexOf(".")) + ".htm";
                
                return requestURI;
        }

}


 


原文地址:http://www.itmmd.com/201501/531.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

Spring mvc 3.0 InternalResourceViewResolver 返回字符串   上一篇
下一篇  Spring mvc 2.5 版本返回json串的方式

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!