Freemarker自定義指令功能應用

    /**
     * 之前用freemarker,在前端頁面處理時候總覺得它的字符串截取功能不強,但是一直沒有多費時間解決。
     * 最近有點兒時間,總算優化了下它,靠的,還是freemarker的自定義指令功能。
     * 需求:頁面上給出了一個固定寬度的位置(如30px),然後將不定長的字符串填充滿這個區域(字符串由字母、數字、符號和漢字組成)     *
     * 多餘的字符串必須給予截掉,不管是字母,還是漢字,都必須將此區域最大限度的填滿
     *
     * 問題:如採常規方式,採用ftl寫一個macro或者function,然後截取指定長度的字符串,遇到字母與漢字混合,就肯定會有問題,因爲一個漢字寬度是一個字母寬度的兩倍,依據其中任何一個來計算,都會有問題
     *
     * 爲此,專門寫了個函數 Substr
     * 功能:指定長度截取等寬字符串, 解決漢字與字母混合情況下的字
     *
     * 第一,寫個類:Substr
     * 第二,在系統啓動的時候進行註冊包含有此函數的類

     * 第三,在.ftl文件中應用,就像使用freemarker的內置函數一樣方便
     *
 */

//  下面是主要的清單:

//  第一步

import java.util.List;

import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;

public class Substr implements TemplateMethodModel {

 

    // 這裏的長度計算,以漢字爲標準,兩個字母作爲一個字符
    public Object exec(List args) throws TemplateModelException {
        if(args.size()!=2)
            throw new TemplateModelException("Wrong arguments!");
       
        int length=2*Integer.parseInt(args.get(1).toString(),10);
        char[] arraySource=String.valueOf(args.get(0)).toCharArray();
       
        StringBuffer result=new StringBuffer("");       
        for(char c:arraySource){
            int ASCIICode=(int)c;
            if(ASCIICode<=255){
                length-=1;
            }else{
                length-=2;
            }
            result.append(c);
            if(length==0)break;
        }
        return new SimpleScalar(result.toString());       
    }   
}

 

// 第二步:

// 先寫了個簡單的servlet小試下,

public class HelloServlet extends HttpServlet {
    private Configuration cfg;    
    public void init() {       
        cfg = new Configuration();    

 

        // 告訴servlet你的ftl文件存放目錄   
        cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates");     
    }
   
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {  
        Map root = new HashMap();
     
        Template t = cfg.getTemplate("test.ftl"); // 給定測試用的ftl文件
      
        resp.setContentType("text/html; charset=" + t.getEncoding());
        Writer out = resp.getWriter();       
        try { 
            // 在比較單一的環境下,可以直接這樣使用          
            root.put("substr",new Substr());
            t.process(root, out);           
            out.flush();
        } catch (TemplateException e) {
            throw new ServletException(
                    "Error while processing FreeMarker template", e);
        }
    }
}

 

 

// 第三步應用,ftl文件就不貼了,主要有兩句

<#assign aboutname="some週三123thing456"/>

 ${substr(aboutname,4)}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章