SpringMVC + FreeMarker 页面静态化

第一步:在web.xml中将/请求交给SpringMVC

<!-- Spring 请求分发控制器-->

<servlet>

<servlet-name>dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath*:dispatcher-config.xml</param-value>

</init-param>

<load-on-startup>0</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>


第二步:配置resources/dispatcher-config.xml

<!--配置FreeMarker-->

<bean id="freemarkerConfigurer"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
	<!-- 指定freemarker模板加载的路径-->
	<property name="templateLoaderPath" value="/WEB-INF/freemarker/"></property>
	<property name="freemarkerVariables">
            <map>
                <entry key="config_comment" value="no used" />
            </map>
        </property>
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">0</prop>
                <prop key="defaultEncoding">UTF-8</prop>
		<prop key="locale">zh_CN</prop>
		<prop key="tag_syntax">auto_detect</prop><!-- 设置freemarker 标签-->
		<prop key="auto_import">/common/macroTemplate.ftl as common</prop><!-- 向模板中自动导入macro的定义-->
            </props>
        </property>
</bean>

<!--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.cggol.business.web.FreemarkerViewUtil" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
 </bean>
第三步:新建com.cggol.business.web.FreemarkerViewUtil,新建一个MyFreeMarkerView,继承自org.springframework.web.servlet.view.freemarker.FreeMarkerView,在这里对原类进行扩展

package com.cggol.business.web;

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 
FreemarkerViewUtil extends FreeMarkerView{
    @Override
    protected 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);       

        if(null != request.getAttribute("savePath") && String.valueOf(request.getAttribute("savePath)).length() > 0){

    createHTML(getTemplate(locale), fmModel, String.valueOf(request.getAttribute("savePath")), response);
        }else{
            processTemplate(getTemplate(locale), fmModel, response);
        }
    }


    public void createHTML(Template template, SimpleHash model,String filePath,
            HttpServletResponse response) throws IOException, TemplateException, ServletException {    
            File htmlFile = new File(filePath);
            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);

    template.process(model,writer);
            out.flush();
            out.close();
    }
}

第四步:在dispatcher-action.xml中配置一个html的拦截器
<!-- 注解用的拦截器,如果该路径同时存在两个拦截器,按顺序先执行最上面配置的那个拦截器-->
<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/**"/><!-- 这个可以跨包访问到 ; 这里表示拦截所有的,但我们那些页面需要用到静态化就配置拦截那些访问路径 -->
		<bean class="com.cggol.business.core.interceptor.HtmlInterceptor">
	<mvc:interceptor>
</mvc:interceptors>


第五步:新建 HtmlInterceptor

public class HtmlInterceptor implements HandlerInterceptor

{

private static final HashMap<String,String> HTML_MAPPING = new HashMap<String,String>();


@Override

public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object obj,Exception ex)throws Exception{}


@Override

public void postHandle(HttpServletRequest request,HttpServletResponse response,Object obj,Exception ex)throws Exception{}


@Override

public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object obj,Exception ex)throws Exception

{

//请求的 url 地址

String urlBorw = request.getServletPath();

String htmlUrl = HTML_MAPPING.get(urlBrow);

if(null != htmlUrl && htmlUrl.length() > 0)

{

File file = new File(request.getSession().getServletContext().getRealPath("")+htmlUrl);

if(file.exists())

{

request.getRequestDispatcher(htmlUrl).forward(request,response);

return false;

}

else

{

return true;

}

}

//静态文件地址

String filePath = request.getSession().getServletContext().getRealPath("/");

StringBuffer fileName = new StringBuffer(urlBrow.substring(urlBrow.lastIndexOf("/")+1,urlBrow.length())+".html");

String savePath = filePath + "html" + File.separator + fileName;

HTML_MAPPING.put(urlBrow.toString(),"/html/"+fileName);

request.setAttribute("savePath",savePath);

return true;

}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值