欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第8章Struts和MVC设计模式.ppt

    • 资源ID:2906420       资源大小:1.72MB        全文页数:79页
    • 资源格式: PPT        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第8章Struts和MVC设计模式.ppt

    第8章 Struts和MVC设计模式,第8章 Struts和MVC设计模式,8.1 MVC框架简介8.2 用Struts2实现MVC设计模式8.3 Struts的Web应用开发实例 8.4 小结 8.5 习题,8.1 MVC框架简介,在Web应用开发中,MVC框架应用非常广泛,特别是在大型的、比较复杂的项目中。8.1.1 MVC框架是什么 8.1.2为什么要用MVC 8.1.3 MVC的实现,8.1.1 MVC框架是什么,基于Java的动态Web开发有两种常用的开发模型:Model1和Model2。Model1在Model 1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应。用少量的JavaBean来处理数据库连接、数据库访问等操作。,Model 1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看,它的局限性非常明显:JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。,Model2,Model2实现了业务逻辑、显示逻辑和控制逻辑的分离,即是基于MVC的框架。MVC框架即模型视图控制器(ModelViewController)设计模式。其中,M代表Model,V代表View,C代表ControllerMVC的目的是增加代码的可重用性,减少数据描述和应用操作的可耦合度,并提高代码的可读性。同时,也可以使软件的可维护性、可扩展性、可修复性、灵活性以及封装性大大提高。,在Model 2模式下,模型(Model)由JavaBean 充当,视图(View)由JSP页面充当,而控制器(Controller)则由Servlet充当。,MVC包括以下三部分:,视图:视图是应用程序的表示层,代表用户交互界面。在Web应用中,交互界面可能是HTML界面,也有可能是XML界面、Applet界面或其他界面。模型:模型是应用程序的业务处理层,负责所有业务流程的处理和业务规则的制定。模型处理由控制器发来的视图的请求数据,并将最终的处理结果返回给视图。控制器:控制器的作用实际上就是一个分发器,负责决定将请求数据转发给什么样的模型组件,以及决定选择什么样的视图来显示模型返回的数据。,一个基于MVC的应用程序对用户请求的处理过程:,(1)终端用户通过应用程序发出了一个请求,该请求被转发给控制器。(2)控制器收到该请求后,检查该请求然后决定用什么样的业务逻辑来处理该请求,这时控制器会将该请求转发给一个相应的业务组件去处理。(3)模型中包含处理该用户请求的所有业务组件,并且也执行用户所需要的全部数据存取。代表终端用户查询检索出的任何数据都被打包返回给控制器。(4)控制器接收从模型返回的数据,并选择显示这些数据的相应的视图,然后将视图返回给用户。MVC模式适合大型项目的开发,是组件式的开发,但开发起来相对Model1复杂,步骤较多。,8.1.2为什么要用MVC,MVC框架的优点如下:有利于程序的维护和功能的扩展。有利于开发中的分工。有利于组件的重用。,8.1.3 MVC的实现,【例8.1】MVC的实现。本节采用JSPServletJavaBean技术开发一个体重指数测量程序。本例是一个根据身高和体重数据来衡量体重状况的程序。程序包含4个文件,分别是:view_Table.jspcontroller_Servlet.javamodel_Bean.javaview_Result.jsp,对身高和体重数据的处理计算是在模型层实现的,其中运用的业务规则是世界卫生组织拟定的体重状况的判断标准。体重指数(BMI)的计算公式是:体重指数(BMI)=体重(kg)/身高(米)的平方世界卫生组织拟定的BMI指数与体重状况的对应关系是:BMI在18.525 体重在正常范围BMI大于25小于30 体重状况为超重BMI大于30 体重状况为较肥胖BMI小于18.5 体重状况为偏瘦,(1)Model层的实现,Model(模型)层是软件中的核心模块,负责实现软件所有的业务逻辑,所有的数据处理都是在这里进行的。Model层用JavaBean来实现。类model_Bean是Model层的具体实现。新建一个类model_Bean,文件名为model_Bean.java,目录名为WEB-INF/src,存放在mvc_Test包中。,Model_Bean.java文件源代码如下:package mvc_Test;public class model_Bean/构造函数public model_Bean()/私有成员private String result;private String bmi;/体重指数/公有成员public void setBmi(String w,String h)/BMI体重指数double wt=Double.parseDouble(w);/将字符串类型的体重数据转换成double类型double ht=Double.parseDouble(h);/将字符串类型的身高数据转换成double类型double bmit=wt/(ht*ht);/按给定公式计算BMI体重指数,bmit*=10;int bmitt=(int)bmit;bmit=(double)bmitt/10;bmi=String.valueOf(bmit);/通过在浮点型和整型之间,先后进行相互的强制转换,使BMI指数只保留一位小数。public String getBmi()return bmi;public void setResult(String bmi)/根据BMI指数大小判定体型double bmit=Double.parseDouble(bmi);if(bmit18.5,else if(bmit25/将处理结果返回控制层组件controller_Servlet 模型层负责对其接收的身高和体重数据进行处理,这些数据是视图层以表单的方式采集而来的,接下来将给出视图层的代码。,(2)View层的实现 View(视图)层提供了一个表单以采集用户的身高和体重数据。view_Table.jsp文件源代码如下:世界卫生组织标准体重测定 看看您的体重状态如何,&nbsp 视图层采集的数据提交给控制层,控制层转发给模型层处理,模型层接收控制层转发来的数据并对数据进行处理,处理结 果返回给控制层。,(3)Control层的实现 控制层的具体功能是向模型层转发请求数据以及回收数据处理的结果,同时生成结果显示页面,返回给用户。Control层用Servlet实现。首先新建一个类controller_Servlet,对应文件名为controller_Servlet.java,目录名为WEB-INF/src,放在包mvcTest中。controller_Servlet.java源代码如下:package mvc_Test;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import mvc_Test.model_Bean;,public class controller_Servlet extends HttpServlet public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException/抛出接受请求的过程中的异常信息 doPost(request,response);public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException/抛出发送信息的过程中异常信息 String weight=request.getParameter(weight);/获取表单中体重的字符串信息 String height=request.getParameter(height);/获取表单中身高的字符串信息 model_Bean Pro=new model_Bean();/建立一个model_Bean的实例Pro,Pro.setBmi(weight,height);String BMI=Pro.getBmi();Pro.setResult(BMI);String result=Pro.getResult();/通过建立一个model_Bean的实例Pro,调用模型层组件model_Bean处理身高和体重信息 response.setContentType(text/html;charset=gb2312);/指定以中文字符集显示返回信息 request.setAttribute(result,result);request.setAttribute(BMI,BMI);/使用RequestDispatcher 转发至显示视图页面/view_Result.jsp RequestDispatcher requestDispatcher=request.getRequestDispatcher(/view_Result.jsp);/获得 RequestDispatcher对象 requestDispatcher.forward(request,response);/转发,显示测试结果的页面view_Result.jsp文件源代码如下:);out.println();out.println();out.println(您的BMI体重指数为:+BMI+);out.println(result);out.println();%,注意:编译controller_Servlet.java文件时,需要将Tomcat安装目录下的commonlib目录下的servlet-api.jar,添加到JDK安装目录下的jdk1.6.0jrelibext目录下面,否则会编译失败。因为文件所包含的软件包 javax.servlet在Web服务器中才有,JDK中并没有。也可以按照第三章例3.1所介绍的方法配置环境变量。然后新建一个配置文件web.xml,放在目录WEB-INF下。视图组件view_Table.jsp需要配置文件提供路径才能找到控制组件controller_Servlet.java,这些需要在web.xml中配置。,8.1.3 MVC的实现,web.xml源代码如下:control mvc_Test.controller_Servlet control/controller_Servlet,8.1.3 MVC的实现,(4)将本例所有文件及文件夹放在MVC文件夹中,并放在Tomcat安装目录下的webapps文件夹下,启动Tomcat,打开IE浏览器,在地址栏中输入地址:http:/localhost:8080/MVC/view_Table.jsp,运行结果如图8.3所示。(5)在表单中输入数据,单击提交按钮,运行结果如图8.4所示。图8.3 用户输入界面 图8.4 测试结果页面,8.2 用Struts2实现MVC设计模式,传统的MVC应用开发非常复杂,使用Struts控制器可以大大简化MVC应用程序的开发,尤其是大型的应用软件项目的开发。Struts作为一个开放源代码的应用框架,在最近几年得到了飞速的发展,在JSP Web应用开发中应用得非常广泛。8.2.1 Struts概述 8.2.2 Struts2的安装与测试8.2.3 Struts2的配置8.2.4 Struts 2的常用标签8.2.5 Struts 2的Action,8.2.1 Struts概述,1.什么是Struts Struts是一个用于简化MVC框架(Framework)开发的Web应用框架,用于快速开发Java Web应用。2.Struts2简介 Struts2的诞生源于OpenSynphony的著名Web框架WebWork,和Struts1一样,WebWork也是主流的Web框架之一。WebWork的技术先进程度要优于Struts1,但Struts1却具有更广泛的客户群。2005年,双方决定合作开发下一代的Web框架,Struts2于是诞生。从技术层面讲,Struts2采用了WebWork的核心技术而与Struts1完全不兼容。,8.2.1 Struts概述,3.Struts1与Struts2的对比 根据Struts2开发组的文章可以得知,Struts2与Struts1的不同之处如表8.1所示。表8.1 Struts2与Struts1的不同之处,表8.1 Struts2与Struts1的不同之处,8.2.2 Struts2的安装与测试,(1)安装Struts2需要的软件在安装Struts2前必须安装以下两个软件:JDK1.4以上版本,此处使用最新版的JDK6(或叫JDK1.6)。Servlet Container,此处使用Tomcat5.5。(2)下载Struts安装包 Struts最新版安装包Struts2.1.2可在http:/struts.apache.org/download.cgi#struts212上免费下载。下载页面如图8.3所示。,图8.3 Struts2下载页面,8.2.2 Struts2的安装与测试,选择下载Full Distribution版本,Struts 2安装包只是一个简单的压缩文件,解压即可。使用解压软件解压后,目录结构如图8.5所示。图8.5 Struts目录结构,8.2.2 Struts2的安装与测试,该目录结构内容如下:apps:该文件夹下包含了基于Struts 2的示例应用,这些示例应用对于学习者是非常有用的资料。docs:该文件夹下包含了Struts 2的相关文档,包括Struts 2的快速入门、Struts 2的文档,以及API文档等内容。backport:该文件夹下包含了让Struts 2支持JDK 1.4的JAR文件。lib:该文件夹下包含了Struts 2框架的核心类库,以及Struts 2的第三方插件类库。src:该文件夹下包含了Struts 2框架的全部源代码。,8.2.2 Struts2的安装与测试,(3)安装Struts2 Struts 2的安装是非常简单的,只是将JAR文件复制到相应目录即可。在正确安装好JDK和Tomcat后,把lib目录下的相关JAR文件拷贝到Web应用的lib目录中,同时修改Web应用的web.xml文件,添加Struts 2的配置。一般普通的Web应用目录结构如下:Web应用名称(如Bank):|-WEB-INF|classes|lib|web.xml|index.jsp,8.2.2 Struts2的安装与测试,将Struts2解压后的lib文件夹下struts2-core-2.1.2.jarxwork-2.1.1jarognl-2.6.11.jarcommons-logging-1.0.4.jarcommons-fileupload-1.2.1.jarfreemarker-2.3.12.jar等必需类库复制到Web应用的WEB-INF/lib路径下,这些jar文件是运行简单Struts2应用的最小集合。当然,如果Web应用需要使用Struts 2的更多特性,则需要将更多的JAR文件复制到Web应用的WEB-INF/lib路径下。,(4)测试Struts 2,在Struts目录结构下,apps中包含了4个示例程序:struts2-blank-2.1.2.warstruts2-mailreader-2.1.2.warstruts2-portlet-2.1.2.warstruts2-showcase-2.1.2.war 将struts2-blank-2.1.2.war文件拷贝到Tomcat安装目录下的webapps目录下,启动Tomcat,会自动将struts2-blank-2.1.2.war文件解压发布。在浏览器中输入:http:/localhost:8080/struts2-blank-2.1.2/example/HelloWorld.action,会返回Struts的应用示例界面,,8.2.2 Struts2的安装与测试,8.2.3 Struts2的配置,Struts2的配置可以分成三个单独的文件,如图8.7所示 图8.7 框架元素的配置文件,1.配置web.xml,FilterDispatcher是一个servlet过滤器,它是整个Web应用的配置项,需要在“web.xml”中进行配置:action2 org.apache.struts2.dispatcher.FilterDispatcher action2/*,2.struts.properties文件此文件提供了一种更改框架默认行为方式的机制。在一般情况下,如果不是打算让调试更加方便的话,不需要更改这个文件。struts.properties文件在WEB-INF/classes目录下存放。这个文件用来配置Struts2系统的一些基本规约,所有在struts.properties中配置的内容都可以在struts.xml中配置,或者web.xml中在struts2 filter中配置,struts.properties中的如下配置:struts.i18n.encoding=UTF-8相当于struts.xml中的如下配置:相当于web.xml中的如下配置:struts org.apache.struts2.dispatcher.FilterDispatcher struts.i18n.encoding true,3.struts.xml文件 struts.xml文件中包含的是开发Action时所需要修改的配置信息。本章中所讨论的配置信息,都可以被其他方式所代替,比如注解,web.xml启动参数和可替换的URL映射方案。必须要在struts.xml中进行配置的信息只有全局结果、异常处理和自定义的拦截器堆栈。,典型的struts.xml文件结构如下所示:其中标签位于Struts2配置的最外层,其他标签都是包含在它里面的。,8.2.4 Struts 2的常用标签,Struts 2的标签库是Struts 2的重要组成部分,Struts 2的标签库提供了非常丰富的功能,这些标签库不仅提供了表现层数据处理,而且提供了基本的流程控制功能,还提供了国际化、Ajax支持等功能。通过使用Struts 2的标签,开发者可以最大限度地减少页面代码的书写。要在JSP中使用Struts 2标签,需要在JSP文件的顶部加入以下代码:Struts 2的标签可以分为两类:通用标签和UI标签。,1.通用标签,通用标签用来在页面表示的时候控制代码执行的过程,这些标签也允许从Action或者值堆栈中取得数据。通用标签分为以下三类:控制标签,用于控制程序执行,例如:if,else,iterator。数据标签,用于管理数据的取得和创建,例如:property,set,push等。杂项标签,为一些特殊需求设计的,例如:include,url,i18n,text,param等。,1.通用标签,(1)控制标签 控制标签用于控制程序的执行,包括if标签、iterator标签等。if标签 if标签用来控制基本的条件处理流程,通常和else标签或者elseif标签连用。该标签参数如下所示。,if Tag if Tag Maxs file here Scotts file here Others file here,iterator标签 iterator标签用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)。它需要的参数如表8.4所示。,Iterator Names:!-,White 此外,控制标签还有sort,generator,append标签等。,(2)数据标签,数据标签用来提供各种数据相关的功能,范围从显示一个Action的直接结果到获取本地化的数值等。数据标签包括property,bean,set,push,action标签等property标签 property标签是struts 2中比较常用的标签。property标签用于得到“value”的属性,如果value没提供,默认为堆栈顶端的元素。它需要的参数如表8.5所示。,set标签 set标签赋予变量一个特定范围内的值。当希望给一个变量赋一个复杂的表达式,每次访问该变量而不是复杂的表达式时用到。其在两种情况下非常有用:复杂的表达式很耗时(用于性能提升)很难理解(用于提高代码可读性)。它需要的参数如表8.6所示。,如下代码每次都要使用#sessionuser,代码冗长而且容易出错:这里可以使用set标签定义临时变量:,push标签set标签可以在Action Context中放置数据,而push标签则可以将对象的引用压入值栈中,这在对单个对象做大量操作是非常有用的。可以将对象压入值栈之后直接对其进行操作,而不需要在每个表达式之前都加上对象的名字。push标签的参数表:,如上面的例子可以写成如下代码:此外数据标签还包括bean标签和action标签。,(3)杂项标签,include标签 include标签与JSP的动作功能类似,在用Struts 2进行开发时,此标签较常用。它用于包含一个servlet的输出(servlet或jsp的页面)。url标签 i18n标签 text标签 param标签,2.UI标签,UI标签也叫HTML标签,它又可以分为表单UI非表单UI表单UI部分基本与Struts 1.x相同,都是对HTML表单元素的包装。因为这些标志很多都经常用到,而且参数也很多。需要深入了解这些标志,可以查看以下网址:http:/wiki.javascud.org/display/ww2cndoc/Tags WebWork2文档中文化计划(中文)http:/cwiki.apache.org/WW/tag-reference.html Tag Developers Guide(英文),8.2.5 Struts 2的Action,有Struts 1.x经验的都知道Action是Struts的核心内容,当然Struts 2也不例外。不过,Struts 1.x与Struts 2.0的Action模型很大的区别。虽然,理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重载(Override)此类里的String execute()方法。,8.3 Struts的Web应用开发实例,【例8.2】Struts 2 应用实例。以下通过一个基于Struts2的Web应用程序来展现Struts 2的基本使用方法。这个程序的功能是让用户输入两个整数,并提交给一个Struts Action,在Action中计算这两个数的代数和,如果代数和为非负数,则跳转到positive.jsp页面,否则跳转到negative.jsp页面。,本例Web应用的文件结构如图8.8所示。,8.3 Struts的Web应用开发实例,1.安装Struts 2 用MyEclipse在Tomcat安装目录下的webapps目录下新建Web应用工程struts2Example,需要注意的是:WebRoot目录下的文件夹和文件需要放在Web应用的根目录下才能正确访问。将所需的包放入WEB-INFlib目录中,本实例所需的包有:struts2-core-2.1.2.jar、xwork-2.1.1jar、ognl-2.6.11.jar、commons-logging-1.0.4.jar、commons-fileupload-1.2.1.jar和freemarker-2.3.12.jar。2.配置web.xml 要使Struts能正常工作,需修改WEB-INF目录下的web.xml的内容,为其增加Struts2的FilterDispatcher,修改后的web.xml的内容如下:,struts2org.apache.struts2.dispatcher.FilterDispatcherstruts2/*,3.编写Action类FirstAction.java代码如下:package action;import com.opensymphony.xwork2.ActionSupport;public class FirstAction extends ActionSupport private int operand1;private int operand2;public String execute()throws Exception if(getSum()=0)/如果代码数和是非负整数,跳到positive.jsp页面return positive;else/如果代码数和是负整数,跳到negative.jsp页面return negative;,public int getOperand1()return operand1;public void setOperand1(int operand1)System.out.println(operand1);this.operand1=operand1;public int getOperand2()return operand2;public void setOperand2(int operand2)System.out.println(operand2);this.operand2=operand2;public int getSum()return operand1+operand2;/计算两个整数的代码数和,本文件存放在Web应用程序下的srcaction目录下.从上述代码可看出,Action类的一个特征就是要覆盖execute方法,只是Struts2的execute方法没有参数了,而Struts1.x的execute方法有四个参数。而且execute方法的返回值也不同的。Struts2只返回一个String,用于表述执行结果(就是一个标志)。,4.配置struts.xml文件这一步struts1.x和struts2.x都是必须的,只是在struts1.x中的配置文件一般叫struts-config.xml,而且一般放到WEB-INF目录中。而在struts2.x中的配置文件一般为struts.xml,放到WEB-INFclasses目录中。配置好的struts.xml文件代码如下:/positive.jsp/negative.jsp,8.3 Struts的Web应用开发实例,在标签中可以有多个,其extends属性继承一个默认的配置文件“struts-default”,一般都继承于它。标签中的name属性表示动作名,class表示动作类名。标签的name实际上就是execute方法返回的字符串,如果返回的是“positive”,就跳转到positive.jsp页面,如果是“negative”,就跳转到negative.jsp页面。,5.编写JSP页面本例共有三个JSP页面:主页面sum.jsp两个转向页面positive.jsp和negative.jsp这三个JSP文件都存放在Web应用程序根目录下。(1)sum.jsp页面在此页面中,用户可以输入两个整数,提交到Action进行求和运算,其代码如下:,输入操作数求代数和,在sum.jsp中使用了Struts2带的标签。在Struts2中已经将Struts1.x的几个标签库统一了,在Struts2中只有一个标签库/struts-tags。这里面包含了所有的Struts2标签。需要注意的是,在中最好都使用Struts2标签,尽量不要用HTML或普通文本。上例中的表单内容将提交到FirstAction进行处理。页面运行结果如图8.9所示。图8.9 主界面sum.jsp运行结果,(2)positive.jsp页面,如果Action中的计算结果为非负值,则转向positive.jsp页面,其代码如下:显示代数和代数和为非负整数,8.3 Struts的Web应用开发实例,在主页面中输入3和5两个数,页面运行结果如图8.10所示。图8.10 当运算结果为非负整数时转向的页面,8.3 Struts的Web应用开发实例,negative.jsp页面如果Action中的计算结果为负值,则转向negative.jsp页面,其代码如下:显示代数和代数和为负整数,8.3 Struts的Web应用开发实例,在主页面中输入-3和-5两个数,页面运行结果如图8.11所示。图8.11 当运算结果为负整数时转向的页面 这两个jsp页面的实现代码基本一样,其中都使用了一个标签来显示Action类中的sum属性值。,8.4 小结,本章介绍了Java Web开发的两种模式:Model1和Model2。其中,Model1采用JSP开发系统或采用JSPJavaBean的开发模式,在开发小型系统时具有较大的优势,但不适用于大规模项目的开发。而Model2实现了业务逻辑、显示逻辑和控制逻辑的分离,是基于MVC的开发模式,适用于大型项目的开发,是组件式的开发。本章还介绍了用Struts2以及如何用Struts2实现MVC。,8.5 习题,1.单选题(1)MVC中的M是指()。A.Model B.View C.Controller D.以上都不对(2)MVC中的V是指()。A.Model B.View C.Controller D.以上都不对(3)MVC中的C是指()。A.Model B.View C.Controller D.以上都不对(4)有关struts 2的说法不正确的是()A.Struts是一个用于简化MVC框架(Framework)开发的Web应用框架 B.应用Struts 2不需要进行配置 C.Struts 2 含有丰富的标签 D.Struts2采用了WebWork的核心技术2.上机练习 参考例8.2,用Struts 2编写一个用户登录的简单Web应用程序。,

    注意事项

    本文(第8章Struts和MVC设计模式.ppt)为本站会员(仙人指路1688)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开