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";
    }

 

posted @ 2017-11-01 22:16  陆伟  阅读(371)  评论(0编辑  收藏  举报