浏览 2772 次
锁定老帖子 主题:按字节截取字符串的jsp自定义标签
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-10-24
按字节截取字符串的jsp自定义标签
tld 定义如下: <!-- 按字节数截取字符串 --> <tag> <name>sliceByte</name> <tag-class>...</tag-class> <body-content>empty</body-content> <attribute> <name>baseStr</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>byteCount</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>escapeXml</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>addEllipsis</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>variable</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag>
java代码实现如下: import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.SimpleTagSupport; import org.apache.commons.lang.StringEscapeUtils; /** * 按字节截取字符串标签 (非按字符截取) * * @author chengkai * */ public class SliceByte extends SimpleTagSupport { /** * 原始字符串 */ private String baseStr; /** * 截取数量 */ private long byteCount; /** * 是否转义 */ private boolean escapeXml; /** * 是否在进行截取后添加... */ private boolean addEllipsis; /** * 将截取后的结果保存进指定变量 */ private String variable; public String getBaseStr() { return baseStr; } public void setBaseStr(String baseStr) { this.baseStr = baseStr; } public long getByteCount() { return byteCount; } public void setByteCount(long byteCount) { this.byteCount = byteCount; } public boolean isEscapeXml() { return escapeXml; } public void setEscapeXml(boolean escapeXml) { this.escapeXml = escapeXml; } public boolean isAddEllipsis() { return addEllipsis; } public void setAddEllipsis(boolean addEllipsis) { this.addEllipsis = addEllipsis; } public String getVariable() { return variable; } public void setVariable(String variable) { this.variable = variable; } @Override public void doTag() throws JspException, IOException { JspWriter out = this.getJspContext().getOut(); String resultStr = this.substringByBytes(this.baseStr, 0, byteCount); resultStr = resultStr == null ? "" : resultStr; if (addEllipsis && baseStr != null && baseStr.length() != resultStr.length()) { resultStr += "..."; } resultStr = escapeXml ? this.html(resultStr) : resultStr; if (this.variable != null) { this.getJspContext().setAttribute(variable, resultStr); } else { out.print(resultStr); } } /** * 根据字节截取字符串 * * @param baseString * 原始字符串 * @param offset * 字节偏移索引 (包含) * @param count * 要截取的字节数 * @return 返回截取后的字符串 */ public String substringByBytes(String baseString, long offset, long count) { if (baseString == null) { return null; } offset = offset < 0 ? 0 : offset; count = count < 0 ? 0 : count; char[] chr = baseString.toCharArray(); StringBuffer resultStr = new StringBuffer(); for (int index = 0, bytecnt = 0, bytenum = 0; index < chr.length; index++) { int currentBC = String.valueOf(chr[index]).getBytes().length; bytecnt += currentBC; if (bytecnt >= offset) { bytenum += currentBC; if (bytenum <= count) { resultStr.append(chr[index]); } else { break; } } } return resultStr.toString(); } private String html(String content) { return StringEscapeUtils.escapeXml(content); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |