jstl3目运算:前台页面截取字符串
jstl三目运算:前台页面截取字符串
通常像标题之类的,如果后台输入过长,那么前台完整输出,必然在格式上造成多行,会显得很难看,当然如果事先对该行进行了长度和高度的控制,加上了一句“overflow:hidden”,那又另当别论了。
截取的方式自然是通过${fn:substring()}函数,那么做法如下:
1 |
< c:if test="${fn:length(article.title)>21"}>${fn:substring(article.title,0,21)}....</ c:if >
|
2 |
< c:if test = "${fn:length(article.title)<=21" }>${article.title}</ c:if >
|
这样写未尝不可,其实有一个更简单的输出方式,用到的方法就是三目运算法,代码如下:
1 |
${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上拷贝过来的,在实际的项目中通过。
01 |
package com.test.mytag;
|
02 |
|
03 |
import java.io.IOException;
|
04 |
|
05 |
import javax.servlet.jsp.JspException;
|
06 |
import javax.servlet.jsp.tagext.TagSupport;
|
07 |
|
08 |
import org.apache.log4j.Logger;
|
09 |
|
10 |
/** |
11 |
* 截断字符串并以制定符号替代的tag
|
12 |
*
|
13 |
* @author ryankay.xiang@gmail.com
|
14 |
*
|
15 |
*/
|
16 |
public class CutStringTag extends TagSupport {
|
17 |
/**
|
18 |
*
|
19 |
*/
|
20 |
private static final long serialVersionUID = 1L;
|
21 |
|
22 |
/**
|
23 |
* Logger for this class
|
24 |
*/
|
25 |
private static final Logger logger = Logger.getLogger(CutStringTag. class );
|
26 |
|
27 |
String value;
|
28 |
String mark= "" ;
|
29 |
Integer size;
|
30 |
|
31 |
@Override
|
32 |
public int doStartTag() throws JspException {
|
33 |
return SKIP_BODY;
|
34 |
}
|
35 |
|
36 |
@Override
|
37 |
public int doEndTag() throws JspException {
|
38 |
String html = cutString(value, size,mark);
|
39 |
try {
|
40 |
this .pageContext.getOut().write(html.toString());
|
41 |
} catch (IOException e) {
|
42 |
logger.error( "tag CutStringTag error" , e);
|
43 |
}
|
44 |
return EVAL_PAGE;
|
45 |
}
|
46 |
|
47 |
public String cutString(String str, int len,String mark) {
|
48 |
len = len * 2 ;
|
49 |
StringBuffer sb = new StringBuffer();
|
50 |
int counter = 0 ;
|
51 |
for ( int i = 0 ; i < str.length(); i++) {
|
52 |
char c = str.charAt(i);
|
53 |
if (c < 255 ) {
|
54 |
counter++;
|
55 |
} else {
|
56 |
counter = counter + 2 ;
|
57 |
}
|
58 |
if (counter > len) {
|
59 |
String result=sb.toString().trim();
|
60 |
result+=mark;
|
61 |
return result;
|
62 |
}
|
63 |
sb.append(c);
|
64 |
}
|
65 |
return sb.toString();
|
66 |
}
|
67 |
|
68 |
public String getValue() {
|
69 |
return value;
|
70 |
}
|
71 |
|
72 |
public void setValue(String value) {
|
73 |
this .value = value;
|
74 |
}
|
75 |
|
76 |
public String getMark() {
|
77 |
return mark;
|
78 |
}
|
79 |
|
80 |
public void setMark(String mark) {
|
81 |
this .mark = mark;
|
82 |
}
|
83 |
|
84 |
public Integer getSize() {
|
85 |
return size;
|
86 |
}
|
87 |
|
88 |
public void setSize(Integer size) {
|
89 |
this .size = size;
|
90 |
}
|
91 |
} |
JS的控制如下:
- function cutstr(str,len)
- {
- var str_length = 0;
- var str_len = 0;
- str_cut = new String();
- str_len = str.length;
- for(var i = 0;i<str_len;i++)
- {
- a = str.charAt(i);
- str_length++;
- if(escape(a).length > 4)
- {
- str_length++;
- }
- str_cut = str_cut.concat(a);
- if(str_length>=len)
- {
- str_cut = str_cut.concat("...");
- return str_cut;
- }
- }
- }