自定义EL函数解决JSTL标签不足之处——按字节长度截取字符串

 题外话:做过大型网站前台的Web开发程序员最头疼的事情就是前台首页的布局,这其中最最头疼的就是标题字符的截取的问题,虽然有fn:substring,但表现率以及对中文的支持均不够完善,其实最终还是归结为客户要求太高了,不过做事情就应该严谨嘛,尤其干我们这一行。。在我们老大的指点下,了解了如何自定义EL函数,哈哈,今天实现了它。

开发步骤:

1、 添加实现静态方法

/** * @author X.Ing's Blog */ public class StringUtils { /** * @param str: * source string * @param width: * string's byte width * @param ellipsis: * a string added to abbreviate string bottom * @return String Object * @author X.Ing's Blog * @see <a href="http://blog.csdn.net/xxd851116/" mce_href="http://blog.csdn.net/xxd851116/">X.Ing's Blog</a> */ public static String abbreviate(String str, int width, String ellipsis) { if (str == null || "".equals(str)) { return ""; } int d = 0; // byte length int n = 0; // char length for (; n < str.length(); n++) { d = (int) str.charAt(n) > 256 ? d + 2 : d + 1; if (d > width) { break; } } if (d > width) { n = n - ellipsis.length() / 2; return str.substring(0, n > 0 ? n : 0) + ellipsis; } return str = str.substring(0, n); } }

2、 添加标签库描述符tld文件(Tag Library Descriptor),在其中注册该静态方法

<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <description>StringUtils</description> <tlib-version>1.0</tlib-version> <short-name>StringUtils</short-name> <uri>http://blog.csdn.net/xxd851116</uri> <function> <description>StringUtils</description> <name>abbreviate</name> <function-class>com.xxd.utils.StringUtils</function-class> <function-signature>java.lang.String abbreviate(java.lang.String, int, java.lang.String)</function-signature> </function> </taglib>

3、 在JSP页面导入标签库(不用再Web.xml中说明tld的位置,servlet容器可自动搜索tld文件,因此可打包成jar文件)

<%@taglib uri="http://blog.csdn.net/xxd851116" prefix="fnx" %>

注意:

(1) 此处的uri和tld文件中的uri必须相一致,这个不用说明吧?哈哈。

(2) prefix是函数使用前缀。

4、 页面使用,超级简单!

${fnx:abbreviate('要截取的源字符串', '字节长度', '尾部追加字符')}

5、 测试结果

【代码】

<body> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 0, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 1, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 2, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 3, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 4, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 5, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 6, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 7, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 8, '')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 9, '')} <br /> <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 0, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 1, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 2, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 3, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 4, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 5, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 6, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 7, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 8, '...')} <br /> ${fnx:abbreviate('a我b是c,中d国e人f', 2 * 9, '...')} <br /> </body>

【结果】

a
a我b
a我b是
a我b是c
a我b是c,
a我b是c,中d
a我b是c,中d国
a我b是c,中d国e
a我b是c,中d国e人f

...
...
a我...
a我b...
a我b是...
a我b是c...
a我b是c,中...
a我b是c,中d...
a我b是c,中d国...
a我b是c,中d国e人f

 

【源码下载】:http://download.csdn.net/source/1618386

 

文章原创,转载请注明出处:http://blog.csdn.net/xxd851116

你可能感兴趣的:(c,String,servlet,web开发,encoding,Descriptor)