版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章Servlet編程本課教學(xué)內(nèi)容Servlet的工作原理Servlet生命周期Servlet的API如何接收請求并返回響應(yīng)MVC模式的原理與應(yīng)用回顧Servlet概念
應(yīng)用在服務(wù)器端接收客戶端請求并作出響應(yīng)的JAVA類Servlet作用
Servlet技術(shù)主要完成大量邏輯處理,可以處理瀏覽器請求,也可處理一個(gè)客戶端的應(yīng)用程序請求,可以訪問數(shù)據(jù)庫,進(jìn)行計(jì)算處理,將結(jié)果返回客戶端Servlet創(chuàng)建
Servlet類繼承自HttpServlet,覆蓋doGet、doPost方法之一或全部Servlet的配置與部署
需要配置<servlet>和<servlet-mapping>兩個(gè)節(jié)點(diǎn),其中子節(jié)點(diǎn)包括<servlet-class>、<servlet-name>、<url-pattern>Servlet的測試
需在地址欄輸入http://IP/Port/WebContextName/servletURL來請求該ServletServlet生命周期Servlet運(yùn)行在Servlet容器中,其生命周期由容器來管理。Servlet的生命周期通過javax.servlet.Servlet接口中的init()、service()和destroy()方法來表示。Servlet的生命周期包含了下面4個(gè)階段:Servlet生命周期1、實(shí)例化Servlet容器創(chuàng)建Servlet的實(shí)例2、初始化該容器調(diào)用init()方法3、服務(wù)如果請求Servlet,則容器調(diào)用service()方法銷毀實(shí)例之前調(diào)用destroy()方法4、銷毀完成初始化工作,如建立數(shù)據(jù)庫連接、獲取配置信息,每個(gè)實(shí)例只初始化一次獲取請求參數(shù),并根據(jù)請求方式GET或POST調(diào)用doGet()或doPost()方法當(dāng)WEB容器被關(guān)閉時(shí)會調(diào)用destroy()方法銷毀Servlet實(shí)例,以釋放它所使用資源Servlet生命周期Servlet的生命周期由Servlet容器(如:Tomcat)控制servlet容器處理請求過程:HTTP請求容器請求響應(yīng)12Servlet實(shí)例Servlet執(zhí)行service(請求,響應(yīng))34doGet(請求,響應(yīng))5響應(yīng)6通過URL找到生命周期相關(guān)方法public
classHelloServletextendsHttpServlet{
public
voidinit()throwsServletException{ System.out.println("初始化時(shí)第一次調(diào)用!");}
public
voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ PrintWriterout=response.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>HelloServlet</TITLE></HEAD>"); out.println("<BODY>"); out.println("你好"+newDate()); out.println("</BODY></HTML>"); }
public
voiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ doGet(request,response);}
public
voiddestroy(){System.out.println(“釋放資源!"); }}初始化方法doGet()方法doPost()方法銷毀方法Servlet與JSP分工首先考慮以下問題,既然Serlvet比JSP代碼復(fù)雜,什么情況下寫成Servlet?以下情況適合寫成Servlet處理請求,調(diào)用DAO某些純編程的場合相反如果是一些與顯示相關(guān)的內(nèi)容,可以考慮寫成JSP。Servlet與JSP分工思考:以下哪些工作適合寫成JSP?哪些適合寫成Servlet?顯示登錄表單。接受登錄表單中的賬號、密碼并調(diào)用DAO進(jìn)行驗(yàn)證。模糊查詢學(xué)生界面獲取查詢關(guān)鍵字,調(diào)用DAO查詢。顯示查詢的結(jié)果結(jié)論:1、3、5為顯示界面適合寫成JSP,2、4為處理請求適合寫成Servlet!Servlet內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)servlet可以跳轉(zhuǎn)到另一個(gè)servlet或Jsp頁,并且可以數(shù)據(jù)傳遞過去。跳轉(zhuǎn)方式為兩種:(1)重定向,這種方式屬于客戶端跳轉(zhuǎn),不能傳遞請求request,意味著跳轉(zhuǎn)后頁面取不到上一頁面請求對象,容器重新創(chuàng)建新的request請求對象。也就是說,用戶提交的表單參數(shù)在重定向之后的頁面中將無法取到。如果用這種方式跳轉(zhuǎn),要在請求跳轉(zhuǎn)和跳轉(zhuǎn)目標(biāo)頁共享數(shù)據(jù),需使用session對象。重定向后瀏覽器地址欄能看到地址發(fā)生變化,顯示為跳轉(zhuǎn)后地址。 serlvet內(nèi)重定向語句與JSP相同,如下:
response.sendRedirect(“url”);Servlet內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)關(guān)于重定向中URL路徑的說明:url通常使用相對路徑,如果以”/”開頭是相對于WEB服務(wù)器的根路徑(http://localhost:8080)。如重定向response.sendRedirect(“/stuSystem/index.jsp”);
表示請求的文件完整路徑為
http://localhost:8080/stuSystem/index.jsp如果不以”/”開頭的相對路徑則相對于WEB應(yīng)用程序根目錄(http://localhost:8080/stuSystem/),如:response.sendRedirect(“index.jsp”);
則重定向的到達(dá)頁面完整路徑為http://localhost:8080/stuSystem/index.jspServlet內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)(2)服務(wù)器內(nèi)跳轉(zhuǎn),可以傳遞請求對象request,請求跳轉(zhuǎn)和跳轉(zhuǎn)目標(biāo)頁可以共享請求數(shù)據(jù)。跳轉(zhuǎn)后瀏覽器地址欄能看不到地址發(fā)生變化,仍顯示為跳轉(zhuǎn)前地址。作用等價(jià)于JSP中的<jsp:forward>標(biāo)簽。Servlet內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)Servlet中服務(wù)器內(nèi)部跳轉(zhuǎn)的實(shí)現(xiàn):ServletContexapplication
=this.getServletContex();
RequestDispatcherrd
=application.getRequestDispatcher(“url”);
rd.forward(request,response);注:這里的url必須以”/”開頭的路徑,是相對于當(dāng)前WEB應(yīng)用程序根路徑(http://localhost:8080/stuSystem)一個(gè)簡單用戶登錄的例子publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringuname=request.getParameter("username");Stringupass=request.getParameter(“password");Useruser=null;user.setUname(uname);user.setUpass(upass);UserDAOuserDAO=newUserDAO();user=userDAO.getUserByUname(uname);if(user!=null){HttpSessionsession=request.getSession();session.setAttribute("user",user);response.sendRedirect("index.jsp");}else{ response.sendRedirect("error.jsp");
}}request.setAttribute("user",user);ServletContexapplication=this.getServletContex();RequestDispatcherrd=application.getRequestDispatcher(“/index.jsp”);rd.forward(request,response);或者將查詢到的JavaBean對象user存入request,并將request轉(zhuǎn)發(fā)給下一JSP頁面,這樣user只在下一個(gè)頁面中可見,使用forward方法跳轉(zhuǎn)獲取用戶輸入?yún)?shù)創(chuàng)建JavaBean數(shù)據(jù)庫操作將查詢到的JavaBean對象user存入session,以使得后面多個(gè)JSP頁面可獲取到user對象,使用sendRedict方法跳轉(zhuǎn)MVC模式MVC是三個(gè)單詞的縮寫,分別是模型(Model),視圖(view)和控制器(Controller)。Model層實(shí)現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通常可以用javabean或EJB實(shí)現(xiàn)。View層用于與用戶的交互,通常用JSP來實(shí)現(xiàn)。Controller層是Model與View之間溝通的橋梁,通??梢杂蓅ervlet來實(shí)現(xiàn),它可以分派用戶的請求,并選擇恰當(dāng)?shù)囊晥D以用于顯示,同時(shí)它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。MVC模式的優(yōu)勢各施其責(zé),互不干涉在MVC模式中,三個(gè)層各司其責(zé),所以如果一旦哪一層的需求發(fā)生了變化,就只需要修改相應(yīng)層中的代碼而不會影響到其他層中的代碼。有利于開發(fā)中的分工在MVC模式中,由于按層把系統(tǒng)分開,那么就能更好的實(shí)現(xiàn)開發(fā)中的分工。網(wǎng)頁設(shè)計(jì)人員可以開發(fā)視圖層,而其他開發(fā)人員可以開發(fā)控制層、模型層。有利于組件的重用分層后更有利于組件的重用。如控制層可獨(dú)立成一個(gè)能用的組件,視圖層也可以做成通用的操作界面。MVC模式架構(gòu)Web服務(wù)器瀏覽器HtmlJSP(視圖)JavaBeans(模型)數(shù)據(jù)庫請求響應(yīng)Servlet(控制器)選擇視圖實(shí)例化請求圖MVC模式架構(gòu)示意圖“用戶登錄”模塊的MVC模式MVC結(jié)構(gòu)設(shè)計(jì)Model層:由Manager.java、Teacher.java、Student.java、ManagerDao.java、TeacherDao.java、StudentDao.java作為Model層,其中Manager、Teacher、Student用來封裝管理員、教師、學(xué)生對象信息(編號、名稱、密碼等),XXXDao用來實(shí)現(xiàn)連接數(shù)據(jù)庫,實(shí)現(xiàn)對相應(yīng)表的增加、查詢、修改、刪除等操作。
View層:用來顯示登陸界面、登陸成功后用戶角色的入口界面的JSP頁面,如登陸界面index.jsp、管理員入口studentManage/stuAdminEntry.jsp、學(xué)生入口studentEntry/stuEntry.jsp、教師入口teaherEntry/teaEntryjsp。Controller層:控制層由Servlet來擔(dān)任,本模塊中l(wèi)oginServlet.java來擔(dān)任登陸驗(yàn)證的控制層,它負(fù)責(zé)獲取用戶登陸信息,根據(jù)用戶登陸身份選擇調(diào)用相應(yīng)DAO,連接數(shù)據(jù)庫查詢該用戶是否存在,若存在則將該用戶對象放入session并跳轉(zhuǎn)到相應(yīng)入口界面,若用戶對象不存在則跳轉(zhuǎn)回登陸界面lndex.jsp,給出“登陸失敗”的提示信息,要求用戶重新登陸?!坝脩舻卿洝蹦K調(diào)用流程servlet.LoginServletindex.jsp數(shù)據(jù)庫t_student表
t_teacher表t_manager表manEntry.jspdao.LoginDao判斷用戶角色vo.Managervo.Teachervo.StudentteaEntry.jspstuEntry.jspController控制層Model模型層JavaBeanView視圖層實(shí)現(xiàn)程序:LoginServlet.java
登錄處理控制器的創(chuàng)建
在src目錄下選擇【new】菜單創(chuàng)建【Servlet】,創(chuàng)建LoginServlet.java
類,package包為servlet,繼承自javax.http.servlet.HttpServlet父類,創(chuàng)建過程如圖:
Servlet的創(chuàng)建Servlet創(chuàng)建,指定Package包和Name類名Servlet配置創(chuàng)建,指定ServletName及訪問Servlet的映射URL實(shí)現(xiàn)程序:LoginServlet.java作為登錄請求處理控制器,需重寫其中的doGet()和doPost()方法。
登錄處理控制器的作用用來接收登錄表單數(shù)據(jù),并調(diào)用dao.LoginDao操作訪問數(shù)據(jù)庫,LoginDao會根據(jù)用戶角色不同查詢t_manager管理員表、t_teacher教師表或t_student學(xué)生表。查詢到該用戶則表明登錄成功,并將用戶名保存至session。這里模擬管理員登錄過程,管理員輸入用戶名和密碼合法后將跳轉(zhuǎn)到studentManage/stuAdmin.jsp頁面。LoginServlet.java關(guān)鍵源碼(一)LoginServlet.java關(guān)鍵源碼(二)doPost()方法與doGet()方法的處理相同,doPost()中調(diào)用doGet()實(shí)現(xiàn)程序:index.jsp登錄頁面將用戶登錄表單請求提交給LoginServlet控制器處理,LoginServlet控制器的訪問URL為/login,將index.jsp的form的action屬性做修改如下,請求LoginServlet的URL: <formaction=“/stuSystem/login”name=“l(fā)oginform”method=“post”>
或<formaction=“l(fā)ogin”name=“l(fā)oginform”method=“post”>請求的servlet的URL相對路徑表示有/stuSystem/login和login兩種寫法,前者相對web服務(wù)器根目錄(http://localhost:8080),后者相對web應(yīng)用程序根目錄(http://localhost:8080/stuSystem/)程序說明:
LoginServlet配置文件web.xml在webRoot/WEB-INF目錄下,web.xml對Servlet的名字,對應(yīng)的類以及訪問該類的URL進(jìn)行了部署,具體內(nèi)容為:<?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.5"
xmlns="http:///xml/ns/javaee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="http:///xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"><servlet><servlet-name>LoginServlet</servlet-name><servlet-class>servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>
<welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>程序說明:通過登錄控制器處理,管理員登錄成功后會跳轉(zhuǎn)到管理員主界面studentManage/stuAdmin.jsp,并在studentManage/stuAdmin.jsp的左框架的studentManage/left.jsp頁面獲取登錄者姓名并顯示歡迎。studentManage/Left.jsp做如下修改:
<%Stringusername=(String)session.getAttribute("uname");%><%if(null!=username&&!"".equals(username)){%><p><%=username%>,歡迎你!<ahref="../logout.jsp">退出</a></p><divid="menu"><ul>學(xué)生信息管理
<li><ahref="lookStudent.jsp"
target="main">學(xué)生信息查詢</a></li><li><ahref="addStudent.jsp"
target="main">學(xué)生信息添加</a></li><li><ahref="deleteStudent.jsp"
target="main">學(xué)生信息刪除</a></li><li><ahref="updateStudent.jsp"
target="main">學(xué)生信息修改</a></li></ul> ……</div><%}else{%><scripttype="text/javascript">alert("請先登錄!");window.parent.location.href="../index.jsp";</script><%}%>MVC模式應(yīng)用舉例二設(shè)計(jì)使用MVC開發(fā)模式實(shí)現(xiàn)電子商城中“新品上市”模塊功能功能說明用戶單擊首頁上“新品上市”超鏈接,可以在右下方div框架中顯示出所有的新品的名稱、價(jià)格、介紹、圖片等信息。顯示效果如圖:如用戶已登陸,則可以顯示出“購買”按鈕,否則只顯示“查看”按鈕,顯示效果如下圖:MVC結(jié)構(gòu)設(shè)計(jì)Model層:由Goods.java和GoodsDao.java兩個(gè)類作為Model層,其中Goods用來封裝商品信息(商品編號、商品名稱、商品價(jià)格等,與數(shù)據(jù)庫商品表字段一致),GoodsDao用來連接數(shù)據(jù)庫,并實(shí)現(xiàn)對新品、特價(jià)商品的增加、查詢、修改、刪除相應(yīng)操作方法。
說明:在數(shù)據(jù)庫中新品是指newgoods=1的所有商品,
特價(jià)商品是sale=1的所有商品。View層:JSP技術(shù)作為View表現(xiàn)層,采用Html標(biāo)簽與java代碼混合的形式。該模塊包括用來顯示新品和特價(jià)商品的JSP頁面,如顯示新品的newGoods.jsp,顯示特價(jià)商品的saleGoods.jspController層:控制層由Servlet來完成,作為模型層與試圖層的中間層來實(shí)現(xiàn)請求處理與顯示的控制任務(wù)。本模塊中NewGoodsServlet.java來擔(dān)任新品上市的控制層,它負(fù)責(zé)調(diào)用GoodsDao的getNewGoods()方法查詢得到所有新品的集合,并將新品集合放入request中轉(zhuǎn)發(fā)給newGoods.jsp,在newGoods.jsp中顯示出所有新品的信息?!靶缕飞鲜小蹦K的調(diào)用流程servlet.NewGoodsServlettop.jspdao.GoodsDaovo.Goods數(shù)據(jù)庫newGoods.jspModel模型層JavaBeanController控制層View視圖層NewGoodsServlet.java新品上市控制器packageservlet;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.ArrayList;importjavax.servlet.RequestDispatcher;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importdao.GoodsDao;importvo.Goods;publicclassNewGoodsServletextendsHttpServlet{@Override//重寫doGet方法publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ doPost(request,response);//調(diào)用doPost() }@Override//重寫doPost方法publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
//實(shí)例化商品集合對象al ArrayList<Goods>al=newArrayList<Goods>(); GoodsDaogdao=newGoodsDao();//實(shí)例化數(shù)據(jù)訪問對象gdaotry{ al=gdao.getNewGoods();//getNewGoods方法獲取新品集合}catch(Exceptione){ e.printStackTrace();}//將新品集合存入request對象request.setAttribute("newGoods",al);//獲取Servlet上下文環(huán)境對象ServletContextsc=this.getServletContext();//跳轉(zhuǎn)到newGoods.jsp頁面,并將請求轉(zhuǎn)發(fā)到該頁面RequestDispatcherrd=sc.getRequestDispatcher("/newGoods.jsp");rd.forward(request,response);}}【top.jsp】請求NewGoodsServlet控制器 <td><ahref=“/shop/NewgoodsServlet”target=“main_frame”>新品上 市</a></td>【newGoods.jsp】顯示新品上市
<%Goodsg=newGoods(); ArrayList<Goods>al=(ArrayList)request.getAttribute("newGoods");for(inti=0;i<al.size();i++){ g=al.get(i); intid=g.getId(); Stringpicture=g.getPicture(); Stringgoodsname=g.getGoodsname(); Doubleprice=g.getPrice(); Stringintroduce=g.getIntroduce();%>【web.xml】servlet配置
<servlet> <servlet-name>NewgoodsServlet</servlet-name> <servlet-class>servlet.NewgoodsServlet</servlet-class></servlet><servlet-mapping> <servlet-name>NewgoodsServlet</servlet-name> <url-pattern>/NewgoodsServlet</url-pattern></servlet-mapping>MVC模式應(yīng)用舉例三使用MVC開發(fā)模式設(shè)計(jì)實(shí)現(xiàn)電子商城中“購物車”模塊功能需求分析用戶單擊首頁上“購物車”超鏈接,可以對購物車中的商品信息進(jìn)行查看。此操作只對登陸用戶有效,所以在查看前需對session檢查判斷用戶是否登陸,若未登陸則給出提示要求用戶“需要先登陸再購物”。用戶登陸后查看購物車,若購物車為空則跳轉(zhuǎn)至購物車為空頁面,并在該頁面提供“購買商品”超鏈接,用戶單擊后跳轉(zhuǎn)至首頁繼續(xù)購物,該頁面顯示效果如下:若購物車不為空則顯示出購物車中的每一項(xiàng)商品信息(包括編號、商品編號、商品名稱、商品價(jià)格、商品數(shù)量、單價(jià)、合計(jì)總金額)用戶可以選中購物車中某商品,從購物車中刪除可以清空購物車,跳轉(zhuǎn)至購物車為空界面MVC結(jié)構(gòu)設(shè)計(jì)Model層:vo.CartItem:封裝購物車中的一項(xiàng)商品信息(商品編號id,商品名稱goodsname、商品價(jià)格price、商品數(shù)量goodsnumber)vo.Goods:封裝商品的全部信息dao.GoodsDao:增加getGoodById(intid)方法,根據(jù)id查出該商品全部信息。View層:cart_null.jsp:購物車為空界面cart_see.jsp:查看購物車界面cart_move.jsp:刪除購物項(xiàng)并跳轉(zhuǎn)回cart_see.jspcart_clear.jsp:清空購物車并跳轉(zhuǎn)回cart_see.jspController層servlet.CartAddServlet:1)獲取用戶購買商品的id,調(diào)用GoodsDao查詢到該商品全部信息,并將其中部分信息保存至CartItem中。2)判斷購物車中是否已有該商品,如果已有則更新該購物項(xiàng)的商品數(shù)量,沒有則將該商品加入購物車。3)將購物車放入session并將請求轉(zhuǎn)發(fā)到cart_see.jsp“購物車”模塊調(diào)用流程CartAddServletGoods.jspdao.GoodsDaovo.Goods數(shù)據(jù)庫cart_see.jspModel模型層JavaBeanController控制層View視圖層cart_move.jspGoods.java封裝商品對象CartItem.java封裝購物項(xiàng)對象GoodsDao.java(一)GoodsDao.java(二)web.xmlCartAddServlet.java購物車添加控制器packageservlet;publicclassCartAddServletextendsHttpServlet{
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出版公司薪酬分配方案
- 室內(nèi)木門定制合同范本
- 城市邊緣加油站建設(shè)項(xiàng)目合同
- 2024年個(gè)人隱私保護(hù)協(xié)議書
- 醫(yī)療衛(wèi)生班組退場承諾書
- 工廠消防水池施工合同
- 城市照明電梯租賃合同模板
- 2024墻體廣告投放權(quán)買賣合同
- 數(shù)字經(jīng)濟(jì)二手房買賣協(xié)議書
- 家具店入口地彈門安裝協(xié)議
- 水利工程監(jiān)理工作程序
- 索道施工方案分享版
- 2022年三會一課座談交流會發(fā)言稿.doc
- 國家開放大學(xué)《計(jì)算機(jī)繪圖(本)》章節(jié)測試參考答案
- 虧損項(xiàng)目整改措施
- 第2講循環(huán)流化床鍋爐的構(gòu)造及工作原理ppt課件
- DB45∕T 2364-2021 公路路基監(jiān)測技術(shù)規(guī)范
- 英語培優(yōu)扶差記錄表(共7頁)
- 排球比賽記分表
- 網(wǎng)站服務(wù)合同域名續(xù)費(fèi)與維護(hù)
- 實(shí)驗(yàn)幼兒園陪餐記錄表
評論
0/150
提交評論