版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第十二章JSPJAVA語言程序設(shè)計1Java語言程序設(shè)計-JSP程序設(shè)計目錄12.1JSP簡介12.2JSP與JavaBean12.3JSP標簽庫12.4JSP與Servlet12.5本章小結(jié)2Java語言程序設(shè)計-JSP程序設(shè)計12.1JSP簡介servlet和JSP(JavaServerPage)已成為開發(fā)電子商務(wù)等動態(tài)網(wǎng)站的首選技術(shù),它們都是運行在服務(wù)器上的Java程序servletHTML的編寫和維護都比較困難,使用print語句生成HTML并不容易,非Java開發(fā)人員很難處理這些HTMLJSP靜態(tài)內(nèi)容的輸出都采用標準的HTML,只用java語言編寫頁面中生成動態(tài)內(nèi)容的代碼提供了對Java編程語言以及針對動態(tài)部分的servlet技術(shù)的完全訪問3Java語言程序設(shè)計-JSP程序設(shè)計12.1.1什么是JSP程序JSP簡單的說,就是嵌入了Java代碼的HTML,由靜態(tài)HTML、專用的JSP標簽和Java代碼組成服務(wù)器端的技術(shù)。在后臺被自動轉(zhuǎn)換成servlet僅在修改后的第一次被訪問時,才會被轉(zhuǎn)換成servlet并進行編譯,創(chuàng)建JSP唯一的一個一實例,并調(diào)用_jspInit完成初始化,之后每個用戶請求都會創(chuàng)建一個調(diào)用JSP實例的_jspService方法的線程。因而多個并發(fā)請求會導致多個線程同時調(diào)用_jspServiceTomcat中,默認目錄下的JSP文件被轉(zhuǎn)換生成的servlet文件及編譯后生成的class文件被放在install_dir/work/Catalina/localhost/_/org/apache/jsp目錄下JSP簡介4Java語言程序設(shè)計-JSP程序設(shè)計12.1.1什么是JSP程序
——JSP頁面被請求后的操作JSP簡介將JSP頁面轉(zhuǎn)換為servlet編譯servlet將servlet載入到服務(wù)器內(nèi)存中調(diào)用jspInit調(diào)用_jspService頁面初次創(chuàng)建請求1有有有有有請求2無無無無有服務(wù)器重啟后請求3無無有有有請求4無無無無有頁面修改后請求5有有有有有請求6無無無無有5Java語言程序設(shè)計-JSP程序設(shè)計JSP文件在服務(wù)器的部署可以和常規(guī)的HTML頁面放在相同的目錄中,并使用和常規(guī)HTML相同的URL訪問它們除了不允許將WEB-INF和META-INF作目錄名之外,可以使用任何喜歡的目錄名Tomcat中JSP的默認目錄是install_dir/webapps/ROOT,我們只要把編寫好的JSP文件直接放在此目錄下即可例如install_dir/webapps/ROOT/SomeDirectory/Some則對應(yīng)的URL為http://host:port/SomeDirectory/Some12.1.1什么是JSP程序
——JSP文件在服務(wù)器的部署JSP簡介6Java語言程序設(shè)計-JSP程序設(shè)計12.1.2JSP語法概述除了標準的HTML以外,JSP主要包括三類組件腳本元素(scriptingelements)使你可以向JSP文件產(chǎn)生的servlet文件中插入代碼指令標簽(directives)將影響由JSP頁產(chǎn)生的servlet的總體結(jié)構(gòu)動作標簽(actions)影響JSP運行時的功能JSP簡介7Java語言程序設(shè)計-JSP程序設(shè)計腳本元素——向JSP文件產(chǎn)生的servlet文件中插入代碼,主要有三種形式表達式<%=expression%><%和=之間不能有空格。expression必須能求值,服務(wù)器計算出值后以字符串形式發(fā)送到客戶端顯示程序片<%code%>一個JSP頁面可以有許多,它們將被插入到生成的servlet文件的_jspService方法中每次客戶端請求都會新開一個線程,調(diào)用servlet的service方法,service方法再調(diào)用_jspService方法JSP簡介12.1.2JSP語法概述
——腳本元素8Java語言程序設(shè)計-JSP程序設(shè)計聲明語句<%!Declaration%>聲明的內(nèi)容包括變量和方法,將被插入到生成servlet的類體中,在_jspService方法之外,成為類變量和類方法,直到服務(wù)器關(guān)閉才被釋放當多個客戶請求一個JSP頁面時,多個線程將共享這些變量和方法,因而任何一個用戶對這些變量操作的結(jié)果,都會影響到其他用戶12.1.2JSP語法概述
——腳本元素JSP簡介9Java語言程序設(shè)計-JSP程序設(shè)計指令標簽將影響由JSP頁產(chǎn)生的servlet的總體結(jié)構(gòu)其格式為<%@directive
attribute1="value1",attribute2="value2",┄%>directive代表指令名稱attribute代表該指令中可選的屬性名稱value代表屬性值并且總是用單引號或雙引號括起來,要想在屬性值value中輸出引號,可在該引號前用一個反斜杠“\”在JSP中,有三種類型的指令pageincludetaglibJSP簡介12.1.2JSP語法概述
——指令標簽10Java語言程序設(shè)計-JSP程序設(shè)計page指令可放在文檔內(nèi)的任何位置,該指令對整個頁面有效可以定義一個或多個大小寫敏感的屬性,包括import、contentType、isThreadSafe、Session、buffer等import屬性為JSP頁面引入Java核心包中的類,這樣就可以在腳本部分使用這些類,如:<%@pageimport="java.io.*"%>可以為import屬性指定多個值,這些值用逗號分割,這樣就可以引入若干個包或類,如:
<%@pageimport="java.io.*","java.awt.*","java.util.Date"%>JSP頁面默認import屬性已經(jīng)有如下的值:"java.lang.*","javax.servlet.*","javax.servlet.jsp.*","javax.servlet.http.*“除import屬性外,Page指令的其它屬性只能指定一個值JSP簡介12.1.2JSP語法概述
——指令標簽/page指令11Java語言程序設(shè)計-JSP程序設(shè)計contentType屬性定義JSP頁面相應(yīng)的MIME(MultipurposeInternetMailExtension,多用途Internet郵件擴展)類型和JSP頁面字符編碼其屬性使用以下兩種格式之一<%@pagecontentType="MIME-Type;charset=Character-Set"%>或者<%@pagecontentType="MIME-Type"%>例如<%@pagecontentType="application/vnd.ms-excel;charset=GB2312"%>其屬性默認值為<%@pagecontentType="text/html;charset=ISO-8859-1"%>JSP簡介12.1.2JSP語法概述
——指令標簽/page指令12Java語言程序設(shè)計-JSP程序設(shè)計isThreadSafe屬性用來設(shè)置JSP頁面是否可多線程訪問設(shè)為true時,JSP頁面能同時響應(yīng)多個客戶的請求設(shè)為false時,同一時刻只能處理一個客戶的請求,其它客戶須等待其默認值為truesession屬性表示當前的JSP頁面是否參與HTTP會話設(shè)為true時,可以使用內(nèi)置的javax.Servlet.HttpSession類型的一個名為session的對象設(shè)為false時,則該對象不被創(chuàng)建默認值為trueJSP簡介12.1.2JSP語法概述
——指令標簽/page指令13Java語言程序設(shè)計-JSP程序設(shè)計buffer屬性指定jsp內(nèi)置輸出流out變量使用的緩沖區(qū)的尺寸,如果設(shè)置為none,則不使用緩沖區(qū)默認值是8kbout變量是JspWriter類型的,JspWriter是java.io.Writer類的子類。累計輸出內(nèi)容超過了這里設(shè)定的大小、完成了此頁、或者輸出被明確清除(如使用response.flushBuffer),文檔才被發(fā)送給客戶顯示例如<%@pagebuffer="16kb"%>autoflush屬性控制out的緩沖區(qū)在裝滿時的處理,默認為true設(shè)為true時,裝滿時則自動清除緩沖區(qū)設(shè)為false時,裝滿后則會出現(xiàn)異常buffer的值是none時將autoflush設(shè)為false是不合法的JSP簡介12.1.2JSP語法概述
——指令標簽/page指令14Java語言程序設(shè)計-JSP程序設(shè)計info屬性定義了一個通過getServletInfo方法可從servlet中檢索到的串格式為<%@pageinfo="someMessage"%>isErrorPage屬性指明當前頁是否能充當其它JSP頁面的錯誤頁。采用以下兩種格式之一<%@pageisErrorPage="true"%>或者<%@pageisErrorPage="false"%><%--Default--%>。errorPage屬性指定一個處理當前頁未被捕獲的任何異常的頁面格式為<%@pageerrorPage="RelativeURL"%>這個URL指定的錯誤頁的isErrorPage屬性必須被設(shè)為true方可使用JSP簡介12.1.2JSP語法概述
——指令標簽/page指令15Java語言程序設(shè)計-JSP程序設(shè)計include指令與page指令不同,該指令應(yīng)該放在你想要將外部文件插入的位置,它可以將文件整體插入到該處其格式為<%@includefile=""%>Jsp文件被轉(zhuǎn)換成servlet文件時,外部文件就被插入了,然后統(tǒng)一進行編譯當外部文件發(fā)生改變時,當前頁面無法得到通知,要想得知外部文件的任何改變,當前頁面必須重新編譯,由上一節(jié)jsp的操作過程可知,必須重新保存該jsp文件12.1.2JSP語法概述
——指令標簽/include指令JSP簡介16Java語言程序設(shè)計-JSP程序設(shè)計taglib指令JSP1.1規(guī)范中新增的指定一個標記庫,用于擴充標準的JSP標記集完成三個任務(wù)首先,它通知JSP服務(wù)器,頁面使用一個標記庫其次,它指定包含標記庫標志符的特殊jar文件的位置最后,它指定一個用于唯一區(qū)分這些新標記的標記前綴格式為:<%@tagliburi="someuri"prefix="somename"%>uri屬性:一個引用標記庫描述符文件(后綴名為TLD:TagLibraryDescriptor)的絕對或相對URLprefix屬性:指定一個將要在TLD文件定義的標記名前面使用的前綴如果TLD文件定義了一個名為tag1的標記,并且prefix屬性的值設(shè)為test,那么實際的標記名將為test:tag112.1.2JSP語法概述
——指令標簽/taglib指令JSP簡介17Java語言程序設(shè)計-JSP程序設(shè)計動作標簽一種特殊的標簽,影響JSP運行時的功能格式為<jsp:action_name
attribute1="value1",attribute2="value2"┄/>action_name代表動作名稱attribute代表屬性名稱value代表屬性值分為兩類Resource動作JavaBean動作JSP簡介12.1.2JSP語法概述
——動作標簽18Java語言程序設(shè)計-JSP程序設(shè)計
Resource動作include動作標簽告訴JSP頁面動態(tài)包含一個文件,即JSP頁面運行時才將文件加入,例如:<jsp:includepage="some"/>如果包含的是普通的文本文件,就將文件的內(nèi)容發(fā)送到客戶端,由客戶端負責顯示如果包含的是JSP文件,JSP引擎就執(zhí)行這個文件,然后將執(zhí)行的結(jié)果發(fā)送到客戶端顯示如果修改了被包含的文件,那么運行時將看到修改后的結(jié)果,這一點和include指令不同可結(jié)合param指令,向要包含的文件傳送信息,被包含的文件通過JSP的內(nèi)置對象request調(diào)用getParameter方法獲得參數(shù)值。格式為:<jsp:includepage="some"><jsp:paramname="someName"value="someValue"/></jsp:include>JSP簡介12.1.2JSP語法概述
——動作標簽/Resource動作19Java語言程序設(shè)計-JSP程序設(shè)計forward動作標簽告訴JSP頁面從該指令處停止當前頁面的繼續(xù)執(zhí)行,而轉(zhuǎn)向其他的一個頁面,當前頁面后邊的內(nèi)容將不被執(zhí)行,例如:<jsp:forwardpage="some"/>該標簽也可結(jié)合param指令,向要轉(zhuǎn)到的頁面?zhèn)魉托畔?,格式同include標簽JSP簡介12.1.2JSP語法概述
——動作標簽/Resource動作20Java語言程序設(shè)計-JSP程序設(shè)計plugin動作標簽用于插入Applet或JavaBean到JSP頁面,組件必須被下載到瀏覽器并且在客戶端執(zhí)行param元素可以用于發(fā)送參數(shù)到Applet或JavaBean(一個可重復使用的軟件組件,實際上就是一個Java類)如:
<jsp:plugin
type="applet"code="A.class"width="120"height="120"><jsp:paramname="someName"value="someValue"/>
<jsp:fallback>promptmessage
</jsp:fallback>
</jsp:plugin>當客戶訪問含該段代碼的JSP文件時,如果客戶端不支持applet,將導致下載Javaplug插件,出現(xiàn)客戶選擇是否下載插件的界面。用戶下載安裝后,就可以使用Java虛擬機加載執(zhí)行Javaapplet小應(yīng)用程序A.class了fallback元素可用于指定組件失敗時發(fā)送到客戶端的錯誤信息字符串12.1.2JSP語法概述
——動作標簽/Resource動作JSP簡介21Java語言程序設(shè)計-JSP程序設(shè)計JavaBean動作useBean動作標簽格式為<jsp:useBeanid="bean的名字"class="創(chuàng)建bean的類"scope="有效范圍"/>或者<jsp:useBeanid="bean的名字"class="創(chuàng)建bean的類"scope="有效范圍"/></jsp:useBean>服務(wù)器將加載該bean類的一個對象setProperty動作標簽設(shè)置bean的屬性getProperty動作標簽獲取bean屬性的值并輸出12.1.2JSP語法概述
——動作標簽/JavaBean動作JSP簡介22Java語言程序設(shè)計-JSP程序設(shè)計12.1.3JSP內(nèi)置對象JSP的內(nèi)置對象在JSP頁面的腳本元素中,有些不用聲明就可以使用的對象包括out、request、response、session、application等out對象是javax.servlet.jsp.JspWriter類的實例,JspWriter包含的方法大多數(shù)與java.io.PrintWriter類一樣這個輸出流對象用來向客戶端輸出數(shù)據(jù),其可調(diào)用的方法如下表JSP簡介23Java語言程序設(shè)計-JSP程序設(shè)計12.1.3JSP內(nèi)置對象(續(xù))
——out對象可使用的方法名稱解釋print(Booleanb)輸出一個布爾值print(charc)輸出一個字符print(doubled)輸出一個雙精度的浮點數(shù)print(floatf)輸出一個單精度的浮點數(shù)print(longl)輸出一個長整型數(shù)據(jù)print(Strings)輸出一個字符串newLine()輸出一個換行符flush()輸出緩沖區(qū)里的內(nèi)容close()關(guān)閉流JSP簡介24Java語言程序設(shè)計-JSP程序設(shè)計request對象是javax.servlet.http.HttpServletRequest的實例客戶每次請求頁面時,JSP引擎創(chuàng)建一個request對象代表該請求封裝了用戶提交的信息,這些信息包括HTTP請求的請求行HTTP頭信息體調(diào)用相應(yīng)的方法可以獲取封裝的信息,最常用的方法是request.getParameter(param_name)12.1.3JSP內(nèi)置對象(續(xù))
——request對象JSP簡介25Java語言程序設(shè)計-JSP程序設(shè)計12.1.3JSP內(nèi)置對象(續(xù))
——request對象的常用方法名稱解釋getProtocal()獲取客戶向服務(wù)器提交信息使用的通訊協(xié)議getServletPath()獲取JSP文件的目錄getContentLength()獲取提交信息的長度getMethod()獲取客戶提交信息的方式,例如post或getgetHeaderNames()獲取頭名字的一個枚舉getHeader(Strings)獲取HTTP頭文件中由s指定的屬性的值,例如“content-type”,“cookie”等getRemoteHost()獲取客戶機的名稱getRemoteAddr()獲取客戶機的IP地址getServerName()獲取服務(wù)器的名稱getServerPort()獲取服務(wù)器的端口號getParameterNames()獲取客戶提交的信息體部分中所有參數(shù)的名字getParameter(String_name)獲取指定參數(shù)名字的參數(shù)值JSP簡介26Java語言程序設(shè)計-JSP程序設(shè)計
response對象javax.servlet.http.httpServletResponse的實例與request對象相對應(yīng),我們可以用response對象對客戶的請求做出動態(tài)響應(yīng),向客戶端發(fā)送數(shù)據(jù)。類似于HTTP請求,HTTP響應(yīng)也由三個基本部分組成狀態(tài)行:包括使用的協(xié)議以及狀態(tài)代碼,表示請求是否成功頭:包含關(guān)于服務(wù)器和返回的文檔的消息,例如服務(wù)器名稱和文檔類型等信息體使用這個對象的一些方法可以完成如下任務(wù)動態(tài)設(shè)置contentType屬性頁面重定向設(shè)置返回狀態(tài)碼等JSP簡介12.1.3JSP內(nèi)置對象(續(xù))
——response對象27Java語言程序設(shè)計-JSP程序設(shè)計JSP簡介12.1.3JSP內(nèi)置對象(續(xù))
——resnponse對象的常用方法名稱解釋setStatus(intsc)設(shè)置返回狀態(tài)碼setContentType(Stringtype)設(shè)置被發(fā)送文檔的MIME類型setHeader(Stringname,Stringvalue)設(shè)置頭中指定屬性name為指定值valuesetRedirect(Stringlocation)重定向到指定URL28Java語言程序設(shè)計-JSP程序設(shè)計會話的概念從一個客戶打開瀏覽器連接到服務(wù)器的某個服務(wù)目錄,到客戶關(guān)閉瀏覽器離開該服務(wù)目錄稱為一個會話每個會話只對應(yīng)于一個客戶,并且可以跨多個頁面session對象javax.servlet.http.HttpSession的實例,對應(yīng)于會話的概念用于在使用無狀態(tài)連接協(xié)議(如HTTP)的情況下跟蹤關(guān)于某個客戶的信息,對識別客戶是非常重要的在客戶首次訪問某服務(wù)目錄中的任何一個JSP頁面時創(chuàng)立,并且具有一個獨一無二的Id號,直到客戶關(guān)閉瀏覽器或這個session對象達到了最大生存時間,服務(wù)器端該客戶的session對象才被取消調(diào)用相應(yīng)的方法可以存儲客戶在訪問各個頁面期間提交的各種信息,比如姓名、編號等JSP簡介12.1.3JSP內(nèi)置對象(續(xù))
——session對象29Java語言程序設(shè)計-JSP程序設(shè)計JSP簡介12.1.3JSP內(nèi)置對象(續(xù))
——session對象的常用方法名稱解釋intgetMaxInactiveInterval()返回會話過期前需要經(jīng)過的秒數(shù)voidsetMaxInactiveInterval(intinterval)設(shè)置某個會話的生命期longgetCreationTime()返回創(chuàng)建會話的時間longgetLastAccessedTime()返回上次使用此會話的時間voidinvalidate()使得session對象無效booleanisNew()判斷是否是個新會話StringgetId()返回識別客戶的獨一無二的字符串EnumerationgetIds()返回一個包含當前所有會話Id的枚舉值voidsetAttribute(Stringkey,Objectvalue)在session對象中添加obj,并指定索引關(guān)鍵字為keyObjectgetAttribute(Stringname)從session對象獲取關(guān)鍵字為key的對象voidremoveAttribute(Stringname)從session中刪除指定索引關(guān)鍵字的對象EnumerationgetAttributeName()獲取session對象存儲的所有鍵名30Java語言程序設(shè)計-JSP程序設(shè)計application對象javax.servlet.ServletContext的實例。比session對象的生存時期更長。服務(wù)器啟動后,就產(chǎn)生了這個application對象,直到服務(wù)器關(guān)閉,該對象才被取消所有客戶共享這個內(nèi)置的application對象,所以任何客戶對該對象中存儲的數(shù)據(jù)的改變都會影響到其他客戶,因此,在某些情況下,對該對象的操作需要同步處理12.1.3JSP內(nèi)置對象(續(xù))
——application對象JSP簡介31Java語言程序設(shè)計-JSP程序設(shè)計12.1.3JSP內(nèi)置對象(續(xù))
——application對象的常用方法名稱解釋voidsetAttribute(Stringkey,Objectobj)將obj對象添加到application對象中,并為obj指定一個索引關(guān)鍵字key。ObjectgetAttribute(Stringkey)獲取application對象中指定關(guān)鍵字的對象EnumerationgetAttributeNames()返回application對象的所有索引關(guān)鍵字voidremoveAttribute(Stringkey)刪除指定索引的對象JSP簡介32Java語言程序設(shè)計-JSP程序設(shè)計12.1.4一個簡單的JSP程序在表單中輸入一個自然數(shù),計算從1到該數(shù)的累加和<%--page指令標簽,指定MIME類型和頁面的字符編碼--%><%@pagecontentType="text/html;charset=gb2312"%><%--聲明一個類方法,該方法在整個JSP頁面有效--%><%!intcontinuousSum(intn){ intsum=0; for(inti=1;i<=n;i++){sum=sum+i;} returnsum;}%><%--JSP中的Java程序片,將被JSP引擎按順序執(zhí)行--%><%Stringstr=request.getParameter("number");if(str==null)str="10";intr=Integer.parseInt(str);%>JSP簡介33Java語言程序設(shè)計-JSP程序設(shè)計12.1.4一個簡單的JSP程序(續(xù))<html><head><title>計算連續(xù)和</title></head><body><h1>請輸入一個自然數(shù)</h1><!--HTML表單--><formname="form1"method="post"action=""><inputtype="text"name="number"value=<%=str%>><inputtype="submit"name="Submit"value="計算"></form> <%--JSP表達式,其值由服務(wù)器負責計算,并將結(jié)果發(fā)回客戶端顯示--%><%=r%>的連續(xù)和是<%=continuousSum(r)%></body></html>JSP簡介34Java語言程序設(shè)計-JSP程序設(shè)計12.1.4一個簡單的JSP程序(續(xù))
——例12_1運行結(jié)果JSP簡介35Java語言程序設(shè)計-JSP程序設(shè)計12.2JSP與JavaBean指令標簽<%@includefile=“”%>和動作標簽<jsp:includepage=“some”/>都可以嵌入代碼。前者實際上是將代碼插入行內(nèi),后者是將另一個頁面的輸出插入原來的頁面這些方法無助于分離表示邏輯和業(yè)務(wù)邏輯,它們都造成了顯著的可伸縮性問題,不利于開發(fā)人員分工合作JavaBean解決了這個問題,它將一系列相關(guān)的屬性和方法組合在一個Java類中,構(gòu)成了一個組件在JSP程序中,只要使用JavaBean動作標簽調(diào)用該組件就可以了36Java語言程序設(shè)計-JSP程序設(shè)計12.2.1JavaBean簡介JavaBean其實就是Java類必須使用一組相當簡單而又標準的設(shè)計和命名約定,因而調(diào)用它們的應(yīng)用程序無須理解其內(nèi)部工作原理,就可以很容易的使用JavaBean的方法JavaBean類的一個實例叫做一個bean通常我們將JavaBean文件取名為XxxBeanJSP與JavaBean37Java語言程序設(shè)計-JSP程序設(shè)計12.2.1JavaBean簡介(續(xù))
——JavaBean的設(shè)計要求對于JSP中使用的JavaBean,有三個設(shè)計要求必須擁有一個默認(無參數(shù))的構(gòu)造函數(shù)如果未聲明任何構(gòu)造函數(shù),默認的構(gòu)造函數(shù)會被自動創(chuàng)建JSP元素創(chuàng)建bean時,會調(diào)用默認構(gòu)造函數(shù)類中不應(yīng)該有公開的屬性對于類內(nèi)的屬性,通常應(yīng)該提供設(shè)置和獲取其值的方法publicvoidsetXxx(Objec_typevalue)方法進行設(shè)置publicObject_typegetXxx()方法進行獲取,如果該屬性是布爾類型的,允許使用publicbooleanisXxx()獲取屬性值如果某個屬性只有g(shù)etXxx或isXxx方法,叫做只讀屬性JSP與JavaBean38Java語言程序設(shè)計-JSP程序設(shè)計可以使用JSP腳本元素訪問類的任意方法訪問bean的標準JSP動作只能使用那些遵循getXxx/setXxx或isXxx/setXxx命名約定的方法12.2.1JavaBean簡介(續(xù))
——JSP對JavaBean的訪問JSP與JavaBean39Java語言程序設(shè)計-JSP程序設(shè)計設(shè)計一個描述員工信息的JavaBean類。包括編號、姓名、性別、工資、職務(wù)屬性packagemyBeans;publicclassEmployeeBean{ privateintid=0,salary=0; privateStringname="none",occupation="none"; privatebooleanmale=true;
publicintgetId(){returnid;} publicvoidsetId(intid){this.id=id;} publicStringgetName(){returnname;} publicvoidsetName(Stringname){=name;}
publicbooleanisMale(){returnmale; } publicvoidsetMale(booleanmale){this.male=male;}
publicintgetSalary(){returnsalary;} publicvoidsetSalary(intsalary){this.salary=salary;}
publicStringgetOccupation(){returnoccupation;} publicvoidsetOccupation(Stringoccupation){this.occupation=occupation;}}JSP與JavaBean12.2.1JavaBean簡介(續(xù))
——例12_240Java語言程序設(shè)計-JSP程序設(shè)計EmployeeBean類滿足成為JavaBean的條件沒有公開的實例變量沒有聲明任何顯式的構(gòu)造函數(shù),從而也就擁有了一個默認的無參數(shù)的構(gòu)造函數(shù)它的屬性的設(shè)置和獲得都使用了標準的形式JSP與JavaBean12.2.1JavaBean簡介(續(xù))
——例12_2說明41Java語言程序設(shè)計-JSP程序設(shè)計12.2.2在JSP程序中使用JavaBeanJavaBean類在Web應(yīng)用中的部署不能放在含有JSP文件的目錄中,而應(yīng)該放在安裝servlet的目錄中,且一定要使用包單個JavaBean類的字節(jié)碼文件的正確位置是webAppDir/WEB-INF/classes/PackageName/含有bean類的JAR文件應(yīng)該放在webAppDir/WEB-INF/lib/目錄中在JSP頁面中,可以使用三種JavaBean動作標簽構(gòu)建和操作JavaBean組件useBean動作標簽setProperty動作標簽getProperty動作標簽JSP與JavaBean42Java語言程序設(shè)計-JSP程序設(shè)計
<jsp:useBeanid="beanName"
class="package.class"
scope="someScope"/>表示建立一個bean類的對象class指定的bean類的類名id指定該實例的名字scope屬性表示bean的有效范圍,有4個可選值PageRequestSessionApplication如果已經(jīng)存在scope和id相同的實例,則訪問現(xiàn)存的實例JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))
——建立JavaBean43Java語言程序設(shè)計-JSP程序設(shè)計Page默認值,有效范圍是當前請求訪問的JSP頁面表示每次請求訪問JSP頁面時都會創(chuàng)建新的bean,并將其放在PageContext對象中servlet可以通過預定義變量pageContext的getAttribute方法訪問它Request有效范圍是當前的請求將bean放在HttpServletRequest對象中,如果已經(jīng)存在,則調(diào)用之,可通過getAttribute方法訪問在使用jsp:include,jsp:forward,或者RequestDispatcher的include或forward方法時,兩個JSP頁面,或JSP頁面和servlet將會共享該bean12.2.2在JSP程序中使用JavaBean(續(xù))
——建立JavaBeanJSP與JavaBean44Java語言程序設(shè)計-JSP程序設(shè)計Session有效范圍是客戶的會話期間表示要將bean實例存儲到與當前請求相關(guān)的HttpSession對象中如果這個客戶在多個頁面中相互鏈接,每個頁面都包含有一個useBean標簽,這些useBean標簽中id的值相同,并且scope的值都是session,那么該客戶在這些頁面得到的bean是相同的一個Application表示要將bean實例存儲在ServletContext中,ServletContext由Web應(yīng)用中多個servlet和JSP頁面共享所有客戶共享這個bean,如果一個客戶改變這個bean的某個屬性的值,那么所有客戶的這個bean的屬性值都發(fā)生了變化這個bean直到服務(wù)器關(guān)閉才被取消JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))
——建立JavaBean45Java語言程序設(shè)計-JSP程序設(shè)計<jsp:getPropertyname="beanName"
property="propertyName"/>表示讀取bean屬性的值bean的名稱由name項指定,與useBean標簽的id項對應(yīng)property項指定屬性名稱該語法只能讀取在JavaBean類文件中有g(shù)etXxx方法的屬性也可用JSP腳本元素<%=beaName.getXxx()%>得到相同的結(jié)果JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))
——取得Bean的屬性值46Java語言程序設(shè)計-JSP程序設(shè)計<jsp:setPropertyname="beanName"
property="propertyName"
value="propertyValue"/>表示設(shè)置bean的屬性值name項指定bean的名稱,與useBean標簽的id相對應(yīng)property項指定屬性名稱value項指定屬性的值該語法只能設(shè)置JavaBean類文件中有setXxx方法的屬性也可以用JSP腳本元素<%=beanName.setXxx("propertyValue")%>得到相同的結(jié)果JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))
——設(shè)置Bean的屬性值47Java語言程序設(shè)計-JSP程序設(shè)計建立JSP文件Ex12_3.jsp使用上節(jié)建立的EmployeeBean<%@pagecontentType="text/html;charset=gb2312"%><html><head><title>使用JavaBean</title></head><body><jsp:useBeanid="employee"class="myBeans.EmployeeBean"/>
<H2>初始值:</h2><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>編號是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工資是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>職務(wù)是:<jsp:getPropertyname="employee"property="occupation"/></p>
<H2>修改后:</h2><jsp:setPropertyname="employee"property="name"value="超杰"/><jsp:setPropertyname="employee"property="id"value="1"/><jsp:setPropertyname="employee"property="male"value="true"/><jsp:setPropertyname="employee"property="salary"value="6000"/><jsp:setPropertyname="employee"property="occupation"value="Manager"/><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>編號是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工資是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>職務(wù)是:<jsp:getPropertyname="employee"property="occupation"/></p></body></html>12.2.2在JSP程序中使用JavaBean(續(xù))
——例12_3JSP與JavaBean48Java語言程序設(shè)計-JSP程序設(shè)計
首先顯示初始值,修改后,顯示新值JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))
——例12_3運行結(jié)果49Java語言程序設(shè)計-JSP程序設(shè)計通過表單使用上節(jié)建立的EmployeeBean。<%@pagecontentType="text/html;charset=gb2312"%><%@pagecontentType="text/html;charset=gb2312"%><html><head><title>使用JavaBean</title></head><body><formname="form1"method="post"action=""><br>姓名:<inputtype="text"name="name"> <br>性別:<inputtype="radio"name="male"value="true">男
<inputtype=“radio”name=“male”value=“false”>女
<br>編號:<inputtype="text"name="id"><br>職務(wù):<inputtype="text"name="occupation"><br>工資:<inputtype="text"name="salary"><br><inputtype="submit"name="Submit"value="提交"></form>
<jsp:useBeanid="employee"class="myBeans.EmployeeBean"/><jsp:setPropertyname="employee"property="name"param="name"/><jsp:setPropertyname="employee"property="id"param="id"/><jsp:setPropertyname="employee"property="male"param="male"/><jsp:setPropertyname="employee"property="salary"param="salary"/><jsp:setPropertyname="employee"property="occupation"param="occupation"/><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>編號是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工資是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>職務(wù)是:<jsp:getPropertyname="employee"property="occupation"/></p></body></html>12.2.2在JSP程序中使用JavaBean(續(xù))
——例12_4JSP與JavaBean50Java語言程序設(shè)計-JSP程序設(shè)計12.2.2在JSP程序中使用JavaBean(續(xù))
——例12_4運行結(jié)果在表單中填入信息后,將顯示填入的信息JSP與JavaBean51Java語言程序設(shè)計-JSP程序設(shè)計12.3JSP標簽庫JSP標簽庫除了使用JavaBean,JSP還可以使用定制的標記,便于Web開發(fā)人員實現(xiàn)內(nèi)容和功能的分離相對于使用JavaBean,用戶自定義的標簽庫有如下優(yōu)點beans不可以操縱JSP的內(nèi)容,但標簽庫可以使用標簽比bean可以用更加簡單的形式完成復雜的功能,JSP通過指令標簽中的taglib指令使用標簽庫52Java語言程序設(shè)計-JSP程序設(shè)計12.3JSP標簽庫(續(xù))使用自定義標簽比使用bean要復雜一些,它需要3個部分實現(xiàn)標簽行為的標簽處理類將XML元素名稱映射到標簽實現(xiàn)上的標簽庫描述文件(后綴名為tld)使用標簽的JSP程序JSP標簽庫53Java語言程序設(shè)計-JSP程序設(shè)計12.3.1標簽處理類標簽處理類是一個Java類,用來告訴系統(tǒng)在JSP程序中遇到標簽后應(yīng)該做些什么必須實現(xiàn)javax.servlet.jsp.tagext.Tag接口通常通過擴展如下兩類來實現(xiàn)javax.servlet.jsp.tagext.TagSupportjavax.servlet.jsp.tagext.BodyTagSupportJSP標簽庫54Java語言程序設(shè)計-JSP程序設(shè)計12.3.1標簽處理類(續(xù))TagSupport類及其doStartTag方法如果在taglib指令標簽中沒有屬性或標簽體,即標簽的引用形式為<prefix:tagname/>,這樣的標簽類應(yīng)該擴展TagSupport類該類實現(xiàn)Tag接口并包含基本標簽所需的大量標準功能。只須重載改該類的doStartTag方法,這個方法中的代碼將在頁面請求時期遇到標簽頭時執(zhí)行為了產(chǎn)生輸出,doStartTag方法應(yīng)該調(diào)用pageContext類變量的getOut方法獲得JspWriter對象除此之外,調(diào)用pageContext的別的一些方法,還可以獲得和請求相關(guān)的別的數(shù)據(jù)結(jié)構(gòu):例如getRequest、getResponse、getServletContext、getSession如果標簽沒有體,doStartTag方法應(yīng)該返回SKIP_BODY常量,這將告訴系統(tǒng)忽略標簽起始和結(jié)束之間的內(nèi)容JSP標簽庫55Java語言程序設(shè)計-JSP程序設(shè)計實現(xiàn)一個標簽處理類,當JSP程序遇到相應(yīng)標簽,可插入一個100以內(nèi)的隨機整數(shù)和一行文本packagetags;importjavax.servlet.jsp.*;importjavax.servlet.jsp.tagext.*;importjava.io.*;publicclassExampleTagextendsTagSupport{ publicintdoStartTag(){ try{ JspWriterout=pageContext.getOut(); out.print((int)(Math.random()*100)); out.print("Myfirsttagtest!"); } catch(IOExceptionioe){ System.out.println("ErrorinExampleTag:"+ioe); } return(SKIP_BODY); }}12.3.1標簽處理類(續(xù))
——例12_5JSP標簽庫56Java語言程序設(shè)計-JSP程序設(shè)計12.3.2標簽庫描述文件標簽庫描述文件定義了標簽處理類后,接下來就是在服務(wù)器上為這個類命名,并將其和一個專門的XML標簽名關(guān)聯(lián)起來。通過標簽庫描述文件可以完成這個任務(wù)該文件包括一個XML版本聲明、一個DOCTYPE聲明、以及一個taglib容器元素重點是taglib容器元素中的tag元素,對于沒有屬性的標簽,tag元素又應(yīng)該包括以下四個子元素name:該元素定義了將在JSP文件中使用的tagname;tag-class:該元素給出了標簽處理類的完整類名,包括包名;body-content:對于沒有體的標簽應(yīng)該取值為EMPTY;description:一個簡短的說明JSP標簽庫57Java語言程序設(shè)計-JSP程序設(shè)計
建立一個標簽庫描述文件,將上例建立的標簽處理類和example名關(guān)聯(lián)。將其存儲在Chapter12\web\WEB-INF\tlds\example.tld<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns=""xmlns:xsi=""xsi:schemaLocation="web-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><short-name>example</short-name><uri>/WEB-INF/tlds/example</uri><tag><name>example</name><tag-class>tags.ExampleTag</tag-class><body-content>empty</body-content><description>Insert
arandominteger</description></tag></taglib>12.3.2標簽庫描述文件(續(xù))
——例12_6JSP標簽庫58Java語言程序設(shè)計-JSP程序設(shè)計12.3.3在JSP文件中使用標簽已經(jīng)有了標簽處理類和標簽庫描述文件,接下來就可以在JSP文件中使用自定義的標簽了在首次使用標簽之前,需要使用taglib指令標簽<%@tagliburi=“someuri”prefix=“somename”%>uri屬性是一個引用標簽庫描述符文件的絕對或相對URLprefix屬性指定一個將要在標簽庫描述符文件定義的標簽名前面使用的前綴接下來就可以使用<prefix:tagname/>引用標簽了JSP標簽庫59Java語言程序設(shè)計-JSP程序設(shè)計建立一個JSP文件,使用剛剛建立的標簽處理類和標簽庫描述文件<%@pagecontentType="text/html;charset=gb2312"%><html><head><%@tagliburi="/WEB-INF/tlds/example"prefix="testTag"%><title>使用標簽<testTag:example/></title></head><body><H1><testTag:example/></H1></body></html>12.3.3在JSP文件中使用標簽(續(xù))
——例12_7JSP標簽庫60Java語言程序設(shè)計-JSP程序設(shè)計每次按刷新后結(jié)果都是隨機的12.3.3在JSP文件中使用標簽(續(xù))
——例12_7運行結(jié)果JSP標簽庫61Java語言程序設(shè)計-JSP程序設(shè)計12.3.4自定義標簽庫有時我們需要在JSP文件中指定標簽的一些屬性例如我們希望能輸出1000以內(nèi),而不是100以內(nèi)的隨機整數(shù)這時的引用形式應(yīng)該是<prefix:tagnameattribute1="value1"attribute2="value2"┅/>相應(yīng)的需要修改標簽處理類和標簽庫描述文件JSP標簽庫62Java語言程序設(shè)計-JSP程序設(shè)計12.3.4自定義標簽庫(續(xù))
——修改標簽處理類NewExampleTag.java使用attribute1將導致調(diào)用標簽處理類的setAttribute1方法。所以為了在Ex12_7中能夠指定隨機整數(shù)的范圍,我們?yōu)閷傩匀∶麨閞ange,并修改標簽處理類ExampleTag.java為NewExampleTag.java如下publicclassNewExampleTagextendsTagSupport{protectedintrange=100;publicintdoStartTag(){try{JspWriterout=pageContext.getOut();out.print((int)(Math.random()*range));out.print("Tagtestwithattribute!");}catch(IOExceptionioe){System.out.println("ErrorinExampleTag:"+ioe);}return(SKIP_BODY);}publicvoidsetRange(Stringrange){try{this.range=Integer.parseInt(range);}catch(NumberFormatExceptionnfe){this.range=100;}}}JSP標簽庫63Java語言程序設(shè)計-JSP程序設(shè)計此外還需要修改標簽庫描述文件,在12.3.2節(jié)中介紹的tag元素中再增加attribute子元素,這個子元素又包括三個孫元素name::定義了屬性名稱,這個例子中,屬性名為rangerequired:指出是否必須提供該屬性,true是必須提供,false是可以不提供,這個例子中,range屬性是可選的,如果不選,則默認為100,所以我們將其設(shè)定為falsertexprvalue:是一個可選孫元素,表示屬性值是否可以是JSP表達式,以便在請求時期動態(tài)確定,默認狀態(tài)下是false,表示只能是一個靜態(tài)字符串12.3.4自定義標簽庫(續(xù))
——修改標簽庫描述文件NewExample.tldJSP標簽庫64Java語言程序設(shè)計-JSP程序設(shè)計將剛剛建立的標簽處理類和newexample名關(guān)聯(lián)。將其存儲在Chapter12\web\WEB-INF\tlds\NewExample.tld<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns=""xmlns:xsi=""xsi:schemaLocation="web-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><short-name>newexample</short-name><uri>/WEB-INF/tlds/NewExample</uri>
<tag>
<name>newexample</name>
<tag-class>tags.NewExampleTag</tag-class>
<body-content>empty</body-content>
<description>Insertarandomintegerwithinsomerange</description>
<attribute>
<name>range</name><required>false</required>
</attribute></tag></taglib>12.3.4自定義標簽庫(續(xù))
——修改標簽庫描述文件newexample.tldJSP標簽庫65Java語言程序設(shè)計-JSP程序設(shè)計最后,我們修改例12_7的Jsp文件如下:<%@pagecontentType="text/html;charset=gb2312"%><html><head><%@tagliburi="/WEB-INF/tlds/NewExample"prefix="testTag"%><title>使用標簽<testTag:newexample/></title></head><body><UL><Br>使用默認范圍:<testTag:newexample/><Br>1000以內(nèi):<testTag:newexamplerange="1000"/><Br>10000以內(nèi):<testTag:newexamplerange="10000"/></UL></body></html>12.3.4自定義標簽庫(續(xù))
——修改JSP文件Ex12_7_new.jspJSP標簽庫66Java語言程序設(shè)計-JSP程序設(shè)計將會出現(xiàn)三個不同范圍內(nèi)的隨機數(shù),每次刷新后結(jié)果都將不同12.3.4自定義標簽庫(續(xù))
——Ex12_7_new.jsp運行結(jié)果JSP標簽庫67Java語言程序設(shè)計-JSP程序設(shè)計12.3.4自定義標簽庫(續(xù))此外我們還可以在標簽中使用標簽體其形式為<prefix:tagname>body</prefix:tagname>,body里的內(nèi)容可以是JSP腳本元素、指令標簽、動作標簽這時需要修改標簽處理類doStartTag方法不能再返回SKIP_BODY,而應(yīng)該返回EVAL_BODY_INCLUDE如果需要在讀取body內(nèi)容后進行一些處理,還需要重載doEndTag方法如果在標簽內(nèi)容顯示完之后還想繼續(xù)處理后面的頁面內(nèi)容,doEndTag方法應(yīng)該返回EVAL_PAGES,否則應(yīng)該返回SKIP_PAGEJSP標簽庫還可以實現(xiàn)嵌套標簽。有興趣的讀者可以查找介紹JSP高級應(yīng)用的教材JSP標簽庫68Java語言程序設(shè)計-JSP程序設(shè)計12.4JSP與ServletJSP與ServletJSP不過是編寫Servlet的另一種不同的方式而已,JSP歸根到底也要轉(zhuǎn)化為Servlet二者各有所長Servlet擅長數(shù)據(jù)處理,如讀取并檢查數(shù)據(jù)、與數(shù)據(jù)庫通信JSP擅長表示,即構(gòu)建HTML來表示請求的結(jié)果通常一個大型的項目需要綜合使用JSP與Servlet69Java語言程序設(shè)計-JSP程序設(shè)計通常,我們可以將一個Web應(yīng)用程序的結(jié)構(gòu)分為三個部分顯示層(Presentationlayer):包括前端的HTML、XML和Applet,主要用作用戶的操作接口,負責讓用戶輸入數(shù)據(jù)以及顯示數(shù)據(jù)處理后的結(jié)果商業(yè)邏輯層(Businesslogiclayer):負責數(shù)據(jù)處理、連接數(shù)據(jù)庫、產(chǎn)生數(shù)據(jù)等控制層(Controllayer):控制整個網(wǎng)站的流程這三個部分分別對應(yīng)模型-視圖-控制器(ModelViewController,MVC)構(gòu)架的視圖、模型、控制器12.4.1Web應(yīng)用程序的一般結(jié)構(gòu)JSP與Servlet70Java語言程序設(shè)計-JSP程序設(shè)計SUN在JSP出現(xiàn)早期制定了兩種規(guī)范,稱為Model1和Model212.4.1Web應(yīng)用程序的一般結(jié)構(gòu)(續(xù))
——兩種規(guī)范71Java語言程序設(shè)計-JSP程序設(shè)計Model1設(shè)計模塊:開發(fā)快速,適合于小型系統(tǒng),其處理方式還可分為兩種完全使用JSP來開發(fā)用戶發(fā)出一個請求到服務(wù)器端,就是由JSP頁面來接收處理,接著將執(zhí)行結(jié)果響應(yīng)到客戶端由于JSP頁面包括了大量的Java語法,程序可讀性降低,不易維護,而且不利于重復利用使用JSP+JavaBean將可重用的組件抽出來寫成JavaBean,通過JSP調(diào)用JavaBean來存取數(shù)據(jù)和進行邏輯運算依然缺乏流程控制,每個JSP文件都要完成驗證參數(shù)正確性、確認用戶的身份權(quán)限、異常處理等任務(wù),因此對將來的維護造成了困難12.4.1Web應(yīng)用程序的一般結(jié)構(gòu)(續(xù))
——Model1設(shè)計模塊JSP與Servlet72Java語言程序設(shè)計-JSP程序設(shè)計Model2MVC架構(gòu)對于大型系統(tǒng)的開發(fā),大多采取Model2MVC架構(gòu)的開發(fā)模式MVC最主要的精神就是Model和View的分離,因而可以使網(wǎng)頁設(shè)計師和程序員獨立工作,互不影響Model代表的是應(yīng)用程序的商業(yè)邏輯(通過JavaBean、EJB等組件來實現(xiàn))View是系統(tǒng)的顯示接口(使用JSP來輸出HTML)Controller提供應(yīng)用程序的處理過程控制(通常是servlet)12
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 債務(wù)糾紛合同(2篇)
- 公共事業(yè)資產(chǎn)管理合同
- 2025年無機械動力飛機項目發(fā)展計劃
- 《職場溝通》電子教案 項目九 商務(wù)談判溝通教案
- 門店租賃協(xié)議模板
- 福州汽車租賃合同
- 廠房租賃合同書范文
- 公寓別墅租賃服務(wù)合同
- 八年級語文上冊第一單元5國行公祭為佑世界和平教案新人教版1
- 八年級道德與法治上冊第三單元勇?lián)鐣熑蔚谄哒n積極奉獻社會第2框服務(wù)社會教案新人教版
- HSE基礎(chǔ)知識培訓
- 安徽省蚌埠市2023-2024學年高一上學期期末考試 地理 含答案
- GB/T 5483-2024天然石膏
- 2024年度托管班二人合伙協(xié)議書3篇
- 山東中醫(yī)藥大學中西醫(yī)臨床(專升本)學士學位考試復習題
- 飼料加工混凝土施工合同
- 會議會務(wù)服務(wù)投標方案投標文件(技術(shù)方案)
- 機械結(jié)構(gòu)工程師年終總結(jié)
- 成都大學《Python數(shù)據(jù)分析》2023-2024學年期末試卷
- 2024年醫(yī)院消毒隔離制度范文(六篇)
- 2024年國家開放大學(電大)-行政管理(本科)考試近5年真題集錦(頻考類試題)帶答案
評論
0/150
提交評論