




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Servlet的概念、配置与运行 Java Servlet的概念Java Servlet是一个专门用于编写网络服务器应用程序的Java组件。所有基于Java的服务器端编程都是构建在Servlet之上的。在J2EE中Servlet已经是一个标准的组件。了解Servlet在Java的软件包中是怎样的一个结构,这会有助于我们理解Servlet的概念。在J2EE中跟Servlet相关的一个包是javax.servlet,其中最基本的Servlet被声明为一个接口javax.servlet: Interface Servlet,这是Servlet最高层次的一个抽象,它是和网络协议无关的。同样在javax.servlet中,实现了一个类 javax.servlet: class GenericServlet,这个类实现了Servlet接口,也是和协议无关的。而这个类是构建其他和协议相关的Servlet子类型的通用的父类(至少HttpServlet是从它继承而来的,从它的名字也能看出这一点)。也就是说Servlet所适用的网络协议可以是多种多样的,比如HTTP,FTP,SMTP,TELNET等,但是就目前而言,只有HTTP服务已经形成了标准的Java组件。对应的软件包有两个javax.servlet.http和javax.servlet.jsp,分别对应我们要讲解的Servlet和JSP编程。我们通常所说的Servlet编程主要就是指针对HTTP的Servlet编程,用到的就是javax.servlet.http包中的类(典型的就是HttpServlet类),实际上Java Servlet编程的概念要更广一些,在这里我们也就约定俗成的使用Servlet来指代HTTP Servlet的编程,这点你是需要了解的。由于JSP最终都是要经过JSP引擎转换成Servlet代码的,而且Servlet编程和一般的Java编程是没有大的区别的,只需要了解一定的规范即可,所以我们在这里先讲解Servlet的编程,这样对以后理解JSP是很大的有好处的,尽管在使用的时候可能JSP更为简单一些。目前,Servlet引擎一般是第三方的插件,它通过一定的方法连接到Web服务器,Servlet引擎把它识别为Servlet请求的那些HTTP请求截获下来处理,而其他的HTTP请求由Web服务器按照通常的方式来处理,Servlet引擎会装载合适的Servlet到内存中,如果Servlet还没有运行的话,会分配一个可以使用的线程来处理请求,再把Servlet的输出返回到发出请求的Web客户机。Java Servlet和Java Applet正好是相对应的两种程序类型,Applet运行在客户端,在浏览器内执行,而Servlet在服务器内部运行,通过客户端提交的请求启动运行,你在学习过程可以作简单的比较。使用过CGI的话一定知道CGI程序的作用,Servlet要实现的功能和CGI是一样的,只是实现的时候更为方便,效率更高。Servlet的优点和应用范围由于Servlet是用Java编写的,所以它与生俱来就有跨平台的特性,因此Servlet程序的设计完全和平台是无关的,同样的Servlet完全可以在Apache,IIS等不同Web服务器上执行,不管底层的操作系统是Windows,Solaris,Mac,Linux还是其他的能支持Java的操作系统。Servlet是跟普通的Java程序一样,是被编译成字节码后由JVM执行的。相比传统的CGI,尽管CGI是用本地代码直接执行的,但是由于每次客户端发出请求,服务器必须启动一个新的程序来处理请求,这就把高负载强加给了服务器资源,尤其如果CGI使用脚本语言编写时,如perl,服务器还必须启动语言解释程序,程序越多,占用的内存就越多,消耗CPU也越多,严重影响系统性能。Servlet运行于Servlet引擎管理的Java虚拟机中,被来自客户机的请求所唤醒,与CGI不同的是,在虚拟机中只要装载一个Servlet就能够处理新的请求,每个新请求使用内存中那个Servlet的相同副本,所以效率比CGI来得高。如果采用服务器端脚本,如ASP,PHP,语言解释程序是内置程序,因此可以加快服务器的运行,但是效率还是比不上准编译的Servlet。实际的使用也已经证明,Servlet是效率很高的服务器端程序,很适合用来开发Web服务器应用程序。Java Servlet有着十分广泛的应用。不光能简单的处理客户端的请求,借助Java的强大的功能,使用Servlet还可以实现大量的服务器端的管理维护功能,以及各种特殊的任务,比如,并发处理多个请求,转送请求,代理等。Servlet的运行环境为了运行Servlet,首先当然需要一个JVM来提供对Java的基本支持,一般需要安装JRE(Java Runtime Environment)或JDK(Java Develop Kit,JRE是其一个子集)。其次我们需要Servlet API的支持,一般的Servlet引擎都自带Servlet API,只要我们安装Servlet引擎,或直接支持Servlet的Web服务器之后便会自动安装上Servlet相关的程序包。典型的Servlet运行环境有JSWDK,Tomcat,Resin等,这几个都是免费的软件,适合用来学习Servlet和JSP。它们都自带一个简单的HTTP Server,只需简单配置即可投入使用,你也可以把它们绑定到常用的Web服务器上,如Apache,IIS等,提供小规模的Web服务。还有一些商业的大中型的支持Servlet和JSP的Web服务器,如JRun,Web Sphere,Web Logic等等,配置比较复杂,但是功能较为强大,有条件的可以一试。后面会讲解如何配置一简单的支持Servlet和JSP的Web服务器。Servlet与CGI环境变量在使用CGI时,最重要的内容是CGI接口的环境变量。CGI规范列出了19个环境变量。尽管其他的环境变量,如HTTP_COOKIE(用于查询站点信息的)不是该规范的组成部分,但也是经常使用。由于Java运行于JVM,不直接在服务器上运行,所以不能直接访问环境变量。由于CGI环境变量是Web服务器建立的,而且用户能够用其他的方法查询变量值,所以Java不访问环境变量没有什么大问题。Java Servlet API定义几种查询在CGI环境变量中发现大多数信息的方法。有些信息是HTTP标题的组成部分,而且采用HttpServletRequest类中的getHeader()方法能够很容易的获取。采用特殊的方法可以查询其他的信息。Java唯一不可用的CGI环境变量是GATEWAY_INTERFACE。当在CGI程序中使用时,该变量包含CGI版本。在Java Servlet中这种变量信息是无关紧要的。以上的内容是针对有CGI编程经验的你的,通过对比能帮助更快的理解Servlet。Servlet的安全性Java Servlet能够使用包括SSL在内的安全协议。Servlet与Java内在的安全措施紧密相连,如不能直接访问内存等。采用安全管理器,用户能够限定对其他资源的访问,如文件、目录和局域网。Java Servlet支持代码符号,从而能够更好的控制委托每个Servlet要执行的程序。Java的安全机制本身是比较复杂的,在这里我们只能作简单讲解,具体的分析参看有关Java安全性的技术资料。Servlet的管理对于大多数用户来说,Servlet比CGI程序和服务器脚本更容易管理。Servlet是以Java类的形式编译的。Java采用能够保存在Java Archive(.JAR)文件中的编制目录树内的组件,提供一种管理类的方法,如Sun公司的Java Web服务器的Servlet管理平台。有些服务器和第三方产品为管理Servlet提供图形用户界面。具体的Servlet的管理是比较复杂的一件事情,尤其是对于一个大系统而言。对于初学者只要能掌握基本的配置一个Servlet,使其能正常运行的技能就可以了。更高级的技巧要在更多的实践中才能真正掌握。Servlet的编译Servlet的编译和一般的Java程序是完全一样的,在使用javac编译的时候不需要任何特殊的参数。只要Servlet的编写是正确的,编译完后生成的Class文件就可以做为Servlet来运行了。用Servlet Runner运行Servlet在真正开始编写Servlet之前,我们先介绍一个简单的Servlet引擎-Resin。目前支持Servlet的Web服务器不下数十种,Resin是一个简单易用的Servlet运行器(Servlet Runner),很适合初学者。由于各个厂家的Servlet引擎各不相同,配置方法也是千差万别,在这里不可能一概而论,但是Servlet的编写方法却是一样的,所以你不必太在意服务器的配置方法,只要知道如何让自己的Servlet正常运行就可以了,把更多的注意力放在Servlet的编写上。Resin自带一个Servlet Runner和HTTP Server,因此要构建一个简单的Web环境,光有Resin已经足够了,不需要额外的支持软件。Resin不需要安装,解压之后即可使用。Resin目录下有几个子目录,bin目录存放的是可执行文件,要启动HTTP Server和Servlet Runner只需要分别点击其中的httpd.exe和srun.exe即可,启动后会出现四个窗口,分别对应HTTP Server的标准输出,启/停控制和Servlet Runner的标准输出,启/停控制。conf目录下存放的是Resin Servlet Runner的配置文件,这是配置整个Web环境的关键,包括Servlet的配置和后面要用到的JSP的配置。doc目录是默认的发布目录,即Resin自带的HTTP Server是以这个目录为根目录的。下面我们以一个最简单的HelloWorld的例子,来讲解如何配置Resin,使其能运行Servlet程序,同时也做为Servlet编写的入门。程序如下:/HelloServlet.javaimport java.io.*;import java.util.*;import javax.servlet.http.*;import javax.servlet.*;/导入必要的包public class HelloServlet extends HttpServlet /所有Servlet必须从HttpServlet派生public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException /doGet()是这个Servlet的核心,真正处理请求的地方res.setContentType(text/html); /设置相应的类型为text/htmlPrintWriter pw = res.getWriter(); /从HttpServletResponse得到输出流pw.println();pw.println();pw.println();pw.println();pw.println(Hello, world!);pw.println();pw.println();pw.println(Hello, world!);pw.println();/上面的语句都是向客户端打印HTML文本pw.close(); /关闭HttpServletResponse,使Web服务器知道相应结束public HelloServlet() /构造函数,可以不要这是最简单的一个Servlet程序,整个类从HttpServlet派生,就跟Applet一样,这个派生关系是必须的。这个Servlet必须实现doGet()方法(因为它是作为静态页面通过地址访问的,这种方式在HTTP中称为GET请求,在后面还会有更具体的讲解),这是这个Servlet真正处理请求的地方,是整个Servlet的主体,就跟线程体的run()方法一样。doGet()有两个参数HttpServletRequest req和 HttpServletResponse res。HttpServletRequest包含了客户请求的各种信息,HttpServletResponse则包装了服务器响应,主要处理对客户机的输出。这个程序是很简单的,如果对网络编程和HTML有一些概念的话,很容易就应该能理解。通过javac对以上程序进行编译,我们可以得到HelloServlet.class,下面我们就通过配置Resin来运行这个Servlet。前面说过如果你没有修改过Resin的配置文件的话,doc是Resin默认的发布目录。发布目录下的WEB_INF/classes是Resin默认的Classpath,你只要把自己的Servlet拷贝到该目录下,Resin就能识别,当然只要拷贝的有效的系统的或用户的Classpath下,Resin都是能够找到的。我们把HelloServlet.class拷贝到WEB_INF/classes目录下。接下来就需要修改conf目录下的resin.conf文件,来配置我们的Servlet。你可以使用任何一种自己所熟悉的文本编辑器来打开该配置文件。找到,在它和 之间任何地方添加以下的配置语句(可以参考已有的语句)这样当客户端产生/Hello请求的时候,Resin就能把这个请求定向到HelloServlet上,该Servlet就能正常运行了,我们也可以采用以下的配置语句这种情况下,没有对Servlet的名字进行映射,系统会默认的使用servlet-name作为servlet-class进行类的查找,所以servlet-name必须填写正确的类名,而不能是随意的名字。关于Resin更多的配置信息,有兴趣的你可以参考Resin的帮助文档,这里就不再赘述了。下面我们启动Http Server和Servlet Runner(通过双击bin下的httpd.exe和srun.exe)。这样我们就可以通过浏览器访问这个Servlet了。打开浏览器,比如IE,在地址栏键入http:/localhost:8080/Hello,我们可以打开如下的一个网页:通过查看源码,我们可以得到如下的结果Hello, world!Hello, world!很显然这些文本正是我们在Servlet中向客户端所打印的信息,在Http头部content=text/html也是我们在程序中所设置的。通过这样一个简单的HelloWorld的程序,你对Servlet的工作原理的基本配置方法应该有了一个大概的了解。Servlet的应用实例Servlet在编写Web应用方面的具体应用。Servlet与表单交互的方法表单是HTML中使用最广泛的传递信息的手段。搞清楚Servlet与表单的交互,就在客户端与服务器之间架起了一座桥梁。Servlet使用HttpServlet类中的方法与表单进行交互。在HttpServlet类中有几个未完全实现的方法,你可以自己定义方法的内容,但是必须正确使用方法名称以使HTTP Server把客户请求正确的映射到相应的函数上。doHeader 用于处理HEADER请求doGet 用于处理GET请求,也可以自动的支持HEADER请求doPost 用于处理POST请求doPut 用于处理PUT请求doDelete 用于处理DELETE请求HttpServlet的Service方法,当它接收到一个OPTIONS请求时,它会自动调用doOptions方法,当接收到一个TRACE请求时调用doTrace。DoOptions默认执行方式是自动决定什么样的HTTP被选择并返回哪个信息。在使用这些方法时必须带两个参数。第一个包含来自客户端的数据HttpServletRequest。第二个参数包含客户端的相应HttpServletResponse。在我们的第一个例子中使用的是doGet方法,因为通过地址访问的话,对应的方式是GET。一个HttpServletRequest对象提供请求HTTP头部数据,也允许获取客户端的数据。怎样获取这些数据取决于HTTP请求方法。不管何种HTTP方式,都可以用getParameterValues方法返回特定名称的参数值。 对于HTTP GET请求的方式,getQueryString方法将会返回一个可以用来解剖分析的参数值。对于用HTTP POST,PUT和DELETE请求的方式,HttpServletRequest有两种方法可以选择:如果是文本数据,你能通过getReader的方法得到BufferedReader获取数据;如果是二进制数据,可以通过getInputStream方法得到ServletInputStream获取数据。为了相应客户端,一个HttpServletResponse对象提供返回数据给用户的两个方法:一种是用getWriter方法得到一个PrintWriter,用于返回文本数据;另一种方法是用getOutputStream方法得到ServletOutputStream,用于返回二进制数据。在使用Writer或OutputStream之前应先设置头部(HttpServletResponse中有相应的方法),然后用Writer或OutputStream将相应的主体部分发给用户。完成后要关闭Writer或OutputStream以便让服务器知道相应已经结束。下面我们举一个使用HttpServletRequest和HttpServletResponse得到并打印客户端信息的例子:/RequestInfo.javaimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class RequestInfo extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException /处理GET请求的方法response.setContentType(text/html); /先设置Header,在这里只设置ContentType一项PrintWriter out = response.getWriter(); /得到文本输出Writer/下面打印相关的HTMLout.println();out.println();out.println(Request Information Example);out.println();out.println();out.println(Request Information Example);out.println(Request URI: + request.getRequestURI()+); /打印请求的路径out.println(Protocol: + request.getProtocol()+); /打印协议名称out.println(PathInfo: + request.getPathInfo()+); /打印额外的路径信息out.println(Remote Address: + request.getRemoteAddr(); /打印客户机的地址,如果没有打印IP地址out.println();out.println();out.close(); /关闭Writer public void doPost(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException/如果是POST请求类型,同样调用GET类型的响应函数doGet(request, response);用我们在前面介绍的方法在Resin中配置使其运行,我们得到的结果如下:这样的一个例子很好的说明了所谓的动态网页和静态网页的区别,就上面这个例子而言,每个客户看到的内容是不一样的,而静态网页则对每一个客户而言都是一成不变的。Servlet与表单交互的例子上面我们介绍了Servlet如何与表单进行交互,并提供了一个从HTTP请求头部得到客户端信息的例子,下面我们给出一个Servlet与HTTP提交的表单进行交互的例子,通过这个例子你应该能对整个客户端和服务器端交互的过程有一个整体的了解。这个例子分成两个文件,一个是静态的HTML文件,提供一个表单,并设置提交按钮,表单被提交后,服务器会把它定向到另一个文件,也就是我们的Servlet,由它读取表单并打印到客户端。1. 静态HTML文本:ourform.htmlOur FormOur Form姓名:性别:男女在IE下显示效果如图所示:不熟悉HTML的你可以参考有关HTML的书籍,尤其要注意的form的两个属性method和action2. FormDemo.java/FormDemo.javaimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class FormDemo extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException /处理GET请求的方法response.setContentType(text/html); /先设置Header,在这里只设置ContentType一项PrintWriter out = response.getWriter(); /得到文本输出WriterString name = request.getParameter(Name); /得到表单值NameString sex = request.getParameter(Sex); /得到表单值Sexname = new String(name.getBytes(),ISO-8859-1); /转换到正确的编码/打印得到的表单值out.println();out.println();out.println();out.println(Your Info);out.println();out.println();out.println(Data You Posted);out.println();out.println();out.println(new String(new String(你的姓名:).getBytes(),ISO-8859-1);out.println(+name+);out.println();out.println();out.println(new String(new String(你的性别:).getBytes(),ISO-8859-1);out.print();if(sex.equals(1) out.println(new String(new String(男).getBytes(),ISO-8859-1);else out.println(new String(new String(女).getBytes(),ISO-8859-1);out.println();out.println();out.println();out.println();out.close(); /关闭Writer这个Servlet也是比较简单的,首先从提交的表单中得到需要的两个值,然后用HTML向客户端打印这些信息。值得注意的是,在这个例子中,所有出现打印中文的地方,我们都使用了字符编码的转换来正确打印中文。前面的例子我们都没有涉及中文,在这里我们有必要提一下Servlet的中文问题。我们知道在同一台机器上,所有的编码方式都是一样的,一般中文平台是gb2312,英文平台是ISO-8859-1,但是网络上的两台机器并不能保证他们的编码方式都是一样的,这时候就有可能出现乱码的问题。在进行HTTP网络传输的时候,统一采用的编码方式是ISO-8859-1,这时候如果还是按照本地编码来传输就会出现问题,这也是Servlet在实现网络传输的时候一个不完美的地方,它不会自动进行本地编码到ISO-8859-1的转换,所以直接打印的话就会出现乱码。原理上讲任何出现打印字符串的地方,都是需要进行编码转换的,但是西文字符在不同字符集下对应相同的编码,以在打印西文字符的时候就不需要转换了。在Servlet后继的规范中可能会改变这种麻烦的状况。不同的是,从网络提交的表单数据,Servlet是自动把它转换成本地编码的,所以程序中得到的name字符串变量是gb2312编码的,同样需要进行转换后才能在客户端正确打印。字符编码转换常用的方法是String native_encoded = 中文字符串; /本地编码的字符串Byte byte_array = native_encoded.getBytes(); /得到本地编码的字节数组String net_encoded = new String(native_encoded, ISO-8859-1); /生成ISO-8859-1编码的字符串这样得到的net_encoded字符串就可以用来向客户端打印而不出错了。还有一点要注意的是,为了在客户端正常显示中文,必须在HTML头部设置charset=gb2312。当我们按下提交按钮后,我们得到的结果如下:如果我们把ourform.html中的method由GET改成POST,会有什么样的结果呢?由于我们没有重写doPost方法,所以在Resin下,我们得到如下的结果:有兴趣的你可以修改FormDemo类来响应POST方法。通过以上的几个例子,你对Servlet如何响应HTTP请求,并从提交的表单中获取数据应该有了一个大概的了解,但是要构建Web应用程序,光有这几点是不够的,下面我们要讲解的Servlet的会话和生命周期对于构建Web应用是及其重要的两个特性。用Servlet控制会话会话状态的维持是开发Web应用所必须面对的问题,有多种方法可以来解决这个问题,如使用Cookies,hidden类型的表单域,或直接把状态信息加到URL中等,还有Servlet本身提供了一个HttpSession接口来支持会话状态的维持,在这里我们主要介绍基于这个接口的会话状态的管理。Session的发明是为了填补HTTP协议的局限。请注意HTTP协议是如何工作的-用户发出请求,服务器作出响应,这种用户端和服务器端的联系就是离散的,非连续的。HTTP协议不能提供允许服务器跟踪用户请求的功能。在服务器端完成响应用户的请求之后,服务器不能继续与该浏览器继续保持连接。从服务器这端来看,每一个请求都是独立的,因此HTTP协议被认为是无状态协议,当用户在多个主页间切换时,服务器无法知道他的身份。Session的出现就是为了弥补这个局限。利用Session,您就可以当一个用户在多个主页间切换的时候也能保存他的信息。这样很多以前根本无法去做的事情就变得简单多了。在访问者从到达某个特定的主页到离开为止的那段时间,每个访问者都会单独获得一个Session。Java Servlet定义了一个HttpSession接口,实现的Session的功能,在Servlet中使用Session的过程如下:(1) 使用HttpServletRequest的getSession方法得到当前存在的session,如果当前没有定义session,则创建一个新的session,还可以使用方法getSession(true)(2) 写session变量。可以使用方法HttpSession.setAttribute(name,value)来向Session中存储一个信息。也可以使用HttpSession.putValue(name,value),但这个方法已经过时了。(3) 读Session变量。可以使用方法HttpSession.getAttribute(name)来读取Session中的一个变量值,如果name是一个没有定义的变量,那么返回的是null。需要注意的是,从getAttribute读出的变量类型是Object,必须使用强制类型转换,比如:String uid = (String) session.getAttribute(uid);也可以使用HttpSession.getValue(name),但是这个方法也已经过时了。(4) 关闭session,当时用完session后,可以使用session.invalidate()方法关闭session。但是这并不是严格要求的。因为,Servlet引擎在一段时间之后,自动关闭seesion。下面举一个简单的例子说明session的使用/ SessionExample.javaimport java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;/导入必要的软件包public class SessionExample extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException /实现doGet方法response.setContentType(text/html); /设置HTTP头PrintWriter out = response.getWriter(); /得到输出WriterHttpSession session = request.getSession(true); /得到session对象/打印HTML标记out.println();out.println();out.println();out.println();out.println();Date created = new Date(session.getCreationTime(); /得到session对象创建的时间Date accessed = new Date(session.getLastAccessedTime();/得到最后访问该session对象的时间out.println(ID + session.getId()+); /得到该session的id,并打印out.println(Created: + created+);/打印session创建时间out.println(Last Accessed: + accessed+); /打印最后访问时间session.setAttribute(UID,12345678); /在session中添加变量UID=12345678session.setAttribute(Name,Tom); /在session中添加变量Name=TomEnumeration e = session.getAttributeNames(); /得到session中变量名的枚举对象while (e.hasMoreElements() /遍历每一个变量String name = (String)e.nextElement(); /首先得到名字String value = session.getAttribute(name).toString(); /由名字从session中得到值out.println(name + = + value+); /打印out.println(); /打印HTML标记out.println();该Servlet运行的结果是:有了Session对象,Web应用程序就可以在服务器端保存客户的状态,这对构建Web应用的重要性你在以后的实践中会逐步有所体会。正像前面提到的,Session只是一个概念,可以有多种实现方法,在这里我们就不过多的介绍了。因为Servlet本身就是实用性很强的内容,各种各样的技巧,实现方案,不胜枚举。而且很多相关内容也不只是Servlet的专利,在这里只能做简单的介绍,使你对Servlet有一个概念上的认识。有兴趣的话可以参考相关资料。Servlet的生命周期跟客户端的Applet相似,Servlet(这里Servlet的概念又回到了最原始的含义)也遵循严格的生命周期。在每个Servlet实例的生命中有三种类型的事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法:1init()。当Servlet第一次被装载时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁德2025年福建福鼎市卫生健康局招聘33人笔试历年参考题库附带答案详解-1
- 天津2025年天津市机电工艺技师学院事业单位招聘8人笔试历年参考题库附带答案详解
- 佛山2025年广东佛山顺德区公立医院招聘高层次人才40人笔试历年参考题库附带答案详解
- 科技与家居装饰的完美结合
- 安全员工作总结
- 大学生毕业实习总结
- 2025年度企业文化建设与员工凝聚力提升合同4篇
- 秋学期幼儿园工作计划
- 小区保安工作计划报告范文
- 小学少先队年度工作总结
- Unit 3 Environmental Protection Reading and Thinking 选择性必修第三册
- 小学道德与法治课堂教学中提升学生核心素养策略
- 中水回用项目可行性研究报告
- 基于主题式教学法的初级汉语综合课《我的低碳生活》教学设计
- 微信公众号运营及推广合同
- 2025年浙江长兴文旅集团招聘笔试参考题库含答案解析
- 医院临床科研大数据平台方案
- 2024年北京市中考生物真题卷及答案解析
- 2023年凉山州西昌市人民医院招聘卫生专业技术人员考试真题
- (2024)湖南省公务员考试《行测》真题卷及答案解析
- 2025年部编教材的网络培训心得体会
评论
0/150
提交评论