第一步:在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;
}
}