




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2.jstl库(1)jstl的概述* apache的东西,依赖EL* 使用jstl需要导入jstl1.2.jar* 四大库:> core:库,重点> fmt:格式化:日期、数字> sql:过时> xml:过时(2). 导入库* jar包 jstl-1.2.jar* 在jsp页面中:<%taglib prefix="前缀" uri="路径"%>3.out和set导入JSTL的core库:<% taglib prefix="c" uri="" %>(1)- prefix=
2、"c":指定(2)- uri="件;库的前缀,这个前缀可以随便给值,但大家都会在使用core库时指定前缀为c;":指定库的uri,它不一定是真实存在的,但它可以让JSP找到库的描述文out和set* <c:out>:输出> value:可以是字符串常量,也可以是EL表达式> default:当要输出的内容为nul时,会输出default指定的值> escapeXml:默认值为true,表示转义!* <c:set>:设置(创建域的属性)> var:变量名> value:变量值,可以是EL表达式>
3、scope:域,默认为page,可选值:page、request、session、application图如何来防止这种呢?(escapeXml如果是false,那就不转义)把el表达式$code 改为 <c:out value="$code " ></c:out>下面是setset是用来替代java的setAttribute的例如,用<c:set var="code"value="<script>alert('hello');</script>" scope=&q
4、uot;request"></c:set>来代替<%request.setAttribute("code", "<script>alert('hello');</script>");%>4.removeremove* <remove>:删除域变量> var:变量名> scope:如果不给出scope,表示删除所有域中的该名称的变量;如果指定了域,那么只删除该域的变量。5.urlurl* value:指定一个路径!它会在路径前面自动添加项目名。<&
5、gt; <c:url value="/index.jsp"/>,它会输出/day13_1/index.jsp* 子:<c:param>,用来给url后面添加参数,例如:<c:url value="/index.jsp"><c:param name="username" value="张三"/> <!-可以对参数进行url编码!-></c:url>结果为:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F
6、* var:指定变量名,一旦添加了这个属性,那么url* scope:它与var一起使用,用来保存url。就再输出到页面,而是把生成url保存到域中。6.if和choose(1)if:对应java中的if语句* <c:if test="布尔类型">.</c:if>,当test为值时,执行体内容!举例之前先说一个$empty empty是关键字, 代表空的(表示如果为空的话),上面语句意思为name参数是否为空对应还有not empty 表示如果不为空的话(空代表有没有参数)举例:<c:if test="$empt
7、y param.score ">您没有给出参数</c:if>param.value怎么赋值?在浏览器地址栏手动赋值就行?score=80这时候param.score=80下面介绍choose(2) choose:它对应java中的if/else if/ . /else* 例如:<c:choose><c:when test="">.</c:when><c:when test="">.</c:when><c:when test="">.&l
8、t;/c:when>.<c:otherwise> .</c:otherwise></c:choose>等同与if(.) else if( ) else if( ) else if( ) .else 举例7.forEach它用来循环遍历数组、集合!它还可以用来计数方式来循环!(1) 计数方式:for(int i = 1; i <= 10; i+) .等价于<c:forEach var="i" begin="1" end="10">$i</c:forEach>属性:*
9、 var:循环变量* begin:设置循环变量从几开始。* end:设置循环变量到几结束。* step:设置步长!等同与java中的i+,或i+=2(step此时为2)。step默认为1。举例子基础用法<c:forEach var="i" begin="1" end="10">$i <br/></c:forEach><br/> 进阶用法<c:forEach var="j" begin="1" end="10" step=&
10、quot;2">$j <br/></c:forEach><br/>输出(2)用来输出数组、集合!l 循环遍历集合,类似for(Object o : 集合);但是,首先先写java<%来新建数组String strs = "one","two","three"request.setAttribute("strs", strs);%>然后<c:forEach items="$strs " var="str"&g
11、t;$str <br/></c:forEach>等同于for(String str : strs) .属性:* items:指定要循环谁,它可以是一个数组或一个集合* var:把数组或集合中的每个元素赋值给var指定的变量。一个值得注意的问题-jstl、EL表达式中的空格陷阱加空格后输出以下错误内容输出正确8.forEach中的循环状态变量循环状态可以使用varStatus来创建循环状态变量!循环状态变量有如下属性:* count:循环元素的个数(int类型)* index:循环元素的下标(int类型)* first:是否为第一个元素(boolean类型)* last:
12、是否为最后一个元素(boolean类型)* current:当前元素(Object类型)简单例子<c:forEach items="$list " var="ele" varStatus="vs">$vs.index $vs.count $vs.first $vs.last $vs.current <br/></c:forEach>输出注意:$vs.current的效果与$vs 一致9.fmtfmt库它是格式化库<fmt:formatDate value="" patter
13、n="">value:指定一个Date类型的变量pattern:用来指定输出的模板!例如:yyyy-MM-dd HH:mm:ss<fmt:formatNumber value="$num1" pattern="0.00">保留小数点后2位,它会四舍五入!如果不足2位,以0补位!<fmt:formatNumber value="$num1" pattern="#.#">保留小数点后2位,它会四舍五入!如果不足2位,不补位!举个例子<%request.setAtt
14、ribute("num1", 3.141253);%><fmt:formatNumber value="$requestScope.num1 " pattern="0.00"></fmt:formatNumber>10.自定义自定义入门(1). 步骤*处理类(也是一个对象,那么就需要先有类!)* tld文件,它是一个xml* JSP页面中使用<%taglib%>来指定tld文件的位置(2).处理类SimpleTag接口:* void doTag():每次执行时都会调用这个方法;* JspTag
15、 getParent():返回父* void setParent(JspTag):设置父(非生命周期方法)* void setJspBody(JspFragment):设置体* void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext其中doTag()会在其他三个方法之后被tomcat调用。(3). 配置tld文件tld文件一般都放到WEB-INF之下,这样保证客户端<tag>不到!<name>myTag1</name> 指定当前的名称<tag-class>cn.itcast.tag.M
16、yTag1</tag-class> 指定当前的处理类!<body-content>empty</body-content> 指定</tag>体的类型,我们这里使用的是空!(4). 页面中指定tld文件位置<% taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>导库,就是为页面指定tld文件的位置!过程中一些注意事项新建tld文件(模板太老,其实不必用这个)taglib的内容去其它地方“借”过来(例如jstl1,2.jar中c.tld)
17、首先第一步,新建一个处理类/* 自定义* author cxf*/public class MyTag1 implements SimpleTag private PageContext pageContext; private JspFragment body;/* 所有的set()方法都会在doTag()方法之前被tomcat调用!* 所在doTag()中就可以使用tomcat传递过来的对象了。*/ Overridepublic void doTag() throws JspException, IOException pageContext.getOut().print("He
18、llo Tag!");Overridepublic JspTag getParent() return null;Overridepublic void setJspBody(JspFragment body) this.body = body;/接收tocat给我们的""Overridepublic void setJspContext(JspContext context) this.pageContext = (PageContext) context;/接收tocat给我们的""public void setParent(JspTag
19、arg0) =其实上面实现接口的办法代码比较繁琐,所以可以继承其它类来达到方便的目的/* SimpleTagSupport它实现了SimpleTag接口。* 它已经把所有的tomcat传递的数据都保存起来了!而且还提供了get方法供子类调用!* author cxf*/public class MyTag2 extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException this.getJspContext().getOut().print("再 Hello 一次 Tag!&q
20、uot;);附图Tag2 extends SimpleTagSupport写好处理类之后,第二步就要写tld文件了其实下面红字是需要写的内容,其余的都是模板。<?xml version="1.0" encoding="UTF-8"?><taglib xmlns="xmlns:xsi=" xsi:schemaLocation="jsptaglibrary_2_1.xsd" version="2.1">""<tlib-version>1.0&l
21、t;/tlib-version><short-name>itcast</short-name><uri></uri><tag><name>Tag1</name><tag-class>cn.itcast.tag.Tag1</tag-class><body-content>empty</body-content></tag><tag><name>Tag2</name><tag-class>cn.itca
22、st.tag.Tag2</tag-class><body-content>empty</body-content></tag></taglib>一点empty就类似与<br/>没有属性的空<tag><name>MyTag1</name><tag-class>cn.itcast.tag.MyTag1</tag-class><body-content>empty</body-content></tag>还有最后一步,就是在index
23、.jsp中使用在index.jsp前面导入自定义的库<% taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %><body><h1><it:Tag1/></h1><br/><h1><it:Tag2/></h1></body>11.自定义进阶之体内容类型体内容* empty:无体!* JSP:jsp2.0已经不再支持这个类型了!表示体内容可以是:java,可以是,可以是el表达式*
24、 scriptless:只能是EL表达式,也可以是其他的!* tagdependent:体内容被执行,而是直接赋值处理类!(不要用)一般用empty 还有scriptless步骤与上一节一样,所以省略讲处理类public class MyTag3 extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException Writer out = this.getJspContext().getOut();/获取当前jsp页面的输出流out.write("*<br/>"
25、;);this.getJspBody().invoke(out);/执行体的内容,把结果写到执行的流中,即页面上out.write("<br/>*");在原来的tld文件中添加tag最后,在jsp使用<body><%request.setAttribute("%><h1>", "");<it:MyTag3>$</h1></body></it:MyTag3>输出12.自定义之SkipPageException,不再执行下面的内容首先,写处理类
26、public class MyTag4 extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException this.getJspContext().getOut().print("你只能看见我"); throw new SkipPageException();=然后,tld文件<tag><name>MyTag4</name><tag-class>cn.itcast.tag.MyTag4</tag-class>&
27、lt;body-content>empty</body-content></tag>=最后,jsp页面使用在原来的jsp页面顶端<body>之后加<h2><it:MyTag4/></h2>输出13.自定义属性之带有属性的步骤:1. 给你的为处理类添加属性!处理类添加属性,属性至少要且一个set方法!这个set方在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。2. 在tld文件中对属性进行配置<attribute><name>test</name>
28、指定属性名<required>true</required> 指定属性是否为必需的<rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL</attribute>举例先新建处理类public class MyTag5 extends SimpleTagSupport private boolean test;/* 这个方法由tomcat来调用*/public void setTest(boolean test) this.test = test;Overridepublic void doTag() t
29、hrows JspException, IOException if(test)/* 执行*/体this.getJspBody().invoke(null);/null为默认当前输出流/this.getJspContext().getOut();然后在tld文件中配置<tag><name>MyTag5</name><tag-class>cn.itcast.tag.MyTag5</tag-class><body-content>scriptless</body-content><attribute>&
30、lt;name>test</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>=说明一下,rtexprvalue并不是一个单词,而是 Run-time Expression Value的缩写,指定属性是否可以使用EL表达式最后,在jsp中使用<it:MyTag5 test="$empty param.<h2><it:MyTag4/></h2>&qu
31、ot;></it:MyTag5>注意问题14.MVCMVC它不是java独有,所有的B/S结构的项目都在使用它!M - m模型(写代码)V - View 视图(jsp)C - Cotroller器(Servlet)1 MVC设计模式MVC设计模式MVC模式(M-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(M)、视图(View)和器(Controller)。MVC模式最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。MVC可对程序的后期维
32、护和扩展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序简化,更加直观。l器Controller:对请求进行处理,负责请求转发;l 视图View:界面设计进行图形界面设计;l 模型M:程序编写程序应用的功能(实现算法等等)、数据库管理;注意,MVC不是Java的东西,几乎现在所有B/S结构的软件都采用了MVC设计模式。但是要注意,MVC在B/S结构软件并没有完全实现,例如在我们今后的B/S软件中并有驱动!2 JavaWeb与MVCJavaWeb的经历了JSP M1、JSP M1二代、JSP M2三个时期。2.1 JSP MJSP M1第一代1是JavaWeb早期的模型,它适合
33、小型Web项目,开发成本低!M1第一代时期,服务器端只有JSP页面,所有的操作都在JSP页面中,连的维护和扩展极为不利。数据库的API也在JSP页面中完成。也就是说,所有的东西都耦合在一起,对后期2.2 JSP MJSP M1第二代1第二代有所改进,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。虽然第二代比第一代好了些,但还让JSP做了过多的工作,JSP中把视图工作和请求调度(器)的工作耦合在一起了。2.3 JSP MJSP M22模式已经可以清晰的看到MVC完整的结构了。l JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;l Se
34、rvlet:层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;l JavaBean:模型层,完成具体的业务工作,例如:开启、转账等。JSP M2适合多人合作开发大型的Web项目,各司其职,互不,有利于开发中的分工,有利于组件的重用。但是,Web项目的开发难度加大,同时对开发的技术要求也提高了。15.JavaWeb的三层框架JavaWeb三层框架Web层 -> 与Web相关的内容(Servlet,JSP,Servlet相关API:request、response、session、ServletContext)业务层 -> 业务对象(Service)数据层 -> 操作数
35、据库(DAO Data Access Object)(所有对数据库的操作,不能跳出到DAO之外)JavaWeb经典三层框架我们常说的三层框架是由JavaWeb提出的,也就是说这是JavaWeb独有的!所谓三层是表述层(WEB层)、业务逻辑层(Business Logic),以及数据l WEB层:包含JSP和Servlet等与WEB相关的内容;l 业务层:业务层中不包含JavaWeb API,它只关心业务逻辑;层(Data Access)。l 数据层:封装了对数据库的细节;注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至
36、可以应用到非Web环境依赖业务层!务层的每个方法可以理解成一个万能,例如转账业务方法。业务层依赖数据层,而Web层16.三层的HelloWorld程序首先,新建四个包(1)第一步就是在domain包中新建User类/* 把数据库* author 阿滔*/出的结果保存到这个对象中public class User private String username; private String password;public User() super();/ TODO Auto-generated constructor stubpublic User(String username, Strin
37、g password) this.username = username; this.password = password;public String getUsername() return username;public void setUsername(String username) this.username = username;public String getPassword() return password;public void setPassword(String password) this.password = password;Overridepublic St
38、ring toString() return "User username=" + username + ", password=" + password + ""(2)然后,在dao包中新建UserDao类public class UserDao /*把xml中的数据*/public User find() 出来之后,封装到 user对象中。然后返回return new User("zhangsan","123");=(3)接着,在service包中新建UserService类public c
39、lass UserService /service层依赖dao层private UserDao userDao = new UserDao();/* service的*/,需要使用dao来完成public User find() return userDao.find();=(4)然后,在web.servlet包中新建UserServlet类public class UserServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws
40、ServletException, IOException /* 在Servlet中依赖service,然后通过service完到request中、* 转发到jsp*/能,把结果保存UserService userService = new UserService();User user = userService.find();request.setAttribute("user", user);request.getRequestDispatcher("/show.jsp").forward(request, response);=(5)最后就是显示
41、。在WebRoot中新建index.jsp(初始页面)和show.jsp(结果显示页面)=index.jsp<% taglib prefix="c" uri="%><body><a href="<c:url value='/UserServlet'></c:url>">点击这里显示</a></body>=show.jsp<body>用户名:$user.username <br/>密 码:$user.password <
42、;br/></body>-运行如下点击超day141.项目的框架的分析项目功能:>> 登录-JSP:* login.jsp -> 登录表单* regist.jsp ->表单* index.jsp -> 主页(只有登录才能看到)Servlet:* LoginServlet* RegistServletService:* UserService -> 与用户相关的业务类Dao:* UserDao -> 与用户相关的数据类Domain:* User(对应数据库,还要对应所有表单)> username> password>
43、verifyCode-数据库设计* users.xml<users><user username="<user username="</users>password="password="/>"/>-步骤:1. 创建空项目2. 导包:* CommonUtils* commons-beanutils.jar* commons-logging.jar* dom4j3. 建包* cn.itcast.user.domain> User* cn.itcast.user.dao> UserDao*
44、 cn.itcast.user.service> UserService* cn.itcast.user.web.servlet> LoginServlet> RegistServlet4. jsp* login.jsp* regist.jsp* index.jsp5. 在F盘下创建一个users.xml文件!2.项目的框架搭建步骤:1. 创建空项目2. 导包:* CommonUtils* commons-beanutils.jar* commons-logging.jar* dom4j3. 建包* cn.itcast.user.domain> User* cn.itc
45、ast.user.dao> UserDao* cn.itcast.user.service> UserService* cn.itcast.user.web.servlet> LoginServlet> RegistServlet4. jsp* login.jsp* regist.jsp* index.jsp5. 在F盘下创建一个users.xml文件!* 添加根元素<users>* 保证文件为utf-8编码!导包的时候要注意导全下面是替代Servlet旧模板操作(导入jar包)然后找到位置替换在F盘下创建一个users.xml文件!* 添加根元素<u
46、sers>* 保证文件为utf-8编码!3.功能流程分析上面漏了创建RegisterServletregist.jsp> 第一步:完成regist.jsp的基本功能! RegistServlet> 封装表单数据,封装到User对象中。> 调用service的regist()方法* 如果这个方法没有出问题,输出“”* 如果这个方法抛出了异常,把错误信息保存到request域,转发到regist.jsp(显示错误信息)UserService#regist()> 没有返回值,但失败抛出一个自定义的异常!可以在异常中添加异常信息!(自定义一个异常类)> 校验用户名是
47、否已被> 添加用户用户),如果已被,抛出异常,异常信息为“用户名已被!”(通过用户名UserDao:通过业务分析,得到结果:需要提供两个方法> 按用户名用户对象:User findByUsername(String username)>一个用户到数据库中:void add(User user)工作:1. 在service层添加一个UserException2. dao;* User findByUsername(String username)* void add(User user)3. service* void regist() throws UserException
48、4. servlet1). 封装表单数据到User对象中2). 使用user调用service的regist()方法3). 如果得到UserException,那么把异常信息保存到request域中,转发回regist.jsp,(数据的回显)4). 输出“”下图是流程图图片放大4.dao之按用户名用户对象预备知识复path先来完成UserDao的内容/* 数据类* author cxf*/public class UserDao private String path = "F:/users.xml"/依赖数据文件/* 按用户名* paramusername* return
49、*/public User findByUsername(String username) /* 1. 得到Document* 2. xpath* 3. 校验!结果是否为nul,如果为nul,返回nul* 4. 如果不为nul,需要把Element封装到User对象中。*/* 1. 得到Document*/ 创建器SAXReader reader = new SAXReader();try Document doc = reader.read(path);/* 2. 通过xpath*/得到ElementElement ele = (Element)doc.selectSingleNode(&q
50、uot;/userusername='" + username + "'");/上面xpath中的参数巧妙利用了字符串拼接避免了username的歧义(让username串"username")/* 3. 校验ele是否为nul,如果为nul,返回nul*/if(ele = nul) return nul;为变量而不是简单的字符/* 4. 把ele的数据封装到User对象中*/User user = new User();String attrUsername = ele.attributeValue("usernam
51、e");/获取该元素的名为username属性值String attrPassword = ele.attributeValue("password");/获取该元素的名为password属性值user.setUsername(attrUsername);user.setPassword(attrPassword);return user; catch (DocumentException e) throw new RuntimeException(e);/避免客户处理异常-throw new RuntimeException(e);/避免客户处理异常妙处-来源网
52、上:vcjFJJbafVN540AhMb8vJHdvFzgQSqA5KVk3Z9VttcvWmru0iITxae.printStackTrace( )是打印异常栈信息,而throw new RuntimeException(e)是把异常包在一个运行时异常中抛出。我们常看见这种写法try.catch(Exception e)e.printStackTrace( );throw new RuntimeException(e);这是处理没法进一步处理的异常的一般做法。try块中出现了一个异常,它被catch住了,我们首先要在标准输出上打印出异常但是如果没有throw这句,这个错误就静悄悄地被catc
53、h块了,程序会继续运行。可这个时候很可能你的程序的状态已经不对了,继续下去也没有什么意义,所以应该继续抛出这个异常。你当然可以写throw e;,但是这个e是一般的异常,如果这样抛出的话,你得在这个函数头上用throws来public void abc() throws Exception,比如:然后调用这个函数的函数也还得这么干,所以一般的处理是把e包装成运行时异常:newRuntimeException(e),这样就不需要在函数头了。但这只是一般的处理方法,在实际程序中不可不顾实际情况和需求。5.dao之添加用户自行回顾知识 回写xml/* 添加用户* param user*/ publi
54、c void add(User user) /* 1. 得到Document* 2. 通过Document得到root元素!<users>* 3. 使用参数user,转发成Element对象* 4. 把element添加到root元素中* 5. 保存Document*/ 得到Document SAXReader reader = new SAXReader(); try Document doc = reader.read(path);/ 得到根元素Element root = doc.getRootElement();/ 通过根元素创建新元素Element userEle = r
55、oot.addElement("user");/ 为userEle设置属性 userEle.addAttribute("username", user.getUsername(); userEle.addAttribute("password", user.getPassword();/* 保存文档*/ 创建输出格式化器OutputFormat format = new OutputFormat("t", true);/缩进使用t,是否换行,使用是! format.setTrimText(true);/清空原有的换
56、行和缩进/个人补充:其实红字没必要那么麻烦,直接OutputFormat format = OutputFormat.createPrettyPrint();就可以了/ 创建XmlWriter XMLWriter writer; try writer = new XMLWriter( new OutputStreamWriter( new FileOutputStream(path), "UTF-8"), format); writer.write(doc);/保存document对象writer.close(); catch (Exception e) throw new RuntimeException(e); catch (DocumentException e) throw new RuntimeException(e);6.dao层测试新建一个test.dao包再新建测试类UserDaoTestimport org.junit.Test;import cn.itcast.dao.UserDao;import cn.itcast.domain.User;public class UserDaoTest Testpublic void testFindByUsername() UserDao userDao = new
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁夏固原公开招聘农村(村务)工作者笔试题含答案2024年
- 新建120万吨大宗固废处置综合利用项目可行性研究报告-立项备案
- 年产300套SVG动态无功补偿装置研发生产项目可行性研究报告-立项备案
- 诚信教育:诚信与考试主题班会
- 自动控制原理课程设计报告
- 天津静海县2025年公开招聘农村(村务)工作者笔试题带答案分析
- 城区土地押金合同协议
- 大学生心理教育
- 租赁农村屋顶合同协议
- 生肉购买合同协议
- 义务兵家庭优待金审核登记表
- GA 255-2022警服长袖制式衬衣
- GB/T 5202-2008辐射防护仪器α、β和α/β(β能量大于60keV)污染测量仪与监测仪
- GB/T 39560.4-2021电子电气产品中某些物质的测定第4部分:CV-AAS、CV-AFS、ICP-OES和ICP-MS测定聚合物、金属和电子件中的汞
- GB/T 3452.4-2020液压气动用O形橡胶密封圈第4部分:抗挤压环(挡环)
- 计划生育协会基础知识课件
- 【教材解读】语篇研读-Sailing the oceans
- 抗肿瘤药物过敏反应和过敏性休克
- 排水管道非开挖预防性修复可行性研究报告
- 交通工程基础习习题及参考答案
- 线路送出工程质量创优项目策划书
评论
0/150
提交评论