版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaWeb开发技术3.6Servlet的高级特性与应用1本讲聚焦Servlet高级特性:会话管理:通过Cookie(客户端)和Session(服务器端)实现用户状态跟踪,对比两者的存储机制、安全性和适用场景;过滤器(Filter):拦截请求与响应,实现统一编码处理、访问控制和日志记录,支持web.xml和注解配置;监听器(Listener):监听域对象的生命周期和属性变化,触发初始化、销毁或状态变更逻辑,增强应用的可观测性和事件响应能力。主要内容3.6.1Servlet的会话管理与Cookie应用
在当今的Web开发领域,会话管理是确保网站安全性和个性化用户体验的关键部分。在这个领域,Cookie和Session是两个核心概念,它们在用户状态管理和信息存储方面发挥着关键作用。Cookie和Session3.6.1Servlet的会话管理与Cookie应用Cookie是一小段存储在客户端浏览器的文本信息。它由服务器在HTTP响应的Set-Cookie头部中发送给浏览器,并被客户端保存,并在后续的HTTP请求中发送回服务器。通常情况下,它被用来跟踪用户的状态、记录用户的偏好和实现购物车等功能。Cookie通常包括:名字、值、过期时间、路径、域和安全等属性。01什么是Cookie浏览器和服务器之间传递Cookie的过程可参考图3-16。02Cookie的工作原理Cookie对象图3-16浏览器和服务器之间传递Cookie的过程3.6.1Servlet的会话管理与Cookie应用
当用户首次访问网站时,服务器端如果检测到访问请求中并未携带Cookie信息,服务器端会生成一个包含信息的Cookie,并将其放置在HTTP响应的Set-Cookie头部中。HTTP响应将包含这些Cookie信息,并发送到用户的浏览器。浏览器会将这些Cookie保存在本地。浏览器接收到Cookie后,将其存储在本地的Cookie数据库中,通常是在内存或硬盘中。每次用户浏览器再次请求与该网站相关联的URL时,浏览器都会自动在请求头中携带相应的Cookie信息。服务器接收到请求后,会解析其中的Cookie数据,并据此处理用户的会话、状态或其他需求。Cookie对象3.6.1Servlet的会话管理与Cookie应用CookieAPI方法说明描述Cookie(String
name,
String
value)实例化Cookie对象,传入cooke名称和cookie的值public
String
getName()取得Cookie的名字public
String
getValue()取得Cookie的值public
void
setValue(String
newValue)设置Cookie的值public
void
setMaxAge(int
expiry)设置Cookie的最大生存时间(以秒为单位)。如果设置为正数,则表示Cookie的有效期;如果设置为0,则表示删除Cookie;如果设置为负数,则表示Cookiet仅在当前会话期间有效(即浏览器关闭时Cookie失效)publicintgetMaxAge()获取Cookies的有效期publicvoidsetPath(String
uri)设置cookie的有效路径,这决定了哪些路径下的请求会携带该Cookie。如果设置为/,则表示对整个网站有效。public
String
getPath()获取cookie的有效路径publicvoidsetComment(Stringpurpose)获取/设置Cookie的注释publicStringgetComment()
获取/设置Cookie的注释publicvoidsetDomain(Stringpattern)设置cookie的有效域publicStringgetDomain()获取cookie的有效域为了方便操作Cookie,Servlet中提供了用于操作Cookie对象的接口和类的方法集合,它提供了创建、发送、接收、修改和删除Cookie的功能。具体的内容如表3-14所示。表3-14Cookie类常用的方法3.6.1Servlet的会话管理与Cookie应用案例演示@WebServlet(name="ServletCookie",value="/ServletCookie")publicclassServletCookieextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Cookiecookie=newCookie("name","Student");cookie.setComment("thisisusername");cookie.setDomain("localhost");cookie.setMaxAge(60);cookie.setSecure(false);response.addCookie(cookie);}}(1)在ch03目录中新建session目录,并在其中编写ServletCookie类,这个Servlet类中调用了Cookie类常用的方法用于设置Cookie,ServletCookie类代码如下。3.6.1Servlet的会话管理与Cookie应用案例演示@WebServlet(name="ServletReadCookie",value="/ServletReadCookie")publicclassServletReadCookieextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Cookie[]cookies=request.getCookies();for(Cookiecookie:cookies){Stringname=cookie.getName();Stringvalue=cookie.getValue();PrintWriterout=response.getWriter();out.println(name+":"+value);}}}(2)在session目录中编写ServletReadCookie类,这个Servlet类中调用了Cookie类常用的方法用于读取Cookie,ServletReadCookie类代码如下。3.6.1Servlet的会话管理与Cookie应用案例演示(3)在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ch03/ServletCookie,用于设置Cookie的内容,显示效果如图3-17所示。图3-17ServletCookie的运行结果(4)在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ch03/ServletReadCookie,用于读取Cookie的内容,显示效果如图3-18所示。图3-18ServletReadCookie的运行结果
会话(Session)是什么?除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,它提供了一种持久性的用户体验,使得用户在浏览网站时能够方便地进行交互和使用各种功能。Session的工作原理当用户首次访问Web应用时,Web应用会自动生成一个Session。Session是服务端的一块内存区域,这块内存会分配一个唯一的id,叫做sessionId。每当服务端创建一个session的时候,服务端就会将这个session所对应的sessionId写入到Cookie中,并发送给前端。以后当用户访问Web应用中的页面时,浏览器会自动将Cookie中的Sessionid发送给服务器端。服务端每次解析出来这个sessionId之后,根据这个sessionId就能找到对应的内存区域(session对象),据此,服务端就能将多个联系到一起。当用户关闭浏览器,Session或者SessionID就会被销毁,表示用户本次会话结束。SessionAPI由于Session是与每个请求消息紧密相关的,因此,在HTTPServletRequest中定义了用于获取Session对象的getSession方法,该方法两种重载形式:publicHttpSessiongetSession(booleancreate);publicHttpSessiongetSession();0103023.6.1Servlet的会话管理与Cookie应用0207Session对象3.6.1Servlet的会话管理与Cookie应用SessionAPI方法声明描述StinggetId()用于返回与当前HttpSession对象关联的会话标识号longgetCreationTime()返回Session创建的时间。这个时间是创建Session的时间与1970年1月1日0时0分0秒之间时间差的毫秒标识形式longgetLastAccessedTime()返回客户端最后一次发送与Session相关请求的时间。如上voidsetMaxInactiveInterval(intinterval)用于设置当前HttpSession对象可空闲的以秒为单位最长的时间,也就是修改当前会话的默认超时间隔booleaisNew()判断当前HttpSession对象是否是新创建的voidinvalidate()用于强制使Session对象无效ServletContextgetServletContext()用于返回当前HttpSession对象所书序的Web应用程序对象,即代表当前Web应用程序的ServletContext对象voidsetArribite(Stringname,Objectvalue)用于将一个对象与一个名称关联后存储到当前的HttpSession对象中StringgetArribute()用于从当前HttpSession对象中返回指定名称的属性对象voidremoveAttribute(Stringname)用于从当前HttpSession对象中删除指定名称属性
其中第一个getSession()方法根据传递的参数判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时返回新的HttpSession,否则不创建。第二中方法getSession()相当于第一个方法参数为true的情况。
要想使用HttpSession对象,除了获取HttpSession对象外,还需要知道HttpSession接口中的相关方法。HttpSession接口中的常用方法如表3-15所示。表3-15HttpSession接口常用的方法3.6.1Servlet的会话管理与Cookie应用案例演示@WebServlet(name="ServletSession",value="/ServletSession")publicclassServletSessionextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");HttpSessionsession=request.getSession();session.setAttribute("value","Session的内容");StringsessionId=session.getId();Objectvalue=session.getAttribute("value");if(session.isNew()){PrintWriterout=response.getWriter();out.print("session创建成功,session的id是:"+sessionId);out.println("<br/>");out.print("session的value是:"+value);}else{PrintWriterout=response.getWriter();out.print("服务器已经存在该session了,session的id是:"+sessionId);out.println("<br/>");out.print("session的value是:"+value);}}}(1)在session目录中编写ServletSession类,这个Servlet类中调用了HttpSession接口常用的方法,ServletSession类代码如下3.6.1Servlet的会话管理与Cookie应用案例演示单击此处输入你的正文,请尽量言简意赅的阐述观点,以便观者可以准确理解您所传达的信息关键字单击此处输入你的正文,请尽量言简意赅的阐述观点,以便观者可以准确理解您所传达的信息关键字(3)在IDEA中启动Tomcat服务器,显示效果如图3-20所示。
(4)刷新页面,显示效果如图3-21所示。图3-20ServletSession的运行结果(2)参考图3-19,选择【Run】->【EditConfigurations】,在其中【URL】填入地址http://localhost:8080/myJavaWeb_war/ServletSession,然后单击【OK】。这个主要是session在首页加载的时候已经产生,新的session必须放在第一个访问的网址。图3-19设置Tomcat服务器打开的首地址图3-21ServletSession刷新页面运行结果3.6.1Servlet的会话管理与Cookie应用当用户访问网站时,服务器可以通过HTTP响应头将Cookie发送给客户端,客户端会将Cookie存储起来,然后在后续的请求中将其发送给服务器。由服务器端创建,可以设置过期时间。
当用户访问网站时,服务器会创建一个唯一的会话ID,并将该ID存储在Cookie中返回给客户端。然后,服务器会使用该会话ID在服务器端存储或检索相关数据。会话数据通常在用户关闭浏览器或超过一定时间后会被清除。工作方式Cookie的存储容量通常较小(4KB左右),而Session通常可以存储更大的数据量。存储容量存储位置从安全角度来看,Session比Cookie更安全,因为Session数据存储在服务器端,而Cookie数据存储在客户端。敏感信息更适合存储在Session中。安全性01030204Cookie和Session的比较cookie存储在客户端(通常是浏览器)上,以文本文件的形式保存。session:存储在服务器上,通常以内存或数据库的形式保存。3.6.2Servlet过滤器(Filter)Filter类能够截取用户从客户端提交的请求,也就是在请求还没有到达需要访问的资源时就可以运行;同时还能在资源还没有被发送到客户端前就截取,并处理这些还没有发送到客户端的响应。Filter主要用于统一字符编码、过滤敏感词汇和安全控制等。Filter的运行原理如图3-22所示。Filter图322Filter运行原理3.6.2Servlet过滤器(Filter)Filter相关APIFilter相关接口包含3个接口,分别是Filter接口、FilterConfig接口和FilterChain接口(1)Filter接口ServletFilter接口是Servlet提供的一种标准接口,用于在Servlet容器中对HTTP请求和响应进行拦截和处理。它可以用于访问控制、安全验证、日志记录、字符编码转换等功能。具体如表3-16所示表3-16Filter接口常用的方法方法声明描述publicvoidinit(FilterConfigfilterConfig)在Filter被初始化时调用,用于进行一些初始化操作。publicvoiddoFilter(ServletRequest,ServletResponse,FilterChain)对HTTP请求和响应进行拦截和处理的核心方法,可以对请求进行修改或过滤,也可以对响应进行修改或增强。publicvoiddestroy()在Filter被销毁时调用,用于进行一些清理操作。3.6.2Servlet过滤器(Filter)Filter相关API(2)FilterConfig接口FilterConfig是ServletAPI提供的一个用于获取Filter程序在web.xml文件中的配置信息的接口,该接口封装了Filter程序在web.xml中的所有注册信息,并且提供了一系列获取这些配置信息的方法,具体如表3-17所示。表3-17FilterConfig接口的方法方法声明描述StringgetFilterName()用于返回在web.xml文件中为Filter所设置的名称,也就是返回
<filter-name>
元素的设置值StringgetInitParameter(Stringname)用于返回在web.xml文件中为Filter所设置的某个名称的初始化参数值,如果指定名称的初始化参数不存在,则返回nullEnumerationgetInitParameterNames()用于返回一个Enumeration集合对象,该集合对象包含在web.xml文件中为当前Filter设置的所有初始化参数的名称ServletContextgetServletContext()用于返回FilterConfig对象中所包装的ServletContext对象的引用3.6.2Servlet过滤器(Filter)Filter相关API(3)FilterChain接口在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也称过滤器链)。FilterChain接口用于定义一个Filter链的对象应该对外提供的方法这个接口中只有一个。具体如表3-18所示。表3-18FilterChain接口的方法方法声明描述publicvoiddoFilter(ServletRequest,ServletResponse,FilterChain)该方法用于将过滤后的请求转发给下一个过滤器,如果该过滤器已经是最后一个过滤器,那么,将请求传给目标资源3.6.2Servlet过滤器(Filter)Filter配置配置Filter有两种方式,一种是通过web.xml文件进行配置,一种是通过@WebFilter注解进行配置。(1)web.xml配置方式<!--在web.xml文件的web-app标签下写入以下内容--><filter><filter-name>过滤器名</filter-name><filter-class>过滤器类</filter-class></filter><filter-mapping><filter-name>过滤器名</filter-name><url-pattern>过滤器要过滤的请求</url-pattern><!--设置过滤器要过滤的请求--><!--1.过滤单个请求--><url-pattern>/index.jsp</url-pattern><!--2.过滤指定后缀名的请求--><!--如:过滤所有后缀名为.jsp的页面--><url-pattern>*.jsp</url-pattern><!--3.过滤指定目录的请求--><url-pattern>/home/index.jsp</url-pattern><!--4.过滤整个项目的所有请求--><url-pattern>/*</url-pattern></filter-mapping>例如:<filter><filter-name>myFilter</filter-name><filter-class>com.demo.filter.myFilter</filter-class></filter><filter-mapping><filter-name>myFilter</filter-name><url-pattern>/ServletMyFile</url-pattern></filter-mapping>3.6.2Servlet过滤器(Filter)Filter相关API(2)@WebFilter注解配置表3-19@WebFilter常用属性属性名类型说明filterNameString指定过滤器名称urlPattrenString[]指定需要过滤的资源,如某个Servlet或jspvalueString[]等价于urlPattern,不能同时使用servletNamesString[]指定过滤器将应用于哪些Servlet,取值是@WebServlet中name属性的取值dispatcherTypesDispatcherType指定过滤器转发模式,取值有ERROR、initParamsWebInitParam[]指定过滤器的一组初始化参数注意:DispatcherType是枚举类,取值的作用如下:a.DispatcherType.ERROR表示过滤器拦截那些跳转到某个异常处理页面的请求。b.DispatcherType.FORWARD表示过滤器拦截那些通过forward()方法来请求的转发的请求。c.DispatcherType.INCLUDE表示过滤器拦截那些通过include()方法来请求包含的请求。d.DispatcherType.REQUEST表示过滤器只会拦截普通的请求,而请求转发和请求包含类的请求不会拦截。如果需要拦截用户的所有请求,则可以使用*号通配符,如:@WebFilter("filterName=”myFilter”,urlPattrens=”/ServletMyFile”)publicclassmyFilterimplementsFilter{publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{System.out.println("myFilter执行了");}}@WebFilter("/*")例如:3.6.2Servlet过滤器(Filter)Flter应用(1)网站访问计数@WebFilter(filterName="FilterCount",urlPatterns="/ch03/webpage.jsp",initParams={@WebInitParam(name="count",value="0")})publicclassFilterCountimplementsFilter{privateintcount;publicvoidinit(FilterConfigconfig)throwsServletException{count=Integer.parseInt(config.getInitParameter("count"));}publicvoiddestroy(){}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsServletException,IOException{ServletContextcontext=request.getServletContext();count++;context.setAttribute("count",count);chain.doFilter(request,response);}}(1)在ch03目录中新建Filter目录,并在其中编写FilterCount类,这个Filter类中调用了FIlterConfig接口的方法,FilterCount类代码如下。注意:因为idea2023新建的快捷菜单中没有Filter的选项,我们需要把FilterServlet这个选项加入到快捷菜单中,具体操作类似于Servlet,就不再赘述。第6行代码中是FilterConfig接口提供了一个getInitParameter方法,该方法用于返回在Filter所设置的count的初始化参数值。(2)在webapp下的ch03目录中创建webpage.jsp,主要代码如下您是第${count}次访问网站<br>3.6.2Servlet过滤器(Filter)Flter应用单击此处输入你的正文,请尽量言简意赅的阐述观点,以便观者可以准确理解您所传达的信息关键字单击此处输入你的正文,请尽量言简意赅的阐述观点,以便观者可以准确理解您所传达的信息关键字图3-23webpage.jsp的运行结果(3)在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/ch03/webpage.jsp,显示效果如图3-23所示。图3-24webpage.jsp刷新2次的运行结果(4)刷新页面2次,显示效果如图3-24所示。(1)网站访问计数3.6.2Servlet过滤器(Filter)Filter应用(2)FilterChain的使用@WebFilter(filterName="FilterTest01",urlPatterns="/MyFilterServlet")publicclassFilterTest01implementsFilter{publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsServletException,IOException{response.setContentType("text/html;charset=UTF-8");PrintWriterout=response.getWriter();out.write("FirstFilterChain处理请求前的操作...<br/>");chain.doFilter(request,response);out.write("FirstFilterChain处理响应后的操作...<br/>");}}FilterChain是一系列过滤器的集合,每个过滤器负责处理不同的安全逻辑。当一个请求到达应用程序时,它会被FilterChain中配置的一系列过滤器依次处理,每个过滤器执行它特定的任务。案例演示(1)在Filter目录中编写FilterTest01类,这个Filter类中调用了FilterChain接口的方法,FilterTest01类代码如下3.6.2Servlet过滤器(Filter)Filter应用案例演示(2)同样在Filter目录中再编写FilterTest02类,这个Filter类中同样调用了FilterChain接口的方法,FilterTest02类代码如下。@WebFilter(filterName="FilterTest02",urlPatterns="/MyFilterServlet")publicclassFilterTest02implementsFilter{publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsServletException,IOException{response.setContentType("text/html;charset=UTF-8");PrintWriterout=response.getWriter();out.write("SecondFilterChain处理请求前的操作...<br/>");chain.doFilter(request,response);out.write("SecondFilterChain处理响应后的操作...<br/>");}}@WebServlet(name="MyFilterServlet",value="/MyFilterServlet")publicclassMyFilterServletextendsHttpServlet{protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();out.write("MyFilterServlet<br/>");}}(3)在Filter目录中编写MyFilterServlet类,这个Servlet类中用于输出“MyFilterServlet”,MyFilterServlet类代码如下。3.6.2Servlet过滤器(Filter)Filter应用案例演示(4)在IDEA中启动Tomcat服务器,在浏览器的地址栏中访问地址http://localhost:8080/myJavaWeb_war/MyFilterServlet,显示效果如图3-25所示。图3-25MyFilterServlet的运行结果注意:由上图可知MyFilterServlet的请求先被FilterTest01拦截,先显示了FilterTest01的内容,然后被FilterTest02拦截,显示了FilterTest02的内容,直到MyFilterServlet的请求被FilterTest02释放以后,才显示了MyFilterServlet的内容。当使用@WebFilter注解配置多个Filter时,用户无法控制这些Filter的执行顺序,只能依据这些Filter的类名进行控制,按自然排序的规则执行,例如FilterTest01就比FilterTest02先执行。3.6.3Servlet监听器(Listener)监听器用于监测Web应用中特定对象的创建、销毁、添加、修改和删除等操作。一旦这些对象的状态发生变化,服务器将自动触发监听器中相应的方法来进行响应处理。当特定的事件发生时,Servlet容器会调用相应的监听器方法,使得开发者能够执行自定义的代码逻辑。通过使用Listener监听器,开发者可以在这些关键时刻执行一些必要的操作,例如初始化资源、释放资源、记录日志、发送通知等。它提供了一种机制,让开发者能够更好地管理和监控Servlet的行为,增强应用程序的可扩展性和可维护性。Listener概述3.6.3Servlet监听器(Listener)事件:用户的某个操作,如单击一个按钮,调用了一个方法等。事件源:指产生事件的对象监听器:指的是监听产生事件的对象的事件事件处理器:当事件发生的时候触发的方法。Listener监听过程组成部分3.6.3Servlet监听器(Listener)Servlet事件监听器类
型描
述ServletContextListener用于监听ServletContext对象的创建与销毁过程HttpSessionListener用于监听HttpSession对象的创建和销毁过程ServletRequestListener用于监听ServletRequest对象的创建和销毁过程ServletContextAttributeListener用于监听ServletContext对象中的属性变更HttpSessionAttributeListener用于监听HttpSession对象中的属性变更ServletRequestAttributeListener用于监听ServletRequest对象中的属性变更HttpSessionBindingListener用于监听JavaBean对象绑定到HttpSession对象和从HttpSession对象解绑的事件HttpSessionActivationListener用于监听HttpSession中对象活化和钝化的过程在Servlet规范中定义了8种类型的监听器(见表3-20),它们用于监听的事件源分别为ServletContext、HttpSession和ServletRequest这三个域对象。表3-20Servlet事件监听器3.6.3Servlet监听器(Listener)①
用于监听域对象创建和销毁的事件监听器(ServletContextListener接口、HttpSessionListener接口、ServletRequestListener接口)。②
用于监听域对象属性增加和删除的事件监听器(ServletContextAttributeListener接口、HttpSessionAttributeListener接口、ServletRequestAttributeListener接口)。③
用于监听绑定到HttpSession域中某个对象状态的事件监听器(HttpSessionBindingListener接口、HttpSessionActivationListener接口)。监听器分类:3.6.3Servlet监听器(Listener)监听域对象创建和销毁的事件监听器应用案例演示@WebListenerpublicclassServletListenerimplementsServletContextListener,HttpSessionListener,ServletRequestListener{publicvoidcontextInitialized(S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广州市考《行政职业能力测验》真题及答案解析
- 2026年初级会计职称考试真题试卷及答案解析
- 9.2中国与新兴国际组织教案-2022-2023学年高中政治统编版选择性必修1当代国际政治与经济
- 电务管理岗位常见试题及答案集锦
- 盛大综合笔试题及详细答案
- 病历书写规范测试题及参考答案
- 电气知识测评试卷及答案
- 煤化工设备项目可行性研究报告
- 充电桩厂储能项目可行性研究报告
- 2026年东风汽车招聘面试题及答案
- 子宫内膜癌的放射治疗
- 幼儿园教职工岗位安全培训
- 统编版小学六年级道德与法治上册 第二单元 我 学历案设计
- (人教2024版)九年级化学新教材新教材培训 课件(新标题、新框架、新内容、新理念、新思路)
- GB/T 44317-2024热塑性塑料内衬油管
- 酒店英语会话(第六版)教案全套 李永生 unit 1 Room Reservations -Unit 15 Handling Problems and Complaints
- DLT5196-2016 火力发电厂石灰石-石膏湿法烟气脱硫系统设计规程
- YYT 0294.1-2016 外科器械金属材料 第1部分:不锈钢
- 特种设备使用单位安全风险 日管控、周排查、月调度
- 《系统集成项目管理工程师教程》(教材解读)
- 《烧(创)伤的急救复苏与麻醉管理》智慧树知到课后章节答案2023年下中国人民解放军总医院第四医学中心
评论
0/150
提交评论