论坛首页 综合技术论坛

按字节截取字符串的jsp自定义标签

浏览 2777 次
精华帖 (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);
	}

}
 
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics