Struts2增删改查(自己思路理解)
1:查询所有:
DAO层:把所有的信息都放到list集合中。然后返回。
public List<Employee> getEmployees(){ return new ArrayList<Employee>(emps.values()); }
Action层:把所有的数据放到request的Map中。然后页面显示的时候。取request中的值
private Map<String, Object> request; public void setRequest(Map<String, Object> arg0) { this.request = arg0; } public String list(){ request.put("emps", dao.getEmployees()); return "list"; }
页面获取: #request.emps
<body> <table cellpadding="10" cellspacing="0" border="1"> <thead> <tr> <td>ID</td> <td>FirstName</td> <td>LastName</td> <td>Email</td> <td>Edit</td> <td>Delete</td> </tr> </thead> <tbody> <s:iterator value="#request.emps"> <tr> <td>${employeeId }</td> <td>${firstName }</td> <td>${lastName }</td> <td>${email }</td> <td><a href="emp-edit?employeeId=${employeeId }">Edit</a></td> <td><a href="emp-delete?employeeId=${employeeId }">Delete</a></td> </tr> </s:iterator> </tbody> <a href="emp-save.jsp">添加一个</a> </table> <s:debug></s:debug> </body>
2:删除一个
DAO:点击删除的时候得到ID。然后作为参数传入。然后删除整个Employee对象。
public Employee delete(Integer empId){ return emps.remove(empId); }
Action:
利用ModelDrivenInterceptor拦截器和ModelDriven 接口把值压入到栈顶
用getModel方法创建一个employee对象。然后压入到栈顶。
利用使用 PrepareInterceptor拦截器 和 Preparable 接口
执行 ParametersInterceptor 的 intercept 方法: 把请求参数的值赋给栈顶对象对应的属性. 若栈顶对象没有对应的属性, 则查询
值栈中下一个对象对应的属性....
prepare() 主要作用:为getModel()方法准备model的。
5). 存在的问题:
getModel 方法
public Employee getModel() {
if(employeeId == null)
employee = new Employee();
else
employee = dao.get(employeeId);
return employee;
}
I. 在执行删除的时候, employeeId 不为 null, 但 getModel 方法却从数据库加载了一个对象. 不该加载!
II. 指向查询全部信息时, 也 new Employee() 对象. 浪费!
6). 解决方案: 使用 PrepareInterceptor 和 Preparable 接口.
7). 关于 PrepareInterceptor
[分析后得到的结论]
若 Action 实现了 Preparable 接口, 则 Struts 将尝试执行 prepare[ActionMethodName] 方法,
若 prepare[ActionMethodName] 不存在, 则将尝试执行 prepareDo[ActionMethodName] 方法.
若都不存在, 就都不执行.
若 PrepareInterceptor 的 alwaysInvokePrepare 属性为 false,
则 Struts2 将不会调用实现了 Preparable 接口的 Action 的 prepare() 方法
public Employee getModel() { employee=new Employee(); return employee; } private Integer employeeId; public void setEmployeeId(Integer employeeId) { this.employeeId = employeeId; } public String delete(){ dao.delete(employeeId); return "success"; } public void prepare() throws Exception { System.out.println("prepare..."); }
3:添加一个:
DAO:保存一个employee对象
public void save(Employee employee){ long time=System.currentTimeMillis(); employee.setEmployeeId((int)time); emps.put(employee.getEmployeeId(), employee); }
Action:
public String save(){ dao.save(employee); return "success"; } public void prepareSave(){ employee = new Employee(); }
4:修改 得到修改的ID。然后回显本来显示的数据(利用ModelDriven把在栈顶的employee对象显示出来)。然后再重新添加一个Employee对象。
在页面上隐藏ID:
<s:hidden name="employeeId"></s:hidden>
DAO:得到一个ID。
public Employee get(Integer empId){ return emps.get(empId); } public void update(Employee emp){ emps.put(emp.getEmployeeId(), emp); }
Action:
public String update(){ dao.update(employee); return "success"; } public void prepareUpdate(){ employee = new Employee(); } public String edit(){ return "edit"; }