• 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";
        }
  • 相关阅读:
    使用setTimeout()代替setInterval()
    音视频入门-02-RGB拼图
    音视频入门-01-认识RGB
    CMake入门-04-自定义编译选项
    CMake入门-03-还是HelloWorld
    CMake入门-02-HelloWorld扩展
    CMake入门-01-从HelloWorld开始
    HTML页面启动sass监听编译成css文件
    安装+配置Express
    安装+配置Nginx
  • 原文地址:https://www.cnblogs.com/bulrush/p/7768831.html
Copyright © 2020-2023  润新知