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 一輝 閱讀(436) 評論(1)  編輯  收藏 所屬分類: My Design

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

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


          網站導航:
           
          主站蜘蛛池模板: 南丰县| 岳池县| 鲜城| 东乌珠穆沁旗| 黑水县| 个旧市| 承德县| 古丈县| 于田县| 滨海县| 桃源县| 叙永县| 静乐县| 宿迁市| 昌图县| 佳木斯市| 磐安县| 湖口县| 东明县| 克东县| 界首市| 南通市| 沙湾县| 东兴市| 霍林郭勒市| 秭归县| 石景山区| 泾阳县| 即墨市| 韩城市| 张家口市| 东兰县| 兰坪| 咸宁市| 巴青县| 山阴县| 七台河市| 东明县| 固始县| 凯里市| 镇原县|