/**
* 之前用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)}