StringBuffer的使用

文章详细介绍了在项目开发过程中遇到的问题,即利用注入方式创建对象导致同一Buffer对象被多次操作,进而引起页面输出叠加。通过在方法调用时创建新的StringBuffer对象,成功解决了该问题,确保了页面输出的正确性和唯一性。

这两天在做项目。。。。废话不说,直入正题:(S1SH整合开发)

                       封了一个Util的类,主要用于读取树形结构,数据库表结构是这样:id  name pid isleaf

 

发现bug之前,代码写成这样:*

 

import java.util.List;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.JdbcTemplate;

import com.fanqi.pojo.Category;

 

public class TreeUtil {

    private JdbcTemplate jdbcTemplate;

    private StringBuffer treeStr=new StringBuffer();//注意:这里Buffer是定义的属性(全局的!!)

    private static final int isLeaf=1;//是叶子

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

       this.jdbcTemplate = jdbcTemplate;

    }

    /**

     *

     * @param pid 父节点的id,pid0开始

     * @param level 控制缩进"-"

     * @return

     */

    public String read(int pid,int level,String flag){

       String sql="select categoryID,categoryName,categoryDescription,pid,isLeaf from t_category where pid=?";

       Object [] args = new Object[]{pid};

       List<Category> categoryList = jdbcTemplate

                  .query(sql, args, new BeanPropertyRowMapper(Category.class));

       for(int i=0;i<categoryList.size();i++){

           Category cgy=(Category)categoryList.get(i);

           treeStr.append("<option value='"+cgy.getCategoryID()+"'>");

           for(int j=0;j<level;j++){

              treeStr.append(flag);

           }

          

           treeStr.append(cgy.getCategoryName()+"</option>");

           if(notLeaf==cgy.getIsLeaf()){

              read(cgy.getCategoryID(),level+1,flag);

           }

       }

       return treeStr.toString();

    }

       

   

}

 

我在action中是以注入的形式将这个类创建的。前台输出字符串如下:

 

<select multiple="multiple" id="typeListA" style="width:300px;height: 200px;">

         <bean:write name="treeString" filter="false"/>

</select>

 

当每次刷新页面的时候,<bean:write>中输出的treeString就会叠加在一起,比如:

           第一次,访问页面时<bean:write>输出的是:<option >金属类</option>

           第二次,刷新当前页面<bean:write>输出的是:<option >金属类</option><option >金属类</option>

           第三次,刷新当前页面<bean:write>输出的是:<option >金属类</option><option >金属类</option><option >1111</option>                         

                                     .

                                     .

                                     .

                                     .

                                                                     以此类推

                                     .

                                     .

经过检查,上面的写法有个问题,当以注入的形式创建对象的时候,内存中就只有一个TreeUtil类,TreeUtil类中的Buffer对象也只有一个,那么,每次刷新页面的时候,都是对同一个Buffer对象进行操作,所以才会出现这种情况。

修改TreeUtil类如下:

import java.util.List;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.JdbcTemplate;

import com.tjhha.pojo.Category;

 

public class TreeUtil {

    private JdbcTemplate jdbcTemplate;

    private static final int notLeaf=0;//不是叶子为0

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

       this.jdbcTemplate = jdbcTemplate;

    }

   

    public String readTree(int pid,int level,String flag){

       StringBuffer treeBufStr=new StringBuffer();//注意:StringBuffer,每次调用方法时都要new一个,如果用private定义成类属性,会只使用一个StringBuffer对象

       String treeStr=read(pid,level,flag,treeBufStr);

       return treeStr;

      

    }

    /**

     *

     * @param pid id

     * @param level 控制换行

     * @return

     */

    public String read(int pid,int level,String flag,StringBuffer treeBufStr){

       String sql="select categoryID,categoryName,categoryDescription,pid,isLeaf from t_category where pid=?";

       Object [] args = new Object[]{pid};

       List<Category> categoryList = jdbcTemplate

                  .query(sql, args, new BeanPropertyRowMapper(Category.class));

       for(int i=0;i<categoryList.size();i++){

           Category cgy=(Category)categoryList.get(i);

           treeBufStr.append("<option value='"+cgy.getCategoryID()+"'>");

           for(int j=0;j<level;j++){

              treeBufStr.append(flag);

           }

          

           treeBufStr.append(cgy.getCategoryName()+"</option>");

           if(notLeaf==cgy.getIsLeaf()){

              read(cgy.getCategoryID(),level+1,flag,treeBufStr);

           }

       }

       return treeBufStr.toString();

    }

   

}

 

注意上面粉色的标注,这样就不会出现叠加的情况了~~~~~~~

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值