Huion
          事業(yè)向左...愛情向右...失去的...我會(huì)在未來期待...
          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ù)取出來放到存入JavaBean的集合里面

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

          三、開始動(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è)問題我沒有答案,希望有人能夠幫我解惑!

          2)行為抽象,不管用什么方法進(jìn)去buildBean 進(jìn)行buildXml,之前所需要進(jìn)行的相關(guān)運(yùn)行,我抽象出來,在這一步上,如果抽象得好,那么擴(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[]是用來讀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í)來嘗試一下

          先做個(gè)SimpleXmlBuilder嘗試一下,如果涉及到無限類包含或者在取出存入的時(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è)試還沒有做相關(guān)的工作!異常處理是好像有點(diǎn)麻煩!或者應(yīng)該再制定一個(gè)XmlBuilderException出來!在模塊處理中應(yīng)該拋出來,而不應(yīng)該返回null,這一點(diǎn)是有點(diǎn)不負(fù)責(zé)任!
          呵呵!希望有人能夠加入評(píng)論!

          posted on 2005-07-08 02:29 一輝 閱讀(438) 評(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)航:
           
          主站蜘蛛池模板: 朝阳区| 措勤县| 仁布县| 苍溪县| 武川县| 曲松县| 临海市| 柘荣县| 昌吉市| 哈尔滨市| 岳西县| 灌阳县| 德化县| 清涧县| 平南县| 自贡市| 呼图壁县| 资兴市| 襄城县| 长泰县| 宁津县| 鹰潭市| 含山县| 柏乡县| 株洲市| 海安县| 土默特右旗| 淮北市| 贺兰县| 宁远县| 葵青区| 嵊泗县| 刚察县| 靖安县| 宾川县| 库伦旗| 上杭县| 会东县| 英超| 孝义市| 汨罗市|