Java 版 (精华区)

发信人: thering (没完没了), 信区: Java
标  题: struts源码分析=====ActionMessages
发信站: 哈工大紫丁香 (2003年05月16日22:17:18 星期五), 站内信件

www.javasoft.cn


package org.apache.struts.action


package org.apache.struts.action

ActionMessages

2003-5-16日:有点累了

package org.apache.struts.action;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.HashMap;
import java.util.List;

封装messages的一个类,有点统一管理的感觉
public class ActionMessages implements Serializable {

    public static final String GLOBAL_MESSAGE = 
        "org.apache.struts.action.GLOBAL_MESSAGE";
    
    //猜想他是保存message的
    protected HashMap messages = new HashMap();

    //计数的东东
    protected int iCount = 0;

    public ActionMessages() {
        super();
    }

    public ActionMessages(ActionMessages messages) {
        super();
        this.add(messages);
    }
    
    看过这个方法你就会知道struts是怎么管理message的了。 ActionMessages里面有个
    实例变量messages,他存储着  ActionMessageItem类型的对象,ActionMessageItem
    类型的对象有个list变量,他负责ActionMessage对象的存储,
    我个人觉得有点麻烦

    public void add(String property, ActionMessage message) {
        // ActionMessageItem是什么?别急,后面马上就到
        ActionMessageItem item = (ActionMessageItem)
                                    messages.get(property);
        List list = null;
        if (item == null) {
            list = new ArrayList();
            item = new ActionMessageItem(list,iCount++);
            messages.put(property, item);
        } else {
            list = item.getList();
        }
        list.add(message);
    }

    //将以有的ActionMessages内容加到this ActionMessages当中
    public void add(ActionMessages messages) {
        //取得messages的keyset
        Iterator props = messages.properties();
        while (props.hasNext()) {
            String property = (String) props.next();
            Iterator msgs = messages.get(property);
            while (msgs.hasNext()) {
                ActionMessage msg = (ActionMessage)msgs.next();
                this.add(property, msg);
            }
        }
    }

    public void clear() {
        messages.clear();
    }

    public boolean empty() {
        return (this.isEmpty());
    }

    public boolean isEmpty(){
        return (messages.isEmpty());    
    }

    public Iterator get() {
        if (messages.size() == 0) {
            return (Collections.EMPTY_LIST.iterator());
        }
        ArrayList results = new ArrayList();
        ArrayList actionItems = new ArrayList();

        for (Iterator i = messages.values().iterator();
            i.hasNext();) {

            actionItems.add(i.next());
        }

        Collections.sort(actionItems, new Comparator() {
            public int compare(Object o1, Object o2) {
                return              ((ActionMessageItem)o1).getOrder() - 
                ((ActionMessageItem) o2).getOrder();
            }
        });

        for (Iterator i = actionItems.iterator();i.hasNext();) {
            ActionMessageItem ami = (ActionMessageItem)
                                    i.next();
            for (Iterator messages =
                ami.getList().iterator();               
                messages.hasNext();) {

                results.add(messages.next());
            }
        }
        return (results.iterator());
    }


    public Iterator get(String property) {
        ActionMessageItem item = (ActionMessageItem)            
                                    messages.get(property);
        if (item == null) {
            return (Collections.EMPTY_LIST.iterator());
        } else {
            return (item.getList().iterator());
        }
    }

    public Iterator properties() {
        return (messages.keySet().iterator());
    }

    public int size() {
        int total = 0;
        for (Iterator i = messages.values().iterator();             
            i.hasNext();) {

            ActionMessageItem ami = (ActionMessageItem)i.next();
            total += ami.getList().size();
        }
        return (total);
    }

    public int size(String property) {
        ActionMessageItem ami = (ActionMessageItem)             
                                messages.get(property);
        if (ami == null)
            return (0);
        else
            return (ami.getList().size());
    }

    //就是这个类用order和list来存储message
    protected class ActionMessageItem implements Serializable {
        protected List list = null;
        protected int iOrder = 0;
        public ActionMessageItem(List list, int iOrder) {
            this.list = list;
            this.iOrder = iOrder;
        }
        public List getList() {
            return list;
        }
        public void setList(List list) {
            this.list = list;
        }
        public int getOrder() {
            return iOrder;
        }
        public void setOrder(int iOrder) {
            this.iOrder = iOrder;
        }
    }
}

总结:这部分只需要知道它的结构就可以了,还有他的几个简单方法,如果你看着不爽,
也可以用你自己的方法实现ActionMessage的管理,作你自己的ActionMessages。
 

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.228.151]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.597毫秒