<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Huion
    事業向左...愛情向右...失去的...我會在未來期待...
    posts - 1,comments - 3,trackbacks - 0

    一、為什么要這樣子做?

    雖然知道業界已經有很多包,而且功能、性能方面很強大了!但是做這人包純粹為了學習Java的映射和Jdom,順便也磨一磨自己的設計思想!


    二、需求分析

    我希望這個包能夠為我做以下二個事情:

    1)將xml文件里面存儲的數據取出來放到存入JavaBean的集合里面

    2)將存有JavaBean的集合里面的數據寫入xml文件

    三、開始動工

    1)接口設計:

    package cn.huion.xml;

    import java.util.Collection;

    /**
     * @author huion
     *
     
    */


    public interface XmlBuilder {
        
        
    public Collection buildBean();//從文件里面讀取數據,返回集合
        
        
    public void buildXml(Collection collection);//傳入集合,并將數據存入xml文件
        
    }

    為了做到約束,我為所有的JavaBean做了一個統一的基類

    package cn.huion.xml.bean;

    /**
     * @author huion
     *
     
    */

    public class XmlBean {
        
    }

    不知道要約束好還是不要約束好?這個問題我沒有答案,希望有人能夠幫我解惑!

    2)行為抽象,不管用什么方法進去buildBean 進行buildXml,之前所需要進行的相關運行,我抽象出來,在這一步上,如果抽象得好,那么擴展性就高了,如果抽象得不好,以后擴展的時候,要改動這個抽象類的話,就違反了原則,所以在這個類上我不敢放入太多的設計

    package cn.huion.xml;

    import java.util.Collection;
    import java.lang.reflect.Method;

    import cn.huion.xml.bean.XmlBean;

    /**
     * @author huion
     *
     
    */

    public abstract class AbstractXmlBuilder implements XmlBuilder {
        
        
    protected Method [] setMethods;
        
    protected Method [] getMethods;
        
    protected String [] property;
        
    protected String xmlPath;
        
    protected Class beanClass;
        
        

        
    public AbstractXmlBuilder(Class clazz,String xmlPath)throws Exception {
            
    this.xmlPath = xmlPath;
            beanClass 
    = clazz;       
        }


        
    protected void buildPrecondition(){//實現前提條件
            try {
                Method []ms 
    = beanClass.getMethods();//取得XmlBean的所有方法
                int allMethodSize = ms.length;//取得方法的個數
                int objectMethodLength = Object.class.getMethods().length;//取得Object的方法的個數
                property = new String[(allMethodSize-objectMethodLength)/2];//計算出XmlBean的屬性數 property[]是用來讀xml文件的時候用的
                
                
    int propertylength = property.length;
                
                getMethods 
    = new Method[propertylength];//存放XmlBean的所有getter方法
                setMethods = new Method[propertylength];//存放XmlBean的所有setter方法
                
                
    int setCount = 0;
                
    int getCount = 0;
                
    for(int i=0;i<ms.length;i++){//迭代XmlBean的所有方法
                    if(ms[i].getDeclaringClass().equals(beanClass)){//如果這個方法是XmlBean聲明的
                        String methodName = ms[i].getName();//得到方法名
                        if(isGetMethod(methodName)){//如果是getter方法
                            getMethods[setCount] = ms[i];//存到getter數組中去
                            setCount++;//計數器加1
                        }
    else{
                            setMethods[getCount] 
    = ms[i];//否則放到setter方法中去
                            getCount++;//計數器加1
                        }

                    }

                }

                
                
    for(int i=0;i<propertylength;i++){//填充屬性名到property[]中去
                    property[i] = this.getPropertyName(getMethods[i].getName());
                }

                
            }
     catch (SecurityException e) {
                e.printStackTrace();
            }

        }

        
        
    abstract public Collection buildBean();//子類擴展
        
        
    abstract public void buildXml(Collection collection);//子類擴展
        
        
    private String getPropertyName(String methodName){
            StringBuffer sb
    =new StringBuffer();
            sb.append(methodName.substring(
    3,4).toLowerCase());
            sb.append(methodName.substring(
    4,methodName.length()));
            
    return sb.toString();
        }

        
        
    private boolean isSetMethod(String methodName){
            
    if(methodName.substring(0,3).equals("set")){
                
    return true;
            }

            
    return false;
        }

        
        
    private boolean isGetMethod(String methodName){
            
    if(methodName.substring(0,3).equals("get")){
                
    return true;
            }

            
    return false;
        }


    }

    或許我可以更大膽點,把xml 解析成Document的代碼也放在這個抽象類中...

    3)先做個簡單的現實來嘗試一下

    先做個SimpleXmlBuilder嘗試一下,如果涉及到無限類包含或者在取出存入的時候要按一定的規則排序的話,如果能夠從AbstractXmlBuilder中擴展,那算是比較好的情況,當然要是不行,必需再進行分析,不斷的重構

    package cn.huion.xml;

    import java.util.Iterator;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.lang.reflect.Method;
    import java.io.
    *;
    import org.jdom.input.SAXBuilder;
    import org.jdom.output.XMLOutputter;
    import org.jdom.Document;
    import org.jdom.Element;

    import cn.huion.xml.bean.XmlBean;


    /**
     * @author huion
     *
     
    */

    public class SimpleXmlBuilder extends AbstractXmlBuilder {
        
        
    private static final String BEAN_MARK="xmlBean";
        
    private static final String XML_ROOT_NAME="root";

        
    protected List readBeans;

        
        
    public SimpleXmlBuilder(Class clazz,String xmlPath)throws Exception {
            super(clazz,xmlPath);
            readBeans
    =new ArrayList();
        }

        
        
    public Collection buildBean() {
            super.buildPrecondition();
            
    try{
                SAXBuilder sb
    =new SAXBuilder();
                Document doc
    =sb.build(new File(xmlPath));
                Element element
    =doc.getRootElement();
                
                List beans 
    = new ArrayList();
                
                beans
    =element.getChildren(BEAN_MARK);
                
    int beanSize=beans.size();
                
    int propertySize=property.length;
                
    for(int i=0;i<beanSize;i++){
                    element
    =(Element)beans.get(i);
                    Object o
    =beanClass.newInstance();
                    
                    Element e;
                    Method m;
                    
    for(int j=0;j<propertySize;j++){
                        e
    =element.getChild(property[j]);
                        m
    =(Method)setMethods[j];
                        m.invoke(o,
    new String[]{e.getTextTrim()});
                    }

                    readBeans.add(o);
                }
     
                
    return readBeans;
            }
    catch(Exception e){
                e.printStackTrace();
                
    return null;
            }

        }

        
        
    public void buildXml(Collection collection){
            super.buildPrecondition();
            
    try{
                XMLOutputter xo
    =new XMLOutputter();
                Document doc
    =new Document();
                Element root
    =new Element(XML_ROOT_NAME);
                Iterator it 
    = collection.iterator();
                
    while(it.hasNext()){
                    Element xmlBean
    =new Element(BEAN_MARK);
                    Object bean
    =it.next();
                    
    for(int j=0;j<property.length;j++){
                        System.
    out.println(getMethods[j].getName());
                        Element e
    =new Element(property[j]);
                        String str
    =(String)getMethods[j].invoke(bean,null);
                        e.setText(str);
                        xmlBean.addContent(e);
                    }

                    root.addContent(xmlBean);
                }

                doc.addContent(root);
                xo.output(doc,
    new FileOutputStream(new File(xmlPath)));
            }
    catch(Exception e){
                e.printStackTrace();
            }

        }

        
    }

    四、相關測試

    1)定義XmlBean

    import cn.huion.xml.bean.XmlBean;

    /**
     * @author huion
     *
     
    */

    public class TestBean extends XmlBean {
        
        
    private String name;
        
    private String sex;

        
    /**
         * 
         
    */

        
    public TestBean() {
            super();
        }



        
    /**
         * @return 返回 name。
         
    */

        
    public String getName() {
            
    return name;
        }

        
    /**
         * @param name 要設置的 name。
         
    */

        
    public void setName(String name) {
            
    this.name = name;
        }

        
    /**
         * @return 返回 sex。
         
    */

        
    public String getSex() {
            
    return sex;
        }

        
    /**
         * @param sex 要設置的 sex。
         
    */

        
    public void setSex(String sex) {
            
    this.sex = sex;
        }

    }


    2)新建一個xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    <xmlBean>
    <name>
    huion
    </name>
    <sex>
    1
    </sex>
    </xmlBean>

    <xmlBean>
    <name>
    dobedo
    </name>
    <sex>
    2
    </sex>
    </xmlBean>
    </root>



    3) 功能測試用例

    package cn.huion.xml;

    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ArrayList;

    import junit.framework.TestCase;

    /**
     * @author huion
     *
     
    */

    public class TestSimpleXmlBuilder extends TestCase {

        SimpleXmlBuilder sxb;
        
    protected void setUp() throws Exception {
            super.setUp();
            sxb 
    = new SimpleXmlBuilder(TestBean.class,"C:/test.xml");
        }


        
    protected void tearDown() throws Exception {
            super.tearDown();
        }


        
    public void testBuildBean() {
            Collection coll 
    = sxb.buildBean();
            Iterator it 
    = coll.iterator();
            
    while(it.hasNext()){
                TestBean bean 
    = (TestBean)it.next();
                System.
    out.println("Name: "+bean.getName()+" Sex: "+bean.getSex());
            }

        }


        
    public void testBuildXml() {
            List list 
    = new ArrayList();
            TestBean b 
    = new TestBean();
            b.setName(
    "love");
            b.setSex(
    "1");
            list.add(b);
            TestBean bb 
    = new TestBean();
            bb.setName(
    "dobedo");
            bb.setSex(
    "2");
            list.add(bb);
            sxb.buildXml(list);
        }


    }

    五、總結

    至此為止功能基本實現了,性能上的測試還沒有做相關的工作!異常處理是好像有點麻煩!或者應該再制定一個XmlBuilderException出來!在模塊處理中應該拋出來,而不應該返回null,這一點是有點不負責任!
    呵呵!希望有人能夠加入評論!

    posted on 2005-07-08 02:29 一輝 閱讀(431) 評論(1)  編輯  收藏 所屬分類: My Design

    FeedBack:
    # re: 我的設計之一:利用Java映射和Jdom做通用JavaBean取存
    2006-03-22 15:13 | weibo
    hao  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 无码国产精品一区二区免费模式| 精品亚洲国产成人av| 蜜芽亚洲av无码精品色午夜| 国产亚洲精品va在线| 久久亚洲综合色一区二区三区| 亚洲欭美日韩颜射在线二| 久久久精品国产亚洲成人满18免费网站| 亚洲av无码专区在线观看素人| 亚洲M码 欧洲S码SSS222| 免费成人午夜视频| jjzz亚洲亚洲女人| 久久久青草青青国产亚洲免观 | 丝瓜app免费下载网址进入ios| 国产精品成人啪精品视频免费| 精品久久久久久国产免费了| 国产永久免费高清在线| 无码日韩精品一区二区免费暖暖| 99视频精品全部免费观看| 国产精品成人免费福利| 免费看美女被靠到爽的视频| 国产在线a不卡免费视频| 亚洲人妻av伦理| 亚洲va无码va在线va天堂| 亚洲视频在线一区二区三区| 亚洲男人天堂影院| 亚洲国产一区二区三区在线观看| 无码的免费不卡毛片视频| 一个人免费视频在线观看www| 人妻丰满熟妇无码区免费| 91免费精品国自产拍在线不卡| 免费va在线观看| 中文字幕不卡亚洲| 亚洲福利视频网址| 亚洲国产成人无码AV在线 | 亚洲高清视频免费| 久久夜色精品国产噜噜亚洲a| 污污视频网站免费观看| 永久免费av无码网站yy| 成人在线视频免费| 国产亚洲成人在线播放va| 亚洲精品高清国产一久久|