隨筆-124  評論-49  文章-56  trackbacks-0

          1  Freemarker網站靜態化的實現(轉)

          首頁:
          1.<body>   
          2.
          <div id="wrap">   
          3.    
          <!--頭部開始-->   
          4.    
          <jsp:include page="/html/top.html" flush="true"></jsp:include>   
          5.    
          <!--頭部結束-->   
          6.    
          <!--導航開始-->   
          7.    
          <jsp:include page="/html/channel.html" flush="true"></jsp:include>   
          8.    
          <!--導航結束-->   
          9.    
          <jsp:include page="/html/center.html" flush="true"></jsp:include>   
          10.    
          <!--友情連接開始-->   
          11.    
          <jsp:include page="/html/index_link.html" flush="true"></jsp:include>   
          12.    
          <!--友情結束-->   
          13.    
          <!--底部開始-->   
          14.    
          <jsp:include page="/html/bottom.html" flush="true"></jsp:include>   
          15.    
          <!--底部結束-->   
          16.
          </div>   
          17.
          </body>  
          整個網站首頁的基本結構是通過jsp的include標簽將所有通過freemarker生成的靜態頁面組織起來。后臺控制各個部分的靜態頁生成。這樣做將首頁進行了拆分,便于了靜態頁面的維護,當我們需要生成“友情鏈接”部分的時候就只生成友情鏈接部分,而不需要將整個頁面都從新生成一次。
             以下是我生成靜態頁最核心的方法,使用freemarker。
                 /**  
          * 生成靜態頁面主方法  
          @param context ServletContext  
          @param data 一個Map的數據結果集  
          @param templatePath ftl模版路徑  
          @param targetHtmlPath 生成靜態頁面的路徑  
          */
            
          public static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){   
          Configuration freemarkerCfg 
          = new Configuration();   
          //加載模版   
          freemarkerCfg.setServletContextForTemplateLoading(context, "/");   
          freemarkerCfg.setEncoding(Locale.getDefault(), 
          "UTF-8");   
          try {   
              
          //指定模版路徑   
              Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");   
              template.setEncoding(
          "UTF-8");   
              
          //靜態頁面路徑   
              String htmlPath = context.getRealPath("/html")+"/"+targetHtmlPath;   
              File htmlFile 
          = new File(htmlPath);   
                    Writer out 
          = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));   
                    
          //處理模版     
                    template.process(data, out);   
                    out.flush();   
                    out.close();   
          }
           catch (Exception e) {   
              e.printStackTrace();   
          }
             
          其實很簡單,只要Google一下就有很多這方面的代碼。我也是Google的代碼然后自己再根據實際情況修改。簡單說明一下參數:
          ServletContext :這個不用說了吧。做java web的應該都知道,只不過struts2中這樣獲取ServletActionContext.getServletContext()
          Map<String,Object> data : 模版的數據來源。freemarker通過一個Map給ftl模版送數據。
          現在已友情鏈接為列子詳細介紹靜態頁面如何生成。其他模塊以此類推。
          String templatePath : ftl所在的路徑。我這里相對于網站的一個相對路徑然后通過ServerContext獲取絕對路徑。
          String targetHtmlPath : 最后生成靜態頁的路徑:我這里相對于網站的一個相對路徑然后通過ServerContext獲取絕對路徑。

          友情鏈接根據這段代碼<jsp:include page="/html/index_link.html" flush="true"></jsp:include>我們需要freemarker生成一個index_link.html文件。友情鏈接數據來源通過數據庫查詢獲取。
          然后再寫一個方法專門生成友情鏈接靜態頁面:
          /**  
          * 生成友情鏈接的靜態頁index_link.html  
          @param context  
          @param data  
          */
            
          public static void createIndexFriendLink(ServletContext context,Map<String,Object> data){   
          crateHTML(context,data,
          "index_link.ftl","index_link.html");   
          此方法調用上面的createHTML方法。
          然后根據以上方法我們就可以再Struts2的action里面從數據庫查詢數據放入map調用createIndexFriendLink()方法生成靜態頁了。
          這是action中的一個方法:
           /**  
           * 生成友情鏈接靜態頁index_link.html  
           * 
          @return  
           
          */
            
          public String createLink(){   
              
          //權限驗證   
              if(! this.isAccess())   
                  
          return "error";   
              
          try{   
                  
          //得到友情鏈接   
                  List links = friendLinkDAO.findAll();   
                  
          //準備數據   
                  HashMap<String,Object> data = new HashMap<String,Object>();   
                  data.put(
          "links", links);   
                  
          //調用靜態頁面方法   
                  HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data);   
                  addActionMessage(
          "靜態頁面生成成功!");   
                  
          return "message";   
              }
          catch(Exception e){   
                  e.printStackTrace();   
                  
          return "failure";   
              }
             
          }
            
          List links = friendLinkDAO.findAll();通過spring注入action的hiberate DAO獲取數據給list然后通過以下代碼
          HashMap<String,Object> data = new HashMap<String,Object>();
          data.put("links", links);
          準備數據調用createIndexFriendLink()方法。
          以下是:ftl模版源碼:
          <#if links?size != 0>   
          <div class="link">   
                  
          <strong>友情鏈接:</strong>   
                  
          <#list links as link>   
                  
          <href="${link.linkUrl}" target="_blank" title="${link.linkName}">${link.linkName}</a>   
                  
          </#list>   
          </div>   
          <#else>   
          <div class="link"></div>   
          </#if>  
          這樣友情鏈接靜態頁就生成了。然后其他靜態頁依此葫蘆畫瓢。
          posted on 2009-11-06 17:52 junly 閱讀(1111) 評論(2)  編輯  收藏 所屬分類: java

          評論:
          # re: 網站首頁靜態化方案 2010-11-16 09:03 | chanel watches
          唉,咋還是菜鳥,看不懂  回復  更多評論
            
          # re: 網站首頁靜態化方案 2010-11-16 09:03 | chanel watches
          咋還是菜鳥,看不懂  回復  更多評論
            
          主站蜘蛛池模板: 五峰| 渭源县| 太仆寺旗| 泸西县| 盐源县| 怀远县| 喀喇| 桐庐县| 宜州市| 聂拉木县| 汽车| 鄢陵县| 秭归县| 慈利县| 恩施市| 灵璧县| 丰镇市| 文水县| 叶城县| 四会市| 泰宁县| 翼城县| 汉中市| 益阳市| 尚义县| 潼关县| 榆树市| 措勤县| 闵行区| 施秉县| 吉林市| 云梦县| 深州市| 东港市| 阳春市| 麦盖提县| 宜昌市| 鲁山县| 浦江县| 武城县| 穆棱市|