JAVA基础开发培训_第1页
JAVA基础开发培训_第2页
JAVA基础开发培训_第3页
JAVA基础开发培训_第4页
JAVA基础开发培训_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java开发培训2013/02/17JAVA基础开发培训全文共50页,当前为第1页。主要内容Java网络开发1JAVA常用开发工具与技术2JAVA学习方向3EffectiveJava4JAVA基础开发培训全文共50页,当前为第2页。一.Java网络开发计算机网络分层体系结构套接字JavaWeb开发JAVA基础开发培训全文共50页,当前为第3页。1.1计算机网络分层体系结构

计算机以一种非常简单的方式进行相互间的操作和通信。计算机芯片是以1和0的形式存储并传输数据的开—闭转换器的集合。当计算机想共享数据时,它们所需做的全部就是以一致的速度、顺序、定时等等来回传输几百万比特和字节的数据流。每次想在两个应用程序之间进行信息通信时,您怎么会愿意担心那些细节呢? 为免除这些担心,我们需要每次都以相同方式完成该项工作的一组包协议。这将允许我们处理应用程序级的工作,而不必担心低级网络细节。这些成包协议称为协议栈(stack)。TCP/IP是当今最常见的协议栈。多数协议栈(包括TCP/IP)都大致对应于国际标准化组织(InternationalStandardsOrganization,ISO)的开放系统互连参考模型(OpenSystemsInterconnectReferenceModel,OSIRM)。OSIRM认为在一个可靠的计算机组网中有七个逻辑层(见图)。各个地方的公司都对这个模型某些层的实现做了一些贡献,从生成电子信号(光脉冲、射频等等)到提供数据给应用程序。TCP/IP映射到OSI模型中的两层的情形如图所示。我们不想涉及层的太多细节,但您应该知道套接字位于什么地方。JAVA基础开发培训全文共50页,当前为第4页。物理层:以太网·调制解调器·电力线通信(PLC)·SONET/SDH·G.709·光导纤维·同轴电缆·双绞线等数据链路层:Wi-Fi(IEEE802.11)·WiMAX(IEEE802.16)·ARP·RARP·ATM·DTM·令牌环·以太网·FDDI·帧中继·GPRS·EVDO·HSPA·HDLC·PPP·L2TP·PPTP·ISDN·STP等网络层协议:IP(IPv4·IPv6)·ICMP·ICMPv6·IGMP·IS-IS·IPsec等传输层协议:TCP·UDP·TLS·DCCP·SCTP·RSVP·OSPF等应用层协议:DHCP·DNS·FTP·Gopher·HTTP·IMAP4·IRC·NNTP·XMPP·POP3·SIP·SMTP·SNMP·SSH·TELNET·RPC·RTCP·RTP·RTSP·SDP·SOAP·GTP·STUN·NTP·SSDP·BGP·RIP等1.1计算机网络协议JAVA基础开发培训全文共50页,当前为第5页。1.1TCP/IP体系分层JAVA基础开发培训全文共50页,当前为第6页。1.1TCP/IP体系分层JAVA基础开发培训全文共50页,当前为第7页。1.

2.套接字什么是套接字?

套接字是一种软件抽象,用于表达两台机器之间的连接“终端”。对于一个给定的连接,每台机器上都有一个套接字,您也可以想象它们之间有一条虚拟的“电缆”,“电缆”的每一端都插入到套接字中。当然,机器之间的物理硬件和电缆连接都是完全未知的。抽象的全部目的是使我们无须知道不必知道的细节。

简言之,一台机器上的套接字与另一台机器上的套接字交谈就创建一条通信通道。程序员可以用该通道来在两台机器之间发送数据。当您发送数据时,TCP/IP协议栈的每一层都会添加适当的报头信息来包装数据。这些报头帮助协议栈把您的数据送到目的地。好消息是Java语言通过"流"为您的代码提供数据,从而隐藏了所有这些细节,这也是为什么它们有时候被做流套接字(streamingsocket)的原因。 把套接字想成两端电话上的听筒—

我和您通过专用通道在我们的电话听筒上讲话和聆听。直到我们决定挂断电话,对话才会结束(除非我们在使用蜂窝电话)。而且我们各自的电话线路都占线,直到我们挂断电话。JAVA基础开发培训全文共50页,当前为第8页。1.

2.套接字套接字的类型

一般而言,Java语言中的套接字有以下两种形式:TCP套接字(由Socket类实现)UDP套接字(由DatagramSocket类实现)

TCP和UDP扮演相同角色,但做法不同。两者都接收传输协议数据包并将其内容向前传送到表示层。TCP把消息分解成数据包(数据报,datagrams)并在接收端以正确的顺序把它们重新装配起来。TCP还处理对遗失数据包的重传请求。有了TCP,位于上层的层要担心的事情就少多了。UDP不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。 与TCP协议不同,用户数据报协议(UDP)则是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。 一般而言,UDP强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP才是最简单或许也是最高效的选择。JAVA基础开发培训全文共50页,当前为第9页。1.

2.套接字java平台套接字实现URLConnectionSocketServerSocketJAVA基础开发培训全文共50页,当前为第10页。1.3JavaWeb应用的概念在Sun的JavaServlet规范中,对JavaWeb应用作了这样定义:“JavaWeb应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。”

JavaWeb应用中可以包含如下内容:ServletJSPjava实用类javabean静态文档如HTML、图片等客户端类(如Applet)描述Web应用的信息(web.xml)JAVA基础开发培训全文共50页,当前为第11页。1.3.Servlet容器的概念Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器。后文均采用Servlet容器的提法。目前最流行的Servlet容器软件包括:TomcatJBossJ2EE服务器(如Weblogic)中也提供了内置的Servlet容器JAVA基础开发培训全文共50页,当前为第12页。1.3.

Servlet容器响应客户请求的过程http://localhost:8080/szhhxh/hello?clientName=浩瀚

客户Servlet容器Servlet请求HttpServletRequestHttpServletResponse响应JAVA基础开发培训全文共50页,当前为第13页。1.3.

Servlet容器响应客户请求的过程当客户请求访问某个Servlet时,Servlet容器将创建一个ServletRequest对象和ServletResponse对象。在ServletRequest对象中封装了客户请求信息,然后Servlet容器把ServletRequest对象和ServletResponse对象传给客户所请求的Servlet。Servlet把响应结果写到ServletResponse中,然后由Servlet容器把响应结果传给客户。

以下将简单介绍Java网络开发的原理及应用JAVA基础开发培训全文共50页,当前为第14页。1.3HTTPWatchJAVA基础开发培训全文共50页,当前为第15页。1.3.Tomcat原理一个web服务器也叫做HTTP服务器,因为它使用HTTP协议同客户端(即浏览器)通信。一个基于Java的web服务器用到的两个重要类:.Socket和.ServerSocket,通信协议采用HTTP。因此,很自然的接下来我们就以HTTP和java的这两个类来谈谈web服务器。随后我们再介绍一个简单的web服务器应用。JAVA基础开发培训全文共50页,当前为第16页。1.3.Tomcat原理Http是允许web服务端和浏览器之间通过Internet发送/接收的协议,它是一个请求/响应的协议。浏览器请求一个文件,服务器会响应这个请求。Http用Tcp连接方式默认端口是80.Http的第一个发布版本是Http/0.9,目前一般用的是Http1.1.

通过Http协议,通常是浏览器通过建立连接并且发送请求来发起一个会话事务,服务器端会响应或者给浏览器一个响应的连接,浏览器端或者服务器端可以在会话中提前终止一个连接。例如,当用一个浏览器作为客户端,可以点击停止按钮就可以终止正在下载的文件,从而有效的关闭与web服务器端的Http连接。JAVA基础开发培训全文共50页,当前为第17页。1.3.Tomcat原理一个Http请求包含以下3个部分:

·Method-URI-Protocal/Version

·Requestheaders

·Entitybody

一个HTTP请求的例子如下:

POST/examples/default.jspHTTP/1.1

Accept:text/plain;text/html

Accept-Language:en-gb

Connection:Keep-Alive

Host:localhost

User-Agent:Mozilla/4.0(compatible;MSIE4.01;windows98)

Content-Length:33

Content-Type:application/x-www-form-urlencoded

Accept-Encoding:gzip,deflate

lastName=Franks&firstName=MichaelJAVA基础开发培训全文共50页,当前为第18页。1.3.Tomcat原理HTTP/1.1200OK

Server:Microsoft-IIS/4.0

Date:Mon,5Jan200413:13:33GMT

Content-Type:text/html

Last-Modified:Mon,5Jan200413:13:12GMT

Content-Length:112

<html>

<head>

<title>HTTPResponseExample</title>

</head>

<body>

WelcometoBrainySoftware

</body>

</html>JAVA基础开发培训全文共50页,当前为第19页。1.3.Tomcat原理PS:

浏览器、抢票软件……JAVA基础开发培训全文共50页,当前为第20页。2.JAVA常用开发工具与技术HTMLJSPjavascript标签技术(EXTJS、JSF等)JconsoleJ2EE其他开发技术JAVA基础开发培训全文共50页,当前为第21页。2.1.HTML超文本标记语言,即HTML(HypertextMarkupLanguage),是用于描述网页文档的一种标记语言。JAVA基础开发培训全文共50页,当前为第22页。2.2.JSPJSP(JavaServerPages)是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。根据上面的JSP页面工作原理图,可以得到如下四个结论:1、JSP文件必须在JSP服务器内运行。2、JSP文件必须生成Servlet才能执行。3、每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet4、JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。JAVA基础开发培训全文共50页,当前为第23页。2.3javascriptJavascript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对数据进行验证,由于网络速度相当缓慢,只有28.8kbps,验证步骤浪费的时间太多。于是Netscape的浏览器Navigator加入了Javascript,提供了数据验证的基本功能。JAVA基础开发培训全文共50页,当前为第24页。2.4.标签技术1.使用标签

<cc:showUserInfouser="${pageScope.userinfo}"/>2.实现Tag接口,可以直接继承实现了此接口的TagSupport类,覆盖doStartTag()方法,以out.println(“****”)形式输出3.在Web-Inf创建标签库描述文件.tdl(TagLibraryDescription).

<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2eeweb-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><jsp-version>2.0</jsp-version><short-name>cc</short-name><uri>/mytaglib</uri><tag><name>showUserInfo</name><tag-class>com.mytags.UserInfoTag</tag-class><body-content>empty</body-content><attribute><name>user</name><required>false</required><rtexprvalue>true</rtexprvalue></attribute></tag></taglib>4.配置web.xml<jsp-config><taglib><taglib-uri>/mytaglib</taglib-uri><taglib-location>/WEB-INF/mytaglib.tld</taglib-location></taglib></jsp-config>JAVA基础开发培训全文共50页,当前为第25页。2.5.Jconsole在JMXURL:中输入如下内容:service:jmx:iiop:///jndi/corbaname::1.2@localhost:6888#jmx/rmi/RMIConnectorServer其中localhost为应用服务器ip6888为判断有问题的实例的http端口号UserName:输入adminPassword:输入adminJAVA基础开发培训全文共50页,当前为第26页。2.6.J2EE其他开发技术JAVA基础开发培训全文共50页,当前为第27页。3.JAVA编程基础JAVA基础开发培训全文共50页,当前为第28页。3.JAVA网络开发JAVA基础开发培训全文共50页,当前为第29页。3.JAVA高级编程JAVA基础开发培训全文共50页,当前为第30页。3.JAVA应用框架JAVA基础开发培训全文共50页,当前为第31页。3.JAVA系统框架JAVA基础开发培训全文共50页,当前为第32页。4.1考虑用静态工厂方法替代构造器publicstaticBooleanvalueOf(booleanb){ return(b?Boolean.TRUE:Boolean.FALSE);}

优点:1.名字可不与类名相同,可以采用更易理解的名称。2.不必在每次调用的时候都创建一个新的对象。3.可以返回子类型。缺点:1.无法被继承。2.和其它static方法无法区分。JAVA基础开发培训全文共50页,当前为第33页。应用场景:

沿海地产财务凭证WebService接口开发,该财务接口高峰时每秒调用6~10次。问题描述:

生产机服务器每隔两到三天凭证接口调用就开始超时,查看服务器没有内存溢出,高峰值内存占用为70~80%,后台没有抱错,服务器实例必须重启后才能使用。部分代码具体:

修改前:

publiccalssVoucherServiceImpl{publicstaticvoidcreateVoucher(Stringxml,Contextctx){ …… IYHVoucherFacadeiYHVoucherFacade=

YHVoucherFacadeFactory.getLocalInstance(ctx); VoucherInfovoucherInfo=newVoucherInfo(); ……//业务逻辑处理 iYHVoucherFacade.save(voucherInfo);}}4.1考虑用静态工厂方法替代构造器JAVA基础开发培训全文共50页,当前为第34页。修改后:publiccalssVoucherServiceImpl{ privateIYHVoucherFacadeiYHVoucherFacade=null; static{ iYHVoucherFacade =YHVoucherFacadeFactory.getLocalInstance(ctx);

}publicstaticvoidcreateVoucher(Stringxml,Contextctx){ …… VoucherInfovoucherInfo=newVoucherInfo(); ……//业务逻辑处理 iYHVoucherFacade.save(voucherInfo); } }4.1考虑用静态工厂方法替代构造器JAVA基础开发培训全文共50页,当前为第35页。4.2遇到多个构造器参数时要考虑用构造器2.1重叠构造器 NutritionFactsCocaCola=newNutritionFacts(240,8,100,35,27);

缺点:当有许多参数的时候,客户端代码会很难写。2.2JavaBean模式NutritionFactsCocaCola=newNutritionFacts();CocaCola.setServingSize(240);……缺点:构造过程被分解到几个调用过程中,在构造过程中JavaBean可能存于不一致的状态。JAVA基础开发培训全文共50页,当前为第36页。4.2遇到多个构造器参数时要考虑用构造器2.3Builder模式publicstaticNutritionFacts{privatefinalintservingSize;……publicstaticclassBuilder{privatefinalintservingSize;privatefinalintservings; …… privateintcalories=0; …… publicBuilder(intservingSize,intservings){this.servingSize=servingSize; this.servings=servings;}}publicBuildercalories(intval){calories=val;returnthis;}public……publicNutritionFactsbuild(){ returnnewNutritionFacts(this);}}privateNutritionFacts(Builderbuilder){servingSize=builder.servingSize;……}}调用:NutritionFactscocaCola=newNutritionFacts.Builder(240,8).calories(100)……;

优点:可以有多个可变(varargs)参数。

缺点:为了创建对象,必须先创建它的构造器,可能存在一定性能问题,必须先初始化。JAVA基础开发培训全文共50页,当前为第37页。4.3用私有构造器或者枚举类型强化Singleton属性3.1公有静态成员是个final域:publicclassHello{publicstaticfinalHelloInstance=newHell();privateHello(){}}3.2公有的成员是个静态工厂方法:publicclassHello{privatestaticfinalHelloInstance=newHell();privateHello(){}publicstaticHellogetInstance(){//可以方便改变returnInstance;}privateObjectreadResolve(){//防止反序列话时创建一个新的实例

returnINSTANCE;}}

如果想让singleton类成为serializable,除了implementsSerializable外,还要提供readResolve()方法返回该单例。JAVA基础开发培训全文共50页,当前为第38页。4.4避免创建不必要的对象

尤其是创建比较昂贵的。对不可修改的对象尽量进行复用,这样效率和性能都会提高。例如如果循环100次Strings=newString("hello")将创建100个对象循环100次Strings="hello";则只创建了一个对象。很好的进行了复用。以下代码是否有问题,为什么。publicstaticvoidmain(String[]args){Longsum=0L;for(longi=0;i<Integer.MAX_VALUE;i++){sum+=I;}System.out.println(sum);}JAVA基础开发培训全文共50页,当前为第39页。4.5消除过期的对象引用内存泄漏,在cache里易发生。以下两个代码之间有什么问题:publicObjectpop(){if(size==0){}returnelements[size--];}publicObjectpop(){if(size==0){}Objectobj=elements[--size];elements[size]=null;//但是不要滥用,不要每个对象使用后都用NULLreturnobj;}如果一个栈显示增长,然后再收缩,那么,从堆栈中弹出来的对象将不会被当作垃圾回收,即使使用栈的程序不在引用这些对象,他们也不会被回收。这是因为栈内部维护着对这些对象的过期引用。过期引用是指永远也不会再被解除的引用。JAVA基础开发培训全文共50页,当前为第40页。4.6使类和成员的可访问范围降到最低好的模块设计应该尽最大可能封装好自己的内部信息,这样可以把模块之间的耦合程度降到最低。开发得以并行,无疑这将加快开发的速度,便于系统地维护。Java中通过访问控制符来解决这个问题。public表示这个类在任何范围都可用。Protected表示只有子类和包内的类可以使用private-package(default)表示在包内可用private表示只有类内才可以用你在设计一个类的时候应该尽量的按照4321得顺序设计。假如一个类只是被另一个类使用,那么应该考虑把它设计成这个类的内部类。通常public的类不应该有public得字段,不过我们通常会用一个类来定义所有的常量,这是答应的。不过必须保证这些字段要么是基本数据类型要么引用指向的对象是不可修改的。不然他们将可能被修改。例如下面的定义中data就是不合理的,后面两个没有问题。

publicclassCon

{

publicstaticfinalint[]data={1,2,3};//itisbad

publicstaticfinalStringhello="world";

publicstaticfinalinti=1;JAVA基础开发培训全文共50页,当前为第41页。4.7在公有类中使用访问方法而非公有域classpoint{publicdoublex; publicdoubley;}该类的数据域是可以被直接访问的,这些类没有提供封装,如果不改变API,就无法改变它的数据表示法,也无法强加任何约束直接条件,当域被访问的时候,无法采取任何辅助的行动。所以应该改为:

classpoint{privatedoublex; privatedoubley; publicvoidsetX(doublex){this.x=x;}……}总之,公有类永远都不应该暴漏可变的域。虽然还是有几个问题,但是让公有类暴漏不可变的域,起危害比较小。但是,有时候需要会用到包级私有的或者私有的嵌套类来暴漏域,无论这个类是可变还是不可变。JAVA基础开发培训全文共50页,当前为第42页。4.8不要忽略异常Exception处理的最佳实现:

1.选择Checked还是Unchecked的几个经典依据(如果你希望强制你的类调用者来处理异常,那么就用CheckedException;如果你不希望强制你的类调用者来处理异常,就用UnChecked。)

2.Exception的封装问题

3.如无必要不要创建自己得Exception

4.不要用Exception来作流程控制

5.不要轻易的忽略捕获的Exception

6.不要简单地捕获顶层的Exception”JAVA基础开发培训全文共50页,当前为第43页。4.9努力使失败保持原子性一个失败的方法调用,应该是对象保持“它在被调用之前的状态”。具有这种属性的方法,被称为具有失败原子性。获得这种效果的方法:1.设计一个非可变对象。2.对于可变对象,在操作之前检查参数的有效性,在对象状态改变之前,适当的抛出异常。与此类似,对计算处理过程顺序调整,使得任何肯能会失败的计算部分都发生在对象状态被修改之前。3.编写恢复代码(用于永久性的数据结构)。4.在对象的临时拷贝上执行操作,操作完成后,再把临时拷贝中的结果,复制给原来的对象。总结:失败原子性是期望目标,但不总是能做到。对于某些操作,他会显著的增加开销和复杂性。总结一条规则:作为方法规范的一部分,任何一个异常,都不应该改变对象在调用这个方法之前的状态。如果被改变,就该在API文档中指明对象将处于什么样的状态。JAVA基础开发培训全文共50页,当前为第44页。4.10遵守普遍接受的命名惯例java的命名惯例分为两大类:字面的和语法的。字面命名惯例涉及包、类、接口、方法和域。包的名字是层次结构的,用句号分隔第一部分。每一部分的长度不要超过8,由小写字母和数字组成(数字少见用),鼓励使用有意义的缩写。除了java和javax外,一般以域名做开头,顺序是顶级域名放在最前面。类和接口的名字应至少1至多个单词,每个单词的首字母大写(驼峰试),尽量避免缩写。方法和域的名字与类和接口的名字遵守相同的字面惯例,只是第一个首字母要小写。常量域要全部字母都大写,词之间通过下划线区分。语法命名惯例比字面惯例更灵活。类通常用一个名词或名词短语,接口或者与类相同,或者以"-able"或"-ible"结尾的形容词。

执行某个动作的方法,常用一个动词或动词短语,

对于返回boolean类型的方法,名字常以“is"开头后加一个名词或形容词或短语,

如果返回的不是boolean,则常用一个名词/短语,或以"get"开头的动词短语。

如果一方法所在的类是一个Bean,则强制要求以get开头。

如果类包含对属性操作,常用setAttribute或getAttribute格式命名。转换对象类型的方法,如果返回不同类型的独立的对象,则称为toType,个视图,则用asType,如果返回与被调用对象同值的原语类型,称为typeValue,静态工厂的方法,常用valueOf或getInstance.

JAVA基础开发培训全文共50页,当前为第45页。4.11接口优先于反射机制反射机制java.lang.reflect,提供了“通过程序来访问关于已装载的类的信息”的能力。这些对象提供了“通过程序来访问类的成员名字、域类型、方法原型等信息”的能力。而且,Contructor、Method和Field实例使你能够维护它们的底层对等体(“反射到底层”):通过调用Constructor、Method和Field实例上的方法,你可以构造底层类的实例、调用底层类的方法、访问底层类中的域。

反射机制允许一个类使用另一个类,即使当前者被编译的时候后者还根本不存在。然而,这种能力也需要付出代价:

1、你损失了编译时类型检查的好处,也包括异常检查。如果一个程序企图用反射方式调用一个不存在的方法,或者一个不可访问的方法,那么在运行时刻它将会失败,除非你采取了特别的预防措施。

2、要求执行映像访问的代码非常笨拙和冗长。编写这样的代码非常乏味,阅读这样的代码也很困难。

3、性能损失。

通常,普通应用在运行时不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论