当前位置: 代码迷 >> JavaScript >> jstl3目运算:前台页面截取字符串
  详细解决方案

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

热度:489   发布时间:2012-10-27 10:42:26.0
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的控制如下:

  1. function cutstr(str,len)
  2. {
  3. var str_length = 0;
  4. var str_len = 0;
  5. str_cut = new String();
  6. str_len = str.length;
  7. for(var i = 0;i<str_len;i++)
  8. {
  9. a = str.charAt(i);
  10. str_length++;
  11. if(escape(a).length > 4)
  12. {
  13. ?? str_length++;
  14. }
  15. str_cut = str_cut.concat(a);
  16. if(str_length>=len)
  17. {
  18. ?? str_cut = str_cut.concat("...");
  19. ?? return str_cut;
  20. }
  21. }
  22. }
  相关解决方案