Spring MVC配置 freemarker

配置spring MVC
<!-- freemarker start -->
		 <!--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" />
		        <!-- 将Spring的FreeMarkerView改成我们扩展的View -->
		        <property name="viewClass" value="com.bm.biz.controller.MyFreeMarkerView" />
		        <property name="exposeRequestAttributes" value="true" />
		        <property name="exposeSessionAttributes" value="true" />
		        <property name="exposeSpringMacroHelpers" value="true" />
		        <property name="requestContextAttribute" value="request" />
		 </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/ftl/"></property>  
		          <property name="templateLoaderPaths">
		              <list>
		                  <value>/WEB-INF/ftl/</value>
		              </list>
		          </property>
		        <property name="freemarkerSettings">
		            <props>
		            	<!-- 刷新间隔,秒 -->
		                <prop key="template_update_delay">20</prop>
		                <prop key="defaultEncoding">UTF-8</prop>
		                <prop key="auto_import">common/spring.ftl as spring</prop> <!-- spring 国际化相关 -->
		                <prop key="locale">zh_CN</prop><!-- 本地国际化 -->
		                <prop key="whitespace_stripping">true</prop>
						<prop key="boolean_format">true,false</prop>
		            </props>
		        </property>
		  </bean>
	<!-- freemarker end -->
如果能生成、但是转发不了 在spring里把生成的静态文件 放生
 <mvc:resources mapping="/staticPage/**" location="/staticPage/" />
注:spring MVC 配置视图的时候,在 freemarker 配置之后配置

package com.bm.biz.controller;

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;
/**
 * 静态化
 * @author zjs
 * @date  2017年2月13日 15:43:50
 *
 */
public class MyFreeMarkerView extends FreeMarkerView{
    @Override
    protected void doRender(Map<String, Object> model,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
    	Locale locale = RequestContextUtils.getLocale(request);       
    	model.put("localeLan", locale);
        // 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() + "'");
        }

        /*
         * 默认生成静态文件,除非在编写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),locale, fmModel, request, response);
        }
    }

    public void createHTML(Template template,Locale locale, SimpleHash model,HttpServletRequest request,
            HttpServletResponse response) throws IOException, TemplateException, ServletException {
    	   String fileName="";
           String requestURI = request.getRequestURI();
           String[] urlSplit = requestURI.split("/");
           for (String url : urlSplit) {
               fileName = fileName + url;
           }
           String staticPagePath = "/staticPage/" + fileName+"_"+locale+".html";
           // 静态页面绝对路径
           String basePath = request.getSession().getServletContext().getRealPath("/");
           String htmlPath = basePath + staticPagePath;
           System.out.println("htmlPath="+htmlPath);
           
            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(staticPagePath).forward(request, response);

    }
    
	/**
	 * 计算要生成的<strong>静态</strong>文件相对路径.
	 */
	private String getRequestHTML(HttpServletRequest request) {

		//web应用名称,部署在ROOT目录时为空  
		String contextPath = request.getContextPath();

		//web应用/目录/文件.do  
		String requestURI = request.getRequestURI();

		//basePath里面已经有了web应用名称,所以直接把它replace掉,以免重复  
		requestURI = requestURI.replaceFirst(contextPath, "");
		//将请求改为.htm,稍后将请求转发到此htm文件  
		requestURI += ".htm";
		return requestURI;
	}

}
package com.bm.biz.controller;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.bm.biz.dao.UsUserMapper;



@Controller
@RequestMapping("/test")
public class TestController {
private static Logger log = Logger.getLogger(TestController.class);
//private static final Logger   logger = (Logger) LoggerFactory.getLogger(TestController.class); 
	
	@Autowired(required=true)
	@Qualifier(value="usUserMapper")
	private UsUserMapper usUserMapper;
	    

/*	@RequestMapping("test")
	@ResponseBody
	public Map<Object, Object> testJackson(Integer userId){
		Map<Object, Object> map = new HashMap<>();
		map.put("df", "敌法师");
		UsUser user = usUserMapper.selectByPrimaryKey(userId);
		log.error("+++++++++++++++++");
		log.info("-------------------------------------");
		log.info("sdfs");
		log.error("dds");
		System.out.println(JSON.toJSONString(user));
		return map;
		
	}*/
	
    @RequestMapping("index")  
    public ModelAndView index(){  
        ModelAndView modelAndView = new ModelAndView("test");  
        modelAndView.addObject("content", "网站标题-没生成");  
          
        //当设置false时不生成静态页面  
        modelAndView.addObject("STATIC_HTML", false);  
          
        return modelAndView;  
    }  
      
    
    @RequestMapping("testHtml")  
    public String test(Model model){  
    	model.addAttribute("content", "test Model");
    	return "test";  
    }
    
    
}
<#import "./common/spring.ftl" as spring />
<!DOCTYPE html>
<#--
<script type="text/javascript" src="./resources/jquery.min.js"></script>
-->

<body>
<#assign ctx=request.contextPath/>
${ctx}
<br>

${content}</body></html>
项目结构图:

猜你喜欢

转载自killgodaa.iteye.com/blog/2358030