Servlet与表单.doc_第1页
Servlet与表单.doc_第2页
Servlet与表单.doc_第3页
Servlet与表单.doc_第4页
Servlet与表单.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

第17章 Servlet与表单 返回主页上一章 下一章在 Web编程中,经常要使用称为Servlet的服务器端小程序。Servlet是用Java编写的组件,它扩展了服务器的功能,可以处理客户端请求,分解 和传递服务任务。在MVC模式的Web编程中,Servlet起到重要的控制作用。本章介绍Servlet的编程、运行环境和初始化参数的配置,并对 Servlet处理表单的技术作专门介绍。17.1 Servlet简介17.2 Servlet常用接口、类及其方法17.3 Servlet的环境配置和运行17.4 Sevlet处理表单提交17.5 Sevlet的初始化参数配置17.1 Servlet简介 本章开头 下一节信息管理(采集、发布、检索、分析、预测)是信息社会主要特征,Web开发主要目的也是 为了信息的处理,这些都需要数据库的支持。而目前的数据库管理系统有多种,Web程序如何如这些数据库管理系统整合,就成为Web技术的最终要问题。在 ASP中使用Windows系统的ODBC(开放式数据库链接),使得问题获得解决。基于Java的Web编程技术如何解决这个问题呢?这里要引入 JDBC的概念。Servlet,全称为Java Servlet,是用Java编写的服务器端小程序,与客户端的applet小程序对应。Servlet和applet分别在处于服务器和客户机两端。 Servlet运行于支持Java的应用服务器中,没有main方法,只有一些特定的方法用于启动,执行和退出。Servlet提供了Java应用程序的 所有优势,主要是可移植、功能强、安全、简洁、模块化、扩展性、灵活性、容易开发和平台无关性。Servlet主要用于接受客户端的请求,将处理结果返回客户端。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。这个过程为:客户端发送请求至服务器端;服务器将请求信息发送至Servlet;Servlet生成响应内容并将其传给服务器;服务器将动态内容发送至客户端。Servle生成的动态内容,通常取决于客户端的请求。上述过程实际上是Servlet的生命周期的一部分。Servlet的整个生命周期为:1)装载Servlet。一般动态执行,也可由Server的管理功能定制。2)Server创建一个Servlet的实例 3)Server调用Servlet的init()方法 4)一个客户端的请求到达Server 5)Server创建一个请求对象和一个响应对象6)Server激活Servlet的service()方法,传递请求和响应对象作为参数7)service()方法获得关于请求对象的信息,处理请求。8)service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。9)不再需要Servlet时Server调用Servlet的Destroy()方法销毁Servlet。第6-8阶段是最重要的阶段,提供强大的服务。期间可能访问其他资源,获得需要的信息,也可能激活其它方法以处理请求,如doGet()或 doPost()或程序员自己开发的新的方法。对于更多的客户端请求,Server创建新的请求和响应对象,重复以上的循环,但无需再次调用init() 方法,一般Servlet只初始化一次。当Server关闭时,Servlet就被销毁。17.2 Servlet常用接口、类及其方法 上一节 下一节 本章开头17.2.1 Seervlet接口Servlet接口的声明为:public interface Servlet它的生命周期由javax.servlet.servlet接口定义。当你在写Servlet的时候必须直接或间接的实现这个接口。一般趋向于间接实现: 通过从javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在实现 servlet接口时必须实现它的五个方法:Servlet接口public interface Servlet由javax.servlet.servlet接口定义。在写Servlet的时候必须直接或间接的实现这个接口。一般通过 javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在实现Servlet 接口时必须实现它的五个方法:1)public void init(ServletConfig config) 一旦对servlet实例化后,容器就调用此方法。容器把一个ServletConfig对象传统给此方法,这样servlet的实例就可以把与容器相关的配置数据保存起来供以后使用。2)public void service(ServletRequest req,ServletResponse res)只有成功初始化后此方法才能被调用处理用户请求。前一个参数提供访问初始请求数据的方法和字段,后一个提供servlet构造响应的方法。3)public void destroy()容器可以在任何时候终止servlet服务。容器调用此方法前必须给service()线程足够时间来结束执行,因此接口规定当service()正在执行时destroy()不被执行。4)public ServletConfig getServletConfig()在servlet初始化时,容器传递进来一个ServletConfig对象并保存在servlet实例中,该对象允许访问两项内容:初始化参数和 ServletContext对象,前者通常由容器在文件中指定,允许在运行时向sevrlet传递有关调度信息,后者为servlet提供有关容器的信 息。5)public String getServletInfo()这个方法返回一个String对象,该对象包含servlet的信息,例如开发者、创建日期、描述信息等。该方法也可用于容器。17.2.2 GenericServlet类GenericServlet为抽象类,其声明为:Public abstract class GenericServlet implants Servlet,ServletConfig,SerializableGenericServlet类提供了servlet接口的基本实现部分,其service()方法被申明为abstract,因此需要被派生。 init(ServletConfig conf)方法把servletConfig对象存储在一个private transient(私有临时)实例变量里,getServletConfig()方法返回指向本对象的指针,如果你重载此方法,将不能使用 getServletConfig来获得ServletConfig对象,如果确实想重载,记住要包含对super.config的调用。2.1版的 API提供一个重载的没有参数的init()方法。现在在init(ServletConfig)方法结束时有一个对init()的调用,尽管目前它是空 的。2.1版API里面,此类实现了ServletConfig接口,这使得开发者不用获得ServletConfig对象情况下直接调用 ServletConfig的方法,这些方法 是:getInitParameter(),getInitParameterNames(),getServletContext。此类还包含两个写日 志的方法,它们实际上调用的是ServletContext上的对应方法。log(String msg)方法将servlet的名称和msg参数写到容器的日志中,log(String msg,Throwable cause)除了包含servlet外还包含一个异常。17.2.3 HttpServlet类HttpServlet类类扩展了GenericServlet类并对servlet接口提供了与HTTP更相关的实现。Serlvet接口只定义了一个服务方法就是service。HttpServlet类扩展了GenericServlet类并实现了Service方法。service方法定义为:protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOExceptionpublic void service(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException该方法作为HTTP请求的分发器,在任何时候都不能被重载。HTTP请求的类型有:GET、POST、HEAD、OPTIONS、DELETE、PUT、 和TRACE。当请求到来时,service()方法判断请求的类型,并把请求分发给相应的处理方法(doGet()、doPost()、 doHead()、doOptions()、doDelete()、doPut()和doTrace())。每个do方法具有和第一个service() 相同的形式。为了响应特定类型的HTTP请求,我们必须重载相应的do方法。如果servlet收到一个HTTP请求而你没有重载相应的do方法,它就返 回一个说明此方法对本资源不可用的标准HTTP错误。一般情况下,在Web编程中使用servlet时,开发者主要用到doGet和doPost方法。当发出客户端请求的时候,调用Servlet的 service方法并传递一个请求和响应对象。Servlet首先判断该请求是GET操作还是POST操作。然后分别调用doGet或doPost方法。 doGet和doPost都接受请求(HttpServletRequest)和响应(HttpServletResponse)。所谓的GET请求,可以把它看成是当用户在浏览器地址栏输入URL、点击Web页面中的链接、提交指定METHOD=POST的表单或提交没有指定 METHOD的表单时浏览器所发出的请求。POST请求是提交那些指定了METHOD=”POST”的表单时所发出的请求。GET请求只有一个流,参数附 加在URL后,大小个数有严格限制且只能是字符串;POST请求的参数是通过另外的流传递的, 不通过URL,所以可以很大,也可以传递二进制数据,如文件的上传。 1)doGet()GET调用用于获取服务器信息,并将其作为响应返回给客户端。当经由Web浏览器或通过HTML、JSP直接访问Servlet的URL时,一般用GET 调用。GET调用在URL里显示正传送给SERVLET的数据,这在系统的安全方面可能带来一些问题,比如用户登录,表单里的用户ID和密码需要发送到服 务器端,若使用Get调用,就会在浏览器的URL中显示用户名和密码。方法格式为:public class DoGetServlet extends HttpServlet public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException request.setCharacterEncoding(gb2312); response.setContentType(text/html;charset=gb2312); PrintWriter out = response.getWriter(); out.println(The user ID is :+request.getParameter(userID); out.println(The user password is :+request.getParameter(userPWD); 2)doPost()用来处理一个HTTP POST操作。这个操作包含请求体的数据,用于把数据从客户端传送到服务器端,也会有副作用。但好处是可以隐藏传送给服务器的任何数据。Post适合发送大量的数据。方法的格式为:public class DoPostServlet extends HttpServlet public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException request.setCharacterEncoding(gb2312); response.setContentType(text/html;charset=gb2312); PrintWriter out = response.getWriter(); out.println(The user ID is :+request.getParameter(userID); out.println(The user password is :+request.getParameter(userPWD); 3)doPut()用来处理一个HTTP PUT操作。这个操作类似于通过FTP发送文件。这个操作可能有负面影响。例如更新存储的数据或在线购物。这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当处理PUT操作时,必须在HttpServlet的子类中实现这一方法。方法的格式为:protected void doPut(HttpServletResquest request,HttpServletResponse response)throws ServletException,IOException;4)doDelete()用来处理HTTP的DELETE请求。这个操作允许客户端请求从服务器上删除URL。这一操作可能有负面影响,对此用户就负起责任。这一方法的默认执行结果是返回一个HTTP BAD_REQUEST错误。当编写servlet时,为了支持DELETE操作,必须在子类HttpServlet中实现(implement)此方法。方法的格式为:protected void doDelete (HttpServletResquest request, HttpServletResponse response) throws ServletException,IOException;4)doHead()用来处理HTTP的HEAD请求。缺省情况下,它会在无条件的GET方法执行时期中运行,但是不返回任何数据到客户端,只返回包含内容信息的长度的 header。由于用到GET操作,该方法应该是很安全的(没有副作用)也是可重复使用的。方法的缺省实现(implement)自动地处理了 HTTPDE的HEAD操作并且不需要通过一个子类实现(implement)。方法的格式为:protected void doHead (HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException;5)doOptions()用来处理HTTP的OPTIONS请求,其操作自动地决定支持什么HTTP方法。一般不需要重载方法doOptions。如果一个servlet的作者创建HttpServlet的子类并重载方法doGet,然后方法doOptions会返回下面的header:Allow:GET,HEAD,TRACE,OPTIONS该方法的格式:protected void doOptions (HttpServletResquest request, HttpServletResponse response) throws ServletException,IOException;6)doTrace()用来处理HTTP的TRACE请求,其缺省执行产生一个包含所有在trace请求中的herder的信息的应答(response)。在开发servlet时,多数情况下需要重载此方法。格式为:protected void doTrace (HttpServletResquest request, HttpServletResponse response)throws ServletException,IOException; 7)getLatModified()getLastModified 的声明为:protected long getLastModified(HttpServletRequest req)该方法返回以毫秒为单位的的自GMT时间1970年1月1日0时0分0秒依赖的最近一次修改servlet的时间,缺省是返回一个负数表示时间未知。当处理GET请求时,调用此方法可以知道servlet的最近修改时间,服务器就可决定是否把结果从缓存中去掉。17.2.4 HttpServletRequest接口public interface HttpServletRequest extends ServletRequest所有实现此接口的对象(例如从servlet容器传递的HTTP请求对象)都能让servlet通过自己的方法访问所有请求的数据。下面是一些用来获取表单数据的基本方法。1)getParameter()public String getParameter(String key)此方法试图将根据查询串中的关键字定位对应的参数并返回其值。如果有多个值则返回列表中的第一个值。如果请求信息中没有指定参数,则返回null。2)getParameterValues():public String getParameterValues(String key)如果一个参数可以返回多个值,比如复选框集合,则可以用此方法获得对应参数的所有值。如果请求信息中没有指定参数,则返回null。3)GetParameterNames():Public Enumeration getParameterNames()此方法返回一个Enumeration对象,包含对应请求的所有参数名字列表。17.2.4 HttpServletResponse接口public interface HttpServletResponse extends servletResponseservlet容器提供一个实现该接口的对象并通过service()方法将它传递给servlet。通过此对象及其方法,servlet可以修改响应头并返回结果。1)setContentType():public void setContentType(String type)在给调用者发回响应前,必须用此方法来设置HTTP响应的MIME类型。可以是任何有效的MIME类型,当给浏览器返回HTML是就是”text/html”类型。2)getWriter():public PrintWriter getWriter()throws IOException此方法将返回PrintWriter对象,把servlet的结果作为文本返回给调用者。PrintWriter对象自动把Java内部的UniCode编码字符转换成正确的编码以使客户端能够阅读。3)getOutputStream():public ServletOutputStream getOutputStream() throws IOException此方法返回ServletOutputStream对象,它是java.io.OutputStream的一个子类。此对象向客户发送二进制数据。4)setHeader():public void setHeader(String name,String value)此方法用来设置送回给客户的HTTP响应头。有一些快捷的方法用来改变某些常用的响应头,但有时也需要直接调用此方法。17.3Servlet的环境配置和运行 上一节 下一节 本章开头服务器和自建的项目,都需要合理搭建环境,作好参数配置。这里以Tomcat为例,说明子建项目中Servlet的配置和运行。17.3.1 环境说明Servlet包并不在JDK中,如果要在编译和运行Servlet,就必须把Servlet包(包含javax.servlet下各个类的定义)放到classpath下。servlet.jar (tomcat5.0后的版本是servlet-api.jar) 包可以到Tomcat的commonlib下获取。把这个jar包加到classpath下或者把这个包复制到j2sdk142libjreext下即可。在Tomcat 4下编译好了的Servlet的class文件不用配置,只要放到适当的文件夹中,就可以运行。而5.0版本以后,的Servlet需要注册,设置有关的参数,才能运行。Servlet的注册就是把Servlet的名字、class文件的存放位置、访问路径和必要的参数予以说明。用于整个网站的Servlet注册,修改Tomcat安装文件夹confweb.xml即可。一般不动这个文件,而是修改webapps下的程序模块各自的web.xml文件。Web应用程序项目或者模块的目录是有规定的。如果本章的目录是chpt17,则目录结构为:chpt17/:存放jsp、htm和html结尾的页面文件放到这里,还可自建子目录。chpt17/WEB-INF:有web.xml、taglib.tld等xml格式的文件,还有classes和lib两个子目录。chpt17/WEB-INF/classes:存放项目中jsp、htm、html页面用到的Java文件及其编译后的class文件。根据“类”中包的定义,还有相应的子目录。chpt17/WEB-INF/lib:存放项目需要访问的jar文件。WEB-INF为必须,这是j2ee的规范,每个web服务必须要有的目录,除非项目根本就不用任何自编的Java类,是纯JSP和HTML页面。 WEB-INF文件夹,由服务器(容器)控制,一般不允许用户直接访问。当服务器启动时,服务器会读取部署描述,进行初始化设置,类装载器将会装载类文件 (自动装载或访问后装载)。17.3.2 web.xml文件WEB-INF下的web.xml文件中,定义了xml的版本号,如version=1.0 ,所使用的国际标准码,如encoding=ISO-8859-1 。还有项目的初始参数、缺省的访问文件等信息。可以随便拷贝webappsjsp-examplesWEB-INF中的其他web.xml存到自己项 目文件夹的/WEB-INF/下面。然后把其中第二行开始的注释部分删掉,再把和所夹的 内容删掉,形成基本的web.xml,内容如下:现在配置本章(chpt17,假如作为一个项目)的缺省访问文件。在之前加入以下语句: exa17_2.htm index.htm index.jsp 这几句设置,意思是当IE中输入:8080/chpt17(或其他域名、IP地址输入形式)而不输入Web页文件名时,查找调用页面文件的顺序为exa17_2.htmindex.htmindex.jsp,找到那一个,就显示那一个;没有找到,就出现访问资源不存在的错误 或者列出目录下的所有文件和子目录。缺省访问文件的配置不是必需的。Servlet要在web.xml中注册了才能访问。现在举一个最简单的例子。例17-1 一个最简单Servlet,文件名ServletExamlpe.java,代码如下:package exa;import javax.servlet.http.*; public class ServletExamlpe extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException response.setContentType(text/html;charset=gb2312); PrintWriter out = response.getWriter(); out.println(); out.println(); out.println(); out.println(A simple Servlet example); out.println(); out.println(); out.println(这是一个Servlet的简单例子); out.println(); out.println(); 经过编译,按其中包的定义(package exa;)形成字节码文件ServletExample.class,放在chpt16/WEB-INF/classes/exa/中,则在web.xml中注册的语句可以写成: ServletExamlpe exa.ServletExamlpe ServletExamlpe /servexa ServletExamlpe /newunknownU 代码中,前4行是给exa下的ServletExample.class类注册,定义Servlet的名字,一般与类名相同即可。第5-8行是一次映射, 定义web中访问该类的URL。注意如果是本章的web.xml,当前的路径已经是“chpt17”,再加上“/servexa”就是“chpt17 /servexa”,Web中用:8080/chpt17/servexa就可以访问。第9-12行,又映射了一次,使 得:8080/chpt17/newunknownU 也可以访问这个Servlet。如图17-1所示,两个映射地址访问的效果是一样的。图17-1 从两个映射地址访问Servlet的效果映射访问地址只是一种形式,可以随意定义,只要第一个字符是“/”,且不与其他资源重名就可以。允许多次映射,使得资源可以用多种形式访问。17.4Sevlet处理表单提交 上一节 下一节 本章开头Servlet的重要功能是处理表单提交。第16章的学生信息录入例16-3处理表单提交时是采用JSP页面加入Java代码实现的。由于HTML与 Java夹杂,逻辑、代码可读性和复用性方面都受到影响。本着面向对象的设计原则,应当采用纯Java语言的Servlet实现。例17-2,Servlet处理学生信息录入信息。文件名为StudentInput_do.java,代码如下。package exa;import java.sql.*;import java.util.*;import javax.naming.Context;import javax.naming.InitialContext;import javax.sql.DataSource;import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class StudentInput_do extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException response.setContentType(text/html;charset=gb2312); String studentId=request.getParameter(studentId); String studentName=new String(request.getParameter(studentName).getBytes(iso-8859-1); String sex=new String(request.getParameter(sex).getBytes(iso-8859-1); String studentPwd=request.getParameter(studentPwd); String classId=request.getParameter(classId); if(studentPwd.length()=0) studentPwd=studentId; PrintWriter out = response.getWriter(); try Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver).newInstance(); String url=jdbc:microsoft:sqlserver:/:1433;DatabaseName=studadmin; String user=web; String password=prog; Connection conn= DriverManager.getConnection(url,user,password); PreparedStatement stmt=conn.prepareStatement(insert into studentInfo values(?,?,?,?,?,?,?); stmt.setString(1,studentId); /这7句送入参数 stmt.setString(2,studentName); stmt.setString(3,studentPwd); stmt.setString(4,sex); stmt.setString(5,classId); stmt.setInt(6,0); stmt.setString(7,null); stmt.executeUpdate(); stmt.close(); conn.close(); out.println(已成功录入一条记录); catch(Exception e) out.println(数据库操作出现错误,录入不成功!); e.printStackTrace(); 编译后,在chpt16/WEB-INF/web.xml文件中加入StudentInput_do.class的注册信息: StudentInput_do exa.StudentInput_do StudentInput_do /studentInput_do 将第16章的exa16_3.jsp拷贝到本章文件夹chpt17下,重命名为exa17_2.jsp,并把表单中action=exa16_3.jsp改为action=studentInput_do。运行exa17_2.jsp,得到的结果与上一章相同。如果将exa17_2.jsp中表单的method=”GET”改为method=”POST”,再运行一次,结果就会出错。因为上述Servlet只写 了doGet方法,只能处理get方式的请求,没有写doPost方法,不能处理POST方式的请求。最简单的解决办法就是把上述Servlet中的 “doGet”方法改成“doPost”,重新编译,或者再加一个方法doPost,把上述doGet方法中的全部代码都拷贝过来,再重新编译。实际上不 必这样重复写那么多。只需在StudentInput_do类中加一个方法doPost,在其中写一行doGet()调用上面的doGet()方法就可以 了,即:public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request,response); 经过这样处理(文件另存为了StudentInput_do1.java)的Servlet,不管表单是GET还是POST方式请求都可以处理了。在 web.xml中注册StudentInput_do1.class,把exa17_2.htm中form的action指定为 studentInput_do1,不管method是GET还是POST,都能完成提交处理。请读者自己试一试。17.5Sevlet的初始化参数配置 上一节 本章开头Servlet引擎载入Servlet后,Servlet引擎必须调用Servlet的init()方法对Servlet进行初始化。初始化的目的是为了 让 Servlet 对象在处理客户请求前完成一些初始化工作,如初始化JDBC的连接、获取配置信息、读取其他固定存储的数据以及建立与其他资源的连接。对于每一个 Servlet实例,init()方法只能被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfit对象从web 应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出异常来通知容器。例17-2将数据库url、驱动程序、用户名和密码这四个建立连接的要素全部都写入了Servlet,如果改变其中任何一项,就必须修改Servlet源代码,并重新编译。若使用初始化参数配置的方法,就可避免上述问题。下面就这个例子进行改进。例17-3 使用初始化参数建立数据库连接。先修改web.xml,加入连接数据库的相关参数,然后修改例17-2的StudentInput_do1.java文 件,另存为StudentInput_do2.java,类名也相应地改为StudentInput_do2,使之通过获取初始化参数建立连接。在web.xml中加入以下代码,注册和配置初始化参数: StudentInput_do2 exa.StudentInput_do2 DRIVER com.microsoft.jdbc.sqlserver.SQLServerDriver URL jdbc:microsoft:sqlserver:/:1433;DatabaseName=studadmin USER web PASSWORD prog servlet-mapping servlet-nameStudentInput_do2 /studentInput_do2上述代码配置了DRIVER、URL、USER和PASSWORD四个连接数据库的要素。这样就可以在Servlet中调用这些参数。处理表单提交的StudentInput_do2.java代码为:package exa;import java.sql.*;import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class StudentInput_do2 extends HttpServlet String driver;/定义4个初始化参数 String url; String password; String user; public void init()throws ServletException /获取初始化参数 driver=getInitParameter(DRIVER); password=getInitParameter(PASSWORD); url=getInitParameter(URL); user=getInitParameter(USER); public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException response.setContentType(text/html;charset=gb2312); / request.setCharacterEncoding(gb2312); String studentId=request.getParameter(studentId); String studentName=new String(request.getParameter(studentName).getBytes(iso-8859-1); String sex=new String(request.getParameter(sex).getBytes(iso-8859-1); String studentPwd=request.getParameter(studentPwd); String classId=request.getParameter(classId); if(studentPwd.length()=0)

温馨提示

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

评论

0/150

提交评论