自定义JSP标签和JSTL函数
本文主要分享jsp自定义标签和jstl自定义函数。
1-处理类
JSP自定义标签的处理类
public class StringTag extends TagSupport{ /** * */ private static final long serialVersionUID = 1L; private String content; //字符串内容 private int count; //字符串个数 private String append; public int doStartTag(){ try { pageContext.getOut().print(substring(content,count,append)); } catch (IOException e) { e.printStackTrace(); } return SKIP_BODY; } public int doEndTag(){ //执行后续的jsp页面内容 return EVAL_PAGE; } public static String substring(String text, int length, String append) { if (StringUtils.isBlank(text) || text.length() < length) { return text; } int num = 0, i = 0, len = text.length(); StringBuilder sb = new StringBuilder(); for (; i < len; i++) { char c = text.charAt(i); if (c > 127) { num += 2; } else { num++; } if (num <= length * 2) { sb.append(c); } if (num >= length * 2) { break; } } if (i + 1 < len && StringUtils.isNotBlank(append)) { if (text.charAt(i) > 127) { sb.setLength(sb.length() - 1); } else { sb.setLength(sb.length() - 2); } sb.append(append); } return sb.toString(); } //省去get,set方法 }
JSTL自定义函数处理类
import org.apache.commons.lang3.StringUtils; public abstract class StringHandler { public static String stringCut(String content, int count) { return stringCut(content, count, null); } public static String stringCut(String content, int count, String replace) { if (StringUtils.isBlank(content) || content.length() < count) { return content; } int num = 0, i = 0, len = content.length(); StringBuilder buf = new StringBuilder(); for (; i < len; i++) { char c = content.charAt(i); if (c > 127) { num += 2; } else { num++; } if (num <= count * 2) { buf.append(c); } if (num >= count * 2) { break; } } if (i + 1 < len && StringUtils.isNotBlank(replace)) { if (content.charAt(i) > 127) { buf.setLength(buf.length() - 1); } else { buf.setLength(buf.length() - 2); } buf.append(replace); } return buf.toString(); } }
2-定义tld文件
cus_fn.tld
<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>JSTL 1.1 fn library</description> <display-name>JSTL fu</display-name> <tlib-version>1.1</tlib-version> <short-name>fn</short-name> <uri>http://www.cnblogs.com/zhouxyx/functionsc</uri> <function> <name>string_cut</name> <function-class>org.zxy.tutorial.d130819.StringHandler</function-class> <function-signature>boolean stringCut(java.lang.String,int,java.lang.String)</function-signature> </function> </taglib>
utils.tld
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" > <taglib> <tlib-version>utils1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>utils</short-name> <uri>http://www.cnblogs.com/zhouxyx/utils</uri> <tag> <name>str</name> <tag-class>org.zxy.tutorial.d130819.StringTag</tag-class> <body-content>empty</body-content> <attribute> <name>content</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>count</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>append</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
接下来我们在jsp页面运用我们定义的标签和函数
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="u" uri="http://www.cnblogs.com/zhouxyx/utils" %> <%@ taglib prefix="fn" uri="http://www.cnblogs.com/zhouxyx/functionsc" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>custom tag</title> </head> <body> <u:fmt param="yyyy/MM/dd HH:mm:ss" date="${date}" /><br/> <hr> <u:str append="....." count="20" content="${str }"/> <br/> <span style="font-size:18px;color:#339966;font-weight: bold;">JSTL Custom Function</span><br/> ${fn:string_cut(str,10,'...')} </body> </html>
创建一个servlet,并设置一些简单的测试数据即可。效果如下:
3-总结
如果我们在项目中有一些特殊的需求,并且已有的方法运用起来比较麻烦。从今天开始你不妨试着用用。总而言之,套路是一样的,能举一反三就OK了。