1. 程式人生 > >Struts2增刪改查(自己思路理解)

Struts2增刪改查(自己思路理解)

分析 pac name 沒有 從數據 屬性 數據 employees 查詢

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