这两天在做项目。。。。废话不说,直入正题:(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,pid从0开始
* @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(); } } 注意上面粉色的标注,这样就不会出现叠加的情况了~~~~~~~
文章详细介绍了在项目开发过程中遇到的问题,即利用注入方式创建对象导致同一Buffer对象被多次操作,进而引起页面输出叠加。通过在方法调用时创建新的StringBuffer对象,成功解决了该问题,确保了页面输出的正确性和唯一性。
1877

被折叠的 条评论
为什么被折叠?



