练习中的问题:
1,<s:url action="employee_input" />
这个标签用来让struts自动生成请求的路径,struts生成的路径是一个全路径,包含了context/package/action_method.action
1),context:就是我们在tomcat里面配置的path
2),package:struts中的包路径;
3),action_method:写在s:url标签中的action;
4),.action:就是在struts中配置的后缀名;
2,<s:a action="employee_input"><s:param name="employee.id" value="#u.id"/>编辑</s:a>
这个标签用来让struts自动生成<a>标签;
1),生成的a标签的href也是全路径;
2),在a标签中可以加上<s:param>,
<s:param name="" value=""/>
1),name属性代表添加到url中的参数的名字;
2),value属性代表添加到url中参数的值;
3,修改掉值的问题:
现象:在修改的时候,如果修改页面中有一些属性不需要修改,在修改之后,这些属性的值就没了;
原因:在编辑的时候,数据包装到这个Employee中的,由于表单数据缺失,employee中会少一些属性;
在update方法中,直接修改这个实例,hibernate中,会根据对象生成完整的UPDATE语句,所以属性被null覆盖了
解决方法:在包装参数之前,先把employee查询出来,在查询出来的对象上面再包装值;
prepare拦截器:
1,如果我们的Action实现了Preparable接口,prepare拦截器就会在我这个action所有的方法执行之前调用;
2,可以只拦截指定的方法;
1),比如 要拦截的方法名字叫做save;
2),在Action中创建一个public void prepareSave()方法,这个方法就可以在save方法执行之前执行;
3,默认情况下,在defalut-stack中,prepare拦截器是先于params拦截器执行的,所以在prepare拦截器中不能直接得到参数;
4,把默认拦截器栈修改为paramsPrepareParamsStack;
4,opensessioninview:
问题的出现:当我的employee和dept关联,在列表里面就显示不出来dept相关信息(no session的错误)
解决:提前开启session,延迟关闭session(把sesion的开启和关闭放到filter中);我们就把这种模式称为open session in view;这种模式专门用来处理延迟加载的问题;
注意,使用了Opensessioninview的模式,我们必须保证,这个opensessioninview的filter使用的是spring提供的;
spring处理session是一整套方案:
1,在filter中开启session,放到current thread中;
2,在aop的事务中,得到当前的session,开启事务;
3,在dao中(sessionFactory),得到当前的session,处理DML+QUERY;
4,在aop的事务结束时,提交事务(并不会关闭session);
5,请求返回的时候,在filter中关闭session;
5,在修改employee的时候,修改了department,报错;
问题原因:因为使用了opensessioninviewfilter,所以在prepareSave中查询到的employee和employee关联的department都是持久化对象,在提交数据的时候,我们修改了department的OID值,在hibernate中,是不允许修改持久化对象的OID的;所以hibernate报错;
解决问题:在prepareSave方法中,设置得到的employee对象关联的部门对象为空;