jstl三目运算:前台页面截取字符串

       通常像标题之类的,如果后台输入过长,那么前台完整输出,必然在格式上造成多行,会显得很难看,当然如果事先对该行进行了长度和高度的控制,加上了一句“overflow:hidden”,那又另当别论了。

       截取的方式自然是通过${fn:substring()}函数,那么做法如下:      

<c:if test="${fn:length(article.title)>21"}>${fn:substring(article.title,0,21)}....</c:if>
<c:if test="${fn:length(article.title)<=21"}>${article.title}</c:if>

       这样写未尝不可,其实有一个更简单的输出方式,用到的方法就是三目运算法,代码如下:

${fn:length(article.title)>21 ? fn:substring(article.title,0,21) : article.title}${fn:length(article.title)>21 ? '...' : ''}

       代码相比之下,简洁了很多。。

       ${fn:length()}这个标签很强大,因为它不止可以计算字符串的长度,还可以计算从后台传过来的list对象的长度,一开始还真不知道,下午做项目时就碰到这个问题了,为此卡了一下。

       ${fn:substring()}这个标签,我觉得他对于中英文字符串的处理不是太好,它将汉字和英文字符都当成是1个字节,在截取的时候,有时候得到的效果往往不是我们想的,为此最好的解决方法是自己写个标签,当然如果后台输出的都是汉字,那么干脆用这个标签来截取,也很方便的。

       中英文截取字符串标签的java代码如下,这是我从javaeye上拷贝过来的,在实际的项目中通过。

 

package com.test.mytag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.log4j.Logger;

/**
 * 截断字符串并以制定符号替代的tag
 * 
 * @author ryankay.xiang@gmail.com
 * 
 */
public class CutStringTag extends TagSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(CutStringTag.class);

	String value;
	String mark="";
	Integer size;

	@Override
	public int doStartTag() throws JspException {
		return SKIP_BODY;
	}

	@Override
	public int doEndTag() throws JspException {
		String html = cutString(value, size,mark);
		try {
			this.pageContext.getOut().write(html.toString());
		} catch (IOException e) {
			logger.error("tag CutStringTag error", e);
		}
		return EVAL_PAGE;
	}

	public String cutString(String str, int len,String mark) {
		len = len * 2;
		StringBuffer sb = new StringBuffer();
		int counter = 0;
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			if (c < 255) {
				counter++;
			} else {
				counter = counter + 2;
			}
			if (counter > len) {
				String result=sb.toString().trim();
				result+=mark;
				return result;
			}
			sb.append(c);
		}
		return sb.toString();
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public String getMark() {
		return mark;
	}

	public void setMark(String mark) {
		this.mark = mark;
	}

	public Integer getSize() {
		return size;
	}

	public void setSize(Integer size) {
		this.size = size;
	}
}

 

 

        标签的tld文件代码如下: 

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>site</short-name>
	<uri>http://www.collin.cn/taglib/site</uri>
	<display-name>Collin Site</display-name>
	<description></description>

	<tag>
		<name>cutString</name>
		<tag-class>com.test.mytag.CutStringTag</tag-class>
		<body-content>empty</body-content>
		<description>Used to cut a string with your parameter.</description>
		<attribute>
			<name>value</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<description>Required to set the string what you want to cut.</description>
		</attribute>
		<attribute>
			<name>size</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<description>Required to set the size or length and it compute as chinese.</description>
		</attribute>
		<attribute>
			<name>mark</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
			<description>Write something append to the string or you can use the default ''.</description>
		</attribute>
	</tag>
</taglib>


 

posted on 2010-12-07 21:11  大空翼  阅读(9132)  评论(0编辑  收藏  举报

导航