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"; }
Struts2增刪改查(自己思路理解)