海水正藍

          面朝大海,春暖花開
          posts - 145, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          日歷

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          文章檔案

          搜索

          •  

               

          Servlet和Filter的url匹配以及url-pattern詳解


               Servlet和filter是J2EE開發中常用的技術,使用方便,配置簡單,老少皆宜。估計大多數朋友都是直接配置用,也沒有關心過具體的細節,今天 遇到一個問題,上網查了servlet的規范才發現,servlet和filter中的url-pattern還是有一些文章在里面的,總結了一些東西, 放出來供大家參考,以免遇到問題又要浪費時間。

          一 servlet容器對url的匹配過


          當一個請求發送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的映射url,比如我訪問的是http://localhost/test/aaa.html,我的應用上下文是test,容器會將http://localhost/test去掉,剩下的/aaa.html部分拿來做servlet的映射匹配。這個映射匹配過程是有順序的,而且當有一個servlet匹配成功以后,就不會去理會剩下的servlet了(filter不同,后文會提到)。其匹配規則和順序如下:<o:p></o:p>

          1.     精確路徑匹配。例子:比如servletA 的url-pattern為 /test,servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test ,這個時候容器就會先進行精確路徑匹配,發現/test正好被servletA精確匹配,那么就去調用servletA,也不會去理會其他的servlet了。<o:p></o:p>

          2.     最長路徑匹配。例子:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這里的servletB。<o:p></o:p>

          3.     擴展匹配,如果url最后一段包含擴展,容器將會根據擴展選擇合適的servlet。例子:servletA的url-pattern:*.action<o:p></o:p>

          4.     如果前面三條規則都沒有找到一個servlet,容器會根據url選擇對應的請求資源。如果應用定義了一個default servlet,則容器會將請求丟給default servlet(什么是default servlet?后面會講)。

          根據這個規則表,就能很清楚的知道servlet的匹配過程,所以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。

                對于filter,不會像servlet那樣只匹配一個servlet,因為filter的集合是一個鏈,所以只會有處理的順序不同,而不會出現只選擇一 個filter。Filter的處理順序和filter-mapping在web.xml中定義的順序相同。


          二 url-pattern詳解

          • web.xml文件中,以下語法用于定義映射:
          •  以”/’開頭和以”/*”結尾的是用來做路徑映射的。
          •  以前綴”*.”開頭的是用來做擴展映射的。
          • “/” 是用來定義default servlet映射的。
          • 剩下的都是用來定義詳細映射的。比如: /aa/bb/cc.action
          所以,為什么定義”/*.action”這樣一個看起來很正常的匹配會錯?因為這個匹配即屬于路徑映射,也屬于擴展映射,導致容器無法判斷

          出自:
          http://foxty.iteye.com/blog/39332


          posted @ 2013-06-06 15:16 小胡子 閱讀(315) | 評論 (0)編輯 收藏

          oracle監聽不能啟動的問題及處理過程!

          oracle環境如下:

          SQL> select * from V$version

          2 ;

          BANNER

          ----------------------------------------------------------------

          Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

          PL/SQL Release 10.2.0.1.0 - Production

          CORE 10.2.0.1.0 Production

          TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

          NLSRTL Version 10.2.0.1.0 - Production

          出錯過程回憶:在此之前用windows優化大師對系統注冊表進行了修復!

          Q:鏈接oracle時報錯:ORA-12541: TNS: 無監聽程序

          A:

          1〉查看監聽有沒有啟動:

          一:運行lsnrctl

          C:\Documents and Settings\Admin>lsnrctl

          LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 20-4月 -2007 09:

          1:43

          Copyright (c) 1991, 2005, Oracle. All rights reserved.

          歡迎來到LSNRCTL, 請鍵入"help"以獲得信息。

          二:查看stauts

          LSNRCTL> status

          正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

          TNS-12541: TNS: 無監聽程序

          TNS-12560: TNS: 協議適配器錯誤

          TNS-00511: 無監聽程序

          32-bit Windows Error: 2: No such file or directory

          正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zxt)(PORT=1521)))

          TNS-12541: TNS: 無監聽程序

          TNS-12560: TNS: 協議適配器錯誤

          TNS-00511: 無監聽程序

          32-bit Windows Error: 61: Unknown error

          三:發現監聽沒有啟動,現在啟動監聽

          LSNRCTL> start

          啟動tnslsnr: 請稍候...

          Failed to start service, error 3.

          TNS-12560: TNS: 協議適配器錯誤

          TNS-00530: 協議適配器錯誤

          2〉發現監聽啟動不起來,估計是注冊表有點問題,登錄注冊表

          C:\Documents and Settings\Admin>regedit

          進入注冊表到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraDb10g_home1TNSListener

          發現ImagePath關鍵值沒有了,增加可擴充字符串值,取名為ImagePathImagePath,編輯字符串的數值數據為:G:\oracle\product\10.2.0\db_2\BIN\TNSLSNR(對應oracle的TNSLSNR的位置) ,退出注冊表。

          3〉啟動監聽

          LSNRCTL> start

          啟動tnslsnr: 請稍候...

          TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production

          系統參數文件為d:\oracle\product\10.2.0\db_1\network\admin\listener.ora

          寫入d:\oracle\product\10.2.0\db_1\network\log\listener.log的日志信息

          監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))

          監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=zxt)(PORT=1521)))

          正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

          LISTENER 的 STATUS

          ------------------------

          別名 LISTENER

          版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ

          ction

          啟動日期 20-4月 -2007 09:41:29

          正常運行時間 0 天 0 小時 0 分 3 秒

          跟蹤級別 off

          安全性 ON: Local OS Authentication

          SNMP OFF

          監聽程序參數文件 d:\oracle\product\10.2.0\db_1\network\admin\listener.o

          ra

          監聽程序日志文件 d:\oracle\product\10.2.0\db_1\network\log\listener.log

          監聽端點概要...

          (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))

          (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=zxt)(PORT=1521)))

          服務摘要..

          服務 "PLSExtProc" 包含 1 個例程。

          例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...

          命令執行成功

          4>監聽啟動成功后嘗試登錄

          C:\Documents and Settings\Admin>sqlplus zxt@orcl

          SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 20 09:42:33 2007

          Copyright (c) 1982, 2005, Oracle. All rights reserved.

          輸入口令:

          連接到:

          Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

          With the Partitioning, OLAP and Data Mining options

          登錄成功!

          總結:估計是windows優化大師或者別的工具在修復注冊表時候刪掉了ImagePath字段,補上后就可以了!

          補充:登錄sqlplus時報

          ORA-12514: TNS: 監聽程序當前無法識別連接描述符中請求的服務錯誤!

          處理辦法:

          1〉oracle_home\NETWORK\ADMIN\tnsnames.ora中修改(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

          為(ADDRESS = (PROTOCOL = TCP)(HOST = 本地計算機名)(PORT = 1521)),保存即可。

          2〉有的人介紹oracle_home\NETWORK\ADMIN\sqlnet.ora中修改SQLNET.AUTHENTICATION_SERVICES = (NTS)為

          SQLNET.AUTHENTICATION_SERVICES = (NONE)

          這2種方法,第一個最佳!

          posted @ 2013-05-30 14:03 小胡子 閱讀(618) | 評論 (0)編輯 收藏

          Ext GridPanel實現復選框選擇框:

          1 var selectModel = new Ext.grid.CheckboxSelectionModel({
          2     singleSelect : false
          3 });
          4 

           但是這樣每一行都會有復選框,如果需求為:某行數據的某個列滿足什么條件我才有復選框選項就不太好實現了,

          這樣就需要重寫Ext.grid.CheckboxSelectionModel的渲染,行點擊涵數來實現.

           1 var selectModel = new Ext.grid.CheckboxSelectionModel({
           2       singleSelect : false,
           3       renderer : function(v, p, record){
           4           if (record.data['結果狀態'] == '0'){
           5                return '';
           6           }
           7           return '<div class="x-grid3-row-checker">&#160;</div>';
           8       },
           9       onHdMouseDown : function(e, t) {
          10           if (t.className == 'x-grid3-hd-checker') {
          11                e.stopEvent();
          12                var hd = Ext.fly(t.parentNode);
          13                var isChecked = hd.hasClass('x-grid3-hd-checker-on');
          14                if (isChecked){
          15                   hd.removeClass('x-grid3-hd-checker-on');
          16                   this.clearSelections();
          17               }else {
          18                   hd.addClass('x-grid3-hd-checker-on');
          19                   if (this.locked){
          20                       return;
          21                   }
          22                   this.selections.clear();
          23                   for (var i = 0, len = this.grid.store.getCount(); i < len; i++ ){
          24                       if (this.grid.store.getAt(i).data["結果狀態"!= '0'){
          25                            this.selectRow(i, true);
          26                       }
          27                  }
          28               }
          29          }
          30       },
          31       handleMouseDown : function(g, rowIndex, e){
          32             if (e.button !== 0 || this.isLocked()) {
          33                    return;
          34             }
          35             var view = this.grid.getView();
          36             if (e.shiftKey && !this.singleSelect && this.last != false ) {
          37                  var last = this.last;
          38                  this.selectRange(last, rowIndex, e.ctrlKey);
          39                  this.last = last;
          40                  view.focusRow(rowIndex);
          41             }else{
          42                  var isSelected = this.isSelected(rowIndex);
          43                  if (e.ctrlKey && isSelected) {
          44                       this.deselectRow(rowIndex);
          45                  }else if(!isSelected || this.getCount() > 1){
          46                       if(this.grid.store.getAt(rowIndex).data["結果狀態"!= '0'){
          47                           this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);
          48                       }
          49                       view.focusRow(rowIndex);
          50                  }
          51             }
          52       }
          53 });
          原文:
          http://fordream.iteye.com/blog/1179252



          posted @ 2013-05-06 15:34 小胡子 閱讀(341) | 評論 (0)編輯 收藏

               摘要: 在學習中Ext.grid.EditorGridPanel 的時候碰到一個知識點,如何用復選框來表示真假值,當然我們可以直接這樣 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 {2    heade...  閱讀全文

          posted @ 2013-05-06 15:32 小胡子 閱讀(254) | 評論 (0)編輯 收藏

          Ext.grid.GridPanel可以設置stripeRows: true的屬性來實現隔行換顏色的效果,如果你想自定義每行的顏色,那么你可以按照下邊地方法來實現:
          Ext.ux.GridView=Ext.extend(  
                 Ext.grid.GridView,  
                 {  
                     getRowClass:
          function(record,index)  
                     {  
                         
          if(index%2==0)  
                             
          return 'red';  
                         
          else  
                            
          return 'green';  
                    }  
                 }  
             ) 

          使用自定義的view

          var grid = new Ext.grid.GridPanel({
                  
          //other code
              store: store,
              view:
          new Ext.ux.GridView(),
                  
          //other code
          });
          樣式定義:

          .red {
               background
          -color:#FF0000;
          }
          .green {
               background
          -color:#00FF00;
          }



          通過firebug可以看到,給每行的div添加了自定義的樣式
          原文出自:
          http://love4j.iteye.com/blog/516007


          posted @ 2013-05-04 21:33 小胡子 閱讀(714) | 評論 (0)編輯 收藏

               摘要: 先上圖 grid分頁:      把grid和page工具綁定在一起     // create the Data Store     var store = new Ext.data.Store...  閱讀全文

          posted @ 2013-04-29 11:56 小胡子 閱讀(345) | 評論 (0)編輯 收藏

          http://yourgame.iteye.com/blog/252853

          posted @ 2013-04-29 11:53 小胡子 閱讀(305) | 評論 (0)編輯 收藏

          Ext中的combobox有屬性typeAhead:true 可以實現模糊匹配,但是是從開始匹配的,如果需要自定的的匹配,則需要監聽beforequery方法,實現自己的匹配查詢方法:

          代碼如下:


          var gfxmComb  = new Ext.form.ComboBox({
                  id : 'gfxmComb',
                  store : gfxmStore,
                  typeAhead : 
          true,
                  mode : 'local',
                  editable : 
          true,
                  displayField :'xmMc',
                  valueField :'xmBm',
                  triggerAction : 'all',
                  selectOnFocus : 
          true,
                  listeners : {
                      'beforequery':
          function(e){
                           
                          
          var combo = e.combo;  
                          
          if(!e.forceAll){  
                              
          var input = e.query;  
                              
          // 檢索的正則
                              var regExp = new RegExp(".*" + input + ".*");
                              
          // 執行檢索
                              combo.store.filterBy(function(record,id){  
                                  
          // 得到每個record的項目名稱值
                                  var text = record.get(combo.displayField);  
                                  
          return regExp.test(text); 
                              });
                              combo.expand();  
                              
          return false;
                          }
                      }
                  }
              });

          原文出自:http://weibaojun.iteye.com/blog/1098731

          posted @ 2013-04-29 11:33 小胡子 閱讀(425) | 評論 (0)編輯 收藏

          Javascript是一門非常靈活的語言,我們可以隨心所欲的書寫各種風格的代碼,不同風格的代碼也必然也會導致執行效率的差異,開發過程中零零散散地接觸到許多提高代碼性能的方法,整理一下平時比較常見并且容易規避的問題

          Javascript自身執行效率

          Javascript中的作用域鏈、閉包、原型繼承、eval等特性,在提供各種神奇功能的同時也帶來了各種效率問題,用之不慎就會導致執行效率低下。

          1、全局導入

          我們在編碼過程中多多少少會使用到一些全局變量(window,document,自定義全局變量等等),了解javascript作用域鏈的人都 知道,在局部作用域中訪問全局變量需要一層一層遍歷整個作用域鏈直至頂級作用域,而局部變量的訪問效率則會更快更高,因此在局部作用域中高頻率使用一些全 局對象時可以將其導入到局部作用域中,例如:


           1 //1、作為參數傳入模塊
           2 (function(window,$){
           
          3     var xxx = window.xxx;
           
          4     $("#xxx1").xxx();
           
          5     $("#xxx2").xxx();
           
          6 })(window,jQuery);
           
          7 
           
          8 //2、暫存到局部變量
           9 function(){
          10     var doc = document;
          11     var global = window.global;
          12 }

          2、eval以及類eval問題

          我們都知道eval可以將一段字符串當做js代碼來執行處理,據說使用eval執行的代碼比不使用eval的代碼慢100倍以上(具體效率我沒有測試,有興趣同學可以測試一下)

          JavaScript 代碼在執行前會進行類似“預編譯”的操作:首先會創建一個當前執行環境下的活動對象,并將那些用 var 申明的變量設置為活動對象的屬性,但是此時這些變量的賦值都是 undefined,并將那些以 function 定義的函數也添加為活動對象的屬性,而且它們的值正是函數的定義。但是,如果你使用了“eval”,則“eval”中的代碼(實際上為字符串)無法預先識 別其上下文,無法被提前解析和優化,即無法進行預編譯的操作。所以,其性能也會大幅度降低

          其實現在大家一般都很少會用eval了,這里我想說的是兩個類eval的場景(new Function{},setTimeout,setInterver)


          setTimtout("alert(1)",1000);

          setInterver(
          "alert(1)",1000);

          (
          new Function("alert(1)"))();

          上述幾種類型代碼執行效率都會比較低,因此建議直接傳入匿名方法、或者方法的引用給setTimeout方法

          3、閉包結束后釋放掉不再被引用的變量


          var f = (function(){
              
          var a = {name:"var3"};
              
          var b = ["var1","var2"];
              
          var c = document.getElementByTagName("li");
              
          //****其它變量
              //***一些運算
              var res = function(){
                  alert(a.name);
              }
              
          return res;
          })()

          上述代碼中變量f的返回值是由一個立即執行函數構成的閉包中返回的方法res,該變量保留了對于這個閉包中所有變量(a,b,c等)的引用,因此這兩個變 量會一直駐留在內存空間中,尤其是對于dom元素的引用對內存的消耗會很大,而我們在res中只使用到了a變量的值,因此,在閉包返回前我們可以將其它變 量釋放

          var f = (function(){
              
          var a = {name:"var3"};
              
          var b = ["var1","var2"];
              
          var c = document.getElementByTagName("li");
              
          //****其它變量
              //***一些運算
              //閉包返回前釋放掉不再使用的變量
              b = c = null;
              
          var res = function(){
                  alert(a.name);
                  }
              
          return res;
          })()

          在web開發過程中,前端執行效率的瓶頸往往都是在dom操作上面,dom操作是一件很耗性能的事情,如何才能在dom操作過程中盡量節約性能呢?

          1、減少reflow

          什么是reflow?

          當 DOM 元素的屬性發生變化 (如 color) 時, 瀏覽器會通知 render 重新描繪相應的元素, 此過程稱為 repaint。

          如果該次變化涉及元素布局 (如 width), 瀏覽器則拋棄原有屬性, 重新計算并把結果傳遞給 render 以重新描繪頁面元素, 此過程稱為 reflow。

          減少reflow的方法

          1. 先將元素從document中刪除,完成修改后再把元素放回原來的位置(當對某元素及其子元素進行大量reflow操作時,1,2兩種方法效果才會比較明顯)

          2. 將元素的display設置為”none”,完成修改后再把display修改為原來的值

          3. 修改多個樣式屬性時定義class類代替多次修改style屬性(for certain同學推薦)
          4. 大量添加元素到頁面時使用documentFragment

          例如


          for(var i=0;i<100:i++){
              
          var child = docuemnt.createElement("li");
              child.innerHtml 
          = "child";
              document.getElementById(
          "parent").appendChild(child);
          }

          上述代碼會多次操作dom,效率比較低,可以改為下面的形式 創建documentFragment,將所有元素加入到docuemntFragment不會改變dom結構,最后將其添加到頁面,只進行了一次reflow

          var frag = document.createDocumentFragment();
          for(var i=0;i<100:i++){
                  
          var child = docuemnt.createElement("li");
                  child.innerHtml 
          = "child";
              frag.appendChild(child);
          }
          document.getElementById(
          "parent").appendChild(frag);

          2、暫存dom狀態信息

          當代碼中需要多次訪問元素的狀態信息,在狀態不變的情況下我們可以將其暫存到變量中,這樣可以避免多次訪問dom帶來內存的開銷,典型的例子就是:


          var lis = document.getElementByTagName("li");
          for(var i=1;i<lis.length;i++){
              
          //***
          }
          上述方式會在每一次循環都去訪問dom元素,我們可以簡單將代碼優化如下
          var lis = document.getElementByTagName("li");
          for(var i=1,j=lis.length ;i<j;i++){
              
          //***
          }

          3、縮小選擇器的查找范圍

          查找dom元素時盡量避免大面積遍歷頁面元素,盡量使用精準選擇器,或者指定上下文以縮小查找范圍,以jquery為例

          • 少用模糊匹配的選擇器:例如$("[name*='_fix']"),多用諸如id以及逐步縮小范圍的復合選擇器$("li.active")
          • 指定上下文:例如$("#parent .class")$(".class",$el)

          4、使用事件委托

          使用場景:一個有大量記錄的列表,每條記錄都需要綁定點擊事件,在鼠標點擊后實現某些功能,我們通常的做法是給每條記錄都綁定監聽事件,這種做法會導致頁面會有大量的事件監聽器,效率比較低下。

          基本原理:我們都知道dom規范中事件是會冒泡的,也就是說在不主動阻止事件冒泡的情況下任何一個元素的事件都 會按照dom樹的結構逐級冒泡至頂端。而event對象中也提供了event.target(IE下是srcElement)指向事件源,因此我們即使在 父級元素上監聽該事件也可以找到觸發該事件的最原始的元素,這就是委托的基本原理。廢話不多說,上示例


          $("ul li").bind("click",function(){
              alert($(
          this).attr("data"));
          })

          上述寫法其實是給所有的li元素都綁定了click事件來監聽鼠標點擊每一個元素的事件,這樣頁面上會有大量的事件監聽器。

          根據上面介紹的監聽事件的原理我們來改寫一下


          $("ul").bind("click",function(e){
              
          if(e.target.nodeName.toLowerCase() ==="li"){
                  alert($(e.target).attr(
          "data"));
              }
          })

          這樣一來,我們就可以只添加一個事件監聽器去捕獲所有li上觸發的事件,并做出相應的操作。

          當然,我們不必每次都做事件源的判斷工作,可以將其抽象一下交給工具類來完成。jquery中的delegate()方法就實現了該功能

          語法是這樣的$(selector).delegate(childSelector,event,data,function),例如:


          $("div").delegate("button","click",function(){
            $(
          "p").slideToggle();
          });
          參數說明(引自w3school)
          參數描述
          childSelector 必需。規定要附加事件處理程序的一個或多個子元素。
          event

          必需。規定附加到元素的一個或多個事件。由空格分隔多個事件值。必須是有效的事件。

          data 可選。規定傳遞到函數的額外數據。
          function 必需。規定當事件發生時運行的函數。

           

          Tips:事件委托還有一個好處就是,即使在事件綁定之后動態添加的元素上觸發的事件同樣可以監聽到哦,這樣就不用在每次動態加入元素到頁面后都為其綁定事件了

          原文出自:
          http://www.cnblogs.com/gewei/archive/2013/03/29/2988180.html

          posted @ 2013-04-04 23:20 小胡子 閱讀(263) | 評論 (0)編輯 收藏

               摘要: 在Java中,它的內存管理包括兩方面:內存分配(創建Java對象的時候)和內存回收,這 兩方面工作都是由JVM自動完成的,降低了Java程序員的學習難度,避免了像C/C++直接操作內存的危險。但是,也正因為內存管理完全由JVM負責, 所以也使Java很多程序員不再關心內存分配,導致很多程序低效,耗內存。因此就有了Java程序員到最后應該去了解JVM,才能寫出更高效,充分利用有 限的內存的程序。 1...  閱讀全文

          posted @ 2013-03-30 22:39 小胡子 閱讀(214) | 評論 (0)編輯 收藏

          僅列出標題
          共15頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 洱源县| 哈密市| 苗栗市| 天气| 开江县| 乳山市| 林甸县| 铜陵市| 鲜城| 铜山县| 东乌珠穆沁旗| 阿拉善盟| 石首市| 蒙山县| 焦作市| 泗水县| 淄博市| 会昌县| 丰镇市| 正镶白旗| 阜新| 博湖县| 富源县| 九台市| 吐鲁番市| 茂名市| 新绛县| 高青县| 克拉玛依市| 革吉县| 建宁县| 梁平县| 宁夏| 仲巴县| 平湖市| 武夷山市| 保靖县| 思茅市| 萨迦县| 萨嘎县| 大埔区|