在使用JSTL标签的截取字符串函数时有点不爽!当汉字、字母、数字混合在一个字符串中进行统计长度或截取时,它会把汉字、字母、数字作为同一长度进行截取!如:
String str = “abc中国123”;
${fn:substr(str,0,6)} 的结果就是:abc中国1
这让我们用起来很不舒服,特别是在进行列表时,截取同样的长度,如果哪个包含的字母或数字较多,就会看起来特别短。
为此,我把JSTL源代码下载下来,增加了一个函数getLimitStr(String,int).这个函数的作用是对str进行前len个长度的字符,如果str的长度大于len,则用”…”结尾。
具体步骤:
一、在org.apache.taglibs.standard.functions包的Functions.java类中加如下代码:
publicstatic String getLimitStr( String str,int len){
try{
if(str==null) return"";
int counterOfDoubleByte = 0;
byte[] b = str.getBytes("gb2312");
if(b.length <= len)
return str;
for(int i = 0; i < len-3; i++){
if(b[i] < 0)
counterOfDoubleByte++;
}
if(counterOfDoubleByte % 2 == 0)
returnnew String(b, 0, len - 3, "gb2312")+"...";
else
returnnew String(b, 0, len - 4, "gb2312")+"...";
}catch(Exception ex){
return"";
}
}
二、在fn.tld中加:
<function>
<description>
Removes white spaces from both ends of a string.
</description>
<name>getLimitStr</name>
<function-class>org.apache.taglibs.standard.functions.Functions</function-class>
<function-signature>java.lang.String getLimitStr(java.lang.String,int)</function-signature>
<example>
Name: ${fn.getLimitStr(str,20)}
</example>
</function>
三、把Functions.class 和 fn.tld压回standard.jar中。(两个必须都同时这样做)
四、本例使用的是JSTL1.1
五、在编译JSTL源码时,需要在apache网站下载xalan-j_2_7_0.jar这个包。