收藏 分销(赏)

JSP纸制教案(8).doc

上传人:精**** 文档编号:2712114 上传时间:2024-06-04 格式:DOC 页数:16 大小:153.54KB 下载积分:8 金币
下载 相关 举报
JSP纸制教案(8).doc_第1页
第1页 / 共16页
JSP纸制教案(8).doc_第2页
第2页 / 共16页


点击查看更多>>
资源描述
(word完整版)JSP纸制教案(8) 第八章 JSP使用Bean Bean是一种软件组件。在JSP页面中常用Bean来封装事务逻辑(功能实现部分)、数据库操作等,这样,可以实现前台展示、业务逻辑、数据库操作三者的分离,使程序变得清晰,使系统变得健壮和灵活。本章介绍Bean的编写和使用方法。 8。1 什么是bean? bean本身是遵循一定规范的java类,是一个可以重复使用的组件.在实际应用中,我们常编写一个组件来实现某种通用的功能。下面是bean类遵循的规范和bean组件的外部特征: 1.bean作为类必须遵循的规范 ⑴. bean必须是public类 ⑵. bean必须有一个公有的无参构造方法 ⑶. bean必须实现接口Serializable或Externalizable。以确保组件的持续性。 2.bean作为组件的外部特征 ⑴.独立性 ⑵.可重用性 ⑶.能在可视化环境中使用 ⑷.状态可以保存 8。1 编写bean n bean分为可视组件和非可视组件.在JSP中,主要使用非可视组件。对于非可视组件,我们不必关心它的外观,只关心它的属性和方法。为了让JSP引擎知道bean 的属性和方法,bean的方法命名必须遵守以下规则: 1。假设bean类的成员变量名是xxx,则访问该变量的两个方法命名为: Ø get() ,用此方法获取xxx的值 Ø setXxx(),用此方法设置xxx的值 2.若成员变量xxx是布尔类型,则,只有一个访问方法,其命名是isXxx(). 8.2。1编写圆bean [例子8。1]编写一个圆bean,计算圆的面积和周长。 问题分析: 这里部署圆bean的三个步骤: 1.给bean起一个包名"small.dog"。由于Tomcat5.0服务器要求bean字节码必须放在一个包中。我们在编写Circle.java时,使用package语句给bean起的包名是"small。dog”。 2.创建包"small.dog"。在某目录下创建子目录"small\dog",把编译后的字节码文件Circle.class复制到”small\dog”目录下,这就完成了”small。dog”包的创建。 3.把包"small。dog"复制到存放bean的公有目录中。Tomcat5。0服务器存放bean字节码的公有目录是"\Tomcat 5。0\common\classes",我们将"small\dog"目录复制到”\Tomcat 5.0\common\classes"目录下,就完成了包"small.dog”包的复制。 程序结构: 由Circle。java类实现bean功能;useBean.jsp页面调用圆bean。 程序算法: Circle.java: 1。声明三个变量,表示圆的半径/面积/周长:2。radius/circleArea/circleLength 3。定义三个方法,分别获取圆的半径/面积/周长的值 useBean。jsp: 1。导入包"small。dog" 2.以类"small。dog.Circle"创建一个对象,对象名是:girl 3.设置对象girl的半径为100 4。输出对象girl的半径,周长,面积的值。 8。2.2编写三角形bean [例子8。2]编写一个三角形bean,该bean能判断三条边能否构成一个三角形,还能计算三角形的面积。 问题分析: 这里部署三角形bean的步骤: 1.给bean起一个包名"small。dog”。编写Triangle。java时,使用package语句给bean起的包名是"small.dog”。 2.把编译后的字节码文件Triangle.class复制到存放bean的公有目录”\Tomcat 5.0\common\classes\ small\dog ”目录下.这也意味着,Triangle。class字节码保存在 “small.dog”包中。 程序结构:   由Triangle。java类实现bean功能;Triangle。jsp页面调用bean. 程序算法: Triangle.java: 1.声明5个变量,保存bean的5种属性:sideA,sideB,sideC, area, triangle。 2.定义方法getArea(),计算三角形面积。 3.定义方法boolean isTriangle(),判断给出的三条边能否构成一个三角形。 Triangle。jsp: 1.导入包"small。dog” 2.创建一个表单,该表单包含三个文本框(接受客户输入三条边的长度) 3.以类"small.dog。Triangle"创建一个对象,对象名是triangle。 4.给对象triangle的属性(sideA,sideB,sideC)赋值。 5. 将对象triangle的属性值输出。 8。3 Jsp使用bean 在JSP页面中,要正确使用bean,必须遵守以下三个步骤:第一,正确存放bean字节码;第二,在JSP页面中导入要使用的bean类;第三,在JSP页面中使用动作标签useBean创建一个bean.完成以上三个步骤后,才能使用该bean。 1.将bean字节码存放在正确的目录中 u bean字节码文件有两种部署方法,一种是将bean字节码文件部署在web服务器的公有目录中;一种是将bean字节码文件部署在web服务器的私有目录中。选择哪一中部署方式,根据实际情况而定。 (1)将bean字节码文件存放在公有目录中 存放在公有目录中的bean字节码文件,任何WEB 服务目录下的JSP页面都能访问此bean。本书中安装的Tomcat5.0服务器的公有目录是:E:\Tomcat 5.0\common\classes.将前面的圆bean字节码文件就是存放在公有目录中。 将圆bean字节码文件存放在公有目录的方法:定义圆bean类时,规定了该bean类所属的包是small.dog.这样,在E:\Tomcat 5.0\common\classes目录下,创建一个子目录:small\dog ,将圆类(Circle.class)字节码文件存放在E:\Tomcat 5.0\common\classes\small\dog目录下。 (2)将bean字节码文件存放在私有目录中   存放在私有目录中的bean字节码文件,只有该私有目录下的JSP页面能访问此bean,其它目录下的JSP页面就不能访问此bean。例如,将前面的圆bean字节码文件存放在私有目录”e:\test\8"下的方法如下:   在e:\test\8目录下创建子目录WEB-INF\classes,由于圆bean所属的包名是small。dog,因此,在”e:\test\8\WEB-INF\classes”目录下创建一个子目录"small\dog", 最后,将 圆bean(Circle.class)字节码文件保存在”e:\test\8\WEB-INF\classes\small\dog”目录下。在该目录下的bean,只有"e:\test\8"目录下的JSP页面才能访问。 2.在JSP页面中使用import属性导入bean 如果要在JSP页面中访问某个bean,则必须在JSP页面中导入相应的bean类.如,访问圆bean,则在JSP页面中使用下面的语句导入圆bean字节码: <%@ page import=”small.dog。Circle” %〉 3。在JSP页面中使用动作标签useBean获得一个bean对象   使用动作标签useBean创建一个bean, 供JSP页面访问。以圆bean为例,创建一个变量名为boy, 有效范围是session的bean。语句格式如下: 〈jsp:useBean id=”boy” class=”small.dog.Circle” scope=”session”> </jsp:useBean> 下面解释useBean标签的语法格式、执行原理和bean的作用域 (1) UseBean标签的语法格式: 〈jsp:useBean id=”给bean起一个变量名” class=”创建bean的类名” scope=”bean的有效范围” > 〈/jsp:useBean〉 或 <jsp:useBean id="给bean起一个变量名" class=”创建bean的类名” scope="bean的有效范围" /> (2) useBean标签的执行原理 当JSP页面的useBean标签执行时,在一个同步块中,JSP引擎首先根据id的名字值和scope值,在 pageContent对象中查找是否含有变量名是id值,作用域是scope值的对象。如果存在这样一个对象,JSP引擎就分配这样一个对象给客户,如果没有找到名字是id值,作用域是scope值的对象,就根据class属性值(类名),创建一个名字是id值,作用域是scope值的bean,并把该bean添加到pageContent内置对象中, 同时,JSP引擎将此对象分配给客户。 下面是useBean语句执行流程,如图8—1(略) ⑶.useBean标签中bean的作用域 JSP引擎给不同的客户分配不同的bean,也许多个客户拥有相同功能的bean,但是每个客户的bean是独立的,在内存占有不同的空间。用useBean标签创建的bean的作用域由scope属性的取值决定的。scope有四种取值,它们是request/ page/session/application 。 下面就useBean标签中scope的不同取值阐述如下: u scope取值为request 对于同一客户,每次不同的请求,JSP引擎分配给客户的bean也不同。JSP引擎对请求作出响应之后,取消分配给客户的这个bean。bean的生命周期在客户请求开始到对请求作出响应这段时间。 u scope取值为page: 对于同一客户,访问不同页面,JSP引擎分配给客户的bean也不同.客户进入页面时JSP引擎给客户分配一个bean,客户离开该页面时,JSP引擎取消分配给客户的bean.bean的生命周期是客户进入页面到客户离开这个页面这段时间. u scope取值为session: 对于同一客户,访问不同web目录下的页面,JSP引擎分配给客户的bean也不同。客户访问某个web目录时JSP引擎给客户分配一个bean,客户离开该web目录时JSP引擎取消分配给客户的bean.bean的生命周期是客户访问web目录到客户离开这个web目录这段时间。 u scope取值为application: JSP引擎为每个客户分配同一个bean,就是说,所有客户共享同一个bean。bean的生命周期是从bean分配给客户到服务器关闭这段时间. 8.3.1读文件bean [例子8。3]通过客户选择目录和文件,列出目录下的文件名和输出文件内容。 问题分析:   创建一个读文件的bean,该bean可以列出指定目录下的所有文件名,也可以读出指定文件的内容。 程序结构:   本程序由三个页面和一个bean组成.filepathselect。jsp页面提供客户选择目录的界面,把客户选择的目录提交给listfilename。jsp页面;listfilename.jsp页面列出该目录下的所有文件名;readfile.jsp页面读出文件的内容;ReadFile.java是一个bean,该bean的功能是列出指定目录下的文件名和读出文件的内容。三个页面和bean的交互关系如图8-2所示。 listfilename.jsp页面 readfile.jsp 页面 filepathselect.jsp 页面 提交文件 提交目录 ReadFile.java 组件 重新选文件 重新选目录 Param(目录,文件名) Return(文件内容) Param(目录) Return(文件名列表) 程序算法: filepathselect。jsp: 创建一个表单,该表单包含一个列表框,客户在该列表框选择目录。 listfilename。jsp: 1.导入”small。dog”包 2.以ReadFile类创建一个bean,bean的名字是file 3.给bean的成员变量(filePath)赋值(客户提交的目录),其值是filepathselect。jsp页面中,下拉框的值(filePath) 4.输出bean的成员变量filePath的值(目录) 5.输出bean的成员变量listFile的值(列出目录下所有的文件名) 6.创建一个表单,该表单包含一个文本框,用于客户输入文件名,提交该表单时,重定向到readfile。jsp页面。 7.创建一个表单,该表单实现页面重定向功能,当提交该表单时,页面重定向到页面filepathselect.jsp. readfile.jsp: 1.导入类文件”small.dog。ReadFile” 2.以ReadFile类创建一个bean,bean的名字是file 3.给bean成员变量(fileName)赋值,其值是listfilename.jsp页面中,表单中的文本框(fileName)的值。 4.输出bean的成员变量值(文件名:filename,文件内容: readContent) ReadFile.java的说明: 1.定义了4个成员变量保存文件状态。filePath保存文件路径、 fileName保存文件名、listFile保存文件名列表、readContent保存文件内容。 2.public String getListFile() :返回指定目录下的文件名. 3.public String getReadContent():返回指定文件名的文件内容。 8。3.2 写文件bean [例子8.4] 客户在列表框中选择一个目录,在文本框中给文件起一个名字,在编辑窗口编辑文件的内容,最后按提交按钮保存文件的内容。(说明:要加入到实际存在的目录) 问题分析:   创建一个写文件的bean,该bean把客户编辑的内容写入文件中. 程序结构:   本程序由两个页面和一个bean组成.writeContent。jsp页面提供一个界面,客户在此界面可以输入文件目录/文件名/文件内容,然后将数据提交给writeFile.jsp页面,writeFile.jsp页面获得被提交的数据后,调用写bean,将数据写入文件,同时,将文件目录/文件名/文件内容输出到客户端.两个页面和bean的交互关系如图8—3所示。 writeContent.jsp页面 writeFile.jsp 页面 保存文件 WriteFile.java 组件 程序算法: writeContent.jsp: 创建一个表单,该表单包含一个列表框(选择目录),一个文本框(输入文件名),一个文本区(编辑文件内容). writeFile.jsp: 1.导入包"small。dog" 2.用类"small。dog.WriteFile"创建一个bean,该bean的名字是file 3.给bean的成员变量(filePath/ filename/ fileContent)赋值,其值分别来自交表单中的目录(filePath_d),文件名(fileName_d),文件内容(fileContent_d)。 4.输出目录/文件名/文件内容到客户端。 WriteFile.java 的说明: 1.定义3个成员变量保存文件状态。filePath保存文件路径、 fileName保存文件名、fileContent保存文件内容. 2.方法setFileContent(String s):将内容s保存到目录是filePath,文件名是fileName的文件中. 3.方法String getFileContent():对文件内容fileContent进行流处理。如果文件是HTML文件或JSP文件,则经过流处理后,才能正确输出文件的内容。 8.3。3 查询数据库bean [例子8。5]在下拉框中选择一张表,输出该表的数据。 问题分析: 创建一个获取表数据的bean,该bean根据表名获取表中的数据,并以字符串的格式返回表中的数据.在JSP页面中,调用bean读取表中的数据,并输出到客户端。 程序结构:   本程序由一个页面文件inquire.jsp和一个读数据表的bean组成.inquire。jsp页面提交表名,然后调用读取表数据的bean,读取表中的数据,最后以表格的形式,把数据输出到客户端.页面与bean的交互关系如图8—4所示。 inquire.jsp 页面 提交 DataBaseInquire.java 组件 Param(表名) Return(查询结果) 程序算法: inquire。jsp: 1.导入类”small。dog.DataBaseInquire",用于创建一个bean 2.创建一个表单,该表单包含一个下拉列表框,客户在下拉框中选择一个表 3.当表单提交时,用类”small.dog。DataBaseInquire"创建一个bean,其名字是database. 4.给bean的成员变量tableName赋值,其值是表单提交的列表框的值(tableName_d). 5.输出bean的属性值:表名(tableName)及表中的记录数据(result) DataBaseInquire.java的说明: 1.定义2个成员变量保存表的状态。TableName保存表的名字;result保存表的记录数据. 2.方法String getResult()以字符串的方式,返回表中的数据。 8.3。4 添加记录bean [例子8。6]让客户选择一张表,向表中添加记录(假设表中的每个字段类型是字符串型) 问题分析:   创建一个添加记录bean,该bean向表中添加记录。在JSP页面中调用bean向表中添加记录. 程序结构: AddItem。jsp页面包含一个下拉框和一个文本框。客户在下拉框中选择一张表名,提交后,调用bean读取表头;客户在文本框中输入一条记录,提交记录后,调用bean,把该记录加入表中。页面与bean的交互关系如图8-5所示。 AddItem.jsp 页面 提交表名 提交记录 AddItem.java 组件 Param(表名) Return(表头字段) Param(一条记录) Return( ) 说明:提交表名时,调用bean读取表的字段名;提交记录时,调用bean将录入的记录添加到表中。 程序算法:  AddItem。jsp: 1.导入类”small.dog.AddItem",用于创建一个bean。 2.创建一个包含下拉框的表单,客户可以在下拉框中选择一张表名。 3.以类"small。dog。AddItem"创建一个bean,该bean的名字是database。 4.给bean的成员变量赋值,其值是下拉框的值(tableName_d)。(表名提交后才执行此语句) 5.调用bean,输出表名和表字段。 6.创建一个包含文本框的表单,客户可以在此文本框中输入一条记录,当提交表记录后执行下面的语句。 7.给bean的成员变量item赋值,其值是表单中的文本值(item) 8.输出bean的成员变量result的值。 AddItem。java的说明: 1.定义5个成员变量。tableName保存表的名字,item保存要添加的记录,columsName保存表头字段的表格形式,vector保存表中的所有字段,result标识记录是否成功加入表中。 2.方法String getColumsName()以表格的形式返回表头字段. 3.方法setItem(String item)将记录item加入表中。 8。3.5标准考试bean [例子8。7]在线考试的实现。试卷文件格式和内容规定如下: 1.文件的第一行,保存本试卷每道试题的答案 2.每份试卷包含多道试题 3.每道试题提供4个选择答案(A,B,C,D) 4.试题之间用一行“ ***************"字符串 分隔(至少包含两个**) 5.整个试卷用"endend"作为结束标志。 问题分析:   创建一个操作试卷的bean。该bean能实现读取试题(每次读取一道试题),评分功能。 程序结构: test.jsp页面提供一个下拉框,客户在此框中选择考试试卷类型(A,B,C,D)。选择试卷后,程序调用bean读取试卷的第一道试题,客户选择和提交答案后,程序调用bean对照答案,批改此道试题;接着程序继续调用bean读取试卷的第二道试题…。页面交互关系如图8—6所示。 test.jsp 页面 选择试卷 Test.java 组件 提交答案 Param(试卷) Value:试题1 Param(客户答案) Return(考试者的得分, 下一试题) 程序算法: test。jsp: 1.导入类”small.dog。Test”,用于创建bean。 2.用类“small。dog.Test”创建一个bean,该bean的 名字是test。 3.创建一个表单,该表单包含一个下拉框,客户在该框中选择一份试卷. 4.用下拉框(filename_d)的值赋给bean的成员变量(filename)。 5.输出bean的属性值:试卷名(filename)和一道试题(testContent)。 6.创建一个表单,包含4个单选按钮,分别表示一道试题的4个选择答案. 7.客户做完本道试题后,提交表单,程序将单选框(selection_d)的值赋给bean的成员变量(selection)。 8.输出bean的成员变量(score:考试的分数)的值。 Test。java的说明: 1.定义9个成员变量,保存试题相关的状态。Filename保存试卷文件名;correctAnswer保存正确答案;testContent保存读取的一道试题;selection保存客户选择的答案;score统计考试得分;pifend保存批分标识(若试题已批改,其值为true,否则值为false);f保存试卷文件对象;in保存试卷的字符输入流;buffer保存试卷的缓冲输入流。 2.setFilename(String name)初始化5个相关的属性值。 3.String getTestContent() 获取一道试题的内容。 4.setSelection(String s) 将客户选择的每道试题答案依次尾加到selection后面。 5.int getScore()计算考试分数 。 6.String getString(String content) 对字符串进行回压处理。 8。4 访问bean属性 访问Bean属性值的方法有两种:第一种方式,通过Bean的方法访问Bean的属性值,第二种方式,使用JSP动作标签访问Bean属性的值。下面是JSP动作标签访问Bean属性值的语法格式。 1.读取Bean属性的值 该标签的作用是获得bean属性值,并将这个值以字符串方式在客户端显示。使用该标签之前,必须使用useBean标签创建一个bean.下面是getProperty标签的语法格式: 〈jsp:getProperty name=”bean的名字" property=”bean的属性名” /> 其中,name取值是bean的名字,用来指定要获取哪个bean的变量名,它的值必须是useBean标签中id属性的值,property取值是bean的属性名(bean类定义时的成员变量) 2。设置Bean属性的值 该标签的作用是设置bean属性值.使用该标签之前,必须使用useBean标签创建一个bean。下面是setProperty标签的语法格式: 〈jsp:setProperty name=”bean的名字” property=”属性名字” value=属性值/〉 其中,name取值是bean的名字(相当于引用该bean的变量名),用来指定被使用的bean,它的值必须是useBean标签中id属性的值,property取值是bean的属性名 ,将value的取值赋给bean类的属性(即,将value的值赋给bean类的成员变量). 使用setProperty动作标签, 有三种方式给bean属性赋值: (1)使用字符串或表达式直接给bean属性(变量)赋值 这种赋值方式要求表达式的值类型与bean属性(变量)的值类型相同,其语句格式如下: <jsp:setProperty name="bean的名字” property=”bean的属性" value=”<%expression%>” /> (2)使用表单参数给bean属性赋值   这种赋值方式要求表单中提供参数的数据组件名字与bean的成员变量名字相同,其语句格式如下: <jsp:setProperty name="bean的名字” property="*" /> 该标签不用具体指定每个bean属性名字,系统会自动根据表单中数据组件名字与bean的成员变量名字一一对应赋值.注意,这种方式,在标签中没有使用属性"value”。 (3)使用表单的参数值给bean属性赋值     这种赋值方式要求表单中提供参数的数据组件名字与setProperty标签中的param属性值名字相同,其语法格式如下: <jsp:setProperty name="bean的名字” property="属性名字" param=”参数名字“/ 〉     注意:这里的”bean的名字” 是指使用该bean的变量名,”属性名字” 指bean类中的成员变量名,param的值是指赋给成员变量的值 。 8。4。1读取bean属性 [例子8.8]创建一个圆bean(使用例子8.1]中的圆bean), 通过JSP动作标签访问Bean属性的值。 程序结构:   beanGetproperty.jsp页面调用圆bean,获取圆bean的属性值,并输出其值。页面关系如图8-7所示。 程序算法: beanGetproperty。jsp: 1.导入类”small.dog。Circle”。 2.用类”small.dog.Circle"创建一个bean,其名字是boy 3.给圆的半径赋值100 4.调用bean,输出圆的成员变量值(radius/ circleArea/ circleLength) 8.4.2设置bean属性 [例子8。9] 创建一个学生bean,包括学号/姓名/身高/体重。在客户端录入学生信息提交该信息后显示学生信息.本例通过三种方式设置bean的属性值。 问题分析:   创建学生bean,该bean保存学生学号/姓名/身高/体重.能实现学号/姓名/身高/体重的存取。这里创建两种学生bean。student1.jsp页面用类Student1.java创建一个学生bean; student2。jsp页面和student3.jsp页面用类Student2。java各自创建一个学生bean. 程序结构:   这里只说明student1。jsp页面与bean的关系:   student1.jsp页面第一次调用bean ,使用表达式给bean的属性赋值;第二次调用bean,获取bean的属性值(bean的成员变量),页面调用关系如图8—8所示。 程序代码 Ø student1。jsp:第一种赋值方式:直接用表达式给bean的属性赋值。 Ø student2.jsp:第二种赋值方式:通过表单参数给bean属性赋值,不用param属性。这种赋值方式,JSP引擎会自动将字符串类型的表单数据转换为bean属性的数据类型。 Ø student3.jsp:第三种赋值方式:通过表单参数给bean属性赋值,使用param属性。 Student1。java说明: 1.定义4个成员变量保存学生bean的状态。number保存学生学号;name保存学生姓名;height保存学生身高;weight保存学生体重。 2.定义8个方法,分别访问bean的4个成员变量。 Student2。java说明: 除了必须对字符串类型的成员变量(name)进行编码外,其余与Student1。java相同。 8.5 bean的作用域 n 在JSP页面中使用〈jsp:useBean>标记调用bean ,标记中有一个scope属性,该属性值确定了bean作用范围。scope有四种取值,分别是request、page、session和application。 n 下面通过一个例子说明bean的四种作用范围和生命周期。 n [例子8。10] 本例以四个程序说明bean的四种生命周期。观察scope取不同值时,bean的内部名字的变化。 1.request周期 (每提交一次可见boy内部名称变化) 例子:requestBean.jsp 2.page周期 (转向第2页或刷新可见boy内部名称变化) 例子: pageBean1.jsp 3.session周期 (转向第2页boy内部名称不变化,打开两个浏览器可见boy内部名称变化) 例子: sessionBean1。jsp 4.application周期 (转向第2页boy内部名称或打开两个浏览器可见boy内部名称都不变化) 例子: applicationBean。jsp  从以上四个例子可以看出,在同一page内,page bean的内部名字相同; 在同一request内,request bean的内部名字相同;在同一session内,session bean的内部名字相同;对于application bean, 所有客户共用一个application bean。 本章小结 本章主要讲解了bean的编写方法、bean的调用方法、bean的作用域、bean的生命周期和bean的部署方法。同时也介绍了bean的使用方法,以及如何使用bean对程序进行模块化。 心得体会 (1)需要注意,编译Bean文件时,有包(package)的需要用命令“javac –d 。 文件名”来编译,并把编译生成的文件夹复制到Bean的公有目录“\Tomcat5。0\common\classes"下. (2)JSP页如用到Bean时,需要在页面调用Bean语句前输入<%@ page import=“包名。*”%〉导入Bean文件。 (3)创建Bean时需要注意Bean的作用域属性“scope”,request针对每次请求;page针对每个页面;session针对每个session对象;application针对每个application对象。 (4)Bean就是一个有特定要求的类,多数用于对数据的处理.可以通过getxxx()获取数据,setxxx()设置数据,isxxx()获取布尔型数据。(xxx为自定义名称) (5)在设置〈jsp:getProperty />和<jsp:setProperty /〉的属性property时要注意,开头字母一定要小写。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服