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; } } }