国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

J2EE 探險(xiǎn)者:用于無狀態(tài)網(wǎng)絡(luò)的 J2EE 技術(shù)

2019-11-18 16:03:21
字體:
供稿:網(wǎng)友

  無狀態(tài)網(wǎng)絡(luò)
可以將 Web 應(yīng)用程序協(xié)議分為兩大類:無狀態(tài)和有狀態(tài)。協(xié)議的狀態(tài)是指下一次傳輸可以“記住”這次傳輸信息的能力。有狀態(tài)協(xié)議能夠根據(jù)客戶機(jī)以前的請求創(chuàng)建上下文。無狀態(tài)協(xié)議沒有上下文;每個(gè)請求都是與服務(wù)器的獨(dú)立連接。

HTTP 就是一個(gè)很好的無狀態(tài)協(xié)議的示例,它建立在客戶機(jī)-服務(wù)器請求和響應(yīng)的基礎(chǔ)之上。在 HTTP 中,不會(huì)為下一次請求維護(hù)這次請求中客戶機(jī)-服務(wù)器間交互的信息。

當(dāng)然,由于無法維護(hù)狀態(tài),因特網(wǎng)將只能成為漂亮的百科全書、電子黃頁以及 Shockwave.com 上很酷的動(dòng)畫游戲。因此,出現(xiàn)了一些技巧在 HTTP 上模擬有狀態(tài)會(huì)話。有狀態(tài)信息可以存儲(chǔ)在 Html 表單域或用戶機(jī)器的 cookie 中,也可以附到超級(jí)鏈接中。然后,應(yīng)用程序開發(fā)人員負(fù)責(zé)管理、跟蹤和維護(hù)客戶機(jī)的狀態(tài)以確保會(huì)話過程順暢、安全以及讓人著迷。

servlet 的適用情況
servlet 體系結(jié)構(gòu)被設(shè)計(jì)成靈活的、與平臺(tái)無關(guān)的組件模型,它在服務(wù)器上執(zhí)行,并處理客戶機(jī)的請求。Servlet 很靈活,因?yàn)樗鼈兪怯煞?wù)器的部署描述符(它是特定于服務(wù)器的)和 Web 應(yīng)用程序部署描述符(它是由 J2EE 規(guī)范定義的,與服務(wù)器無關(guān),例如 web.xml)兩者的組合唯一地配置的。Servlet 之所以與平臺(tái)無關(guān)是因?yàn)樗鼈兛梢赃\(yùn)行在任何 OS 上(這得益于 JVM),可以在任何 J2EE Web 服務(wù)器中運(yùn)行(這得益于 J2EE 標(biāo)準(zhǔn))。最后,servlet 體系結(jié)構(gòu)是一個(gè)組件模型,因?yàn)樗归_發(fā)人員可以編寫周全的、可實(shí)現(xiàn)特定接口的組件。然后在運(yùn)行時(shí)將這些組件組裝起來,以處理客戶機(jī)請求。

雖然 servlet 通常處理 HTTP 請求,但 servlet 體系結(jié)構(gòu)與協(xié)議無關(guān)。servlet 接口定義了與 servlet 通信所需的基本方法,而不用考慮網(wǎng)絡(luò)協(xié)議。為了簡單起見以及由于 HTTP servlet 是最常用的類型,因此我們將只討論 HTTP servlet。事實(shí)上,如果從 HTTPServlet 擴(kuò)展定制的 servlet 類,則無需擔(dān)心解析 HTTP 請求流、抽取參數(shù)或其它任何典型的 HTTP 處理活動(dòng)中所涉及到的細(xì)節(jié), 就能夠方便地使用和處理 HTTP 通信。

servlet 體系結(jié)構(gòu)
人們通常將模型-視圖-控制器(MVC)設(shè)計(jì)模式應(yīng)用于需要某類人機(jī)界面的情形。該模式源自 Smalltalk 社區(qū),在那里用它來構(gòu)建靈活的且可重用的用戶界面。Servlet 天生就適合于 MVC 設(shè)計(jì)方法。在這種體系結(jié)構(gòu)中,模型是指正在被訪問數(shù)據(jù)的結(jié)構(gòu)和類型。模型組件通常包含業(yè)務(wù)邏輯,業(yè)務(wù)邏輯控制數(shù)據(jù)訪問并為一個(gè)或多個(gè)視圖服務(wù)。視圖提供了用戶界面,用戶或應(yīng)用程序組件可以通過用戶界面來訪問模型。可以用多個(gè)視圖來提供模型的各個(gè)界面。最后,控制器組件協(xié)調(diào)整個(gè)通信。控制器處理客戶機(jī)輸入、操作模型以及決定將哪個(gè)視圖發(fā)送給給定的客戶機(jī)。

從體系結(jié)構(gòu)角度來講,servlet 可充當(dāng)控制器和視圖。通常,將 jsp 頁面用作視圖組件,將 JSP 頁面或純 servlet 用作控制器組件。Servlet 在處理如內(nèi)容格式化和顯示、基本請求處理、安全請求等等之類的用戶交互工作時(shí)很有效。通常,servlet 會(huì)使用助手類(通常為 javaBean 樣式的類)來處理繁重的工作,或使用這些類與后端組件進(jìn)行相互操作。這就允許 servlet 層專注于客戶機(jī)交互,而不是業(yè)務(wù)處理。

Servlet 是非常輕量級(jí)的,因?yàn)橹恍枰邢薜馁Y源來初始化以及維護(hù) servlet 實(shí)例。servlet 的可伸縮性非常平滑和有效。在 servlet 體系結(jié)構(gòu)下,給定的 servlet 實(shí)例通過為每個(gè)請求產(chǎn)生新的線程并在每個(gè)線程內(nèi)執(zhí)行 service() 方法來同時(shí)處理多個(gè)請求。圖 1 顯示了 servlet 實(shí)例的生命周期,展示了它的輕量級(jí)可伸縮性。

圖 1. servlet 線程模型


無論是否需要管理 servlet 容器、設(shè)置服務(wù)器負(fù)載均衡、處理簡單的 HTML 表單或甚至對 HTTP 數(shù)據(jù)流執(zhí)行復(fù)雜的處理,servlet 體系結(jié)構(gòu)和 API 都能使 Web 應(yīng)用程序開發(fā)和部署變得非常容易。用 servlet 容器設(shè)置和管理 Web 服務(wù)器非常簡單,只需要很少的配置。對于服務(wù)器部署,通常一個(gè)或兩個(gè) XML 文件就包含所有所需的配置設(shè)置。對 servlet 進(jìn)行編程也很簡單。servlet API 對以下過程中所涉及到的細(xì)節(jié)進(jìn)行了抽象:截取客戶機(jī)請求、將請求路由至相應(yīng)的 servlet 實(shí)例、從線程池檢索線程、調(diào)用正確的方法來處理請求(doGet()、doPost() 或其它任何從 service() 方法調(diào)用的方法)以及甚至為抽取和處理編碼的 HTTP 數(shù)據(jù)提供方便的 API。

會(huì)話 bean 的適用情況
EJB 體系結(jié)構(gòu)還被設(shè)計(jì)用來提供靈活的、與平臺(tái)無關(guān)的、服務(wù)器端的組件模型。在這些特性和實(shí)現(xiàn)方面,EJB 規(guī)范是 Servlet 規(guī)范的翻版。通過使用用于部署階段綁定的部署描述符,兩種技術(shù)都具有靈活性;得益于 JVM 和 J2EE 規(guī)范,兩種技術(shù)都與平臺(tái)無關(guān);兩種技術(shù)都提供了服務(wù)器端組件模型,這兩種模型使用接口和抽象類以減少開發(fā)時(shí)間和麻煩,并確保了最優(yōu)的組件重用性。另外,無狀態(tài)會(huì)話 bean 從 EJB 容器獲得了一些好處,包括聲明的安全性、聲明的事務(wù)上下文、與其它企業(yè) bean 的可配置關(guān)系,以及可以方便地通過資源管理器連接工廠與其它 J2EE API(譬如 JMS、JavaMail 和 JDBC)集成。

最初,與企業(yè) bean 通信是通過人機(jī)接口進(jìn)行的,最終是通過 bean 的 home 接口或本地接口進(jìn)行。由于外部客戶機(jī)不能使用本地接口,因此我們只探討遠(yuǎn)程接口。通過使用 Java 遠(yuǎn)程方法調(diào)用(RMI)與遠(yuǎn)程接口進(jìn)行通信。RMI 是特定于 Java 平臺(tái)的網(wǎng)絡(luò)協(xié)議,它使 Java 對象可以與遠(yuǎn)程 Java 對象進(jìn)行交互,就好象該遠(yuǎn)程對象在本地一樣。因此,只有 Java 組件(applet、servlet、AWT、Swing 和非 GUI Java 應(yīng)用程序等)可直接用作 EJB 客戶機(jī)。其它任何客戶機(jī)類型(譬如手機(jī)、瀏覽器或非 Java 應(yīng)用程序)都必須通過 Java 應(yīng)用程序進(jìn)行通信。

EJB 體系結(jié)構(gòu)
從體系結(jié)構(gòu)的角度,會(huì)話 bean 可以用作視圖、控制器或甚至模型本身。通常,它們還實(shí)現(xiàn)虛包(Facade)模式或業(yè)務(wù)委派(Business Delegate)模式(請參閱參考資料)。servlet(或 JSP 頁面)、幫助 servlet 的 JavaBean(或 JSP 頁面)、另一個(gè)企業(yè) bean 可以訪問會(huì)話 bean,也可以直接通過 applet、Swing 應(yīng)用程序或其它 Java 應(yīng)用程序訪問會(huì)話 bean。

雖然到目前為止會(huì)話 bean 是最輕量級(jí)的 EJB 類型,但使用 EJB 容器和 EJB 體系結(jié)構(gòu)是有代價(jià)的。EJB 容器需要占用服務(wù)器大量的處理能力和內(nèi)存。不象 Java servlet 所采用的輕量級(jí)線程機(jī)制,EJB 組件需要?jiǎng)?chuàng)建和管理多個(gè)對象實(shí)例和相關(guān)資源(請參閱圖 2)。然而,較高的開銷所換來的好處是,在不犧牲很多響應(yīng)時(shí)間和整體可伸縮性的情形下,EJB 組件向企業(yè)資源、事務(wù)和安全性檢查提供了有效的管理。因?yàn)闊o狀態(tài)會(huì)話 bean 不一定需要維護(hù)任何客戶機(jī)狀態(tài),所以可以有效地合用無狀態(tài)會(huì)話 bean,使用它們來完成任何客戶機(jī)的請求。

圖 2. 企業(yè) bean 管理


無論您需要管理 EJB 容器、設(shè)置服務(wù)器群集、為企業(yè) bean 聲明配置設(shè)置還是需要利用容器眾多服務(wù)(包括安全性、事務(wù)管理和資源管理等)中的某項(xiàng)服務(wù),EJB 體系結(jié)構(gòu)和 API 都能使開發(fā)和部署健壯且功能齊全的 J2EE 應(yīng)用程序變得出奇的簡單。部署描述符定義了容器和 bean 配置,EJB API 使用接口、bean 生命周期回調(diào)方法和工廠模式清晰地分隔開容器和企業(yè) bean,同時(shí)仍使 bean 開發(fā)人員能方便地訪問容器服務(wù)。

選擇正確的技術(shù)
在某些情況下,確定使用 servlet(或 JSP 技術(shù))、無狀態(tài)會(huì)話 bean 還是同時(shí)使用這兩者是一件非常簡單的事情,而在另外一些情況下,這種選擇卻需要不少技巧。通常的配置是使用 servlet 層來處理與 HTTP 客戶機(jī)的交互,然后將業(yè)務(wù)處理交給 EJB 層(主要由無狀態(tài)會(huì)話 bean 組成,偶爾也有實(shí)體 bean 組成)。在這一節(jié),我們將研究幾個(gè)典型的應(yīng)用程序情況,并討論解決這些情況的組件或最佳組件。

當(dāng)您研究這些情況時(shí),請牢記就每種技術(shù)您所了解的內(nèi)容。尤其要記住,servlet 體系結(jié)構(gòu)的輕量級(jí)線程模型使 servlet 的可伸縮性特別有效,而無狀態(tài)會(huì)話 bean 極好地平衡了健壯企業(yè)資源的訪問、恰當(dāng)?shù)捻憫?yīng)時(shí)間和整體可伸縮性,有時(shí)無狀態(tài)會(huì)話 bean 能較好地適合比較重量級(jí)的應(yīng)用程序。

應(yīng)用程序客戶機(jī)
標(biāo)準(zhǔn)的應(yīng)用程序客戶機(jī)是與另一系統(tǒng)或組件進(jìn)行相互操作的用戶,而不是與應(yīng)用程序進(jìn)行相互操作的用戶。我們將研究三種典型的應(yīng)用程序客戶機(jī)情況,以及它們最可能的解決方案:

如果客戶機(jī)是基于 Java 的,并且和服務(wù)器位于同一個(gè)防火墻之后,則最好的解決方案是使用 RMI,直接與應(yīng)用程序服務(wù)器上的無狀態(tài)會(huì)話 bean 通信。


如果正在使用非 Java 客戶機(jī),或者客戶機(jī)沒有位于服務(wù)器的防火墻之后,則您會(huì)希望使用 HTTP 協(xié)議來與 servlet 進(jìn)行相互操作。(應(yīng)該根據(jù)是否需要訪問由 EJB 組件所提供的廣泛的企業(yè)支持來決定是只使用 servlet 還是通過 servlet 訪問會(huì)話 bean)。


第三種情形較少見,但確實(shí)會(huì)出現(xiàn)。一些應(yīng)用程序服務(wù)器供應(yīng)商采用接受本機(jī) IIOP 調(diào)用這樣的方式將其 EJB 容器公開,使 CORBA 客戶機(jī)將 EJB 組件看作本機(jī) CORBA 應(yīng)用程序。這允許非 Java 客戶機(jī)使用 IIOP 協(xié)議來與無狀態(tài)會(huì)話 bean 進(jìn)行通信。在這種設(shè)置中,客戶機(jī)繞過了整個(gè) Web 層,使用 IIOP 協(xié)議直接與業(yè)務(wù)層(無狀態(tài)會(huì)話 EJB 組件)通信。
企業(yè)應(yīng)用程序集成(EAI)
EAI 通常使用一個(gè)或多個(gè)事務(wù)將兩個(gè)或多個(gè)企業(yè)應(yīng)用程序集成到無縫值鏈中。由于 J2EE 對原有應(yīng)用程序、消息傳遞系統(tǒng)、各種數(shù)據(jù)源和其它企業(yè)應(yīng)用程序提供了廣泛的支持,所以它常常被用來將各種應(yīng)用程序“粘合”成相連的集成系統(tǒng)。

在 EAI 這種情形中,servlet 和 EJB 組件作用差不多,因?yàn)樵诩森h(huán)境中使用 servlet 已經(jīng)受到了限制。在這種罕見的情形中:應(yīng)用程序需要調(diào)用 J2EE 方法,而除 HTTP 之外沒有其它機(jī)制可用,對于 EAI,servlet 是很有用的。否則,它只能帶來額外的開銷,以及造成體系結(jié)構(gòu)不必要的復(fù)雜性。

不象 servlet,無狀態(tài)會(huì)話 bean 很好地被設(shè)計(jì)用于 EAI。無狀態(tài)會(huì)話 bean 是非常輕量級(jí)的(相對于有狀態(tài)會(huì)話 bean),可以方便地合用它們以確保極佳的可伸縮性。在 EAI 中常常需要狀態(tài)管理,但可以通過專門機(jī)制或通過 J2EE 事務(wù)來解決此問題。因此,從應(yīng)用程序服務(wù)器中除去了狀態(tài)管理的負(fù)擔(dān)。

另一種可能性是調(diào)用 EJB 組件,就好象它是 CORBA(公共對象請求代理)組件。在被集成的一個(gè)或多個(gè)應(yīng)用程序?yàn)?CORBA 組件的 EAI 情形中,這是特別有用的選項(xiàng)。

豐富的 GUI 客戶機(jī)
當(dāng)構(gòu)建豐富的用戶界面來訪問 J2EE 服務(wù)器端的功能時(shí),您有幾種選擇:applet、獨(dú)立應(yīng)用程序、Java Web Start 和本機(jī) GUI。

applet 是作為 HTML 頁面的一部分裝入的,從而提供了豐富的動(dòng)態(tài)用戶界面,人們一直都期望可以從 Web 上看到這種用戶界面。(在顯示文本方面,HTML 表現(xiàn)極佳,而在制作用戶界面方面,它卻不行)。applet 是一項(xiàng)功能強(qiáng)大的技術(shù),因?yàn)樗鼈兣c瀏覽器無關(guān),而且提供了豐富的 GUI 界面,同時(shí),由 applet 沙箱來防止在未經(jīng)許可的情況下訪問本地資源。對于更新客戶機(jī)接口問題,applet 還提供了引人注目的解決方案:只需在服務(wù)器上安裝最新的 applet 類和支持庫,在每次訪問 applet 時(shí),客戶機(jī)會(huì)自動(dòng)下載新文件。這種靈活性的代價(jià)是,每次訪問 applet 時(shí),必須將 applet 類和所支持的庫下載到客戶機(jī)。

獨(dú)立應(yīng)用程序被直接安裝在最終用戶的機(jī)器上。這些應(yīng)用程序與瀏覽器無關(guān),它們被存儲(chǔ)在本地,而不需要從遠(yuǎn)程站點(diǎn)下載。結(jié)果,啟動(dòng)時(shí)間和響應(yīng)時(shí)間大大縮短。獨(dú)立應(yīng)用程序沒有 applet 的安全限制,所以可以較方便地訪問本地客戶機(jī)機(jī)器以及任何可以訪問的遠(yuǎn)程服務(wù)器。不利的一面是,獨(dú)立應(yīng)用程序極難維護(hù)和更新。每臺(tái)機(jī)器在本地都有一個(gè)副本,所以不可能自動(dòng)更新網(wǎng)絡(luò)上所有的應(yīng)用程序。

Java Web Start 實(shí)際上是 applet 和獨(dú)立應(yīng)用程序的混合物,它是一項(xiàng)較新的技術(shù),它有許多較突出的優(yōu)點(diǎn)(關(guān)于更多這方面的信息,請參閱參考資料)。象 applet 一樣,可以從 Web 瀏覽器調(diào)用 Java Web Start,它也可以與 servlet 交互。與 applet 不同的是,Java Web Start 應(yīng)用程序?qū)⑽募彺嬖诒镜赜脖P,只有當(dāng)需要時(shí)才下載額外的文件。可以從本地資源安裝或通過 Web 遠(yuǎn)程安裝 Java Web Start 應(yīng)用程序。此外,啟動(dòng)的 GUI 是功能齊全的 Swing 客戶機(jī)。可以在不妨礙應(yīng)用程序的情況下關(guān)閉瀏覽器。其結(jié)果是結(jié)合了 applet 和非 applet 兩者的優(yōu)點(diǎn)。然而,Java Web Start 并不是十全十美。它需要將所有資源都包含在本地 JAR 文件中(而不是松散的文件中);它不允許直接訪問資源(資源是通過抽象的資源管理機(jī)制來訪問的);它不支持本機(jī)應(yīng)用程序的部署。

以下解決方案可應(yīng)用于這三個(gè)豐富 GUI 組件類型中的任何一個(gè):

如果客戶機(jī)和服務(wù)器分別位于防火墻的兩側(cè),則您會(huì)希望客戶機(jī)通過 HTTP 與 servlet 通信。使用助手類,servlet 層可以進(jìn)行簡單的業(yè)務(wù)處理(解析 XML 文檔、通過 JDBC 訪問數(shù)據(jù)源、用 JavaMail 或 JMS 來處理簡單的消息或者甚至用 JTS/JTA 協(xié)調(diào)簡單的事務(wù))。對于較復(fù)雜的需求或者需要較頻繁地請求企業(yè)資源,業(yè)務(wù)處理應(yīng)該用會(huì)話 bean。


如果客戶機(jī)和服務(wù)器都位于同一防火墻之后,則純粹使用 RMI 調(diào)用來直接與應(yīng)用程序服務(wù)器通信,這樣可以提高性能和方便編程。在這種情形,使用 servlet 只能帶來額外的開銷,以及造成體系結(jié)構(gòu)不必要的復(fù)雜性。在使用 applet 或 Java Web Start 的情況下,帶有 applet 或 Java Web Start 應(yīng)用程序鏈接的 HTML 文檔可能最初使用 servlet,但在后來,為了處理客戶機(jī)請求,客戶機(jī)將與一個(gè)或多個(gè)無狀態(tài)會(huì)話 bean 建立直接的 RMI 連接。
最后,如果客戶機(jī)使用非 Java GUI(即本機(jī) GUI),并且客戶機(jī)需要管理復(fù)雜的事務(wù)或一系列的事務(wù),則您會(huì)希望考慮選擇使用這種方法:調(diào)用 EJB 組件,就好象它是 CORBA 組件。

Web 應(yīng)用程序
在標(biāo)準(zhǔn)的基于 Web 的應(yīng)用程序(譬如 Web 瀏覽器)情形下,您會(huì)采用支持 HTTP 的客戶機(jī),它需要訪問一個(gè)或多個(gè)后端業(yè)務(wù)服務(wù)。在這種情形下,不需要考慮客戶機(jī)位于防火墻的哪一側(cè),因?yàn)楸仨氁褂?servlet。顯而易見,HTTP 的需求會(huì)利用 Web 層。實(shí)質(zhì)上將根據(jù)對 EJB 容器服務(wù)的相對需求來決定是否使用 EJB 組件。

多種客戶機(jī)類型
最后一種情形是需要多種客戶機(jī)類型。也許外部客戶需要使用基于 Web 瀏覽器的客戶機(jī),而內(nèi)部員工需要使用標(biāo)準(zhǔn)的桌面、豐富的 GUI。在提供高性能和可靠性的需求與重用需求之間,如何平衡?

如果不需要管理復(fù)雜的事務(wù),或者不需要訪問多個(gè)企業(yè)資源,則可以簡單地使用與一系列助手類進(jìn)行相互操作的 servlet 層來進(jìn)行業(yè)務(wù)處理。外部瀏覽器客戶機(jī)將通過這個(gè) Web 層與系統(tǒng)進(jìn)行相互操作。然后,重用助手 bean 來直接為內(nèi)部應(yīng)用程序的請求提供服務(wù),或者內(nèi)部應(yīng)用程序通過 servlet 層進(jìn)行通信。雖然這樣能解決問題,但它不是最干凈、最有效或可伸縮性最好的解決方案。


較常用的解決方案是將業(yè)務(wù)邏輯放入無狀態(tài)會(huì)話 bean 中,讓外部應(yīng)用程序通過 servlet 層與應(yīng)用程序服務(wù)器通信,讓內(nèi)部應(yīng)用程序直接與 bean 通信。這種做法使表示與業(yè)務(wù)邏輯分離得最徹底,使內(nèi)部應(yīng)用程序直接地、自由地訪問業(yè)務(wù)邏輯,從而在達(dá)到同一目的的情況下,這種做法采用的抽象最少。
結(jié)束語
在 J2EE 探險(xiǎn)者系列的第 1 部分中,我們研究了使用 Java servlet 和無狀態(tài)會(huì)話 bean 來完成客戶機(jī)的請求時(shí),它們之間相對的長處和短處。這里所討論的各種情形并沒有涵蓋所有情況,但這些情形代表了無狀態(tài)通信環(huán)境中 servlet 和會(huì)話 EJB 最常用的一些情況。

下個(gè)月,我們將從正反兩面權(quán)衡在 Web 層(使用 servlet 和 HTTPsessionAPI )和業(yè)務(wù)層(使用有狀態(tài)會(huì)話 bean)中管理狀態(tài)。到那時(shí),祝您“探路”愉快!

(出處:http://m.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 师宗县| 仁怀市| 尚义县| 会东县| 夹江县| 嘉祥县| 安国市| 宁都县| 彭山县| 玉环县| 墨玉县| 新河县| 白玉县| 阳春市| 仁布县| 瑞丽市| 隆昌县| 涟水县| 翁牛特旗| 奉贤区| 同仁县| 内黄县| 博客| 象州县| 河西区| 白玉县| 日土县| 庄浪县| 蛟河市| 肥东县| 平舆县| 兴山县| 浦县| 云霄县| 剑河县| 南宫市| 绥阳县| 玉门市| 措美县| 晋城| 敦化市|