咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          動態 JNLP

          Posted on 2008-03-28 10:11 oathleo 閱讀(1718) 評論(2)  編輯  收藏 所屬分類: Java
          附件是客戶端代碼,做了一些改造。主要是清除一些模塊之間的關聯,避免關聯下載。
          為了更快的啟動客戶端、最少的下載gui更新程序,我嘗試了如下做法:

          ?? 1. 個模塊分開打包。目前粒度是對各第三方jar包、common目錄、gui下的個子目錄、gui目錄本身做了單獨打包、簽名、pack200;
          ?? 2. 設置各個包的下載策略。對于少數必須包,用eager;對于非必須包(例如各模塊包、itext包等),一律用lazy處理;
          ?? 3. 首次啟動客戶端,盡可能快、少下載包。目前可以只下載必要包(見后續列表,并且還有改進潛力)。目前可以做到LoginUI出現時,不下載任何業務模塊。
          ?? 4. 由于MainUI關聯了不少各模塊的東西(例如工具欄上有一些業務模塊的快捷入口),啟動程序時候應當避免加載MainUI類。所以,改造XXX的main函數到Main.java中,而不再放在MainUI中;
          ?? 5. 通過觀察以前代碼jnlp的jar加載發現,login界面出來時候eng包竟然已經被加載。調試發現ClientInitialize類中調用了PartType數量。必要性不大,去掉之;
          ?? 6. 啟動MainUI,什么也沒動的情況下,發現幾乎所有業務模塊jar都被加載。原因是:MainUIActionManager里面的clear方法在清除緩存時候,用硬編碼調用各個模塊的類的靜態方法進行clear,導致這些jar包全都被加載。做如下改造:在MainUIActionManager中做一個map存儲所有待清除類,用類名和方法名記錄clear cache的方法;各個具體模塊的類如果有需要logout被清除的,在類的開始處用static代碼段調用 MainUIActionManager.registerClearCache來注冊自己。這樣,MainUIActionManager就不必知道每個被清除者,誰注冊誰會被回調。這里的缺點是:由于這些clear方法都是static的,無法用接口來定義,java沒有abstract static這樣的概念,這里只能用反射,有一定的出錯概率。經過這個改造,mainUI啟動后,業務模塊大多沒有load,只有eng、sales和 manage來死活在上面。
          ?? 7. 繼續研究eng模塊jar包總是被加載。發現原因是:默認進來的HomePage就是PartHomePage。這個看來沒招了。不過sales和manage還要研究。
          ?? 8. 繼續發現:part首頁出現后,sales模塊總是被加載。后來發現是AbstractHomePage類中的addInfoCenterTab方法中,竟然用SalesUtil.getString獲得tab的title字符串。去掉,sales模塊不再加載。
          ?? 9. 繼續發現:part首頁出現后,manage模塊jar總是被加載。后來發現,part首頁的infoCenter要顯示InfoCenter的UI,而這些類是在manage包內定義的。抽出來放在eng模塊,讓manage引用eng模塊。manage模塊不再被加載。

          通過以上改造,首次運行XXX,到LoginUI顯示時,加載的XXX的包如下:
          XXX-base.jar
          XXX-common.jar
          XXX-gui.jar
          XXX-i18n.jar
          XXX-image.jar
          XXX-server.jar
          XXX-swing.jar
          org.jar
          第三方包有:
          commons-lang.jar
          jbossall-client.jar
          looks-1.3.1.jar
          twaver.jar
          總計大小:3.439m。而且應當還有改進潛力。
          點擊login到進入MainUI,期間被加載的包有:
          XXX-comany
          XXX-conf
          XXX-message
          XXX-print
          XXX-security
          總計大小(包含前面加載的):3.995m
          如果點擊樹將各個模塊觸發全部jar下載,累計總計大小:7.116m
          以后:

          ??? * 如果某個業務模塊被具體更新:從雙擊jnlp到MainUI顯示出來未做任何動作之前,沒有任何下載產生(相當于直接啟動);點擊對應的模塊樹會觸發下載,但一般模塊包的jar包都在1m以下,相當于下載一個新聞網頁,略感延遲但不明顯;只要下載服務器和客戶端網絡較好,基本感覺不到更新;
          ??? * 如果客戶端基本包(包括common、gui包、image、base、swing等)被更新,雙擊jnlp會觸發進度條進行下載更新,不過會提示,用戶可以選擇;這是因為在jnlp中做了如下設置:<update check="background" policy="prompt-update"/>,用戶可以選擇不更新而啟動客戶端(當然這樣風險相當大);
          ??? * 如果第三方包被更新:同上。

          附件的jnlp文件是新版本,可以看一下。為了方便管理眾多gz和jar文件,將所有壓縮包放入webstart/jars目錄下,上層目錄只留下index.htm和jnlp文件。
          附件中的bat文件,可以將class文件進行打包、repack、簽名、pack200壓縮、生成對應的空jar文件、move到jboss目錄,一次搞定(使用前需要修改一下里面的目錄)。
          <?xml version="1.0" encoding="utf-8"?>
          <jnlp
          spec="1.0+"
          codebase="http://192.168.1.100:8080/webstart/"
          href="XXX.jnlp">
          <information>
          ????? <title>2BizBox v2</title>
          ???????? <vendor>SERVA Software</vendor>
          ???????? <homepage />
          ???????? <description>XXX</description>
          ???????? <description kind="short">SERVA Software 2BizBox 2.0.</description>
          ???????? <offline-allowed/>
          </information>
          <security>
          ?? <all-permissions/>
          </security>
          <update check="background" policy="prompt-update"/>
          <resources>
          ?? <j2se version="1.5+" initial-heap-size="128m" max-heap-size="512m"/>
          ?? <jar href="jars/XXX-common.jar" part="XXX-common" download="eager"/>
          ?? <jar href="jars/XXX-gui.jar" part="XXX-gui" download="eager" main="true"/>
          ?? <jar href="jars/org.jar" part="XXX-gui" download="eager"/>?
          ?
          ?? <!-- 2bizbox lazy modules -->
          ?
          ?? <jar href="jars/XXX-acc.jar" part="XXX-acc" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.acc.*" part="XXX-acc" recursive="true"/>
          ?? <jar href="jars/XXX-addr.jar" part="XXX-addr" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.addr.*" part="XXX-addr" recursive="true"/>
          ?? <jar href="jars/XXX-base.jar" part="XXX-base" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.base.*" part="XXX-base" recursive="true"/>
          ?? <jar href="jars/XXX-chart.jar" part="XXX-chart" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.chart.*" part="XXX-chart" recursive="true"/>
          ?? <jar href="jars/XXX-company.jar" part="XXX-company" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.company.*" part="XXX-company" recursive="true"/>
          ?? <jar href="jars/XXX-conf.jar" part="XXX-conf" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.conf.*" part="XXX-conf" recursive="true"/>
          ?? <jar href="jars/XXX-cs.jar" part="XXX-cs" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.cs.*" part="XXX-cs" recursive="true"/>
          ?? <jar href="jars/XXX-dev.jar" part="XXX-dev" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.dev.*" part="XXX-dev" recursive="true"/>
          ?? <jar href="jars/XXX-doc.jar" part="XXX-doc" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.doc.*" part="XXX-doc" recursive="true"/>
          ?? <jar href="jars/XXX-eng.jar" part="XXX-eng" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.eng.*" part="XXX-eng" recursive="true"/>
          ?? <jar href="jars/XXX-hr.jar" part="XXX-hr" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.hr.*" part="XXX-hr" recursive="true"/>
          ?? <jar href="jars/XXX-i18n.jar" part="XXX-i18n" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.i18n.*" part="XXX-i18n" recursive="true"/>
          ?? <jar href="jars/XXX-images.jar" part="XXX-images" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.images.*" part="XXX-images" recursive="true"/>
          ?? <jar href="jars/XXX-log.jar" part="XXX-log" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.log.*" part="XXX-log" recursive="true"/>
          ?? <jar href="jars/XXX-man.jar" part="XXX-man" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.man.*" part="XXX-man" recursive="true"/>
          ?? <jar href="jars/XXX-manage.jar" part="XXX-manage" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.manage.*" part="XXX-manage" recursive="true"/>
          ?? <jar href="jars/XXX-message.jar" part="XXX-message" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.message.*" part="XXX-message" recursive="true"/>
          ?? <jar href="jars/XXX-plan.jar" part="XXX-plan" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.plan.*" part="XXX-plan" recursive="true"/>
          ?? <jar href="jars/XXX-print.jar" part="XXX-print" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.print.*" part="XXX-print" recursive="true"/>
          ?? <jar href="jars/XXX-pur.jar" part="XXX-pur" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.pur.*" part="XXX-pur" recursive="true"/>
          ?? <jar href="jars/XXX-quality.jar" part="XXX-quality" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.quality.*" part="XXX-quality" recursive="true"/>
          ?? <jar href="jars/XXX-rule.jar" part="XXX-rule" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.rule.*" part="XXX-rule" recursive="true"/>
          ?? <jar href="jars/XXX-sales.jar" part="XXX-sales" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.sales.*" part="XXX-sales" recursive="true"/>
          ?? <jar href="jars/XXX-security.jar" part="XXX-security" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.security.*" part="XXX-security" recursive="true"/>
          ?? <jar href="jars/XXX-server.jar" part="XXX-server" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.server.*" part="XXX-server" recursive="true"/>
          ?? <jar href="jars/XXX-swing.jar" part="XXX-swing" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.swing.*" part="XXX-swing" recursive="true"/>
          ?? <jar href="jars/XXX-tools.jar" part="XXX-tools" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.tools.*" part="XXX-tools" recursive="true"/>
          ?? <jar href="jars/XXX-ware.jar" part="XXX-ware" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.ware.*" part="XXX-ware" recursive="true"/>
          ?? <jar href="jars/XXX-wo.jar" part="XXX-wo" download="lazy"/>
          ?? <package name="com.serva.XXX.gui.wo.*" part="XXX-wo" recursive="true"/>

          ?? <!-- all third party components -->
          ?? <jar href="jars/looks-1.3.1.jar" download="eager"/>
          ?? <jar href="jars/jbossall-client.jar" download="eager"/>
          ?? <jar href="jars/commons-lang-1.0.1.jar" download="eager"/>
          ?? <jar href="jars/itext-1.4.4.jar" part="itext" download="lazy"/>
          ?? <jar href="jars/iTextAsian.jar" part="itext" download="lazy"/>
          ?? <package name="com.lowagie.*" part="itext" recursive="true"/>
          ?
          ?? <jar href="jars/twaver.jar" part="twaver" download="lazy"/>
          ?? <package name="twaver.*" part="twaver" recursive="true"/>
          ?? <jar href="jars/jxl.jar" part="jxl" download="lazy"/>?
          ?? <package name="jxl.*" part="jxl" recursive="true"/>
          ?? <jar href="jars/barbecue.jar" part="barbecue" download="lazy"/>
          ?? <package name="net.sourceforge.barbecue.*" part="barbecue" recursive="true"/>
          </resources>
          <application-desc main-class="com.serva.XXX.gui.Main">
          ?? <argument>localhost</argument>
          </application-desc>
          </jnlp>
          pack.bat
          cd classes
          del /q *.jar
          cd ..
          rmdir -Q jars-gui
          mkdir jars-gui
          cd classes
          jar -cf XXX-common.jar com/serva/XXX/common
          jar -cf XXX-gui.jar com/serva/XXX/gui/*.class com/serva/XXX/gui/*.dat
          jar -cf XXX-acc.jar com/serva/XXX/gui/acc
          jar -cf XXX-addr.jar com/serva/XXX/gui/addr
          jar -cf XXX-base.jar com/serva/XXX/gui/base
          jar -cf XXX-chart.jar com/serva/XXX/gui/chart
          jar -cf XXX-company.jar com/serva/XXX/gui/company
          jar -cf XXX-conf.jar com/serva/XXX/gui/conf
          jar -cf XXX-cs.jar com/serva/XXX/gui/cs
          jar -cf XXX-dev.jar com/serva/XXX/gui/dev
          jar -cf XXX-doc.jar com/serva/XXX/gui/doc
          jar -cf XXX-eng.jar com/serva/XXX/gui/eng
          jar -cf XXX-hr.jar com/serva/XXX/gui/hr
          jar -cf XXX-i18n.jar com/serva/XXX/gui/i18n
          jar -cf XXX-images.jar com/serva/XXX/gui/images
          jar -cf XXX-log.jar com/serva/XXX/gui/log
          jar -cf XXX-man.jar com/serva/XXX/gui/man
          jar -cf XXX-manage.jar com/serva/XXX/gui/manage
          jar -cf XXX-message.jar com/serva/XXX/gui/message
          jar -cf XXX-plan.jar com/serva/XXX/gui/plan
          jar -cf XXX-print.jar com/serva/XXX/gui/print
          jar -cf XXX-pur.jar com/serva/XXX/gui/pur
          jar -cf XXX-quality.jar com/serva/XXX/gui/quality
          jar -cf XXX-rule.jar com/serva/XXX/gui/rule
          jar -cf XXX-sales.jar com/serva/XXX/gui/sales
          jar -cf XXX-security.jar com/serva/XXX/gui/security
          jar -cf XXX-server.jar com/serva/XXX/gui/server
          jar -cf XXX-swing.jar com/serva/XXX/gui/swing
          jar -cf XXX-tools.jar com/serva/XXX/gui/tools
          jar -cf XXX-ware.jar com/serva/XXX/gui/ware
          jar -cf XXX-wo.jar com/serva/XXX/gui/wo
          pack200 --repack XXX-common.jar????????????????????????
          pack200 --repack XXX-gui.jar????????????????????????
          pack200 --repack XXX-acc.jar????????????????????????
          pack200 --repack XXX-addr.jar????????????????????????
          pack200 --repack XXX-base.jar????????????????????????
          pack200 --repack XXX-chart.jar????????????????????????
          pack200 --repack XXX-company.jar????????????????????????
          pack200 --repack XXX-conf.jar????????????????????????
          pack200 --repack XXX-cs.jar???????????????????????
          pack200 --repack XXX-dev.jar????????????????????????
          pack200 --repack XXX-doc.jar????????????????????????
          pack200 --repack XXX-eng.jar???????????????????????
          pack200 --repack XXX-hr.jar????????????????????????
          pack200 --repack XXX-i18n.jar????????????????????????
          pack200 --repack XXX-images.jar???????????????????????
          pack200 --repack XXX-log.jar???????????????????
          pack200 --repack XXX-man.jar??????????????????????
          pack200 --repack XXX-manage.jar????????????????????
          pack200 --repack XXX-message.jar?????????????????????
          pack200 --repack XXX-plan.jar?????????????????????????
          pack200 --repack XXX-print.jar???????????????????????
          pack200 --repack XXX-pur.jar?????????????????????
          pack200 --repack XXX-quality.jar????????????????????
          pack200 --repack XXX-rule.jar???????????????????
          pack200 --repack XXX-sales.jar????????????????????
          pack200 --repack XXX-security.jar???????????
          pack200 --repack XXX-server.jar????????????????????
          pack200 --repack XXX-swing.jar??????????????????????
          pack200 --repack XXX-tools.jar??????????????????????
          pack200 --repack XXX-ware.jar?????????????????????
          pack200 --repack XXX-wo.jar????????????????
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-common.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-gui.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-acc.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-addr.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-base.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-chart.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-company.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-conf.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-cs.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-dev.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-doc.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-eng.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-hr.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-i18n.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-images.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-log.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-man.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-manage.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-message.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-plan.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-print.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-pur.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-quality.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-rule.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-sales.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-security.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-server.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-swing.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-tools.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-ware.jar XXX
          jarsigner -keystore ../myKeystore -storepass servasoft XXX-wo.jar XXX
          pack200 XXX-common.jar.pack.gz XXX-common.jar
          pack200 XXX-gui.jar.pack.gz XXX-gui.jar
          pack200 XXX-acc.jar.pack.gz XXX-acc.jar
          pack200 XXX-addr.jar.pack.gz XXX-addr.jar
          pack200 XXX-base.jar.pack.gz XXX-base.jar
          pack200 XXX-chart.jar.pack.gz XXX-chart.jar
          pack200 XXX-company.jar.pack.gz XXX-company.jar
          pack200 XXX-conf.jar.pack.gz XXX-conf.jar
          pack200 XXX-cs.jar.pack.gz XXX-cs.jar
          pack200 XXX-dev.jar.pack.gz XXX-dev.jar
          pack200 XXX-doc.jar.pack.gz XXX-doc.jar
          pack200 XXX-eng.jar.pack.gz XXX-eng.jar
          pack200 XXX-hr.jar.pack.gz XXX-hr.jar
          pack200 XXX-i18n.jar.pack.gz XXX-i18n.jar
          pack200 XXX-images.jar.pack.gz XXX-images.jar
          pack200 XXX-log.jar.pack.gz XXX-log.jar
          pack200 XXX-man.jar.pack.gz XXX-man.jar
          pack200 XXX-manage.jar.pack.gz XXX-manage.jar
          pack200 XXX-message.jar.pack.gz XXX-message.jar
          pack200 XXX-plan.jar.pack.gz XXX-plan.jar
          pack200 XXX-print.jar.pack.gz XXX-print.jar
          pack200 XXX-pur.jar.pack.gz XXX-pur.jar
          pack200 XXX-quality.jar.pack.gz XXX-quality.jar
          pack200 XXX-rule.jar.pack.gz XXX-rule.jar
          pack200 XXX-sales.jar.pack.gz XXX-sales.jar
          pack200 XXX-security.jar.pack.gz XXX-security.jar
          pack200 XXX-server.jar.pack.gz XXX-server.jar
          pack200 XXX-swing.jar.pack.gz XXX-swing.jar
          pack200 XXX-tools.jar.pack.gz XXX-tools.jar
          pack200 XXX-ware.jar.pack.gz XXX-ware.jar
          pack200 XXX-wo.jar.pack.gz XXX-wo.jar
          del /q *.jar
          move *.gz ../jars-gui
          cd ../jars-gui
          echo nothing > XXX-common.jar????????????????????????
          echo nothing > XXX-gui.jar????????????????????????
          echo nothing > XXX-acc.jar????????????????????????
          echo nothing > XXX-addr.jar????????????????????????
          echo nothing > XXX-base.jar????????????????????????
          echo nothing > XXX-chart.jar????????????????????????
          echo nothing > XXX-company.jar????????????????????????
          echo nothing > XXX-conf.jar????????????????????????
          echo nothing > XXX-cs.jar???????????????????????
          echo nothing > XXX-dev.jar????????????????????????
          echo nothing > XXX-doc.jar????????????????????????
          echo nothing > XXX-eng.jar???????????????????????
          echo nothing > XXX-hr.jar????????????????????????
          echo nothing > XXX-i18n.jar????????????????????????
          echo nothing > XXX-images.jar???????????????????????
          echo nothing > XXX-log.jar???????????????????
          echo nothing > XXX-man.jar??????????????????????
          echo nothing > XXX-manage.jar????????????????????
          echo nothing > XXX-message.jar?????????????????????
          echo nothing > XXX-plan.jar?????????????????????????
          echo nothing > XXX-print.jar???????????????????????
          echo nothing > XXX-pur.jar?????????????????????
          echo nothing > XXX-quality.jar????????????????????
          echo nothing > XXX-rule.jar???????????????????
          echo nothing > XXX-sales.jar????????????????????
          echo nothing > XXX-security.jar???????????
          echo nothing > XXX-server.jar????????????????????
          echo nothing > XXX-swing.jar??????????????????????
          echo nothing > XXX-tools.jar??????????????????????
          echo nothing > XXX-ware.jar?????????????????????
          echo nothing > XXX-wo.jar?????
          del -Q C:\jboss-4.0.5\server\default\deploy\webstart.war\jars\XXX-*.*
          move *.* C:\jboss-4.0.5\server\default\deploy\webstart.war\jars
          cd ..
          rmdir -Q jars-gui

          Feedback

          # re: 動態 JNLP  回復  更多評論   

          2008-06-15 23:10 by zhangzhenya
          你好,我想了解一下2bizbox ,請問你有源碼嗎?

          # re: 動態 JNLP  回復  更多評論   

          2008-06-17 12:42 by LeoOath
          商業軟件:)
          主站蜘蛛池模板: 和平县| 孝感市| 山阳县| 石嘴山市| 阿瓦提县| 平遥县| 鱼台县| 岳池县| 武冈市| 宜都市| 乌拉特后旗| 双鸭山市| 读书| 张掖市| 临朐县| 秀山| 和平县| 临江市| 宣恩县| 启东市| 比如县| 林州市| 南郑县| 庄河市| 邹平县| 沙雅县| 扎鲁特旗| 凭祥市| 黄平县| 河曲县| 东台市| 罗山县| 武冈市| 云浮市| 乐昌市| 濮阳市| 永康市| 邯郸市| 比如县| 永新县| 象山县|