1. 程式人生 > >Spring MVC靜態化解決方案(一)

Spring MVC靜態化解決方案(一)

http://fumingfu1990-gmail-com.iteye.com/blog/1541740

前段時間研究了下Spring MVC靜態化,今天整理了一下,附上實現方法。
(本文只介紹靜態化,nginx對映以及靜態化更新機制後續介紹)

實現方法:



1、對Spring MVC預設的檢視進行擴充套件,複寫FreeMarkerView,新增自己想要的邏輯。(判斷需要將請求後的response資訊落地)



Java程式碼  收藏程式碼
  1. public class MyFreeMarkerView extends FreeMarkerView{  
  2.     @Override  
  3.     protected void doRender(Map model,  
  4.             HttpServletRequest request, HttpServletResponse response)  
  5.             throws Exception {  
  6.         exposeModelAsRequestAttributes(model, request);  
  7.         SimpleHash fmModel = buildTemplateModel(model, request, response);  
  8.         Locale locale = RequestContextUtils.getLocale(request);  
  9.         /* 
  10.          * 預設不生成靜態檔案,除非在Action中進行如下設定  
  11.          * model.addAttribute("STATIC_PAGE", true); 
  12.          */  
  13.         if(model.get("STATIC_PAGE") == null || Boolean.FALSE.equals(model.get("STATIC_PAGE"))){  
  14.             processTemplate(getTemplate(locale), fmModel, response);  
  15.         }else{  
  16.             createHTML(getTemplate(locale), fmModel, request, response);  
  17.         }  
  18.     }  
  19.     public void createHTML(Template template, SimpleHash model,HttpServletRequest request,  
  20.             HttpServletResponse response) throws IOException, TemplateException, ServletException {  
  21.         // 靜態檔案根目錄的絕對路徑  
  22.         ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(request  
  23.                 .getSession().getServletContext());  
  24.         PropsUtil configHelper = (PropsUtil) context.getBean("configHelper");  
  25.         String basePath = configHelper.getProperty("static_html_path");  
  26.         // String basePath =  
  27.         // "D:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\ROOT\\static\\";  
  28.         // 訪問的URL(根目錄以後,如xxx/113.html)  
  29.         String requestHTML = this.getRequestHTML(request);  
  30.         // 靜態頁面儲存的絕對路徑  
  31.         String htmlPath = basePath + requestHTML;  
  32.         // response路徑  
  33.         String responsePath = "/" + requestHTML;  
  34.         File htmlFile = new File(htmlPath);  
  35.         if (!htmlFile.getParentFile().exists()) {  
  36.             htmlFile.getParentFile().mkdirs();  
  37.         }  
  38.         if (!htmlFile.exists()) {  
  39.             htmlFile.createNewFile();  
  40.         }  
  41.         Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile),  
  42.                 "UTF-8"));  
  43.         // 處理模版  
  44.         template.process(model, out);  
  45.         out.flush();  
  46.         out.close();  
  47.         request.getRequestDispatcher(responsePath).forward(request, response);  
  48.     }  
  49.     /** 
  50.      * 獲取要生成的靜態檔案相對路徑 
  51.      *  
  52.      * @param request HttpServletRequest 
  53.      * @return /目錄/*.html 
  54.      */  
  55.     private String getRequestHTML(HttpServletRequest request) {  
  56.         // web應用名稱,部署在ROOT目錄時為空  
  57.         String contextPath = request.getContextPath();  
  58.         // web應用/目錄/檔案,如/xxxx/1  
  59.         String requestURI = request.getRequestURI();  
  60.         // basePath裡面已經有了web應用名稱,所以直接把它replace掉,以免重複  
  61.         requestURI = requestURI.replaceFirst(contextPath, "");  
  62.         // 得到引數  
  63.         Enumeration<?> pNames = request.getParameterNames();  
  64.         while (pNames.hasMoreElements()) {  
  65.             String name = (String) pNames.nextElement();  
  66.             String value = request.getParameter(name);  
  67.             requestURI = requestURI + "_" + name + "=" + value;  
  68.         }  
  69.         // 加上.html字尾  
  70.         requestURI = requestURI + ".html";  
  71.         return requestURI;  
  72.     }  
  73. }  




2、修改web-servlet.xml 
,將預設的freemarker檢視改成上面複寫FreeMarkerView 的MyFreeMarkerView 


Xml程式碼  收藏程式碼
  1. <bean id="viewResolver"  
  2.         class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
  3.         <property name="viewClass" value="xxx.xxx.xxxx.util.freemarker.MyFreeMarkerView" />  
  4.     </bean>  


3、在action中,進行一下設定,就可以輸入靜態html


Java程式碼  收藏程式碼
  1. model.addAttribute("STATIC_PAG"true);