1. tld文件配置
<tag> <name>stringCut</name> <tag-class>com.neu.edu.utils.mytaglib.StringCutTag</tag-class> <body-content>JSP</body-content> <attribute> <name>length</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>str</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
2. 实现
package com.neu.edu.utils.mytaglib;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import org.apache.commons.codec.EncoderException;
import org.apache.commons.codec.net.URLCodec;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.xiaonei.wap.framework.util.WapStringUtils;
public class StringCutTag extends BodyTagSupport {
private int length = 0;
private String str = "";
public void setLength(int length) {
this.length = length;
}
public void setStr(String str) {
this.str = str;
}
@Override
public int doAfterBody() throws JspException {
BodyContent bodyContent = getBodyContent();
String content = bodyContent.getString();
String outStr = cut(content, length);
JspWriter out = bodyContent.getEnclosingWriter();
try {
out.write(outStr);
} catch (IOException e) {
e.printStackTrace();
}
return super.doAfterBody();
}
@Override
public int doStartTag() throws JspException {
if(StringUtils.isNotBlank(str)){
String outStr = cut(str, length);
try {
pageContext.getOut().print(outStr);
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
} else
return super.doStartTag();
}
private String cut(String str, int length) {
if (StringUtils.isBlank(str) || length <= 0) return "";
if (str.length() <= length) return str;
int tlength = 0;
int maxLength = length * 2;
int i;
for (i = 0; i < str.length() && tlength <= maxLength; i++) {
if (CharUtils.isAscii(str.charAt(i))) ++tlength;
else tlength += 2;
}
if (i == str.length() && tlength <= maxLength) return str;
maxLength -= 2;
while (tlength > maxLength) {
if (CharUtils.isAscii(str.charAt(i - 1))) --tlength;
else tlength -= 2;
--i;
}
return str.substring(0, i) + "...";
}
}
3. 使用
<renren-wap:stringCut length="28">${content}</renren-wap:stringCut>