页面修改Employee对象时,传入Aciton id属性,在页面中需要回显。通过id在数据库中取到emp,将各个字段赋值给
栈顶的新Employee。完成回显,并跳转到修改页面。
public String edit(){
//传入的EmployeeID
//根据EmployeeID获取数据库对象,emp是数据库取出来的
Employee emp=dao.get(employee.getEmployeeId());
//把栈顶对象属性装配
employee.setFirstName(emp.getFirstName());
employee.setLastName(emp.getLastName());
return "edit";
}
上述方法并不理想。应该通过将数据库中取出的对象,放入值栈栈顶来进行回显,但是因为跳转Action时,已经有一个Employee对象在值栈中,所以通过是否有id属性来判断在getModel时是新建还是从数据库中取出Employee放入值栈 。
但原先的拦截器栈在ModelDriven前没有params拦截器,所以要启用新的拦截器栈
<struts>
<package name="default" namespace="/" extends="struts-default">
<!-- 配置使用 paramsPrepareParamsStack 作为默认的拦截器栈 -->
<!-- 修改 PrepareInterceptor 拦截器的 alwaysInvokePrepare 属性值为 false -->
<interceptors>
<interceptor-stack name="atguigustack">
<interceptor-ref name="paramsPrepareParamsStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="atguigustack"/>
<action name="emp-*"
class="com.atguigu.struts2.app.EmployeeAction"
method="{1}">
<result name="{1}">/emp-{1}.jsp</result>
<result name="success" type="redirectAction">emp-list</result>
</action>
<action name="emp-list"
class="com.atguigu.struts2.app.EmployeeAction"
method="list">
<result name="list">/emp-list.jsp</result>
</action>
</package>
</struts>
@Override
public Employee getModel() {
//若create 就new一个
//若修改,则从数据库取
//判断标准为是否有EmployeeID参数
//所以在进入DrivelModel拦截器前要先执行params拦截器栈
//通过paramsPrepaeParams拦截器栈可以实现
if(employeeId == null){
employee=new Employee();
}else{
employee=dao.get(employeeId);
}
return employee;
}
但是在删除的时候,由于也会带入id值,所以值栈中会多余加载Employee对象!