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

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

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

    Huion
    事業(yè)向左...愛(ài)情向右...失去的...我會(huì)在未來(lái)期待...
    posts - 1,comments - 3,trackbacks - 0

    一、為什么要這樣子做?

    雖然知道業(yè)界已經(jīng)有很多包,而且功能、性能方面很強(qiáng)大了!但是做這人包純粹為了學(xué)習(xí)Java的映射和Jdom,順便也磨一磨自己的設(shè)計(jì)思想!


    二、需求分析

    我希望這個(gè)包能夠?yàn)槲易鲆韵露€(gè)事情:

    1)將xml文件里面存儲(chǔ)的數(shù)據(jù)取出來(lái)放到存入JavaBean的集合里面

    2)將存有JavaBean的集合里面的數(shù)據(jù)寫(xiě)入xml文件

    三、開(kāi)始動(dòng)工

    1)接口設(shè)計(jì):

    package cn.huion.xml;

    import java.util.Collection;

    /**
     * @author huion
     *
     
    */


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

    為了做到約束,我為所有的JavaBean做了一個(gè)統(tǒng)一的基類

    package cn.huion.xml.bean;

    /**
     * @author huion
     *
     
    */

    public class XmlBean {
        
    }

    不知道要約束好還是不要約束好?這個(gè)問(wèn)題我沒(méi)有答案,希望有人能夠幫我解惑!

    2)行為抽象,不管用什么方法進(jìn)去buildBean 進(jìn)行buildXml,之前所需要進(jìn)行的相關(guān)運(yùn)行,我抽象出來(lái),在這一步上,如果抽象得好,那么擴(kuò)展性就高了,如果抽象得不好,以后擴(kuò)展的時(shí)候,要改動(dòng)這個(gè)抽象類的話,就違反了原則,所以在這個(gè)類上我不敢放入太多的設(shè)計(jì)

    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(){//實(shí)現(xiàn)前提條件
            try {
                Method []ms 
    = beanClass.getMethods();//取得XmlBean的所有方法
                int allMethodSize = ms.length;//取得方法的個(gè)數(shù)
                int objectMethodLength = Object.class.getMethods().length;//取得Object的方法的個(gè)數(shù)
                property = new String[(allMethodSize-objectMethodLength)/2];//計(jì)算出XmlBean的屬性數(shù) property[]是用來(lái)讀xml文件的時(shí)候用的
                
                
    int propertylength = property.length;
                
                getMethods 
    = new Method[propertylength];//存放XmlBean的所有g(shù)etter方法
                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)){//如果這個(gè)方法是XmlBean聲明的
                        String methodName = ms[i].getName();//得到方法名
                        if(isGetMethod(methodName)){//如果是getter方法
                            getMethods[setCount] = ms[i];//存到getter數(shù)組中去
                            setCount++;//計(jì)數(shù)器加1
                        }
    else{
                            setMethods[getCount] 
    = ms[i];//否則放到setter方法中去
                            getCount++;//計(jì)數(shù)器加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();//子類擴(kuò)展
        
        
    abstract public void buildXml(Collection collection);//子類擴(kuò)展
        
        
    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;
        }


    }

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

    3)先做個(gè)簡(jiǎn)單的現(xiàn)實(shí)來(lái)嘗試一下

    先做個(gè)SimpleXmlBuilder嘗試一下,如果涉及到無(wú)限類包含或者在取出存入的時(shí)候要按一定的規(guī)則排序的話,如果能夠從AbstractXmlBuilder中擴(kuò)展,那算是比較好的情況,當(dāng)然要是不行,必需再進(jìn)行分析,不斷的重構(gòu)

    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();
            }

        }

        
    }

    四、相關(guān)測(cè)試

    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 要設(shè)置的 name。
         
    */

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

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

        
    public String getSex() {
            
    return sex;
        }

        
    /**
         * @param sex 要設(shè)置的 sex。
         
    */

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

    }


    2)新建一個(gè)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) 功能測(cè)試用例

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


    }

    五、總結(jié)

    至此為止功能基本實(shí)現(xiàn)了,性能上的測(cè)試還沒(méi)有做相關(guān)的工作!異常處理是好像有點(diǎn)麻煩!或者應(yīng)該再制定一個(gè)XmlBuilderException出來(lái)!在模塊處理中應(yīng)該拋出來(lái),而不應(yīng)該返回null,這一點(diǎn)是有點(diǎn)不負(fù)責(zé)任!
    呵呵!希望有人能夠加入評(píng)論!

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

    FeedBack:
    # re: 我的設(shè)計(jì)之一:利用Java映射和Jdom做通用JavaBean取存
    2006-03-22 15:13 | weibo

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 美女无遮挡免费视频网站| 久久嫩草影院免费看夜色| 中文字幕不卡免费高清视频| 猫咪免费人成网站在线观看| 国产成人免费网站在线观看| 亚洲av日韩av无码| 亚洲av无码一区二区三区四区| 国产无遮挡无码视频免费软件| 成人毛片免费在线观看| 亚洲AV无码欧洲AV无码网站| 丰满亚洲大尺度无码无码专线| 午夜精品免费在线观看| 国产一区二区免费在线| 亚洲精品视频免费在线观看| 成年免费大片黄在线观看com| 1000部国产成人免费视频| 国产精品亚洲αv天堂无码| 中中文字幕亚洲无线码| 免费福利在线视频| yy6080亚洲一级理论| 亚洲一级毛片在线观| 永久免费av无码网站yy| 免费一级毛片女人图片| 亚洲一区二区三区亚瑟 | 亚洲AV无码一区二区三区性色 | 国外成人免费高清激情视频| 亚洲AV无码精品色午夜果冻不卡| 立即播放免费毛片一级| 无码国产精品一区二区免费| 亚洲人成网77777亚洲色| 色窝窝亚洲av网| 免费观看成人毛片a片2008| 久久亚洲精品AB无码播放| 乱淫片免费影院观看| 日韩一级视频免费观看| 亚洲国产精品yw在线观看| 精品成人免费自拍视频| 国产亚洲午夜高清国产拍精品 | 久久久久亚洲精品无码网址| 亚洲AV香蕉一区区二区三区| 日韩国产免费一区二区三区|