版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Java程序員面試分類模擬13論述題1.
cookie和session有什么區(qū)別正確答案:cookie是在HTTP下,服務(wù)器或腳本可以維護(hù)客戶工作站上信息的一種方式。它是由Web服務(wù)器保存在用戶瀏(江南博哥)覽器上的小文件,可以包含有關(guān)用戶的信息(如身份識(shí)別號碼、密碼等信息)。session是指用來在客戶端與服務(wù)器端之間保持狀態(tài)的解決方案以及存儲(chǔ)結(jié)構(gòu)。
盡管二者都能夠進(jìn)行信息存儲(chǔ),但是也存在著區(qū)別。具體而言,二者有以下幾個(gè)方面的區(qū)別:
1)cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,即數(shù)據(jù)存放在客戶的瀏覽器上;而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案,即數(shù)據(jù)放在服務(wù)器上。
2)cookie安全性不夠。由于cookie信息存放在客戶端,其他人可以很容易地得到存放在本地的cookie,并進(jìn)行cookie欺騙;而session信息存放在服務(wù)器端,因此較為安全。
3)cookie性能更高一些。由于session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上,因此當(dāng)訪問量增多時(shí),會(huì)降低服務(wù)器的性能。
4)單個(gè)cookie保存的數(shù)據(jù)不能超過4KB,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie;而session不存在此問題。
鑒于以上幾點(diǎn)區(qū)別,一般情況下,將用戶登錄信息等重要信息存放至session中,而其他需要保留的信息可以放在cookie中。
2.
什么是J2EE正確答案:1J2EE(Java2Platform,EnterpriseEdition)是Java平臺(tái)企業(yè)版的簡稱,是用來開發(fā)與部署企業(yè)級應(yīng)用的一個(gè)架構(gòu),它提供了一種統(tǒng)一的、開放標(biāo)準(zhǔn)的多層平臺(tái),該平臺(tái)主要由構(gòu)件、服務(wù)和通信3個(gè)模塊構(gòu)成。
構(gòu)件包含客戶端構(gòu)件和服務(wù)器端構(gòu)件兩種類型,其中,客戶端構(gòu)件主要包含兩類Applets和ApplicationClients,服務(wù)器端構(gòu)件分為兩類Web構(gòu)件(Servlet與JSP)和EJBs(EnterpriseJavaBeans)兩種。服務(wù)由J2EE平臺(tái)提供商實(shí)現(xiàn),分為ServiceAPI(開發(fā)時(shí)使用)和運(yùn)行時(shí)服務(wù)。通信由容器提供的支持協(xié)作構(gòu)件之間的通信。
從本質(zhì)上來講,J2EE只是一個(gè)行業(yè)標(biāo)準(zhǔn),主要用來通過Java開發(fā)服務(wù)器端應(yīng)用提供一個(gè)獨(dú)立的、可移植的、多用戶的企業(yè)級平臺(tái),從而能夠簡化應(yīng)用程序的開發(fā)和部署。正是由于J2EE只是一個(gè)標(biāo)準(zhǔn)而不是一個(gè)成熟的產(chǎn)品,因此目前有很多不同類型的J2EE服務(wù)器。只要開發(fā)的應(yīng)用程序符合J2EE的標(biāo)準(zhǔn),就都可以部署在遵循了J2EE開發(fā)標(biāo)準(zhǔn)的J2EE服務(wù)器上。這種標(biāo)準(zhǔn)使得開發(fā)人員只需要專注于各種應(yīng)用系統(tǒng)的商業(yè)邏輯與架構(gòu)設(shè)計(jì),而不用過多地考慮底層繁瑣的程序編寫工作,系統(tǒng)的開發(fā)與部署效率大幅提升。
常見筆試題:
在J2EE中,屬于Web層的組件有______。
A.Servlet
B.EJB
C.Applet
D.HTML
答案:A。見上面講解。
3.
J2EE中常用的術(shù)語有哪些正確答案:J2EE中常用的術(shù)語有Web服務(wù)器、Web容器、EJB容器、Applet容器、ApplicationClient容器、JNDI、JMS、JTA、JAF、RMI等。下面將分別對它們進(jìn)行解釋。
(1)Web服務(wù)器
Web服務(wù)器是指駐留在Internet上的計(jì)算機(jī)程序。它是一種服務(wù)程序,其主要工作是接收來自于客戶端的請求,然后把對請求的處理結(jié)果返回給客戶端。用戶可以通過瀏覽器來請求所需資源,這些資源可以是HTML頁面、圖片、音頻、視頻或者PDF文檔等,Web服務(wù)器接收到請求后會(huì)去查找用戶請求的資源,然后把找到的資源返回給用戶。需要注意的是,它是一個(gè)被動(dòng)的程序,只有當(dāng)收到來自客戶端的請求后,才會(huì)發(fā)送響應(yīng)。
目前最流行的兩大Web服務(wù)器是:IIS(InternetInformationServices)和ApacheHttpServer(簡稱Apache)。
(2)Web容器
Web容器也被叫作Web應(yīng)用服務(wù)器,它是一種服務(wù)程序,用來給運(yùn)行在其中的程序(例如Servlet、JSP等)提供一個(gè)運(yùn)行的環(huán)境。由于Web容器的存在,Servlet只需要關(guān)注業(yè)務(wù)邏輯的處理而不用關(guān)注與客戶端的交互,因?yàn)檫@些交互都已經(jīng)由Web容器來協(xié)助完成了。常見的Web容器有Tomcat、JBoss、WebLogic和WebSphere等。
下面以Tomcat為例介紹一下Web容器主要完成了哪些工作:當(dāng)Web服務(wù)器(例如Apache)接收到一個(gè)客戶端對Servlet的請求后,不是直接把這些請求交給Servlet來處理,而是交給Web容器來處理,由Web容器負(fù)責(zé)給Servlet提供HTTP請求與響應(yīng)對象,同時(shí)容器調(diào)用Servlet的doGet()或doPost()方法來處理用戶的請求。
(3)EJB容器
EJB容器是一個(gè)服務(wù)器端容器。EJB(EnterpriseJavaBean)是J2EE應(yīng)用的業(yè)務(wù)層的技術(shù)標(biāo)準(zhǔn),只要滿足J2EE規(guī)范的組件就能在EJB容器中運(yùn)行,這個(gè)組件就會(huì)被EJB容器高效地管理。同時(shí),EJB容器還給運(yùn)行在其中的組件提供了安全而優(yōu)越的服務(wù)環(huán)境,例如事務(wù)管理、郵件服務(wù)等。
需要注意的是,EJB組件不能顯式地使用EJB容器的API(ApplicationProgrammingInterface,應(yīng)用程序接口)來請求容器提供的中間件服務(wù),但可以隱式地讓EJB容器知道它們的需求,例如在基于XML的部署描述符中制定所需的配置信息,在Bean類中使用部署注釋請求中間件服務(wù)。EJB容器為EJB組件隱式地提供中間件服務(wù)。
(4)Applet容器
Applet容器是一個(gè)客戶端容器,包含的組件為Applet。Applet是一種嵌入在瀏覽器中的輕量級客戶端,一般而言,只有當(dāng)使用Web頁面無法充分地表現(xiàn)數(shù)據(jù)或應(yīng)用界面時(shí),才會(huì)使用它。Applet是一種替代Web頁面的手段,開發(fā)人員只能夠使用J2SE開發(fā)Applet,出于安全性的考慮,Applet無法使用J2EE的各種Service和API。
(5)ApplicationClient容器
ApplicationClienf容器是一個(gè)客戶端容器,包含的組件為ApplicationClient。相對Applet而言,ApplicationClient是一種較重量級的客戶端,它能夠使用J2EE的大多數(shù)Service和API。
(6)JNDI
JNDI全稱為JavaNamingandDirectoryInterface,譯為Java命名和目錄接口。它提供了一個(gè)目錄系統(tǒng),并將服務(wù)名稱與對象關(guān)聯(lián)起來,從而使得開發(fā)人員在開發(fā)過程中可使用名稱來訪問對象。
通過使用JNDI,一方面實(shí)現(xiàn)了快速查找和定位分布式應(yīng)用程序的功能,另一方面使得程序有了更好的可擴(kuò)展性。由于JNDI是獨(dú)立于目錄協(xié)議的,因此應(yīng)用還可以使用JNDI訪問各種特定的目錄服務(wù),例如輕量級目錄訪問協(xié)議(LightweightDirectoryAccessProtocol,LDAP)、網(wǎng)絡(luò)數(shù)據(jù)服務(wù)(NetworkDataService,NDS)和域名系統(tǒng)(DomainNameSystem,DNS)等。
(7)JMS
JMS全稱為JavaMessageSetvice,譯為Java消息服務(wù)。它是一個(gè)Java平臺(tái)中面向消息中間件的API,主要實(shí)現(xiàn)各個(gè)應(yīng)用程序之間進(jìn)行異步通信,包括創(chuàng)建、發(fā)送、接收、讀取消息等。通過使用JMS,能夠最大限度地提升消息應(yīng)用的可移植性。JMS既支持點(diǎn)對點(diǎn)的消息通信,也支持發(fā)布/訂閱式的消息通信。
(8)JTA
JTA全稱為JavaTransactionAPI,譯為Java事務(wù)服務(wù)。它提供各種分布式事務(wù)服務(wù)(在多個(gè)網(wǎng)絡(luò)計(jì)算機(jī)上進(jìn)行數(shù)據(jù)訪問和更新),為J2EE實(shí)現(xiàn)分布式事務(wù)處理提供了重要的支撐。
(9)JAF
JAF的全稱為JavaBeansActivationFramework,譯為JavaBeans激活框架。它是一個(gè)專用的數(shù)據(jù)處理框架,提供了一種統(tǒng)一處理不同數(shù)據(jù)格式的方法。
(10)RMI
RMI全稱為RemoteMethodInvocation,譯為遠(yuǎn)程方法調(diào)用,它主要用于遠(yuǎn)程調(diào)用服務(wù),通過它,可以像調(diào)用本地函數(shù)一樣調(diào)用另外一臺(tái)計(jì)算機(jī)上運(yùn)行的程序,而不需要關(guān)心遠(yuǎn)程計(jì)算機(jī)所使用的系統(tǒng)或所使用的語言,也就是說,只要滿足一定的規(guī)范,就可以實(shí)現(xiàn)在不同的計(jì)算機(jī)上進(jìn)行函數(shù)調(diào)用。
常見筆試題:
JNDI可用于如下哪些應(yīng)用場景?______
A.配置信息存儲(chǔ)
B.異步信息發(fā)送
C.?dāng)?shù)據(jù)庫連接池查找
D.遠(yuǎn)程對象查找
答案:D。見上面講解。
4.
EJB有哪些不同的類別正確答案:EJB是EnterpriseJavaBean的簡稱,相當(dāng)于分布式組件對象模型(DistributedComponentObjectModel,DCOM),它是一種服務(wù)器端組件體系結(jié)構(gòu),用于開發(fā)和部署多層的、分布式的以及面向?qū)ο蟮膽?yīng)用系統(tǒng)的跨平臺(tái)體系結(jié)構(gòu)。EJB簡化了Java開發(fā)企業(yè)級的分布式組件應(yīng)用程序的過程,它定義了一組可重用的組件——EnterpriseBeans,開發(fā)人員可以利用這些組件,像搭積木一樣建立各種分布式應(yīng)用。所以,使用EJB可以寫出可擴(kuò)展的、健壯的、安全的應(yīng)用程序,而不需要開發(fā)人員自己去編寫復(fù)雜的分布式組件框架。
依據(jù)特性的不同,EJB可以分為以下3種類型:SessionBean(會(huì)話Bean),EntityBean(實(shí)體Bean)和MessageDrivenBean(消息驅(qū)動(dòng)Bean)。下面將分別對這3種Bean進(jìn)行介紹。
(1)SessionBean
SessionBean用來實(shí)現(xiàn)服務(wù)器端的業(yè)務(wù)邏輯,同時(shí)協(xié)調(diào)Bean之間的交互。SessionBean僅存在于客戶應(yīng)用與服務(wù)器交互的時(shí)間段內(nèi),SessionBean中的數(shù)據(jù)是不保存在數(shù)據(jù)庫中的。根據(jù)SessionBean是否有狀態(tài)又可以分為兩種類型:StatelessSessionBean(無狀態(tài)的SessionBean)和StatefulSessionBean(有狀態(tài)的SessionBean)。
StatelessSessionBean在方法調(diào)用期間不維護(hù)任何狀態(tài),所有事務(wù)處理都是在一個(gè)方法中處理完成,因此一個(gè)StatelessSessionBean可以被多個(gè)客戶共享,即一個(gè)StatelessSessionBean可以同時(shí)處理多個(gè)客戶應(yīng)用的請求;而StatefulSessionBean則不同,它可以記錄客戶應(yīng)用請求的狀態(tài),例如在線購物系統(tǒng)中,每個(gè)客戶都擁有購物車(StatefulBean),而裝載的貨物和貨物的數(shù)量在SessionBean中通過方法來操作,因此每個(gè)StatefulSessionBean只能處理一個(gè)客戶的請求。與StatelessSessionBean相比,StatefulSessionBean的優(yōu)點(diǎn)是能夠記錄客戶應(yīng)用的狀態(tài),其缺點(diǎn)是它不能被共享,開銷較大,性能遜于StatelessBean,因此當(dāng)請求用戶數(shù)量比較多時(shí)會(huì)消耗更多的內(nèi)存。
(2)EntityBean
EntityBean主要是資料組件,代表數(shù)據(jù)庫中的記錄,因此它與數(shù)據(jù)庫中的數(shù)據(jù)有著相同的生存周期,也就是說,只要數(shù)據(jù)庫中的數(shù)據(jù)存在,Entitybean就一直存在。此外,EntityBean還可以被多個(gè)客戶應(yīng)用共享。Entity有兩種對數(shù)據(jù)持久化的處理方式:①CMP(ContainerManagedPersistence,容器管理的持續(xù)性)。構(gòu)件的相關(guān)數(shù)據(jù)庫操作由容器自動(dòng)完成,不需要在bean中編寫數(shù)據(jù)庫操作的代碼。②BMP(BeanManagedPersistence,Bean管理的持續(xù)性)。構(gòu)件的相關(guān)數(shù)據(jù)庫操作由開發(fā)人員在代碼中通過JDBC編程來實(shí)現(xiàn)。這兩種EntityBean的形態(tài)不同,但目的相同,二者的主要區(qū)別在于維護(hù)資料的角色,CMP是由EJBContainer來維護(hù),而BMP則是由Bean自行維護(hù)資料的一致性。
EntityBean一共有3種狀態(tài):no-state、pooled和ready。其中,no-state狀態(tài)表示Bean實(shí)例還沒有被創(chuàng)建;pooled狀態(tài)表示Bean實(shí)例已經(jīng)被創(chuàng)建,但還沒有和一個(gè)EJBObject關(guān)聯(lián)起來;ready狀態(tài)表示與EJBObject關(guān)聯(lián)起來,若斷開關(guān)聯(lián),則回到pooled狀態(tài)。
(3)MessageDriverBean
MessageDriverBean用來處理異步消息,一般不是由用戶來調(diào)用的。它的調(diào)用方式為:當(dāng)有異步消息發(fā)送到某個(gè)MessageDriverBean后,容器會(huì)負(fù)責(zé)調(diào)用MessageDriverBean的OnMessage()方法來處理這個(gè)異步請求。
5.
EJB與JavaBean有什么異同正確答案:EJB是基于Java的遠(yuǎn)程方法調(diào)用(RemoteMethodInvoeation,RMI)技術(shù),可以被遠(yuǎn)程訪問(跨進(jìn)程、跨計(jì)算機(jī)),但它必須被部署在Webspere、WebLogic等容器中。EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理。
JavaBean是可復(fù)用的組件,理論上講,任何一個(gè)Java類都可以是一個(gè)Bean。但通常情況下,由于JavaBean是被容器(例如Tomcat)所創(chuàng)建的,因此JavaBean應(yīng)具有一個(gè)無參的構(gòu)造器,另外,通常JavaBean還要實(shí)現(xiàn)Serializable接口用于實(shí)現(xiàn)Bean的持久性。JavaBean實(shí)際上相當(dāng)于微軟COM模型中的本地進(jìn)程內(nèi)COM組件,是不能被跨進(jìn)程訪問的。
EJB與JavaBean都是基于Java語言的構(gòu)件模型。在開發(fā)應(yīng)用時(shí),既可以選擇使用EJB模型,也可以選擇使用JavaBean模型。盡管如此,二者也并非完全通用,其主要區(qū)別見表。EJB與JavaBean對比EJBJavaBean主要用在服務(wù)器端的開發(fā)主要用在客戶端的開發(fā)可以作為獨(dú)立的單元被部署到EJB容器中不可部署支持使用部署描述符對EJB應(yīng)用進(jìn)行定制化定制化只能在開發(fā)階段EJB構(gòu)件分布式對象,可以被遠(yuǎn)程的對象訪問JavaBean構(gòu)件不是分布式對象,只能在應(yīng)用程序內(nèi)部被訪問EJB構(gòu)件對終端用戶不可見部分JavaBean對終端用戶可見
6.
EJB有哪些生命周期正確答案:StatelessSessionBean的生命周期是由容器決定的,當(dāng)客戶端發(fā)出請求要建立一個(gè)Bean的實(shí)例時(shí),EJB容器不一定要?jiǎng)?chuàng)建一個(gè)新的Bean實(shí)例來供客戶端調(diào)用,如果當(dāng)前有StatelessSessionBean的實(shí)例能夠滿足客戶需求,就不會(huì)去創(chuàng)建新的實(shí)例。對于StatelessSessionBean來說,實(shí)例的創(chuàng)建和刪除都是由EJB容器來控制的。StatelessSessionBean的生命周期共有兩個(gè)狀態(tài):NoState(無狀態(tài))和MethodReady(準(zhǔn)備方法),下圖是兩種狀態(tài)的狀態(tài)轉(zhuǎn)移圖。
NoState和MethodReady的
狀態(tài)轉(zhuǎn)移圖
其中,NoState表示容器中沒有StatelessSessionBean的實(shí)例。只有EJB容器認(rèn)為實(shí)例池中需要更多的實(shí)例為客戶提供服務(wù)時(shí),才會(huì)去創(chuàng)建新的實(shí)例,此時(shí)新創(chuàng)建的實(shí)例就由NoState轉(zhuǎn)換為MethodReady狀態(tài);相反,如果EJB容器認(rèn)為當(dāng)前實(shí)例池中已經(jīng)不需要這么多的實(shí)例來給客戶端提供服務(wù),就會(huì)根據(jù)某些策略從實(shí)例池中刪除一些實(shí)例,這些被刪除的實(shí)例的狀態(tài)就轉(zhuǎn)換為NoState。
StatefulSessionBean的生命周期是與用戶的操作相關(guān)聯(lián)的,由于StatefulSessionBean不能被共享,因此當(dāng)客戶端第一次調(diào)用一個(gè)StatefulSessionBean時(shí),容器必須立即在服務(wù)器中創(chuàng)建一個(gè)新的Bean實(shí)例,并關(guān)聯(lián)到客戶端上,以后當(dāng)此客戶端調(diào)用StatefulSessionBean的方法時(shí),容器會(huì)把調(diào)用分派到與此客戶機(jī)相關(guān)聯(lián)的Bean實(shí)例。StatefulSessionBean的實(shí)例在生命周期中共有3個(gè)狀態(tài):NoState(無狀態(tài))、MethodReady(準(zhǔn)備方法)和Passivated(鈍化)。狀態(tài)間的轉(zhuǎn)換如圖所示。
StatefulSessionBean的狀態(tài)轉(zhuǎn)換圖
其中,NoState表示容器中沒有StatefulSessionBean的實(shí)例。只要有新的用戶請求到來,EJB容器就會(huì)創(chuàng)建新的StatefulSessionBean實(shí)例,此時(shí)被創(chuàng)建的實(shí)例的狀態(tài)就從NoState轉(zhuǎn)換為MechodReady。當(dāng)這個(gè)實(shí)例不再被使用時(shí)(客戶端不再使用或客戶端超時(shí)),EJB容器就會(huì)刪除該實(shí)例,此時(shí)這個(gè)實(shí)例的狀態(tài)就會(huì)轉(zhuǎn)換為NoState。與StatelessSessionBean不同的是,StatefulSessionBean不能被共享,因此在某一時(shí)刻EJB容器中可能會(huì)有大量的StatefulSessionBean實(shí)例,從而導(dǎo)致內(nèi)存開銷過大,為了解決這個(gè)問題,在StatefulSessionBean的生命周期中引入了另外一個(gè)狀態(tài)——Passirated。當(dāng)StatefulSessionBean實(shí)例過多時(shí),EJB容器只保留那些正在被使用的實(shí)例,從而把當(dāng)前不被使用的實(shí)例從內(nèi)存移到持久存儲(chǔ)介質(zhì)上(例如硬盤),此時(shí)這些實(shí)例的狀態(tài)就轉(zhuǎn)換為Passivated。只有當(dāng)客戶再次請求使用處于Passivated狀態(tài)的實(shí)例時(shí),這些實(shí)例才會(huì)被激活并恢復(fù)到內(nèi)存中,同時(shí)其狀態(tài)也轉(zhuǎn)換為MethodReady。當(dāng)實(shí)例不再被使用或超時(shí)后,其狀態(tài)都會(huì)轉(zhuǎn)換為NoState。
MethodReady狀態(tài)與Passivated狀態(tài)之間通過根據(jù)MRU或NRU算法進(jìn)行遷移。狀態(tài)遷移前會(huì)調(diào)用對應(yīng)的ejbActive()和ejbPassivate()方法。
EntityBean能存活相對較長的時(shí)間,并且狀態(tài)是持續(xù)的。只要數(shù)據(jù)庫中的數(shù)據(jù)存在,EntityBean就一直存活,而不是按照應(yīng)用程序或者服務(wù)進(jìn)程來說的,即使EJB容器崩潰了,EntityBean也是存活的。EntityBean的生命周期能夠被容器或者Bean自己管理。為了很好地管理EntityBean,它的生命周期被劃分為3個(gè)狀態(tài):NoState、PooledState和ReadyState,這3個(gè)狀態(tài)之間的轉(zhuǎn)換如圖所示。
EntityBean的狀態(tài)轉(zhuǎn)換圖
其中,NoState同樣表明實(shí)例不存在。當(dāng)EJB容器創(chuàng)建新的實(shí)例后,被創(chuàng)建的實(shí)例會(huì)進(jìn)入PooledState,處于這個(gè)狀態(tài)的實(shí)例不與任何EJB對象關(guān)聯(lián),與數(shù)據(jù)庫記錄對應(yīng)的字段也未初始化;當(dāng)客戶端調(diào)用Home接口中的方法來創(chuàng)建或找到某個(gè)實(shí)體bean時(shí),該實(shí)體的狀態(tài)就會(huì)從PolledState轉(zhuǎn)換到ReadyState,處于ReadyState的實(shí)例已經(jīng)建立了與EJB對象的關(guān)聯(lián),同時(shí)也已經(jīng)和數(shù)據(jù)庫中的記錄對應(yīng)起來了。與SessionBean一樣,當(dāng)EntityBean的對象不再使用時(shí)其狀態(tài)就會(huì)轉(zhuǎn)換為NoState。
引申:
1.EJB是如何管理事務(wù)的?
EJB通過以下技術(shù)管理實(shí)務(wù):對象管理組織(OMG)的對象實(shí)務(wù)服務(wù)(OTS),SunMicrosystems的JavaTransactionService(JTS)、JavaTransactionAPI(JTA),開發(fā)組(X/Open)的XA接口。
2.EJB的激活機(jī)制是什么?
激活機(jī)制是當(dāng)客戶端調(diào)用某個(gè)EJB實(shí)例業(yè)務(wù)方法時(shí),若對應(yīng)EJBObject發(fā)現(xiàn)自己沒有綁定對應(yīng)的Bean實(shí)例,則從其去激活Bean存儲(chǔ)中(通過序列化機(jī)制存儲(chǔ)實(shí)例)恢復(fù)(激活)此實(shí)例。狀態(tài)變遷前會(huì)調(diào)用對應(yīng)的ejbActive()和ejbPassivate()方法。以StatefulSessionBean為例,其Cache大小決定了內(nèi)存中可以同時(shí)存在的Bean實(shí)例的數(shù)量,根據(jù)MRU(MostRecentlyUsed,最近最常使用)算法或NRU(NotRecentlyUsed,最近未使用)算法,實(shí)例在激活和去激活狀態(tài)之間遷移。
7.
EJB的角色有哪幾種正確答案:EJB將開發(fā)部署EJB應(yīng)用的任務(wù)劃分到了6個(gè)不同的角色,它們分別為EnterpriseBeanProvider(企業(yè)級組件開發(fā)者)、ApplicationAssembler(應(yīng)用組合者)、EJBDeployer(EJB部署者)、EJBServerProvider(EJB服務(wù)器提供者)、EJBContainerProvider(EJB容器提供者)和SystemAdministrator(系統(tǒng)管理員)。每個(gè)角色都可以由不同的開發(fā)商提供,每個(gè)角色所做的工作都必須嚴(yán)格遵循EJB規(guī)范,并保證彼此之間的兼容性。
下表為EJB中6個(gè)角色及其功能描述。EJB中6個(gè)角色及其功能描述介紹角色功能描述EnterpriseBeanProvider用來編寫EJB應(yīng)用所需的構(gòu)件。主要包含EnterpriseBean(包含應(yīng)用的商業(yè)邏輯)、Home接口(包含EnterpriseBean生命周期管理的相關(guān)方法)、Remote接口(包含商業(yè)方法的定義)和DeploymentDescriptor(在部署描述符中,EnterpriseBeanProvider指明EnterpriseBean的名字、事務(wù)屬性以及安全性角色等)ApplicationAssembler在部署描述符中編寫組裝EnterpriseBean的代碼。這些代碼中包含構(gòu)成應(yīng)用的多個(gè)EnterpriseBean之間關(guān)聯(lián)的定義EJBDeployer是應(yīng)用環(huán)境的操作專家,負(fù)責(zé)與EJB部署相關(guān)的工作。它們將EnterpriseBean安裝到運(yùn)行環(huán)境中,而且在部署時(shí)可以對其進(jìn)行定制化,例如可以在部署時(shí)把定義的安全角色和EJB部署環(huán)境中的用戶組及賬號對應(yīng)起來,實(shí)現(xiàn)它們的映射EJBServerProvider即生產(chǎn)EJB服務(wù)器的廠家,它們是分布式事務(wù)、分布式對象和其他低級系統(tǒng)級服務(wù)的專家,為EJB容器提供運(yùn)行時(shí)環(huán)境和服務(wù)框架EJBContainerProvider一方面為EnterpriseBean的執(zhí)行提供系統(tǒng)級服務(wù),如Home接口的自動(dòng)注冊;另一方面提供了一個(gè)很好的部署工具,可以將EnterpriseBean部署到EJB容器中。EJBContainerProvider與EJBServerProvider一般都由同一廠商來提供SystemAdministrator用來配置、監(jiān)控、維護(hù)EJBServer與部署的EnterpriseBean的日常運(yùn)行
需要注意的是,以上6個(gè)角色可以由不同的開發(fā)商提供,但有一個(gè)前提,即它們都必須遵循EJB規(guī)范并且保證相互之間的兼容性。
8.
EJB的開發(fā)流程是怎樣的正確答案:在EJB的開發(fā)流程中有非常重要的3個(gè)對象:Remote接口、Home接口和Bean類。其中Remote接口定義了業(yè)務(wù)方法,用于EJB客戶端調(diào)用業(yè)務(wù)方法,需要注意的是,開發(fā)EJB時(shí),只需要對其進(jìn)行定義即可,并不需要去實(shí)現(xiàn)它,因?yàn)槿萜鲿?huì)在編譯時(shí)會(huì)根據(jù)接口定義和EnterpriseBean類的內(nèi)容自動(dòng)創(chuàng)建一個(gè)實(shí)現(xiàn)了該接口的類。Home接口提供了產(chǎn)生和定位Remote接口實(shí)例的方法,用于EJB工廠創(chuàng)建、移除、查找EJB實(shí)例,它又分為遠(yuǎn)程Home接口與本地Home接口兩種。Bean類指的是實(shí)現(xiàn)了javax.ejb.EnterpriseBean接口的類,它定義了應(yīng)用的商業(yè)邏輯。
具體而言,EJB開發(fā)步驟如下所示。
1)定義Romote接口。編寫一個(gè)接口繼承自javax.ejb.EJBObject。在這個(gè)接口中定義需要實(shí)現(xiàn)業(yè)務(wù)邏輯的方法對應(yīng)的接口。需要注意的是,這個(gè)接口中定義的類都必須拋出RemoteException異常,示例如下。
importjavax.ejb.*;
importjava.rmi.*;
publicinterfaceHelloInterfaceextendsEJBObject{
Stringhello()throwsRemoteException;
}
2)編寫一個(gè)接口繼承javax.ejb.EJBHome。這個(gè)接口中實(shí)現(xiàn)create()方法,這個(gè)方法的返回值必須為Remote接口類型(可以被遠(yuǎn)程訪問的接口),同時(shí)這個(gè)方法還需要拋出兩個(gè)異常:CreateException和RemoteException。create()方法取代傳統(tǒng)OO(ObjectOriented,面向?qū)ο?中的constructor(構(gòu)造方法)來初始化一個(gè)對象。EJB容器可以維護(hù)一定數(shù)量的對象實(shí)例,示例如下。
importjavax.ejb.*;
publicinterfaceHelloHomeextendsEJBHome{
publicHelloInterfacecreate()throws
java.rmi.RemoteException,jaw.ejb.CreateException;
}
以上這個(gè)例子中的create()方法返回值為上面創(chuàng)建的HelloInterface接口。
3)編寫bean類的實(shí)現(xiàn)類(SessionBean)。實(shí)現(xiàn)類必須實(shí)現(xiàn)下面5個(gè)方法:
①publicvoidejbCreate()方法。EJB容器會(huì)調(diào)用這個(gè)方法創(chuàng)建enterprisebean的對象。
②publicvoidejbRemove(){}方法。
③publicvoidejbActivate(){}方法。
④publicvoidejbPassivate(){}方法。
⑤publicvoidsetSessionContext(SesssionCOntextctx){
this.ctx=ctx;
}
以上4個(gè)方法(ejbRemove()、ejbActivate()、ejbPassivate()、setSessionContext())主要用來控制SessionBean的生命周期。具體而言,容器在刪除enterprisebean的實(shí)例之前會(huì)調(diào)用其ejbRemove()方法。容器在將enterprisebean的實(shí)例從臨時(shí)持久存儲(chǔ)介質(zhì)加載到內(nèi)存中后會(huì)調(diào)用其ejbActivate()方法。容器在將enterprisebean的實(shí)例轉(zhuǎn)移到臨時(shí)持久存儲(chǔ)介質(zhì)之前會(huì)調(diào)用其ejbPassivate()方法。每次創(chuàng)建一個(gè)SessionBean時(shí),容器會(huì)調(diào)用setSessionContext()方法,用來初始化enterprisebean使用的SessionContext變量。具體使用方法如下所示:
importjavax.ejb.*;
publicclassHelloBeanimplementsSessionBean{
SessionContextcontext;
publicvoidejbActivate(){}
pubhcvoidejbPassivate(){}
publicvoidejbRemove(){}
publicvoidsetSessionContext(SessionContextcontext){
this.context=context;
}
publicStringhello(){
return"Helloworld!";
}
}
4)在項(xiàng)目的META-INF目錄中創(chuàng)建兩個(gè)文件:ejb-jar.xml和jboss.xml。其中,ejbjar.xml文件的內(nèi)容如下所示:
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>HelloBean</ejb-name>
<home>HelloHome</home>
<remote>HelloInterface</remote>
<ejb-class>HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
jboss.xml文件的內(nèi)容如下所示:
<jboss>
<enterprise-beans>
<session>
<ejb-name>HelloBean</ejb-name>
<jndi-name>Hello</jndi-name>
</session>
</enterprise-beans>
</jboss>
5)把上述EJB項(xiàng)目發(fā)布到JBoss容器上以后,客戶端就可以調(diào)用該EJB對象了。
客戶端調(diào)用EJB的步驟如下:設(shè)置JNDI服務(wù)工廠以及JNDI服務(wù)地址系統(tǒng)屬性,查找Home接口,從Home接口調(diào)用create()方法創(chuàng)建Remote接口,通過Remote接口調(diào)用其業(yè)務(wù)方法,示例如下:
importjavax.naming.*;
publicclassClient{
publicstaticvoidmain(String[]args){
try{
Contextinitial=newInitialContext();
//從JNDI中以Hello名字來定位到對象
HelloHomehome=(HeHoHome)initial.lookup("Hello");
HelloInterfaeeh=home.create();
System.out.println(h.hello());
}catch(Exceptione){
System.out.println(e.getMessage());
}
}
}
9.
EJB3.0與EJB2.0有哪些不同之處正確答案:EJB3.0在EJB2.0的基礎(chǔ)上,引入了更多的概念,而且它對開發(fā)過程實(shí)現(xiàn)了進(jìn)一步的簡化,使得開發(fā)過程變得更加方便。具體而言,就是在系統(tǒng)開發(fā)時(shí),不用再像EJB2.0那樣需要兩個(gè)接口和一個(gè)Bean的實(shí)現(xiàn)類,它主要通過annotations元注釋來標(biāo)明SessionBean的類型,例如,在實(shí)現(xiàn)上例中的StatelessBean時(shí)就可以用下面的方式來實(shí)現(xiàn):
importjaw.ejb.*;
@Stateless
@Remote
publicclassHeUoBean{
publicStringhello(){
return"Helloworld!";
}
}
從這個(gè)例子可以看出,EJB3.0在開發(fā)時(shí)省去了許多方法(例如ejbCreate()、ejbRemove()等),大大簡化了開發(fā)工作。
EJB3.0與EJB2.0最大的不同之處就在于EJB3.0通過元數(shù)據(jù)、去掉部署文件、省去對Home接口的使用等方法簡化了開發(fā)的工作。此外,在訪問數(shù)據(jù)庫的方法上也有所不同:EJB2.0在訪問數(shù)據(jù)庫時(shí)使用的是EntityBean,而EJB3.0用的是JPA(JavaPersistanceAPI)。
10.
EJB容器有哪些作用正確答案:所有EJB都必須運(yùn)行在EJB容器中,EJB容器是EnterpriseJavaBean的擁有者,它負(fù)責(zé)管理運(yùn)行在其中的bean。EJB容器提供了許多服務(wù),使得開發(fā)人員只需要把開發(fā)重點(diǎn)放在業(yè)務(wù)邏輯上。具體來講,EJB容器提供了一些非常重要的服務(wù):事務(wù)管理、持久性管理、安全管理、并發(fā)訪問控制管理、生命周期管理和代碼生成等。
11.
EJB規(guī)范規(guī)定EJB中禁止的操作有哪些正確答案:具體而言,EJB規(guī)范規(guī)定EJB中禁止的操作有以下8種:
1)不能操作線程和線程API(線程API指非線程對象的方法,例如notify、wait等)。
2)不能操作AWT(AbstractWindowingToolkit,抽象窗口工具包)。
3)不能實(shí)現(xiàn)服務(wù)器功能。
4)不能對靜態(tài)屬性存取。
5)不能使用IO操作直接存取文件系統(tǒng)。
6)不能加載本地庫。
7)不能將this作為變量,不能將this返回。
8)不能循環(huán)調(diào)用。
12.
Web服務(wù)器與Web應(yīng)用服務(wù)器有什么區(qū)別正確答案:Web服務(wù)器是可以向發(fā)出請求的瀏覽器提供文檔的程序。其主要功能是提供網(wǎng)上信息瀏覽服務(wù);即接收瀏覽器的請求并把處理結(jié)果傳回瀏覽:器進(jìn)行顯示。Web服務(wù)器支持以HTTP的方式來訪問,當(dāng)Web服務(wù)器接收到一個(gè)HTTP請求時(shí),它同樣會(huì)以HTTP格式返回一個(gè)響應(yīng),這個(gè)響應(yīng)可以是一個(gè)靜態(tài)的HTML頁面,也可以是結(jié)果處理的一個(gè)動(dòng)態(tài)的頁面,還可以是音頻、視頻等信息。為了處理一個(gè)請求,Web服務(wù)器可以做出一個(gè)響應(yīng),并進(jìn)行頁面跳轉(zhuǎn),或者把動(dòng)態(tài)響應(yīng)的產(chǎn)生委托給一些其他程序,例如CGI腳本、JSP、Servlet或者一些其他的服務(wù)器端程序。Web服務(wù)器一般都使用了一些特有的機(jī)制(例如容錯(cuò)機(jī)制)來保證Web服務(wù)器有較好的擴(kuò)展性,并能提供不間斷的服務(wù)。常見的Web服務(wù)器有IIS和Apache。
應(yīng)用服務(wù)器提供訪問業(yè)務(wù)邏輯的途徑以供客戶端應(yīng)用程序使用。具體而言,它通過HTTP、TCP/IP、IIOP(InternetInter-ORBProtocol,互聯(lián)網(wǎng)內(nèi)部對象請求代理協(xié)議)或JRMP(JavaRemoteMethodProtocol,Java遠(yuǎn)程方法協(xié)議)等協(xié)議來提供業(yè)務(wù)邏輯接口。為了系統(tǒng)的可靠性,同樣使用了一些可擴(kuò)展性和容錯(cuò)機(jī)制。除此之外,它還為應(yīng)用的開發(fā)提供了許多服務(wù),例如事務(wù)管理、安全管理、對象生命周期管理等。常見的應(yīng)用服務(wù)器有BEAWebLogicServer,IBMWebSphereApplicationServer,IPlanetApplicationServer,Oracle9iApplicationServer,JBoss和Tomcat等。
Web服務(wù)器一般是通用的,而應(yīng)用服務(wù)器一般是專用的,例如Tomcat只處理Java應(yīng)用程序而不能處理ASPX或PHP。需要注意的是,Web服務(wù)器與應(yīng)用服務(wù)器是并列關(guān)系,二者不存在相互包容關(guān)系。在使用時(shí),如果訪問的頁面只有HTML,用Web服務(wù)器就足夠了,但是如果是JSP,此時(shí)就需要應(yīng)用服務(wù)器了,因?yàn)橹挥袘?yīng)用服務(wù)器才能解析JSP里的Java代碼,并將解析結(jié)果以HTML的格式返回給用戶。
13.
什么是WebService正確答案:WebService是一種基于網(wǎng)絡(luò)的分布式模塊化組件,它可以將可調(diào)用的功能發(fā)布到Web上以供應(yīng)用程序訪問(應(yīng)用程序可以使用標(biāo)準(zhǔn)的Web協(xié)議和數(shù)據(jù)格式來訪問它)。由于WebService遵循一定的技術(shù)規(guī)范,使得它能夠與其他組件或系統(tǒng)有很好的兼容性。
具體而言,WebService是基于下面的一些協(xié)議來實(shí)現(xiàn)的。
1)可擴(kuò)展可標(biāo)記語言(eXtensibleMarkupLanguage,XML)。它是實(shí)現(xiàn)WebService的基礎(chǔ),非常適用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù)時(shí)使用。
2)Web服務(wù)描述語言(WebServiceDescriptionLanguage,WSDL)。它是采用XML語言來描述WebService屬性的語言。它將WebService描述為能夠進(jìn)行消息交換的服務(wù)訪問點(diǎn)的集合,具體定義了WebService可以做什么、在哪里以及怎樣去調(diào)用。
3)通用描述、發(fā)現(xiàn)與集成服務(wù)(UniversalDescription,DiscoveryandIntegration,UDDI)。它是一種由OASIS(OrganizationfortheAdvancementofStructuredInformationStandards,結(jié)構(gòu)化信息標(biāo)準(zhǔn)促進(jìn)組織)制定的規(guī)范,主要提供基于Web服務(wù)的注冊和發(fā)現(xiàn)機(jī)制,為Web服務(wù)提供3個(gè)重要的技術(shù)支持:①標(biāo)準(zhǔn)、透明、專門描述Web服務(wù)的機(jī)制;②調(diào)用Web服務(wù)的機(jī)制;③可以訪問的Web服務(wù)注冊中心。它維護(hù)了一個(gè)WebService的全球目錄,其中的信息描述格式也是基于XML格式的。UDDI的核心組件是UDDI商業(yè)注冊,它使用XML文檔來描述企業(yè)及其提供的WebService。
4)簡單對象存取協(xié)議(SimpleObjectAccessProtocol,SOAP)。它是WebService的通信協(xié)議。當(dāng)用戶通過UDDI找到對應(yīng)的WSDL描述符后,就可以通過SOAP調(diào)用Web服務(wù)中的操作。SOAP也基于XML描述的方法調(diào)用規(guī)范。
調(diào)用WebService時(shí),服務(wù)提供者把所提供的服務(wù)發(fā)布到服務(wù)代理的一個(gè)目錄上,然后服務(wù)請求者使用UDDI首先到服務(wù)代理提供的目錄上搜索服務(wù),得到如何調(diào)用該服務(wù)的信息(WSDL),然后根據(jù)得到的調(diào)用信息使用SOAP調(diào)用服務(wù)提供者提供的服務(wù),如圖所示。
WebService規(guī)范
WebService的這種實(shí)現(xiàn)方式使其擁有很多優(yōu)點(diǎn),具體表現(xiàn)為如下幾個(gè)方面:
1)完好的封裝性。服務(wù)使用者只需要知道WebService提供的功能列表,而不需要關(guān)心具體的實(shí)現(xiàn)。
2)松耦合。WebService在不改變接口的情況下可以隨意改變實(shí)現(xiàn)方式,而且不會(huì)影響到服務(wù)的使用者。也就是說,服務(wù)的提供者與使用者互不影響。
3)高度客戶操作性??梢钥缙脚_(tái)、跨語言進(jìn)行調(diào)用。
4)動(dòng)態(tài)性??梢宰詣?dòng)發(fā)現(xiàn)服務(wù)并進(jìn)行調(diào)用。
14.
SOAP與REST有什么區(qū)別正確答案:SOAP是一個(gè)嚴(yán)格定義的信息交換協(xié)議,用于在WebService中把遠(yuǎn)程調(diào)用和返回封裝成機(jī)器可讀的格式化數(shù)據(jù),SOAP數(shù)據(jù)使用XML數(shù)據(jù)格式,定義了一整套復(fù)雜的標(biāo)簽,來描述調(diào)用的遠(yuǎn)程過程、參數(shù)、返回值和出錯(cuò)信息等內(nèi)容。
REST(RepresentationalStateTransfer,表述性狀態(tài)轉(zhuǎn)移)形式上為客戶端通過申請資源來實(shí)現(xiàn)狀態(tài)的轉(zhuǎn)換,可以被看作一臺(tái)虛擬的狀態(tài)機(jī)。需要注意的是,它只是一種軟件架構(gòu)風(fēng)格,而不是一個(gè)具體的協(xié)議或標(biāo)準(zhǔn),而且,它是面向資源的,甚至連服務(wù)也會(huì)被抽象成資源。
下表為SOAP與REST的對比。SOAP與REST的對比
SOAPREST尋址模型URI只用來定位SOAP端點(diǎn);資源與URI是一一對應(yīng);一端點(diǎn)對應(yīng)多個(gè)資源標(biāo)準(zhǔn)化的URI、DNS;URI與資源(包括服務(wù))一一對應(yīng)接口不提供通用操作,每個(gè)服務(wù)定義自己的方法(操作)提供通用操作,即HTTP的GET、PUT、POST和DELETE中間媒介不兼容傳統(tǒng)的Web中間媒介兼容傳統(tǒng)的Web中間媒介,包括代理、緩存服務(wù)器、網(wǎng)管等安全性十分復(fù)雜,不能使用現(xiàn)有防火墻控制簡單有效,可用現(xiàn)有防火墻控制
15.
什么是XML正確答案:可擴(kuò)展標(biāo)記語言(eXtensibleMarkupLanguage,XML)是一套定義語義標(biāo)記規(guī)則的語言,可以被用來描述業(yè)務(wù)數(shù)據(jù)、數(shù)學(xué)數(shù)據(jù)等。XML一個(gè)非常重要的用途就是實(shí)現(xiàn)了系統(tǒng)的解耦機(jī)制(例如,WebService和JMS都大量使用了XML文件,實(shí)現(xiàn)了系統(tǒng)不同模塊的解耦)。那么XML有哪些優(yōu)點(diǎn)呢?相較于HTML,XML將用戶界面與結(jié)構(gòu)化數(shù)據(jù)分隔開來,這種數(shù)據(jù)與顯示的分離使得集成來自不同源的數(shù)據(jù)成為可能。除此之外,XML還有以下4個(gè)主要優(yōu)點(diǎn)。
1)實(shí)用性強(qiáng)。由于XML是以文本而不是二進(jìn)制的方式存儲(chǔ)的,因此很容易對其進(jìn)行修改和調(diào)試。此外,XML不僅可以用在數(shù)據(jù)量較小的場合(例如struts-config.xml、hibernate.cfg.xml和web.xml等一些配置文件),同時(shí)也適用于存儲(chǔ)大量的數(shù)據(jù)(例如基于XML存儲(chǔ)的數(shù)據(jù)庫)。
2)訪問速度快。由于XML使用的是層次結(jié)構(gòu),因此可以非常方便、快速地通過深入到感興趣的結(jié)點(diǎn)獲取感興趣的數(shù)據(jù)。
3)可擴(kuò)展性好。XML不僅可以用來存儲(chǔ)和顯示數(shù)據(jù),而且還能通過相關(guān)的屬性標(biāo)記數(shù)據(jù)的屬性與類型,以便應(yīng)用程序可以根據(jù)實(shí)際情況選取不同的數(shù)據(jù)。同時(shí),由于XML中的標(biāo)記可以由使用者自己定義,因此它具有很好的可擴(kuò)展性。
4)跨平臺(tái)性好。XML具有統(tǒng)一的標(biāo)準(zhǔn)語法,因此,大部分系統(tǒng)支持的XML文件都具有相同的語法結(jié)構(gòu),這就使得它具有很好的跨平臺(tái)特性。
盡管XML優(yōu)點(diǎn)出眾,但其也存在其不足之處。XML的主要缺點(diǎn)就是當(dāng)數(shù)據(jù)量過大時(shí),它的存儲(chǔ)效率會(huì)變得較低,往往會(huì)比其他存儲(chǔ)方式(例如CSV)占用更大的存儲(chǔ)空間。因此,如果要在網(wǎng)絡(luò)中通信的場合、帶寬受限的情況下,一般不適合使用XML。
XML文檔定義有兩種形式:文檔類型定義(DocumentTypeDeftne,DTD)與Schema。它們一方面用于定義XML文檔的結(jié)構(gòu),另一方面用于驗(yàn)證XML文檔是否滿足指定的結(jié)構(gòu)。具體而言,DTD是一套標(biāo)記的語法規(guī)則,一個(gè)XMLDTD定義了XML文檔的元素架構(gòu)、元素標(biāo)記和屬性,規(guī)定了用戶在DTD關(guān)聯(lián)的XML文檔中可以使用什么標(biāo)記、各個(gè)標(biāo)記出現(xiàn)的順序以及標(biāo)記的層次關(guān)系,并定義了實(shí)體。當(dāng)建立XML文檔時(shí),通常需要按照DTD規(guī)范來進(jìn)行,反過來也可以通過對文檔進(jìn)行DTD驗(yàn)證,檢驗(yàn)XML文檔建立的正確性。DTD不能定義一些必要的限制條件,例如元素出現(xiàn)的次數(shù)、數(shù)據(jù)類型(例如整型、浮點(diǎn)型、布爾型)等,因此DTD更適于以文檔為中心的XML內(nèi)容。而Schema與DTD不同,它本身基于XML,是用一套預(yù)先規(guī)定的XML元素的屬性創(chuàng)建的,這些元素的屬性定義了XML文檔的結(jié)構(gòu)和內(nèi)容模式。XMLSchema同時(shí)還支持命名空間,能夠定義比DTD更復(fù)雜的數(shù)據(jù)類型和結(jié)構(gòu)。XMLSchema內(nèi)置支持一系列的簡單數(shù)據(jù)類型,例如字符串、小數(shù)和整數(shù)等,還可以定義元素出現(xiàn)的次數(shù)。除此之外,XMLSchema利用命名空間將文檔中的特殊節(jié)點(diǎn)與Schema說明相聯(lián)系,一個(gè)XML文件可以有多個(gè)Schema,而對于DTD,一個(gè)XML只能有一個(gè)相對應(yīng)的DTD,因此XMLSchema更適合以數(shù)據(jù)為中心的文檔。所以,越來越多的應(yīng)用偏向于采用XMLSchema來定義和驗(yàn)證XML文檔。
目前,對XML的解析最主要的方式有兩種:DOM和SAX(SimpleAPIforXML,XML簡單APD。DOM方式會(huì)根據(jù)給定的XML文件在內(nèi)存中創(chuàng)建一個(gè)樹形結(jié)構(gòu),因此,這種處理方法會(huì)占用較多的內(nèi)存,在處理大文件時(shí)效率會(huì)急劇下降。而且DOM必須在解析文件之前把整個(gè)文檔裝入內(nèi)存,所以該方式主要適用于對XML的隨機(jī)訪問與頻繁對XML中的內(nèi)容進(jìn)行修改的場合。而SAX是事件驅(qū)動(dòng)型的XML解析方式,它不會(huì)在內(nèi)存中存儲(chǔ)XML文件的內(nèi)容,只是把每次對數(shù)據(jù)的請求看作一個(gè)事件,通過遍歷文件來獲取用戶所需的數(shù)據(jù)。當(dāng)遇到像文件開頭、文檔結(jié)束或者標(biāo)簽開頭與標(biāo)簽結(jié)束時(shí),它會(huì)觸發(fā)一個(gè)事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件。所以,它的使用場合一般為對XML的順序訪問、XML文件太大以至于在內(nèi)存中放不下等情況。
下面分別給出它們操作XML的示例。首先創(chuàng)建一個(gè)test.xml,代碼如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<people>
<p>
<name>name1</name>
<age>23</age>
</p>
<p>
<name>name2</name>
<age>24</age>
</p></people>
采用DOM方式進(jìn)行解析,示例代碼如下:
importjava.io.File;
importorg.w3c.dom.*;
importjavax.xml.parsers.*;
publicclassTest{
publicstaticvoidmain(Stringarge[]){
try{
Filef=newFile("test.xml");
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=factory.newDocumentBuilder();
Documentdoc=builder.parse(f);
NodeListnl=doc.getElementsByTagName("p");
for(inti=0;i<nl.getLength();i++){
System.out.print("姓名:"+doc.getElementsByTagName("name").item(i)
.getFirstChild().getNodeValue());
System.out.println("年齡:"+doc.getElementsByTagName("age").item(i)
.getFirstChild().getNodeValue());
}
}catch(Exceptione){
System.out.println(e.getMessage());
}
}
}
程序運(yùn)行結(jié)果為:
姓名:name1年齡:23
姓名:name2年齡:24
采用SAX方式進(jìn)行解析,示例代碼如下:
importjava.io.File;
importjavax.xml.parsers.SAXParser;
importjavax.xml.parsers.SAXParserFactory;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
publicclassTestextendsDefaultHandler{
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
System.out.print(newString(ch,start,length));
super.characters(ch,start,length);
}
publicvoidendDocument()throwsSAXException{
super.endDocument();
}
publicvoidendElement(Stringurl,StringlocalName,StringqName)throwsSAXException{
System.out.print("</"+qName+">");
super.endElement(url,localName,qName);
}
publicvoidstartDocument()throwsSAXException{
System.out.println("<?xmlversion=\"1.0\"encoding=\"UTF-8\"?>");
super.startDoeument();
}
publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattrs)throwsSAXException{
System.out.print("<"+qName);
if(attrs!=null){
for(inti=0;i<attrs.getLength();i++){
System.out.print(""+attrs.getQName(i)+"=\""+attrs.getValue(i)+"\"");
}
}
System.out.print(">");
super.startElement(uri,localName,qName,attrs);
publicstaticvoidmain(String[]args)throwsException{
SAXParserFaetoryfactory=SAXParserFactory.newInstance();
SAXParserparser=factory.newSAXParser();
Filef=newFile("test.xml");
Testdh=newTest();
parser.parse(f,dh);
}
}
程序運(yùn)行結(jié)果為:
<?xmlversion="1.0"encoding="UTF-8"?>
<people>
<p>
<name>name1</name>
<age>23</age>
</p>
<p>
<name>name2</name>
<age>24</age>
</p></people>
16.
數(shù)據(jù)庫連接池的工作機(jī)制是怎樣的正確答案:數(shù)據(jù)庫連接是一種非常珍貴且有限的資源,尤其在多用戶的網(wǎng)絡(luò)應(yīng)用環(huán)境中更是如此。對數(shù)據(jù)庫連接管理的好壞會(huì)直接影響整個(gè)系統(tǒng)的性能:一是建立與數(shù)據(jù)庫的連接是一個(gè)耗時(shí)的操作,在頁面應(yīng)用中,如果每次用戶的請求都需要建立新的數(shù)據(jù)庫連接,那么響應(yīng)時(shí)間就會(huì)很長,會(huì)嚴(yán)重影響用戶的體驗(yàn);二是數(shù)據(jù)庫的連接個(gè)數(shù)是有限制的,如果管理不好,用戶經(jīng)常建立與數(shù)據(jù)庫的連接卻忘記釋放,運(yùn)行時(shí)間久了,數(shù)據(jù)庫的連接資源就會(huì)耗盡,當(dāng)再有新的用戶需要訪問數(shù)據(jù)庫時(shí),就需要等待很長一段時(shí)間,直到有用戶釋放連接資源才能訪問數(shù)據(jù),這對系統(tǒng)的可用性有著嚴(yán)重的影響。因此,管理好數(shù)據(jù)庫的連接資源對應(yīng)用系統(tǒng)尤其是頁面應(yīng)用系統(tǒng)是非常重要的。
數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理并釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不再是重新建立一個(gè)新的數(shù)據(jù)庫連接,同時(shí),它還負(fù)責(zé)釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接,避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。
在J2EE中,服務(wù)器在啟動(dòng)時(shí)會(huì)創(chuàng)建一定數(shù)量的池連接,并一直維持不少于此數(shù)目的連接池。當(dāng)客戶程序需要訪問數(shù)據(jù)庫時(shí),就可以直接從池中獲取與數(shù)據(jù)庫的連接(獲取一個(gè)空閑的連接),而不用去創(chuàng)建一個(gè)新的連接,同時(shí)將該連接標(biāo)記為忙狀態(tài)。當(dāng)使用完畢后再把該連接標(biāo)記為空閑狀態(tài),這樣其他用戶就可以使用這個(gè)連接了。如果當(dāng)前沒有空閑的連接,那么服務(wù)器就會(huì)根據(jù)配置參數(shù)在池中創(chuàng)建一定數(shù)量的連接。采用這種方法對數(shù)據(jù)庫連接進(jìn)行管理后可以大幅縮短用戶的響應(yīng)時(shí)間,提高運(yùn)行效率。另一方面,為了提高數(shù)據(jù)庫操作的性能,數(shù)據(jù)庫連接池會(huì)釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。
17.
J2EE開發(fā)有哪些調(diào)優(yōu)的方法
<正確答案:當(dāng)使用J2EE開發(fā)Web應(yīng)用程序時(shí),若只是考慮功能實(shí)現(xiàn),一般都不存在什么問題,但由于Web應(yīng)用的分布式特性,在很多特定的場合下,并發(fā)數(shù)據(jù)量會(huì)變得非常大,如何能夠保證此時(shí)系統(tǒng)還能夠高效地運(yùn)轉(zhuǎn),而且能夠快速地響應(yīng)用戶的請求呢?
下面介紹一些常用的方法。
1)優(yōu)化設(shè)計(jì),例如,小心使用繼承。繼承會(huì)導(dǎo)致遞歸,同時(shí)由于父類的構(gòu)造器將會(huì)被遍歷,繼承嵌套得過深,會(huì)產(chǎn)生巨大的創(chuàng)建開銷,因此推薦盡量使用組合方式來代替繼承方式。除此之外,還有很多其他的方法:封裝和重用常用的業(yè)務(wù)方法以及相關(guān)工具,避免在其他類中重復(fù)編寫;簡化類結(jié)構(gòu);面向接口編程;盡量使用主要類型;避免對象的過度使用,例如,不要為了使用一個(gè)方法就創(chuàng)建對象,應(yīng)盡可能地使用靜態(tài)方法或是使用將業(yè)務(wù)組件實(shí)例化后共享的方法等。
2)盡可能使用數(shù)據(jù)庫連接池。建立數(shù)據(jù)庫的連接是一項(xiàng)必須但又非常耗時(shí)的工作,如果頻繁地建立與數(shù)據(jù)庫的連接將會(huì)導(dǎo)致系統(tǒng)性能的急劇下降。因此,在實(shí)際開發(fā)系統(tǒng)時(shí),經(jīng)常使用數(shù)據(jù)庫連接池來提高系統(tǒng)性能。具體而言,就是使應(yīng)用服務(wù)器維護(hù)著數(shù)據(jù)庫連接池,這樣就不需要在每個(gè)事務(wù)處理開始時(shí)就創(chuàng)建一個(gè)連接了。此外,由于PreparedStatement有緩存功能,這使其具有較高的效率,因此,在使用JDBC的方式訪問數(shù)據(jù)庫時(shí),應(yīng)盡可能使用PreparedStatement。
3)給Web容器配置合理的線程數(shù)量來處理客戶端的HTTP請求。一般而言,最小的線程數(shù)量設(shè)置為容器處理請求的平均數(shù)(平均負(fù)載),最大值設(shè)置為系統(tǒng)在高峰期處理的請求數(shù),同時(shí)Web容器中線程的個(gè)數(shù)最好不要多于Web服務(wù)器中線程的個(gè)數(shù)。
4)根據(jù)實(shí)際情況設(shè)置Java虛擬機(jī)中堆空間的大小。合理地設(shè)置堆空間的大小能夠使得垃圾回收器運(yùn)行的時(shí)間間隔被控制在一個(gè)合理的范圍內(nèi),從而減少許多不必要的系統(tǒng)開銷。具體設(shè)置堆空間大小的方法可參考專用資料。
5)使用框架(例如Hibernate)來提高系統(tǒng)的效率。
6)把一些經(jīng)常被訪問的Servlet或JSP緩存起來,能夠減少響應(yīng)時(shí)間和提高系統(tǒng)的性能。但需要注意的是,緩存并非越多越好,無規(guī)則地使用緩存也可能會(huì)導(dǎo)致系統(tǒng)的崩潰。
7)當(dāng)在系統(tǒng)中使用EJB時(shí),由于對EJB的調(diào)用是采用對象請求代理(ObjectRequestBroker,ORB)的方式來完成,而ORB使用了線程來處理對EJB的請求,因此,應(yīng)當(dāng)合理配置線程池的大小以便它能夠在平均負(fù)載和高峰期都能夠很好地處理EJB的請求。
8)優(yōu)化I/O性能。I/O使用不當(dāng)將會(huì)造成資源競爭,降低系統(tǒng)性能。所以,在實(shí)際應(yīng)用時(shí),盡可能少使用System.out打印調(diào)試信息,推薦使用緩沖。
9)優(yōu)化查詢。在模型設(shè)計(jì)時(shí)就應(yīng)考慮冗余相對不會(huì)變化的數(shù)據(jù),如果設(shè)計(jì)大數(shù)據(jù)量,最好能夠考慮分區(qū)設(shè)計(jì)。
10)對session進(jìn)行合理管理與設(shè)置。根據(jù)實(shí)際情況對內(nèi)存中可能存在的session的個(gè)數(shù)設(shè)置一個(gè)合適的值。注意:盡量減少session的大小,以降低其對內(nèi)存的使用。而且,除非是在必須的情況下,否則盡量不要啟用對session的持久化。同時(shí),通過對session設(shè)置一個(gè)合理的超時(shí)時(shí)間來回收較長時(shí)間不使用的session,也可以有效地提高系統(tǒng)的效率。
18.
什么是Struts框架正確答案:Struts名字來源于在建筑與舊式飛機(jī)中使用的支持金屬架,它是由自定義標(biāo)簽、信息資源(messageresources)、Servlet和JSP組成的一個(gè)可重用的MVC2模式的框架。以Struts1.0為例,它的結(jié)構(gòu)圖如圖所示。
Struts的結(jié)構(gòu)圖
從上圖可以看出,Struts的體系結(jié)構(gòu)采用了MVC設(shè)計(jì)模式,同時(shí)包含客戶端(Client)請求以及業(yè)務(wù)邏輯處理(BusinessLogic),而MVC設(shè)計(jì)模式主要由模型(Model)、視圖(View)和控制器(Controller)三部分組成。
下面將分別對這些模塊進(jìn)行介紹。
(1)客戶端(Client)
一方面可以通過瀏覽器發(fā)送HTTP請求,另一方面可以把接收到的HTTP響應(yīng)消息在瀏覽器上展現(xiàn)出來。
(2)控制器(Controller)
控制器主要包括ActionServlet類和RequestProcessor類。其中,ActionServlet類是MVC實(shí)現(xiàn)的控制器部分,是整個(gè)框架的核心部分,它用來接收用戶的請求,并根據(jù)用戶的請求從模型模塊中獲取用戶所需的數(shù)據(jù),然后選擇合適的視圖來響應(yīng)用戶的請求。它采用了命令設(shè)計(jì)模式來實(shí)現(xiàn)這個(gè)功能:通過stnlts-config.xml配置文件來確定處理請求的Action類。在處理用戶請求時(shí),關(guān)于請求的處理大部分已交由RequestPcess()方法來處理。RequestProeessor類的processs()方法采用了模板的設(shè)計(jì)模式(按照處理的步驟與流程順序的調(diào)用了一系列的方法)。處理的主要流程為:
1)processPath(request,response)。根據(jù)URI(UniformResourceIdentifier,統(tǒng)一資源標(biāo)識(shí)符,用來唯一的標(biāo)識(shí)一個(gè)資源)來得到ActionMapping元素的路徑。
2)processMapping(request,response)。根據(jù)路徑信息找到ActionMapping對象。
3)processRoles(request,respose,mapping)。Struts為Web應(yīng)用提供了一種認(rèn)證機(jī)制,當(dāng)用戶登錄時(shí),會(huì)通過processRoles方法調(diào)用requestisUserInRole()方法來檢查這個(gè)用戶是否有權(quán)限來執(zhí)行給定的ActionMapping。
4)processValidate(request,response,form,mapping)。調(diào)用ActionForm的validate()方法。
5)processActionCreate(request,response,mapping)。這個(gè)方法從<action>的type屬性得到Action類名,并創(chuàng)建返回它的實(shí)例。
6)processActionPerform(req,res,action,form,mapping)。這個(gè)方法調(diào)用Action類的execute()方法,其中execute()方法中包含了業(yè)務(wù)邏輯的實(shí)現(xiàn)。需要注意的是,Action類并不是線程安全的。
(3)業(yè)務(wù)邏輯(BusinessLogic)
Servlet在接收到請求后會(huì)根據(jù)配置文件中的對應(yīng)關(guān)系,把請求轉(zhuǎn)給指定的Action類來處理,Action類采用適配器設(shè)計(jì)模式,它只是對業(yè)務(wù)邏輯進(jìn)行了包裝(真正的業(yè)務(wù)邏輯是由EJB的sessionbean或普通的Java類來實(shí)現(xiàn))。
(4)模型(Model)
在Struts體系結(jié)構(gòu)中,模型分為兩個(gè)部分:系統(tǒng)的內(nèi)部狀態(tài)和可以改變狀態(tài)的操作(業(yè)務(wù)邏輯)。內(nèi)部狀態(tài)通常由一組ActionformBean表示,ActionForm封裝了HTTP請求的數(shù)據(jù)的類或?qū)ο?。ActionForm是一個(gè)抽象類,每一個(gè)輸入表單都對應(yīng)著它的一個(gè)子類。配置文件strutsconfig.xml中保存了HTTP請求表單與具體ActionForm類的映射關(guān)系。
(5)視圖(View)
視圖就是一個(gè)JSP文件,該JSP文件中沒有業(yè)務(wù)邏輯的處理,也不保存系統(tǒng)的狀態(tài)信息,它通過一些標(biāo)簽把數(shù)據(jù)以瀏覽器能識(shí)別的方式展現(xiàn)出來。目前,標(biāo)簽庫主要有BeanTags、HTMLtags、LogicTags、NestedTags以及TemplateTags等。
Struts框架作為一項(xiàng)開放源碼項(xiàng)目,優(yōu)點(diǎn)眾多,具體而言,主要有如下幾點(diǎn):
1)由于采用了MVC模式,因此它實(shí)現(xiàn)了表現(xiàn)與邏輯的分離,使得系統(tǒng)有較好的可擴(kuò)展性。同時(shí)Struts的標(biāo)記庫(Taglib)包含了大量的tag,有助于提高系統(tǒng)的開發(fā)效率。
2)提供了頁面導(dǎo)航功能,使系統(tǒng)的脈絡(luò)更加清晰。通過一個(gè)配置文件建立整個(gè)系統(tǒng)各部分之間的聯(lián)系,使有系統(tǒng)結(jié)構(gòu)變得更加清晰,從而增強(qiáng)了系統(tǒng)的可擴(kuò)展性與可維護(hù)性。
3)提供了表單的驗(yàn)證功能,進(jìn)一步增強(qiáng)了系統(tǒng)的健壯性。
4)提供了數(shù)據(jù)庫連接池管理。
5)提供了Exception處理機(jī)制。
6)支持國際化。
當(dāng)然,Struts也有它的不足之處,主要有以下幾點(diǎn):
1)Taglib中包含了大量的tag,對于初學(xué)者而言,開發(fā)難度比較大。
2)Struts開發(fā)中包含了許多XML格式的配置文件。一方面,這些配置文件不易調(diào)試;另一方面,大量的XML文件也不便于管理。
3)Struts只能支持Web應(yīng)用程序的開發(fā)。
4)Struts的Action不是線程安全的,因此Action類用到的所有資源都必須進(jìn)行同步。
5)單元測試不方便。由于Action與Web層的緊耦合,導(dǎo)致其非常依賴于Web容器,給單元測試帶來了不便。
6)部署煩瑣。當(dāng)轉(zhuǎn)到表示層時(shí),需要配置forward,例如,如果有10個(gè)表示層的JSP文件,則需要配置10個(gè)Struts。此外,當(dāng)目錄、文件變更后,需要重新修改forward,而且每次修改配置之后,還需要重新部署整個(gè)項(xiàng)目,對于Tomcate等服務(wù)器,還必須重啟服務(wù)器。
7)對Servlet的依賴性過強(qiáng)。Struts處理Action時(shí)必需要依賴ServletRequest和ServletResponse,擺脫不了對Servlet容器的依賴。
19.
Struts框架響應(yīng)客戶請求的工作流程是什么正確答案:在Struts框架中,控制器主要是ActionServlet,但是對業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward等組件協(xié)調(diào)完成。其中,Action扮演了真正的控制邏輯實(shí)現(xiàn)者的角色,而ActionMapping和ActionForward則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。
對于采用Struts框架的Web應(yīng)用而言,在Web應(yīng)用啟動(dòng)時(shí),會(huì)加載并初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,并把它們存放到ActionMappings對象中。具體而言,當(dāng)ActionServlet接收到一個(gè)客戶請求時(shí),執(zhí)行如下流程:
1)檢索和用戶請求匹配的ActionMapping實(shí)例,如果不存在,就返回用戶請求路徑無效的信息。
2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個(gè)ActionForm對象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中。
3)根據(jù)配置信息決定是否需要表單驗(yàn)證。如果需要驗(yàn)證,就調(diào)用ActionForm的validate()方法。
4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessge的ActionErrors對象,就表示表單驗(yàn)證成功。
5)ActionServlet根據(jù)ActionMapping實(shí)例包含的映射信息決定將請求轉(zhuǎn)發(fā)給哪個(gè)Action。如果對應(yīng)的Action實(shí)例不存在,就先創(chuàng)建一個(gè)實(shí)例,然后調(diào)用Action的execute()方法。
6)Action的execute()方法返回一個(gè)ActionForward對象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指向的JSP組件。
7)ActionForward對象指向的JSP組件生成動(dòng)態(tài)頁面,返回給客戶。
對于以上流程中的步驟4),如果ActionForm的validate()方法返回一個(gè)(包含一個(gè))或多個(gè)ActionMessage的ActionErrors對象,就表示表單驗(yàn)證失敗,此時(shí),ActionServlet將直接把請求轉(zhuǎn)發(fā)給包含客戶提交表單的JSP組件。在這種情況下,不會(huì)再創(chuàng)建Action對象并調(diào)用Action的execute方法了。
20.
Struts框架的數(shù)據(jù)驗(yàn)證可分為幾種類型正確答案:數(shù)據(jù)驗(yàn)證也稱為輸入校驗(yàn),用于指導(dǎo)對用戶的輸入進(jìn)行基本的過濾,包括必填的字段(字段必須為數(shù)字)以及兩次輸入的密碼必須一致等。Struts框架提供了現(xiàn)成的、易于使用的數(shù)據(jù)驗(yàn)證功能。
具體而言,數(shù)據(jù)驗(yàn)證可以分為兩種類型:表單驗(yàn)證與業(yè)務(wù)邏輯驗(yàn)證。其中,表單驗(yàn)證由ActionFormBean處理,例如,如果用戶沒有在表單中輸入姓名就提交表單,將生成表單驗(yàn)證錯(cuò)誤。該方式重寫ActionForm的validate()方法,在該方法內(nèi)對所有字段進(jìn)行基本的校驗(yàn)。若出現(xiàn)不符合要求的輸出,則將錯(cuò)誤提示封裝在ActionError對象里,最后將多個(gè)ActionError組合成ActionErrors對象,因此ActionErrors對象中封裝了所有出錯(cuò)信息。
業(yè)務(wù)邏輯驗(yàn)證由Action處理,如果用戶在表單中輸入的姓名為“Hehao”,那么按照本應(yīng)用的業(yè)務(wù)規(guī)則,不允許輸入“Hehao”,因此將生成業(yè)務(wù)邏輯錯(cuò)誤。需要注意的是,在Action里面完成數(shù)據(jù)驗(yàn)證,實(shí)際上就是在execute()方法前面增加數(shù)據(jù)驗(yàn)證的部分代碼。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44069.5-2025鐵氧體磁心尺寸和表面缺陷極限導(dǎo)則第5部分:電感器和變壓器用EP型磁心及其附件
- 湖鹽脫水工崗前節(jié)能考核試卷含答案
- 棕草編織工安全文明模擬考核試卷含答案
- 筒并搖工班組協(xié)作能力考核試卷含答案
- 汽車涂裝生產(chǎn)線操作工安全檢查強(qiáng)化考核試卷含答案
- 梅乙艾知識(shí)培訓(xùn)
- 海關(guān)行政處罰培訓(xùn)
- 酒店員工請假與出差制度
- 酒店客用物品損壞賠償制度
- 財(cái)務(wù)合同管理與審查制度
- 2026年無錫工藝職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試題庫帶答案解析
- 村級財(cái)務(wù)審計(jì)培訓(xùn)課件
- 【低空經(jīng)濟(jì)】無人機(jī)AI巡檢系統(tǒng)設(shè)計(jì)方案
- 2026年齊齊哈爾高等師范??茖W(xué)校單招職業(yè)技能測試模擬測試卷必考題
- 初中生物教師培訓(xùn)課件
- 2025年湖南省公務(wù)員錄用考試錄用考試《申論》標(biāo)準(zhǔn)試卷及答案
- 2025年遼寧省綜合評標(biāo)專家?guī)炜荚囶}庫及答案
- 工程項(xiàng)目成功完成承諾函3篇
- 漢字的傳播教學(xué)課件
- 行政崗位面試問題庫及應(yīng)對策略
- 2025衢州市市級機(jī)關(guān)事業(yè)單位編外招聘77人筆試試題附答案解析
評論
0/150
提交評論