今天在练习一个SSM例子中,在最后的数据修改提交的过程中出现了一个有意思的错误,记录下来。
首先是在数据列表中通过点击修改跳转到对应的controller后台函数中,其中传递的是数据对应的id。
如下图:
对应的接收方法如下,这里使用的无返回值类型的返回方式:
@RequestMapping(value="/editItems", method=RequestMethod.GET)
public void editItems(HttpServletRequest request,HttpServletResponse response,Integer id) throws Exception{
ItemsCustom itemsCustom = itemsService.findItemsById(id);
request.setAttribute("itemsCustom", itemsCustom);
request.getRequestDispatcher("/WEB-INF/jsp/editItem.jsp").forward(request, response);;
}
负责修改数据的conntroller方法:
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Integer id,ItemsCustom itemsCustom) throws Exception
{
System.out.println("id="+id);
System.out.println("itemsCustom:"+itemsCustom);
itemsService.updateItems(id,itemsCustom);
//请求转发
// return "forward:queryItems.action";
//重定向
return "redirect:queryItems.action";
}
跳转到修改页面后,本以为修改完数据后就好了,但是发现修改完数据后,数据库中的数据并没有发生变化,其中更新数据的函数是通过MyBatis Generator生成的,所以函数是没有问题,可定是在数据的传递过程中出现的问题。
通过syso发现id和itemsCustom中的id并没有传递到controller中
但是神奇的地方出现了,如果是id的数据没有传递过来还可以理解,但是itemsCustom对象中id也变成了空值,而对象中其他的数据没有丢失。
对象数据部分丢失我还是第一次遇到,这我就有点慌了
通过一步步的数据观察,最后找到问题所在,原来在修改页面的表单提交中
在隐藏input中定义的id属性时,用el表达式忘记使用param.XXX
来获取传递参数中的id值了,但是具体为什么hidden中的id会替换掉对象中的id的值,这个我查了半天也没有查到,但是我想是因为id值为itemsCustom对象属性值的一部分,所以才会发生空的id值替换itemsCustom中id的数据,导致后面中获取不到id的值无法对数据进行更新。
还是在看EL表达式的时候没有细心看,其中通过EL获取对象值可以看下这篇博客 http://xvshell.iteye.com/blog/762026