小方的Java博客

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            27 隨筆 :: 17 文章 :: 115 評論 :: 0 Trackbacks

          2007年2月8日 #

          我在做公司某個框架時有這么一個需求。每次調用dwr的方法前要檢查用戶是否已經登錄,否則就不能執(zhí)行并且退到首頁。

          當然了,做攔截器有很多方式,但經過研究發(fā)現(xiàn)DWR自帶很多插件,其中就有一個調用處理的插件。具體做法如下。

          在web.xml里的DWR配置中加入一個參數:
          <init-param>
                      
          <param-name>
                          org.directwebremoting.extend.Remoter
                      
          </param-name>
                      
          <param-value>com.xxx.base.framework.web.MyDWRRemoter</param-value>
                  
          </init-param>

          然后自己創(chuàng)建這個實現(xiàn)類。
          public class MyDWRRemoter extends DefaultRemoter
          {

              
          public Replies execute( Calls calls )
              
          {
                  HttpSession session 
          = WebContextFactory.get().getSession();
                  ISessionContainer sc 
          = ( ISessionContainer ) session.getAttribute( ISessionContainer.SESSION_CONTAINER_KEY );

                  
          //session檢查
                  if ( sc == null || sc.getUserInfo() == null )
                  
          {
                      logOut();
                      
          return super.execute( new Calls() );
                  }

                  
          else
                  
          {
                      IUserInfo userInfo 
          = sc.getUserInfo();
                      
          if(!SecurityFactory.getInstance().isOnline( userInfo.getUserID(), session.getId() ))
                      
          {
                          logOut();
                          
          return super.execute( new Calls() );
                      }

                  }

                  
          return super.execute( calls );
              }


              
          private void logOut()
              
          {
                  WebContext wct 
          = WebContextFactory.get();
                  Util utilThis 
          = new Util(wct.getScriptSession());
                  utilThis.addScript( 
          new ScriptBuffer("logOut()"));
              }

          }

          其中,檢查用戶是否登錄,如果沒有登錄就返回一個空的super.execute( new Calls());, 不能返回null否則會報錯。
          檢查通過就調用super.execute( calls );  其實calls里還能獲得很多信息。

          最后大家注意logOut方法,這里用到了DWR2.0新功能:DWR反向調用,就是DWR調用javascript,具體用法大家網上可以查到,需要配置的,我這里就不多說了。補充一下,addScript調用的是html里的function logOut().

          這樣的話,如果用戶session超時,或被管理員踢掉,一旦他做任何dwr操作就會被強迫登出到首頁了。
          posted @ 2008-12-05 20:42 方佳瑋 閱讀(2903) | 評論 (3)編輯 收藏

          很久以前看某本書整理的,忘了哪本了,現(xiàn)在貢獻出來。

          1)在select語句中使用條件邏輯

          1select ename,sal,   
          2       case when sal <= 2000 then 'UNDERPAID'  
          3            when sal >= 4000 then 'OVERPAID'  
          4            else 'OK'  
          5       end as status   
          6from emp   


          ENAME SAL STATUS
          ---------- ---------- ---------
          SMITH 800 UNDERPAID
          ALLEN 1600 UNDERPAID
          WARD 1250 UNDERPAID
          JONES 2975 OK
          MARTIN 1250 UNDERPAID
          BLAKE 2850 OK
          CLARK 2450 OK
          SCOTT 3000 OK
          KING 5000 OVERPAID
          TURNER 1500 UNDERPAID
          ADAMS 1100 UNDERPAID
          JAMES 950 UNDERPAID

          FORD 3000 OK
          MILLER 1300 UNDERPAID

           

          2)從表中隨機返回n條記錄

          1select *   
          2  from (   
          3    select ename, job   
          4    from emp   
          5    order by dbms_random.value()   
          6  )   
          7  where rownum <= 5 

           

          3)按照子串排序

          比如要從EMP表中返回員工名字和職位,并且按照職位字段最后2個字符排序

          1select ename,job   
          2  from emp   
          3order by substr(job,length(job)-2

          ENAME JOB
          ---------- ---------
          KING PRESIDENT
          SMITH CLERK
          ADAMS CLERK
          JAMES CLERK
          MILLER CLERK
          JONES MANAGER
          CLARK MANAGER
          BLAKE MANAGER
          ALLEN SALESMAN
          MARTIN SALESMAN
          WARD SALESMAN
          TURNER SALESMAN
          SCOTT ANALYST
          FORD ANALYST

           

          4)處理空值排序

          當被排序的列存在空值,如果希望空值不影響現(xiàn)有排序

          1select ename,sal,comm   
          2   from emp   
          3order by comm nulls last 

           

          ENAME SAL COMM
          ------ ----- ---------
          TURNER 1500 0
          ALLEN 1600 300
          WARD 1250 500
          MARTIN 1250 1400
          SMITH 800
          JONES 2975
          JAMES 950
          MILLER 1300
          FORD 3000
          ADAMS 1100
          BLAKE 2850
          CLARK 2450
          SCOTT 3000
          KING 5000

          1select ename,sal,comm   
          2  from emp   
          3order by comm desc nulls first 


          ENAME SAL COMM
          ------ ----- ----------
          SMITH 800
          JONES 2975
          CLARK 2450
          BLAKE 2850
          SCOTT 3000
          KING 5000
          JAMES 950
          MILLER 1300
          FORD 3000
          ADAMS 1100
          MARTIN 1250 1400
          WARD 1250 500
          ALLEN 1600 300
          TURNER 1500 0

          5)根據數據項的鍵排序

          比如如果job是“SALESMAN”,根據COMM排序,否則根據SAL排序

          1select ename,sal,job,comm   
          2  from emp   
          3 order by case when job = 'SALESMAN' then comm else sal end  


          ENAME SAL JOB COMM
          ---------- ---------- --------- ----------
          TURNER 1500 SALESMAN 0
          ALLEN 1600 SALESMAN 300
          WARD 1250 SALESMAN 500
          SMITH 800 CLERK
          JAMES 950 CLERK
          ADAMS 1100 CLERK
          MARTIN 1250 SALESMAN 1300
          MILLER 1300 CLERK
          CLARK 2450 MANAGER
          BLAKE 2850 MANAGER
          JONES 2975 MANAGER
          SCOTT 3000 ANALYST
          FORD 3000 ANALYST


           

          6)從一個表中查找另一個表中沒有的值

          比如要從DEPT中查找在表EMP中不存在數據的所有部門(數據中,DEPTNO值為40的記錄在表EMP中不存在)

          1select deptno from dept   
          2minus   
          3select deptno from emp 


           

          7)在運算和比較時使用null值

          null不會等于和不等于任何值,null和自己都不等于。以下例子是當comm有null的情況下列出比“WARD”提成低的員工。 (coalesce函數將null轉換為其他值)

          1select ename,comm,coalesce(comm,0)   
          2  from emp   
          3where coalesce(comm,0< ( select comm   
          4                                     from emp   
          5                                    where ename = 'WARD' )


          ENAME COMM COALESCE(COMM,0)
          ---------- ---------- ----------------
          SMITH 0
          ALLEN 300 300
          JONES 0
          BLAKE 0
          CLARK 0
          SCOTT 0
          KING 0
          TURNER 0 0
          ADAMS 0
          JAMES 0
          FORD 0
          MILLER 0

           

          8)刪除重復記錄

          對于名字重復的記錄,保留一個

          1delete from dupes   
          2 where id not in ( select min(id)   
          3                      from dupes   
          4                     group by name ) 

           

          9)合并記錄
          比如如下需求:
          如果表EMP_COMMISSION中的某員工也存在于EMP表,那么更新comm為1000
          如果以上員工已經更新到1000的員工,如果他們SAL少于2000,刪除他們
          否則,從表中提取該員工插入表EMP_COMMISSION

          1merge into emp_commission ec   
          2using (select * from emp) emp   
          3    on (ec.empno=emp.empno)   
          4 when matched then  
          5       update set ec.comm = 1000   
          6       delete where (sal < 2000)   
          7 when not matched then  
          8        insert (ec.empno,ec.ename,ec.deptno,ec.comm)   
          9       values (emp.empno,emp.ename,emp.deptno,emp.comm)  

           

          10)用sql生成sql

          1select 'select count(*) from '||table_name||';' cnts   
          2  from user_tables;   


          (user_tables是oracle的元數據表之一)

          CNTS
          ----------------------------------------
          select count(*) from ANT;
          select count(*) from BONUS;
          select count(*) from DEMO1;
          select count(*) from DEMO2;
          select count(*) from DEPT;
          select count(*) from DUMMY;
          select count(*) from EMP;
          select count(*) from EMP_SALES;
          select count(*) from EMP_SCORE;
          select count(*) from PROFESSOR;
          select count(*) from T;
          select count(*) from T1;
          select count(*) from T2;
          select count(*) from T3;
          select count(*) from TEACH;
          select count(*) from TEST;
          select count(*) from TRX_LOG;
          select count(*) from X;

           

          11)計算字符在字符串里的出現(xiàn)次數

          判斷字符串里有多少個‘ , ’

          1select (length('10,CLARK,MANAGER')-   
          2  length(replace('10,CLARK,MANAGER',',','')))/length(',')   
          3  as cnt   
          4from t1   


          先計算原字符串長度,再減去去掉逗號的長度,這個差再除以‘,’的長度

           

          12)將數字和字母分離


          原數據是:

          DATA
          ---------------
          SMITH800
          ALLEN1600
          WARD1250
          JONES2975
          MARTIN1250
          BLAKE2850
          CLARK2450
          SCOTT3000
          KING5000
          TURNER1500
          ADAMS1100
          JAMES950
          FORD3000
          MILLER1300
           1select replace(   
           2  translate(data,'0123456789','0000000000'),'0') ename,   
           3  to_number(   
           4    replace(   
           5    translate(lower(data),   
           6      'abcdefghijklmnopqrstuvwxyz',   
           7      rpad('z',26,'z')),'z')) sal   
           8  from (   
           9    select ename||sal data from emp   
          10 )   

          ENAME SAL
          ---------- ----------
          SMITH 800
          ALLEN 1600
          WARD 1250
          JONES 2975
          MARTIN 1250
          BLAKE 2850
          CLARK 2450
          SCOTT 3000
          KING 5000
          TURNER 1500
          ADAMS 1100
          JAMES 950
          FORD 3000
          MILLER 1300

          思路是很復雜的,比如先去除數字,是先把所有數字翻譯為0,然后用replace去掉0.


           

          13)根據表中的行創(chuàng)建分割列表


          表中數據:
          DEPTNO EMPS
          ------ ----------
          10 CLARK
          10 KING
          10 MILLER
          20 SMITH
          20 ADAMS
          20 FORD
          20 SCOTT
          20 JONES
          30 ALLEN
          30 BLAKE
          30 MARTIN
          30 JAMES
          30 TURNER
          30 WARD

           1select deptno,   
           2    ltrim(sys_connect_by_path(ename,','),',') emps   
           3  from (   
           4  select deptno,   
           5    ename,   
           6    row_number() over   
           7       (partition by deptno order by empno) rn,   
           8    count(*) over   
           9      (partition by deptno) cnt   
          10  from emp   
          11  )   
          12  where level = cnt   
          13  start with rn = 1   
          14    connect by prior deptno = deptno and prior rn = rn-1 


          查詢結果
          DEPTNO EMPS
          ------- ------------------------------------
          10 CLARK,KING,MILLER
          20 SMITH,JONES,SCOTT,ADAMS,FORD
          30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES

           

          14)按字母順序排序

           1select old_name, new_name   
           2  from (select old_name, replace(sys_connect_by_path(c, ' '), ' ') new_name   
           3          from (select e.ename old_name,   
           4                       row_number() over(partition by e.ename order by substr(e.ename, iter.pos, 1)) rn,   
           5                       substr(e.ename, iter.pos, 1) c   
           6                  from emp e, (select rownum pos from emp) iter   
           7                 where iter.pos <= length(e.ename)   
           8                 order by 1) x   
           9         start with rn = 1   
          10        connect by prior rn = rn - 1   
          11               and prior old_name = old_name)   
          12 where length(old_name) = length(new_name) 


          You would like the result to be:

          OLD_NAME NEW_NAME
          ---------- --------
          ADAMS AADMS
          ALLEN AELLN
          BLAKE ABEKL
          CLARK ACKLR
          FORD DFOR
          JAMES AEJMS
          JONES EJNOS
          KING GIKN
          MARTIN AIMNRT
          MILLER EILLMR
          SCOTT COSTT
          SMITH HIMST
          TURNER ENRRTU
          WARD ADRW

           

          posted @ 2008-08-07 14:41 方佳瑋 閱讀(2769) | 評論 (6)編輯 收藏

          答辯后,心理有很多話要說,真是很不爽,也為中國軟件業(yè)的未來捏一把汗。如果此文讓某些讀者感覺不爽,就當沒看過,在此先向你道歉。
           
          本周5是我們計算機專業(yè)畢業(yè)設計答辯日,我提前4天來到學校,帶著3月份早就完成的畢業(yè)設計。真是讓我大吃一驚,很多同學竟然都下載或者花錢買了畢業(yè)設計或者找人幫忙做來交差,這個數量我估計至少有5成。我的一個好友,更是夸張,什么都沒做,要我?guī)退?天內搞定,我慌了,真把我當超人了,不過還好,由于她那個東西確實沒什么內容,我趕了一下還是幫她搞定了,實在是沒啥內容的畢業(yè)設計。最搞笑的是還有些同學。。。,由于不是自己做的東西,而且連代碼也看不懂,運行出錯都不知如何解決,只會找別人求助,還天真地說:奇怪,怎么不行呢?原來明明看到可以運行的。。。。 我要他自己去debug一下,結果,連開發(fā)工具也沒用過,怎么在開發(fā)工具里跑一個工程debug也根本不會,我再次無話可說。
           
          同學們啊,你們不是高中生,你們是重點大學計算機專業(yè)應屆畢業(yè)生啊,怎么就像沒讀過大學一樣,你們到底在4年里干了什么啊。
           
          然后更讓人心寒的是:答辯時,很多老師都自己什么也不會,或者只會皮毛,看著同學的畢業(yè)設計,除了問點需求問題,再也問不出任何技術問題了,最后就草草答辯完,給個分數就算過了。我在答辯時,也懶得把架構和技術應用來說了,實在是對牛彈琴。學生墮落,教師應付,學校亂搞擴招,公司高薪招不到人才,中國軟件業(yè)的未來有何希望!
           
          當然,還是有10%左右的學生很優(yōu)秀,有些做了很不錯的java ee程序,有些自己研究做了簡易3D游戲引擎,還有些同學水平不怎么樣,但通過自己努力獨立完成了,雖然做得不怎么好,但學到很多東西,也是自己勞動汗水,但是這些同學太少太少。。。
          posted @ 2007-06-18 15:43 方佳瑋 閱讀(1617) | 評論 (6)編輯 收藏

          選自《Professional Javascript For Web Developers》

          其它方式:對象冒充,call(),apply(),原型鏈都有不少缺點這里就不一一介紹了,想了解的可以去看一下這本著作的第4章節(jié)。

          這種方法用對象冒充繼承屬性,用原型鏈繼承方法,代碼如下
          function ?ClassA(sColor){
          ????
          this .color? = ?sColor;
          }

          ClassA.prototype.sayColor?
          = ? function (){
          ????alert(
          this .color);
          }

          function ?ClassB(sColor,?sName){
          ????ClassA.call(
          this .?sColor);
          ????
          this .name? = ?sName;
          }

          ClassB.prototype?
          = ? new ?ClassA();

          ClassB.prototype.sayName?
          = ? function (){
          ????alert(
          this .name);
          }

          測試:
          var ?objA? = ? new ?ClassA( " red " );
          var ?objB? = ? new ?ClassB( " blue " ,? " Nicholas " );
          objA.sayColor();?
          // red
          objB.sayColor();? // blue
          objB.sayName();?? // Nicholas

          其它好方法,請參考zlnherit庫和xbObjects
          posted @ 2007-03-03 15:44 方佳瑋 閱讀(1367) | 評論 (0)編輯 收藏

          1.有個大大提高性能的建議:

          比如得到list 是5個班級,然后要得到5個班級的所有學生

          垃圾辦法:5次通過級聯(lián)獲得,等于執(zhí)行5條sql語句

          好辦法:

          this .getSession().createQuery(
          ????????
          " from?User?a,Clazz?b?where?a.clazz=b?and?b?in(:clazz) " )
          ?.setParameterList(
          " clazz " ,?list)
          ?.list();

          僅執(zhí)行一條


          2.還有個很實用的方法,如何通過hql語句返回多個po

          List?list? = ? this .getSession().createQuery(
          ?
          " from?User?a,Clazz?b?where?a.clazz=b " ).list();

          // 使用的時候:
          Iterator?it? = ?list.iterator();
          ??
          while (it.hasNext()){
          ?Object[]?vo?
          = ?(Object[])it.next();
          ?User?user?
          = ?(User)vo[ 0 ];
          ?Clazz?clazz?
          = ?(Clazz)vo[ 1 ];
          ?System.out.println(user.getUserName()?
          + ? " , " ? + ?clazz.getClassName());
          }?


          3.我們全部用一對一,多對一等。如果過濾有問題,有個辦法

          List?students? = ? this .getSession().createFilter(clazz.getStudents(), " where?this.status='A' " ).list();?
          posted @ 2007-02-14 23:30 方佳瑋 閱讀(489) | 評論 (0)編輯 收藏

          選自《Professional Javascript For Web Developers》

          其它方式:工廠方式,構造函數方式,原型方式都各有各的大缺陷,這里就不一一介紹了,想了解的可以去看一下這本著作的第3章節(jié)。

          1. 混合構造函數/原型方式

          function ?Car(sColor,?iDoors,?iMpg)?{
          ??
          this .color? = ?sColor;
          ??
          this .doors? = ?iDoors;
          ??
          this .mpg? = ?iMpg;
          ??
          this .drivers? = ? new ?Array(“Mike”,?“Sue”);
          }

          Car.prototype.showColor?
          = ? function ?()?{
          ??alert(
          this .color);
          };

          var ?oCar1? = ? new ?Car(“red”,? 4 ,? 23 );
          var ?oCar2? = ? new ?Car(“blue”,? 3 ,? 25 );

          oCar1.drivers.push(“Matt”);

          alert(oCar1.drivers);?
          // outputs?“Mike,Sue,Matt”
          alert(oCar2.drivers);? // outputs?“Mike,Sue”

          優(yōu)點:具有其它方式的優(yōu)點而沒有其它方式的缺點
          不足:封裝性欠缺

          2 . 動態(tài)原型方式

          function ?Car(sColor,?iDoors,?iMpg)? {
          ??
          this .color? = ?sColor;
          ??
          this .doors? = ?iDoors;
          ??
          this .mpg? = ?iMpg;
          ??
          this .drivers? = ? new ?Array(“Mike”,?“Sue”);

          ??
          if ?( typeof ?Car._initialized? == ?“undefined”)? {
          ????Car.prototype.showColor?
          = ? function ?()? {
          ??????alert(
          this .color);
          ????}
          ;

          ????Car._initialized?
          = ? true ;
          ??}

          }


          優(yōu)點:封裝性比上一個方式更好
          不足:就是看上去奇怪一點,呵呵


          總之,以上2種方式是目前最廣泛使用的,盡量使用它們避免不必要的問題。

          posted @ 2007-02-11 17:34 方佳瑋 閱讀(6167) | 評論 (1)編輯 收藏

          v0.9 點擊下載

          有些錯別字,我會在以后版本更正

          花了幾周把DWR中文文檔.PDF給搞出來了

          這是首次發(fā)布在網上

          希望對大家有用

          有任何意見請發(fā)我郵箱:jorwen.fang@gmail.com,或者在此留言

          第一版目錄預覽:

          第1章. DWR入門 8
          1.1 簡介 8
          1.2 第一個DWR程序:Hello World 9
          1.2.1 將DWR放入你的工程 9
          1.2.2 編輯配置文件 9
          1.2.3 編寫service 10
          1.2.4 測試DWR 10
          1.2.5 編寫一個jsp 11
          1.3 本章總結 12

          第2章. web.xml配置 13
          2.1 主要配置 13
          2.2 常用<init-param>參數列表 14
          2.2.1 安全參數 14
          2.2.2 Ajax服務器加載時保護參數 14
          2.2.3 其他參數 15
          2.3 日志配置 16
          2.4 多個dwr.xml配置和J2EE角色定義 16
          2.5 插件配置 18
          2.6 測試模式配置 19

          第3章. dwr.xml配置 20
          3.1 縱覽 20
          3.2 <init>標簽 20
          3.3 <allow>標簽 21
          3.3.1 Creator 21
          3.3.2 Converter 25
          3.4 <signatures>標簽 30

          第4章. 整合 32
          4.1 DWR與Servlet 32
          4.1.1 使用webContext的方法: 32
          4.1.2 方法選擇 32
          4.2 DWR與Spring 34
          4.2.1 讓DWR和Spring一起工作的檢查列表 34
          4.2.2 Spring Creator 34
          4.2.3 找到Spring配置文件 34
          4.2.4 使用Spring配置DWR 35
          4.3 DWR與JSF 36
          4.3.1 JSF Creator 36
          4.3.2 Servlet Filter 36
          4.4 DWR與Struts 37
          4.4.1 Struts creator 37
          4.4.2 開始順序 37
          4.5 DWR與Weblogic或PageFlow 38
          4.6 DWR與Hibernate 39
          4.6.1 讓DWR和Hibernate一起工作的檢查列表 39
          4.6.2 HibernateBeanConverter 39
          4.6.3 Session管理 39
          4.7 DWR與WebWork 40
          4.7.1 配置dwr.xml 40
          4.7.2 在JSP中導入腳本 40
          4.7.3 高級 41
          4.8 DWR與Acegi 42
          4.8.1 問題提出 42
          4.8.2 解決方案 42

          第5章. DWR中的JavaScript簡介 44
          5.1 簡單的回調函數 44
          5.2 調用元數據對象 45
          5.3 查找回調函數 45
          5.4 創(chuàng)造一個與Java對象匹配的Javascript對象 46

          第6章. engine.js 功能 47
          6.1 使用選項 47
          6.2 選項索引 48
          6.2.1 處理器(Handler) 48
          6.2.2 調用處理器(Call Handler) 48
          6.2.3 Hooks (一個batch中可以注冊多個hook) 49
          6.2.4 全局選項(在單次調用或者批量調用中不可用) 49
          6.2.5 廢棄的選項 49
          6.2.6 未來版本的選項 49
          6.3 選項說明 50
          6.3.1 批量調用 50
          6.3.2 順序調用 50
          6.3.3 錯誤警告和超時 50
          6.3.4 遠程調 Hooks 51
          6.3.5 遠程調用選項 51

          第7章. util.js 功能 54
          7.1 $() 54
          7.2 addOptions and removeAllOptions 54
          7.3 addRows and removeAllRows 55
          7.4 getText 56
          7.5 getValue 56
          7.6 getValues 57
          7.7 onReturn 57
          7.8 selectRange 57
          7.9 setValue 58
          7.10 setValues 58
          7.11 toDescriptiveString 58
          7.12 useLoadingMessage 58
          7.13 Submission box 61

          第8章. DWR進階 63
          8.1 DWR  Annotations 63
          8.1.1 初始配置 63
          8.1.2 遠程訪問類 63
          8.1.3 對象轉換 64
          8.2 錯誤和異常處理 64
          8.2.1 錯誤處理 64
          8.2.2 異常 65
          8.2.3 找出更多的信息 65
          8.3 傳遞額外的數據到callback函數 66
          8.4 從其他的URL讀取數據 67
          8.5 安全 68

          第9章. 范例精講 71
          9.1 購物車 71
          9.1.1 介紹 71
          9.1.2 實現(xiàn)目錄 72
          9.1.3 測試部署 74
          9.1.4 調用遠程對象 75
          9.1.5 實現(xiàn)購物車 77
          9.1.6 調用遠程的 Cart 方法 79
          9.1.7 演示結果 81
          9.1.8 總結 81

          第10章. 附錄 83
          10.1 常見問題 83
          10.1.1 TransformerFactoryConfigurationError 83
          10.1.2 XML解析錯誤 83
          10.1.3 使用weblogic的類路徑問題 83
          10.1.4 沒有cookies的情況下用DWR 84
          10.2 JavaScript高級應用 85
          10.2.1 用變量操縱函數 85
          10.2.2 高階函數 86
          10.2.3 動態(tài)類型 87
          10.2.4 靈活的對象模型 89
          10.2.5 本節(jié)總結 91

          posted @ 2007-02-08 20:18 方佳瑋 閱讀(7627) | 評論 (49)編輯 收藏

          主站蜘蛛池模板: 诸城市| 临桂县| 酉阳| 涟源市| 安陆市| 安化县| 瑞丽市| 长沙市| 祁东县| 钟山县| 得荣县| 永修县| 南阳市| 靖江市| 南通市| 吴桥县| 开平市| 信丰县| 新竹市| 淮滨县| 周至县| 龙口市| 镇坪县| 泗阳县| 邵东县| 澄城县| 花莲市| 临邑县| 永川市| 阿合奇县| 定陶县| 罗江县| 威信县| 南溪县| 扶风县| 望城县| 商河县| 杭锦旗| 松原市| 贵德县| 区。|