在开发的过程,因为有一个栏目表的功能开发,用于作为整个系统的页面,栏目等等的一个标识记录之类的。表的设计好简单,就是平时的一样:
id bigint 7
pid bigint 7
code varchar(50)
title varchar(50)
....
数据库里有数据:
id pid code title
1 0 index 首页
然后生成一个实体映射类TColumn.java,还有就是TcolumnAction.java继承actionsupper.java之类的,这些都与正常的一样。
JSP页面有一个新增子类,更改,删除之类的功能,新增子类及更改都是调用同一个javascript方法,然后传入一个标识符用作区是点击了新增还是更改。最终的javascript方法是下面这样:
function addModifNode(id,type){
var url ='/admin/content/tcolumn!input.do?id='+id+'$type='+type;
add(url,title);//打开一个窗口
}
TcolumnAction.java里的input方法为:
public TcolumnAction extends ActionSupper {
private Long id;
private TColumn entity;
...
public String input() throws Exception {
System.out.println("#######id: "+entity.getId());
System.out.println("#######pid: "+entity.getPid());
System.out.println("#######code: "+entity.getCode());
System.out.println("#######title: "+entity.getTitle());
}
...
}
大致就是以上这些代码吧,因为ID里已经传入,所以在执行input方法就会根据ID是否为null来确定是否查询数据库来取值的。页面传入了一个id,所以得到的值应该是数据的。打印出来的也应该是数据库里的数据才是正常的。
但实际上打印出来的并不是这样的,其实所有的都正常,就只的一个pid的值是不正确的。于是就查数据库,dutbug,后来连pid的字段名也改了。还是不行,所得到的值与数据库中的值就是不一致。试了很久,也浪费了很久时间。后来无意中在jsp页面中将&pid=+id删除去后,再测试,一切正常了。
发现问题就好办了。猜想了一下:当提交请交到action里,再到input方法前,就已经取得了一个以ID为准的TComun的pojo对象了。还没有到input方法前,Entity.get()还是正常的。但当进入到input方法后,就会将提交过来的值填充到entity去,此时如果再打印的话就会将传过来的值打印出来。