08-01
23

几种对标题长度限制的办法

一.Struts本来有<bean:write>标签,对其类StringTag进行扩展
我觉得在读数据的时候截取标题的长度有一些不妥当,我刚才试图写了一个很简单的自定义标签,在struts中有这样一个标签<bean:write name="article" property="title"/>上面标签的意思是读取article对象中的title属性的值,现在对title的长度要求限制在一定范围之内,定义此标签的类是org.apache.struts.taglib.bean.WriteTag如果对这个类扩展,加一个属性cut ,再根据cut的大小来截取标题的长度,我对WriteTag继承,重写doStartTag(), package org.apache.struts.taglib.bean; //注意,要这样写,不然会出错的
StringTag extends WriteTag{....
public String setValue(String value) {
    String tempProperty=value;
    if(cut>0){
        if(tempProperty.length()>=(cut+1)){
            tempProperty=tempProperty.substring(0, cut) +"...";        }
    }
    return tempProperty;
}
public int doStartTag() throws JspException {    // Look up the requested bean (if necessary)
    if (ignore) {
        if (TagUtils.getInstance().lookup(pageContext, name, scope) == null) {
            return (SKIP_BODY); // Nothing to output
        }
    }    // Look up the requested property value
    Object value = TagUtils.getInstance().lookup(pageContext, name, property, scope);    if (value == null) {
        return (SKIP_BODY); // Nothing to output
    }    // Convert value to the String with some formatting
    String output = formatValue(value);
    output=setValue(output);  //这句是加的,别的都是原来的
    // Print this property value to our output writer, suitably filtered
    if (filter) {
        TagUtils.getInstance().write(pageContext, TagUtils.getInstance().filter(output));
    } else {
        TagUtils.getInstance().write(pageContext, output);
    }    // Continue processing this page
    return (SKIP_BODY);}


对标签重写完毕,然后写一个dtd文件
<tag>
<name>write</name>
<tagclass>org.apache.struts.taglib.bean.StringTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>bundle</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>filter</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>format</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>formatKey</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>ignore</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>locale</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>property</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>scope</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>cut</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>


写完了之后,我们就可以在jsp页面中调用它了,首先引用定义标签
<%@ taglib uri="/WEB-INF/titlecut.tld" prefix="title" %>
然后对链接代码进行重写,我写的是下面一段
<html:link action="/admin/view" paramName="article"
paramProperty="id" paramId="id"
title="<bean:write name='article' property='title'/>">
<title:write name="article" property="title" cut="18"/>
</html:link>

用以上方法当鼠标放到标题上时回显示完整的标题,在页面中显示部分标题

以上为来自网上的第一种方法,方法挺好的,避免了修改ActionForm,以及连带的其他的改变,在最小程度上对原有代码进行了修改。有两个建议:
第一行,不用用package指到struts包中,因为这不是struts本身的部分,你把你的StringTag类放到cn.qhang.cms.article中即可,然后在类中
import org.apache.struts.taglib.bean.WriteTag;
2. setValue方法还值得修改,考虑到页面的显示可能出现这样的几个情况,如果标题长度等于要截取的长度,那么就不用加省略号了,而如果原标题长度长于要截取的长度,那么实际上为了页面的整齐,要把字符多截短两个,留出省略号的位置,这个方法可以参考我原始代码中关于标题长度截取的方法。 3. 还有你的这个定义文件,放到page.tld里面比较好,整合在一起。

第二种,自己写一个类就完事了,这种方法比较省事,但页面有代码,不建议用
JSP中:  
<%@   page   import="org.common.util.Util.*"   %>     //调用截取字符的类  
<bean:define   id="corpintroduce"   name="companyinfo"   property="corpintroduce"   type="java.lang.String"></bean:define>  
<%=org.common.util.Util.getCutString(corpintroduce,0,250,"...")%>  

//corpintroduce是要截取的字段,本来可以直接放<bean:write>进去,不用<bean:define>。可惜我现在的开发环境版本的<%   %>里面不支持<bean:write>   ;所以....  
  
  Java类        
  public   class   Util   {  
          public   final   static   String   getCutString(String   input,   int   start,   int   len,  
                          String   tail)   {  
                  String   str   =   cutString(input,   start,   len);  
                  if   (str.length()   >   0   &&   str.length()   <   input.length())   {  
                          return   str   +   tail;  
                  }  
                  return   str;  
          }  
  }  

    
  // 自己注意类名字和方法,变量名。我市把我代码里面的直接贴出来的  
  // getCutString(要截取的字符串,开始位置,结束位置(就是要截取的位数),截取字符串的最后加的符号 )

第三种,不用想也知道了,是自定义标签,但还是不建议用,毕竟第一种的也是自定义,而且Struts的bean:write标签无论从功能还是性能上,都很良好

文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: bean:write 标签 自定义 自定义标签
相关日志:
评论: 0 | 引用: 0 | 查看次数: 1308
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭