版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Servlet應(yīng)用開發(fā)Web應(yīng)用開發(fā)技術(shù)(JavaEE)學(xué)習(xí)目標(biāo)學(xué)習(xí)目標(biāo)要求學(xué)生掌握Servlet的語法;熟練掌握Servlet運(yùn)行環(huán)境的配置方法;基本具備用Servlet設(shè)計(jì)開發(fā)Web應(yīng)用程序的能力,解決Servlet在項(xiàng)目運(yùn)行中的常見問題;掌握Servlet訪問數(shù)據(jù)庫的技術(shù);掌握使用和配置過濾器Filter的方法;掌握使用和配置監(jiān)聽器Listener的方法。本章提綱Servlet概述第一個Servlet實(shí)例Servlet工作原理使用Eclipse開發(fā)Servlet在Servlet中讀取參數(shù)使用和配置過濾器Filter使用和配置監(jiān)聽器ListenerServlet概述
Servlet=Service+Applet,表示小服務(wù)程序,是使用Java語言編寫的服務(wù)器端程序。它主要運(yùn)行在服務(wù)器端,并由服務(wù)器調(diào)用執(zhí)行,是一種按照Servlet標(biāo)準(zhǔn)開發(fā)的類。Servlet是在JSP之前就存在的運(yùn)行在服務(wù)器端的一種Java技術(shù),它被廣泛地應(yīng)用于開發(fā)動態(tài)的Web應(yīng)用程序。第一個Servlet實(shí)例//完成該Servlet功能需要導(dǎo)入的Java類import
java.io.IOException;
import
java.io.PrintWriter;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
public
class
HelloWorldServlet
extends
HttpServlet
{
//實(shí)現(xiàn)doGet方法
protected
void
doGet(HttpServletRequest
request,
HttpServletResponse
response)
throws
ServletException,
IOException
{
//讓輸出頁面支持中文顯示
response.setContentType("text/html;charset=UTF-8");
//獲得輸出對象out
PrintWriter
out
=
response.getWriter();
//向請求端輸出Hello
World
out.print("Hello
World
!");
}
}
Servlet工作原理Servlet的調(diào)用過程Servlet工作原理Servlet的生命周期Servlet生命周期分為三個階段:初始化Servlet。Servlet第一次被請求加載時(shí),服務(wù)器初始化這個Servlet,即創(chuàng)建一個Servlet對象,該對象調(diào)用init()方法進(jìn)行初始化操作。創(chuàng)建的Servlet對象調(diào)用service()方法來響應(yīng)客戶請求.當(dāng)服務(wù)器關(guān)閉時(shí),Servlet對象調(diào)用destroy()方法,銷毀Servlet對象。Servlet工作原理生命周期的3個方法為:Servlet工作原理init()方法服務(wù)器構(gòu)造Servlet實(shí)例后調(diào)用執(zhí)行Servlet初始化–
創(chuàng)建或加載Servlet在處理請求時(shí)使用的對象可以覆蓋init()方法,添加其他初始化內(nèi)容Servlet工作原理
service()方法service()方法一般不去覆蓋它;service()方法用于分析用戶的請求,根據(jù)用戶的請求類型;調(diào)用不同的處理方法;如:doPost(),doGet()等通常重寫的是doPost()或doGet方法Servlet工作原理
destroy()方法卸載Servlet時(shí),調(diào)用destroy()方法服務(wù)器在完成所有服務(wù)調(diào)用之后,或者在經(jīng)過服務(wù)器特定的秒數(shù)之后調(diào)用destroy()方法容器關(guān)閉的時(shí)候調(diào)用destory方法使用Eclipse開發(fā)Servlet在Eclipse中配置Tomcat在Eclipse菜單欄中依次單擊“Window->Preferences”,打開“Preferences”對話框,單擊“Server”下的“RuntimeEnvironment”,單擊右方的“Add”按鈕,如下圖所示。使用Eclipse開發(fā)Servlet打開“NewServerRuntimeEnvironment”對話框,選擇已成功安裝的“ApacheTomcatv7.0”版本,如下圖所示。使用Eclipse開發(fā)Servlet單擊“Next”,在打開的對話框中,單擊“Browse”按鈕,選擇Tomcat的安裝目錄,如下圖所示。單擊“Finish”按鈕,單擊“OK”即完成配置。使用Eclipse開發(fā)Servlet創(chuàng)建工程在Eclipse菜單欄中依次單擊“File->New->DynamicWebProject”,打開創(chuàng)建Web動態(tài)工程對話框。接下來對工程參數(shù)進(jìn)行配置,包括工程名稱設(shè)置(Projectname)、選擇工程放置位置(Projectlocation)、工程運(yùn)行環(huán)境(Targetruntime和Configuration)等。如下圖所示,將工程名設(shè)置為testServlet,工程的存放路徑使用默認(rèn)的位置,默認(rèn)位置是在Eclipse的workspace中創(chuàng)建一個與工程名相同的文件夾用來存放工程代碼,工程的運(yùn)行環(huán)境設(shè)置為ApacheTomcatv7.0,Dynamicwebmoduleversion設(shè)置為3.0版本。使用Eclipse開發(fā)Servlet完成工程參數(shù)配置后,單擊“Next”按鈕,設(shè)置工程源代碼放置的文件夾,常采用Eclipse提供的默認(rèn)值,繼續(xù)單擊“Next”按鈕,設(shè)置工程的Web文件結(jié)構(gòu),通常將產(chǎn)生web.xml的選項(xiàng)勾選上,讓Eclipse在創(chuàng)建工程時(shí)自動生成web.xml配置文件,其他采用默認(rèn)方式,該步操作過程如下圖所示。使用Eclipse開發(fā)Servlet最后單擊“Finish”按鈕,Eclipse將創(chuàng)建工程,我們可以在ProjectExplorer視圖中看到創(chuàng)建好的工程的文件及其組織結(jié)構(gòu)。如下圖所示,JavaResources目錄下存放的是Java源代碼(src文件夾中)以及在編譯Java源碼時(shí)需要用到的類庫的引用說明(Libraries目錄下),WebContent文件夾中存放的是Web工程的所有配置文件、頁面文件及資源文件。使用Eclipse開發(fā)Servlet創(chuàng)建Servlet類在Web應(yīng)用中,一般開發(fā)者定義的Servlet類都擴(kuò)展HttpServlet。HttpServlet中最常用的是doGet和doPost方法,它們都有一個HttpServletRequest類型和HttpServletRespons類型的參數(shù),前者封裝客戶端提交的請求,后者封裝處理結(jié)果,并返回給客戶端進(jìn)行響應(yīng)。doGet方法用于處理GET類型的請求,這類請求一般在使用Web瀏覽器通過HTML、JSP直接訪問Servlet的URL時(shí)出現(xiàn)。doPost方法用于處理POST類型的請求,這類請求通常發(fā)生在提交表單的情況。使用Eclipse開發(fā)Servlet從HttpServlet派生的Servlet類需要在doGet或doPost方法中加入對客戶端請求的響應(yīng)處理邏輯,并將處理結(jié)果封裝到response中返回給客戶端進(jìn)行顯示。通常是在src目錄中創(chuàng)建實(shí)現(xiàn)Servlet類的Java文件。使用Eclipse開發(fā)Servlet一個簡單的Servlet類的示例packagetestServlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassFirstSimpleServletextendsHttpServlet{ publicFirstSimpleServlet(){ super(); } //處理HTTPGET類型的請求 protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ //設(shè)置輸出頁面支持中文顯示 resp.setContentType("text/html;charset=UTF-8");
使用Eclipse開發(fā)Servlet一個簡單的Servlet類的示例(續(xù))
//獲得輸出對象 PrintWriterout=resp.getWriter(); //向請求端輸出信息 out.println("Thisisasimpleservlet"+"<br>"); //顯示請求是以GET方式還是POST方式提交的 out.println(req.getMethod()); } //處理HTTPPOST類型的請求 protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ //當(dāng)收到HTTPPOST類型的請求時(shí),直接調(diào)用doGet方法進(jìn)行相同的處理 super.doPost(req,resp); }}使用Eclipse開發(fā)Servlet配置Servlet類定義了Servlet類之后,還需要對其進(jìn)行配置,使得Servlet容器發(fā)現(xiàn)并找到Servlet類,從而使其發(fā)揮作用。通常使用xml文件配置Servlet類,其配置方法是在WebContent中WEB-INF文件夾下的web.xml文件的<web-app></web-app>元素之間添加相應(yīng)的內(nèi)容。以配置上節(jié)中的FirstSimpleServlet類為例,其對應(yīng)的配置文件代碼如下。<web-app> <display-name>testServlet</display-name> <!--說明Servlet類--> <servlet> <!--Servlet類的別名--> <servlet-name>FirstSimpleServlet</servlet-name> <!--Servlet類的全名,包括所屬的包名--> <servlet-class>testServlet.FirstSimpleServlet</servlet-class> </servlet> <!--說明Servlet類與訪問地址的映射--> <servlet-mapping><!--Servlet類的別名,該別名與<servlet>元素中定義的Servlet類的別名一致--> <servlet-name>FirstSimpleServlet</servlet-name> <!--訪問Servlet類的地址--> <url-pattern>/myurl</url-pattern> </servlet-mapping></web-app>使用Eclipse開發(fā)Servlet發(fā)布Servlet在Eclipse開發(fā)界面的工程視圖中,右鍵單擊Servlet類所在的工程名,選擇“RunAs->RunonServer”,如下圖所示。使用Eclipse開發(fā)Servlet或者直接在Servers視圖上,單擊如下圖所示鏈接。使用Eclipse開發(fā)Servlet在彈出的RunonServer對話框中選擇已配置的ApacheTomcatv7.0服務(wù)器,然后單擊“Next”按鈕,將Servlet類所在的工程添加到右側(cè)的列表框中,最后單擊“Finish”按鈕。使用Eclipse開發(fā)Servlet經(jīng)過上邊兩個步驟Servlet工程和Servlet類就會被發(fā)布到選定的服務(wù)器上,等待用戶的訪問。發(fā)布完成之后,能夠在ProjectExplorer、Servers和console視圖上看到發(fā)布成功的信息,如下圖所示。使用Eclipse開發(fā)Servlet調(diào)用Servlet類
在瀏覽器地址欄中輸入地址,即可調(diào)用Servlet類。在Servlet中讀取參數(shù)設(shè)置參數(shù)設(shè)置全局參數(shù)設(shè)置局部參數(shù)在Servlet中讀取參數(shù)設(shè)置全局參數(shù)即application范圍內(nèi)的參數(shù),該參數(shù)所有Servlet都可以訪問,存放在ServletContext中,在web.xml中配置如下:<context-param>
<param-name>參數(shù)名<param-name>
<param-value>參數(shù)值<param-value></context-param>注意:上述代碼的位置必須在web.xml文件的最上面。在Servlet中讀取參數(shù)設(shè)置局部參數(shù)即Servlet范圍內(nèi)的參數(shù),該參數(shù)僅在該Servlet中有效,且只能在Servlet的init()方法中取得,在web.xml中配置如下:
<servlet>
<servlet-name>Servlet名稱</servlet-name>
<servlet-value>Servlet類路徑</servlet-class>
<init-param>
<param-name>參數(shù)名<param-name>
<param-value>參數(shù)值<param-value>
</init-param></servlet>
在Servlet中讀取參數(shù)獲取參數(shù)獲取全局參數(shù)獲取局部參數(shù)獲取全局參數(shù):ServletContextcontext=this.getServletContext();context.getInitParameter("參數(shù)名");獲取局部參數(shù):this.getInitParameter("參數(shù)名");注意:此處的this指Servlet本身。下面是一個在servlet中獲取兩種參數(shù)的例子。importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;publicclassMainServletextendsHttpServlet{publicMainServlet(){super();}publicvoidinit()throwsServletException{System.out.println(this.getInitParameter("參數(shù)名"));//獲取局部參數(shù)System.out.println(getServletContext().getInitParameter("參數(shù)名"));//獲取全局參數(shù)}}使用和配置過濾器Filter
Filter簡介
Servlet過濾器(Filter)是在JavaServlet規(guī)范2.3中定義的,它能夠?qū)ervlet容器的請求和響應(yīng)對象進(jìn)行檢查和修改,主要對Servlet、JSP和HTML文件進(jìn)行過濾。Filter不是一個servlet,它本身并不生成請求和響應(yīng)對象,它只提供過濾作用。Filter主要用于對HttpServletRequest進(jìn)行預(yù)處理,也可以對HttpServletResponse進(jìn)行后處理。使用和配置過濾器Filter過濾器的作用在HttpServletRequest到達(dá)Servlet之前,攔截客戶的HttpServletRequest。
根據(jù)需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數(shù)據(jù)。
在HttpServletResponse到達(dá)客戶端之前,攔截HttpServletResponse。
根據(jù)需要檢查HttpServletResponse,可以修改HttpServletResponse頭和數(shù)據(jù)。使用和配置過濾器FilterServlet過濾器的過濾過程使用和配置過濾器Filter過濾器的使用和配置實(shí)現(xiàn)Servlet過濾器的功能,必須實(shí)現(xiàn)javax.servlet.Filter接口,該接口包含3個過濾器類必須實(shí)現(xiàn)的方法:init(FilterConfigcfg)doFilter(ServletRequestreq,ServletResponseres,FilterChainchain)destory()使用和配置過濾器Filterinit(FilterConfigcfg)方法這是Servlet過濾器的初始化方法,在Filter生命周期中僅執(zhí)行一次,即web容器在調(diào)用init方法時(shí)執(zhí)行。doFilter(ServletRequestreq,ServletResponseres,FilterChainchain)方法該方法完成實(shí)際的過濾操作,當(dāng)請求訪問過濾器關(guān)聯(lián)的URL時(shí),Servlet容器將先調(diào)用過濾器的doFilter方法。其中filterChain參數(shù)用于訪問后續(xù)過濾器。
使用和配置過濾器Filterdestory()方法Servlet容器在銷毀過濾器實(shí)例前調(diào)用該方法,該方法可釋放Servlet過濾器占用的資源,其在Filter的生命周期中僅執(zhí)行一次。使用和配置過濾器FilterServlet過濾器的創(chuàng)建步驟:實(shí)現(xiàn)javax.servlet.Filter接口的Servlet類。實(shí)現(xiàn)init方法,讀取過濾器的初始化函數(shù)。實(shí)現(xiàn)doFilter方法,完成對請求或過濾的響應(yīng)。調(diào)用FilterChain接口對象的doFilter方法,向后續(xù)的過濾器傳遞請求或響應(yīng)。實(shí)現(xiàn)一個過濾器后,需要在web.xml中對過濾器進(jìn)行配置,即在web.xml文件中使用<filter>和<filter-mapping>元素對編寫的filter類進(jìn)行注冊,并設(shè)置它所能攔截的資源。使用和配置過濾器Filter過濾器使用與配置的一個完整的例子編碼過濾器:public
class
EncodingFilter
implements
Filter
{
private
String
encoding;
private
Map<String,
String>
params
=
new
HashMap<String,
String>();
//
實(shí)現(xiàn)Filter
接口的destroy方法,項(xiàng)目結(jié)束時(shí)就已經(jīng)進(jìn)行銷毀
public
void
destroy()
{
System.out.println("end
do
the
encoding
filter!");
params=null;
encoding=null;
}
//實(shí)現(xiàn)Filter
接口的doFilter方法
public
void
doFilter(ServletRequest
req,
ServletResponse
resp,
FilterChain
chain)
throws
IOException,
ServletException
{
System.out.println("before
encoding
"
+
encoding
+
"
filter!");
req.setCharacterEncoding(encoding);
chain.doFilter(req,
resp);
System.out.println("after
encoding
"
+
encoding
+
"
filter!");
System.err.println("----------------------------------------");
}
//
實(shí)現(xiàn)Filter
接口的init方法,項(xiàng)目啟動時(shí)就已經(jīng)進(jìn)行讀取
public
void
init(FilterConfig
config)
throws
ServletException
{
System.out.println("begin
do
the
encoding
filter!");
encoding
=
config.getInitParameter("encoding");
for
(Enumeration
e
=
config.getInitParameterNames();
e
.hasMoreElements();)
{
String
name
=
(String)
e.nextElement();
String
value
=
config.getInitParameter(name);
params.put(name,
value);
}
}}
使用和配置過濾器Filter
編碼過濾器配置:<filter>
<filter-name>setCharacterEncoding</filter-name>
<filter-class>pany.strutstudy.web.servletstudy.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
使用和配置監(jiān)聽器Listener監(jiān)聽器簡介
監(jiān)聽器就是一個實(shí)現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖兦闆r,當(dāng)被監(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個方法將立即被執(zhí)行。使用和配置監(jiān)聽器Listener監(jiān)聽機(jī)制
Java的事件監(jiān)聽機(jī)制涉及到三個組件:事件源、事件監(jiān)聽器、事件對象;當(dāng)事件源上發(fā)生操作時(shí),它將會調(diào)用事件監(jiān)聽器的一個方法,并在調(diào)用這個方法時(shí),會傳遞事件對象過來;事件監(jiān)聽器由開發(fā)人員編寫,開發(fā)人員在事件監(jiān)聽器中,通過事件對象可以拿到事件源,從而對事件源上的操作進(jìn)行處理。使用和配置監(jiān)聽器Listener三個域?qū)ο笤赟ervlet規(guī)范中定義了多種類型的監(jiān)聽器,它們用于監(jiān)聽的事件源分別為
ServletContext,
HttpSession
和
ServletRequest
這三個域?qū)ο蟆?/p>
使用和配置監(jiān)聽器Listener監(jiān)聽器的三種類型監(jiān)聽三個域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器;監(jiān)聽域?qū)ο笾袑傩缘脑黾雍蛣h除的事件監(jiān)聽器;監(jiān)聽綁定到HttpSession域中的某個對象的狀態(tài)的時(shí)間監(jiān)聽器。
使用和配置監(jiān)聽器Listener對應(yīng)以上3個事件源的監(jiān)聽器接口分別是ServletContextAttributeListener,HttpSessionAttributeListener和ServletRequestAttributeListener,這三個接口中都定義了三個方法來處理被監(jiān)聽對象中的屬性的增加、刪除和替換的事件,同一個事件在這三個接口中對應(yīng)的方法名稱完全相同,只是接受的參數(shù)類型不同。使用和配置監(jiān)聽器Listener
ServletContext事件的監(jiān)聽類必須實(shí)現(xiàn)的接口和當(dāng)事件發(fā)生時(shí)調(diào)用的方法。事件類型接口方法Servletcontext被創(chuàng)建javax.servlet.ServletContextListenercontextInitialized()Servletcontext被注銷javax.servlet.ServletContextListenercontextDestroyed()增加屬性javax.servlet.ServletContextAttributeListenerattributeAdded()刪除屬性javax.servlet.ServletContextAttributeListenerattributeRemoved()屬性被替換javax.servlet.ServletContextAttributeListenerattributeReplaced()使用和配置監(jiān)聽器Listener
HttpSession事件的監(jiān)聽類必須實(shí)現(xiàn)的接口和當(dāng)事件發(fā)生時(shí)調(diào)用的方法。事件類型接口方法session激活javax.servlet.http.HttpSessionListenersessionCreated()session刪除javax.servlet.http.HttpSessionListenersessionDestroyed()增加屬性javax.servlet.http.HttpSessionAttributeListenerattributeAdded()刪除屬性javax.servlet.http.HttpSessionAttributeListenerattributeRemoved()屬性被替換javax.servlet.http.HttpSessionAttributeListenerattributeReplaced()使用和配置監(jiān)聽器Listener
ServletRequest事件的監(jiān)聽類必須實(shí)現(xiàn)的接口和當(dāng)事件發(fā)生時(shí)調(diào)用的方法。事件類型接口方法Request初始化javax.servlet.ServletRequestListenerrequestInitialized()Request銷毀javax.servlet.ServletRequestListenerrequestDestroyed()增加屬性javax.servlet.ServletRequestAttributeListenerattributeAdded()刪除屬性javax.servlet.ServletRequestAttributeListenerattributeRemoved()屬性被替換javax.servlet.ServletRequestAttributeListenerattributeReplaced()使用和配置監(jiān)聽器Listener使用和配置監(jiān)聽器定義監(jiān)聽器類的步驟如下:創(chuàng)建新的類并實(shí)現(xiàn)事件對應(yīng)的接口;定義不接受參數(shù)、訪問屬性為public的構(gòu)造函數(shù);實(shí)現(xiàn)接口的方法;編譯并拷貝到對應(yīng)Web應(yīng)用的WEB-INF/classes目錄下,或者打包成jar文件拷貝到WEB-INF/lib目錄下。使用和配置監(jiān)聽器Listen
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 乙胺嘧啶中毒的臨床護(hù)理
- 《數(shù)據(jù)分析與統(tǒng)計(jì)軟》課件
- 孕期暈倒的健康宣教
- 《光學(xué)測量技術(shù)》課件-第6章
- 疤痕體質(zhì)的臨床護(hù)理
- 孕期碘缺乏病的健康宣教
- 2024年河南省中職對口升學(xué)高考語文試題真題(解析版)
- 乳牙早失的健康宣教
- 前庭大腺囊腫的健康宣教
- 《信用監(jiān)管》課件
- 三基醫(yī)師分冊題庫新版題庫《中醫(yī)臨床“三基”訓(xùn)練試題集醫(yī)師分冊》
- 2022年08月內(nèi)蒙古自治區(qū)文物考古研究院自主公開招聘5人筆試題庫含答案解析
- 地質(zhì)大勘查地球化學(xué)課件05水化學(xué)找礦、氣體勘查及生物勘查
- 杭州灣跨海大橋鋼樁腐蝕防護(hù)
- 軟件版本說明
- 大學(xué)人工智能期末考試題
- 《基于PLC的五層電梯控制系統(tǒng)設(shè)計(jì)(論文)》10000字
- 2023-2024學(xué)年湖南省漣源市初中語文七年級上冊期末評估試卷
- 2023-2024學(xué)年山東省青島市小學(xué)語文二年級上冊期末通關(guān)試題
- 納米酶研究進(jìn)展
- 應(yīng)用統(tǒng)計(jì)學(xué)實(shí)驗(yàn)指導(dǎo)書
評論
0/150
提交評論