版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
動力節(jié)點詳解Java中的代理概念
Java中的代理
一、代理的概念
動態(tài)代理技術(shù)是整個java技術(shù)中最重要的一個技術(shù),它是學習java框
架的基礎(chǔ),不會動態(tài)代理技術(shù),那么在學習Spring這些框架時是學不明白
的。
動態(tài)代理技術(shù)就是用來產(chǎn)生一個對象的代理對象的。在開發(fā)中為什么
需要為一個對象產(chǎn)生代理對象呢?
舉一個現(xiàn)實生活中的例子:歌星或者明星都有一個自己的經(jīng)紀人,這
個經(jīng)紀人就是他們的代理人,當我們需要找明星表演時,不能直接找到該
明星,只能是找明星的代理人。比如劉德華在現(xiàn)實生活中非常有名,會唱
歌,會跳舞,會拍戲,劉德華在沒有出名之前,我們可以直接找他唱歌,
跳舞,拍戲,劉德華出名之后,他干的第一件事就是找一個經(jīng)紀人,這個
經(jīng)紀人就是劉德華的代理人(代理),當我們需要找劉德華表演時,不能直
接找到劉德華了(劉德華說,你找我代理人商談具體事宜吧!),只能是找劉
德華的代理人,因此劉德華這個代理人存在的價值就是攔截我們對劉德華
的直接訪問!
這個現(xiàn)實中的例子和我們在開發(fā)中是一樣的,我們在開發(fā)中之所以要
產(chǎn)生一個對象的代理對象,主要用于攔截對真實業(yè)務(wù)對象的訪問。那么代
理對象應(yīng)該具有什么方法呢?代理對象應(yīng)該具有和目標對象相同的方法
所以在這里明確代理對象的兩個概念:
1、代理對象存在的價值主要用于攔截對真實業(yè)務(wù)對象的訪問。
2、代理對象應(yīng)該具有和目標對象(真實業(yè)務(wù)對象)相同的方法。劉德華
(真實業(yè)務(wù)對象)會唱歌,會跳舞,會拍戲,我們現(xiàn)在不能直接找他唱歌,
跳舞,拍戲了,只能找他的代理人(代理對象)唱歌,跳舞,拍戲,一個人
要想成為劉德華的代理人,那么他必須具有和劉德華一樣的行為(會唱歌,
會跳舞,會拍戲),劉德華有什么方法,他(代理人)就要有什么方法,我們
找劉德華的代理人唱歌,跳舞,拍戲,但是代理人不是真的懂得唱歌,跳
舞,拍戲的,真正懂得唱歌,跳舞,拍戲的是劉德華,在現(xiàn)實中的例子就
是我們要找劉德華唱歌,跳舞,拍戲,那么只能先找他的經(jīng)紀人,交錢給
他的經(jīng)紀人,然后經(jīng)紀人再讓劉德華去唱歌,跳舞,拍戲。
二、java中的代理
2.1、"java.lang.reflect.Proxy”類介紹
現(xiàn)在要生成某一個對象的代理對象,這個代理對象通常也要編寫一個
類來生成,所以首先要編寫用于生成代理對象的類。在java中如何用程序
去生成一個對象的代理對象呢,java在JDK1.5之后提供了一個
"java.lang.reflect.Proxy"1^,通過"Proxy”類提供的一個newProxylnstance方
法用來創(chuàng)建一個對象的代理對象,如下所示:
1staticObjectnewProxylnstance(ClassLoaderloader,Class<?>[]
interfaces,InvocationHandlerh)
newProxylnstance方法用來返回一個代理對象,這個方法總共有3個
參數(shù),ClassLoaderloader用來指明生成代理對象使用哪個類裝載器,
Class<?>口interfaces用來指明生成哪個對象的代理對象,通過接口指
定,InvocationHandlerh用來指明產(chǎn)生的這個代理對象要做什么事情。所
以我們只需要調(diào)用newProxylnstance方法就可以得到某一個對象的代理對
象了。
2.2、編寫生成代理對象的類
在java中規(guī)定,要想產(chǎn)生一個對象的代理對象,那么這個對象必須要
有一個接口,所以我們第一步就是設(shè)計這個對象的接口,在接口中定義這
個對象所具有的行為(方法)
1、定義對象的行為接口
1/16
1packagexy;
2
3/**
4*@ClassName:Person
5*@Description:定義對象的行為
6*@author:孤傲蒼狼
7*@date:2014-9-14下午9:44:22
8*
9*/
10publicinterfacePerson{
11
12/**
13*(?Method:sing
14*@Description:唱歌
15*@Anthor:孤傲蒼狼
16*
17*@paramname
18*@return
19*/
20Stringsing(Stringname);
21/**
22*?Method:sing
23*@Description:跳舞
24*@Anthor:孤傲蒼狼
25*
26*@paramname
27*@return
28*/
29Stringdance(Stringname);
30}
2、定義目標業(yè)務(wù)對象類
1packagexy;
2
3/**
4*@ClassName:LiuDeHua
5*(?Description:劉德華實現(xiàn)Person接口,那么劉德華會唱歌和跳舞
/6*@author:孤傲蒼狼
2/16
7
*@date:2014-9-14下午9:22:24
8
*
9*/
10publicclassLiuDeHuaimplementsPerson{
11
12publicStringsing(Stringname){
13System.out.println("劉德華唱"+name+"歌!!");14
return"歌唱完了,謝謝大家!";
15)
16
17publicStringdance(Stringname){
18System.out.println("劉德華跳"+name+"舞??!");19
return"舞跳完了,多謝各位觀眾!";
20}
21}
3、創(chuàng)建生成代理對象的代理類
1packagexy;
2
3importjava.lang.reflect.InvocationHandler;
4importjava.Iang.reflect.Method;
5importjava.lang.reflect.Proxy;
6
7/**
8*@ClassName:LiuDeHuaProxy
9*(?Description:這個代理類負責生成劉德華的代理人10*(?author:
孤傲蒼狼
11*@date:2014-9-14下午9:50:02
12*
13*/
14publicclassLiuDeHuaProxy{
15
16〃設(shè)計一個類變量記住代理類要代理的目標對象17
privatePersonIdh=newLiuDeHua();
18
19/**
20*設(shè)計一個方法生成代理對象
21*@Method:getProxy
3/16
22*(?Description:這個方法返回劉德華的代理對象:Person
person=LiuDeHuaProxy.getProxy();〃得到]—代理對象
23*@Anthor:孤傲蒼狼
24*
25*@return某個對象的代理對象
26*/
27publicPersongetProxy(){
28〃使用Proxy.newProxylnstance(ClassLoaderloader,
Class<?>[]interfaces,InvocationHandlerh)返回某個對象的代理對象
29return(Person)
Proxy.newProxylnstance(LiuDeHuaProxy.class
30.getClassLoader(),ldh.getClass().getlnterfaces(),
31newlnvocationHandler(){
32/**
33*InvocationHandler接口只定義了一個
invoke方法,因此對于這樣的接口,我們不用單獨去定義一個類來實現(xiàn)該
接口,
34*而是直接使用一個匿名內(nèi)部類來實現(xiàn)
該接口,newInvocationHandler。{}就是針對InvocationHandler接口的匿名
實現(xiàn)類
35*/
36/**
37*在invoke方法編碼指定返回的代理對象
干的工作
38*proxy:把代理對象自己傳遞進來
39*method:把代理對象當前調(diào)用的方法傳
遞進來
40*args:把方法參數(shù)傳遞進來
41*
42*當調(diào)用代理對象的person.sing("冰雨");
或者person.dance("江南style");方法時,43*實
際上執(zhí)行的都是invoke方法里面的代碼,
44*因此我們可以在invoke方法中使用
method.getName。就可以知道當前調(diào)用的是代理對象的哪個方法
45*/
46(?Override
47publicObjectinvoke(Objectproxy,Method
method,
48Object[]args)throwsThrowable{
49〃如果調(diào)用的是代理對象的sing方法
50if(method.getName().equals("sing")){
51System.out.printing我是他的經(jīng)紀
人,要找他唱歌得先給十萬塊錢?。?);
52〃已經(jīng)給錢了,經(jīng)紀人自己不會唱
歌,就只能找劉德華去唱歌!
53returnmethod.invoke(ldh,args);//
代理對象調(diào)用真實目標對象的sing方法去處理用戶請求
54}
55〃如果調(diào)用的是代理對象的dance方
法
56if(method.getName().equals("dance"))
(
4/16
57
System.out.println("我是他的經(jīng)紀人,要找他跳舞得先給二十萬塊錢!!
");58〃已經(jīng)給錢了,經(jīng)紀人自己不會唱
歌,就只能找劉德華去跳舞!
59returnmethod.invoke(ldh,args);//
代理對象調(diào)用真實目標對象的dance方法去處理用戶請求
60}
61
62returnnull;
63}
64
});
65}
66)
測試代碼:
1packagexy;
2
3publicclassProxyTest{
4
5publicstaticvoidmain(String[]args){
6
7LiuDeHuaProxyproxy=newLiuDeHuaProxy();
8〃獲得代理對象
9Personp=proxy.getProxy();
10〃調(diào)用代理對象的sing方法
11StringretValue=p.sing("冰雨");
12System.out.println(retValue);
13〃調(diào)用代理對象的dance方法
14Stringvalue=p.dance("江南style");
15System.out.println(value);
16)
17)
運行結(jié)果如下:
5/16
Proxy類負責創(chuàng)建代理對象時,如果指定了handler(處理器),那么不
管用戶調(diào)用代理對象的什么方法,該方法都是調(diào)用處理器的invoke方法。
由于invoke方法被調(diào)用需要三個參數(shù):代理對象、方法、方法的參數(shù),
因此不管代理對象哪個方法調(diào)用處理器的invoke方法,都必須把自己所在
的對象、自己(調(diào)用invoke方法的方法)、方法的參數(shù)傳遞進來。
三、動態(tài)代理應(yīng)用
在動態(tài)代理技術(shù)里,由于不管用戶調(diào)用代理對象的什么方法,都是調(diào)
用開發(fā)人員編寫的處理器的invoke方法(這相當于invoke方法攔截到了代
理對象的方法調(diào)用)。并且,開發(fā)人員通過invoke方法的參數(shù),還可以在
攔截的同時.,知道用戶調(diào)用的是什么方法,因此利用這兩個特性,就可以
實現(xiàn)一些特殊需求,例如:攔截用戶的訪問請求,以檢查用戶是否有訪問
權(quán)限、動態(tài)為某個對象添加額外的功能。
3.1、在字符過濾器中使用動態(tài)代理解決中文亂碼
在平時的JavaWeb項目開發(fā)中,我們一般會寫一個
CharacterEncodingFilter(字符過濾器)來解決整個JavaWeb應(yīng)用的中文亂碼
問題,如下所示:
1packageme.gacl.web.fiIter;
2
3importjava.io.lOException;
4
5importjavax.servlet.Filter;
6importjavax.servlet.FilterChain;
7importjavax.servlet.FilterConfig;
8importjavax.servlet.ServletException;
9importjavax.servlet.ServletRequest;
10importjavax.servlet.ServletResponse;
11
12/**
13*@ClassName:CharacterEncodingFilter
14*@Description:解決中文亂碼的字符過濾器
15*(?author:孤傲蒼狼
16*@date:2014-9-14下午10:38:12
6/16
17
*
18*/
19publicclassCharacterEncodingFilterimplementsFilter{
20
21@Override
22publicvoidinit(FilterConfigfilterConfig)throwsServletException
23
24}
25
26@Override
27publicvoiddoFilter(ServletRequestrequest,ServletResponse
response,
28FilterChainchain)throwslOException,
ServletException{
29〃解決以Post方式提交的中文亂碼問題
30request.setCharacterEncoding("UTF-8");
31response.setCharacterEncoding("UTF-8");
32response.setContentType("text/html;charset=UTF-8");
33chain.doFilter(request,response);
34)
35
36(?Override
37publicvoiddestroy(){
38
39}
40)
但是這種寫法是沒有辦法解決以get方式提交中文參數(shù)時的亂碼問題
的,我們可以用如下的代碼來證明上述的解決中文亂碼過濾器只對以post
方式提交中文參數(shù)時有效,而對于以get方式提交中文參數(shù)時無效
jsp測試頁面如下:
1<%@pagelanguage="java"pageEncoding="UTF-8"%>
2引入jstl標簽庫—%>
3<%@tagliburi="/jsp/jstl/core"prefix="c"%>
4<!DOCTYPEHTML>
5<html>
6<head>
7<title>使用字符過濾器解決解決get>post請求方式下的中
文亂碼問題</title>
8</head>
9<body>
10使用c:url標簽構(gòu)建url,構(gòu)建好的url存儲在
servletDemol變量中
11<c:urlvalue="/servlet/ServletDemol"scope="page"
var="servletDemol">
7/16
12
構(gòu)建的url的附帶的中文參數(shù),參數(shù)名是:username,值是:
孤傲蒼狼-%>
13<c:paramname="username"value="孤傲蒼狼
"></c:param>
14</c:url>
15<%—使用get的方式訪問—%>
16<ahref="${servletDemol}">超鏈接(get方式請
求)</a>
17<hr/>
18使用post方式提交表單-%>
19<form
action="${pageContext.request.contextPath}/servlet/ServletDemol"
method="post">;20用戶名:<inputtype="text"
name="username"value="孤傲蒼狼"/>
21<inputtype="submit"value="post方式提交">
22</form>
23
24</body>
25</html>
處理請求的ServletDemol代碼如下:
1packageme.gacl.web.controller;
2
3importjava.io.lOException;
4importjava.io.Printwriter;
5
6importjavax.servlet.ServletException;
7importjavax.servlet.http.HttpServlet;
8importjavax.servlet.http.HttpServletRequest;
9importjavax.servlet.http.HttpServletResponse;
10
11publicclassServletDemolextendsHttpServlet{
12
13publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
14throwsServletException,lOException{
15//接收參數(shù)
16Stringusername=request.getParameter("username");
17//獲取請求方式
18Stringmethod=request.getMethod();
19//獲取輸出流
20PrintWriterout=response.getWriter();
21out.write("請求的方式:"+method);
22out.write("<br/>");
23out.write("接收到的參數(shù):"+username);
8/16
24
)
25
26
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponse
response)27throwsServletException,lOException{
28doGet(request,response);
29}
30)
在web.xml中注冊上述的CharacterEncodingFilter和ServletDemol
1<filter>
2<filter-name>CharacterEncodingFilter</filter-name>
3
<filter-class>me.gacl.web.filter.CharacterEncodingFilter</filter-class&g
t;4</filter>
5
6<filter-mapping>
7<filter-name>CharacterEncodingFilter</filter-name>
8<url-pattern>/*</url-pattern>
9</filter-mapping>
10
11<servlet>
12<servlet-name>ServletDemol</servlet-name>
13
<servlet-class>me.gacl.web.controller.ServletDemol</servlet-class>
14</servlet>
15
16<servlet-mapping>
17<servlet-name>ServletDemol</servlet-name>
18<url-pattern>/servlet/ServletDemol</url-pattern>
19</servlet-mapping>
測試結(jié)果如下所示:
9/16
從運行結(jié)果可以看出,上述的過濾器的確是不能解決以get方式提交
中文參數(shù)的亂碼問題,下面使用動態(tài)代理技術(shù)改造上述的過濾器,使之能
夠解決以get方式提交中文參數(shù)的亂碼問題,改造后的過濾器代碼如下:
1packageme.gacl.web.filter;
2
3importjava.io.lOException;
4importjava.lang.reflect.InvocationHandler;
5importjava.Iang.reflect.Method;
6importjava.lang.reflect.Proxy;
7
8importjavax.servlet.Filter;
9importjavax.servlet.FilterChain;
10importjavax.servlet.FilterConfig;
11importjavax.servlet.ServletException;
12importjavax.servlet.ServletRequest;
13importjavax.servlet.ServletResponse;
14importjavax.servlet.http.HttpServletRequest;
15importjavax.servlet.http.HttpServletResponse;
16
17/**
18*@ClassName:CharacterEncodingFilter
19*(?Description:解決中文亂碼的字符過濾器
20*@author:孤傲蒼狼
21*@date:2014-9-14下午10:38:12
22*
23*/
24publicclassCharacterEncodingFilterimplementsFilter{
25
26(?Override
10/16
27publicvoidinit(FilterConfigfilterConfig)throwsServletException
{
28
29}
30
31@Override
32publicvoiddoFilter(ServletRequestreq,ServletResponseresp,
33FilterChainchain)throwslOException,
ServletException{
34
35finalHttpServletRequestrequest=(HttpServletRequest)
req;
36HttpServletResponseresponse=(HttpServletResponse)
resp;
37〃解決以Post方式提交的中文亂碼問題
38request.setCharacterEncoding("UTF-8");
39response.setCharacterEncoding("UTF-8");
40response.setContentType("text/html;charset=UTF-8");
41〃獲取獲取HttpServletRequest對象的代理對象
42ServletRequestrequestProxy=
getHttpServletRequestProxy(request);
43/**
44*傳入代理對象requestProxy給doFilter方法,
45*這樣用戶在使用request對象時實際上使用的是
HttpServletRequest對象的代理對象requestProxy46*/
47chain.doFilter(requestProxy,response);
48}
49
50
51/**
52*@Method:getHttpServletRequestProxy
53*(?Description:獲取HttpServletRequest對象的代理對象
54*@Anthor:孤傲蒼狼
55*
56*@paramrequest
57*@returnHttpServletRequest對象的代理對象
58*/
59privateServletRequestgetHttpServletRequestProxy(final
HttpServletRequestrequest){
60ServletRequestproxy=(ServletRequest)
Proxy.newProxylnstance(
61CharacterEncodingFilter.class.getClassLoader(),
62request.getClass().getlnterfaces(),
63newlnvocationHandler(){
64(?Override
65publicObjectinvoke(Objectproxy,Method
method,Object[]args)
66throwsThrowable{
67〃如果請求方式是get并且調(diào)用的是
getParameter方法
11/16
68
if(request.getMethod().equalslgnoreCase("get")&&
method.getName().equals("getParameter")){
69
〃調(diào)用getParameter方法獲取參數(shù)的值
70Stringvalue=(String)
method.invoke(request,args);
71if(value==null){
72returnnull;
73)
74〃解決以get方式提交的中文亂碼
問題
75returnnew
String(value.getBytes("iso8859-l")/"UTF-8");
76}else{
77〃直接調(diào)用相應(yīng)的方法進行處理
78returnmethod.invoke(request,
args);
79)
80)
81});
82〃返回HttpServletRequest對象的代理對象
83returnproxy;
84}
85
86@Override
87publicvoiddestroy(){
88
89}
90}
我們在過濾器中使用動態(tài)代理技術(shù)生成一個HttpServletRequest對象
的代理對象requestProxy,然后把代理對象requestProxy進行
chain.doRlter(requestProxy,response)傳遞給用戶使用,這樣用戶實際上使
用的就是
HttpServletRequest對象的代理對象requestProxy。然而這一過程對于
用戶來說是透明的,用戶是不知道自己使用的HttpServletRequest對象是一
個代理對象requestProxy,由于代理對象requestProxy和目標對象
HttpServletRequest具有相同的方法,當用戶調(diào)用getParameter方法接收中
文參數(shù)時,實際上調(diào)用的就是代理對象requestProxy的invoke方法,因此
我們就可以在invoke方法中就判斷當前的請求方式以及用戶正在調(diào)用的方
法,如果判斷當前的請求方式是get方式并且用戶正在調(diào)用的是
getParameter方法,那么我們就可以手動處理get方式提交中文參數(shù)的中
文亂碼問題了。
3.2、在字符過濾器中使用動態(tài)代理壓縮服務(wù)器響應(yīng)的內(nèi)容后再輸出到
客戶端
壓縮過濾器的代碼如下:
1packageme.gacl.web.fiIter;
2
3importjava.io.ByteArrayOutputStream;
4importjava.io.lOException;
12/16
5importjava.io.OutputStreamWriter;
6importjava.io.PrintWriter;
7importjava.lang.reflect.InvocationHandler;
8importjava.lang.reflect.Method;
9importjava.Iang.reflect.Proxy;
10importjava.util.zip.GZIPOutputStream;
11
12importjavax.servlet.Filter;
13importjavax.servlet.FilterChain;
14importjavax.servlet.FilterConfig;
15importjavax.servlet.ServletException;
16importjavax.servlet.ServletOutputStream;
17importjavax.servlet.ServletRequest;
18importjavax.servlet.ServletResponse;
19importjavax.servlet.http.HttpServletRequest;
20importjavax.servlet.http.HttpServletResponse;
21
22/**
23*@ClassName:GzipFilter
24*(?Description:壓縮過濾器,將web應(yīng)用中的文本都經(jīng)過壓縮后
再輸出到瀏覽器
25*@author:孤傲蒼狼
26*@date:2014-9-15下午9:35:36
27*
28*/
29publicclassGzipFilterimplementsFilter{
30
31@Override
32publicvoidinit(FilterConfigfilterConfig)throwsServletException
(
33
34}
35
36@Override
37publicvoiddoFilter(ServletRequestreq,ServletResponseresp,
38FilterChainchain)throwslOException,
ServletException{
39
40finalHttpServletRequestrequest=(HttpServletRequest)
req;
41finalHttpServletResponseresponse=(HttpServletResponse)
resp;
42finalByteArrayOutputStreambout=new
ByteArrayOutputStream();
43finalPrintwriterpw=newPrintWriter(new
OutputStreamWriter(bout;'UTF-8"));44
45chain.doFilter(request,
getHttpServletResponseProxy(response,bout,pw));
13/16
46pw.close();
47〃拿到目標資源的輸出
48byteresult[]=bout.toByteArray();
49System.out.println("原始大小:"+result.length);
50
51ByteArrayOutputStreambout2=new
ByteArrayOutputStream();
52GZIPOutputStreamgout=newGZIPOutputStream(bout2);
53gout.write(result);
54gout.close();
55
56〃拿到目標資源輸出的壓縮數(shù)據(jù)
57bytegzip[]=bout2.toByteArray();
58System.out.printing壓縮大小:"+gzip.length);
59
60response.setHeader("content-encoding","gzip");
61response.setContentLength(gzip.length);
62response.getOutputStream().write(gzip);
63)
64
65/**
66*@Method:getHttpServletResponseProxy
67*(?Description:獲取HttpServletResponse對象的代理對象
68*@Anthor:孤傲蒼狼
69*
70*@paramresponse
71*@parambout
72*@parampw
73*@returnHttpServletResponse對象的代理對象
74*/
75privateServletResponsegetHttpServletResponseProxy(
76finalHttpServletResponseresponse,
77finalByteArrayOutputStreambout,
78finalPrintwriterpw){
79
80return(ServletResponse)
Proxy.newProxylnstance(GzipFilter.class.getClassLoader(),81
response.getClass().getlnterfaces(),
82newlnvocationHandler(){
83@Override
84publicObjectinvoke(Objectproxy,Method
method,Object[]args)85throws
Throwable{
86
if(method.getName().equals("getWriter")){
14/16
87
returnpw;
88}else
if(method.getName().equals("getOutputStream")){89
returnnewMyServletOutputStream(bout);
90}else{
91returnmethod.invoke(response,
args);
92}
93}
94});
95}
96
97@Override
98publicvoiddestroy(){
99
100)
101
102classMyServletOutputStr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽理工大學《工廠供電》2021-2022學年期末試卷
- 固定總價合同規(guī)范要求
- 國藥器械銷售合同
- 合同保證金遺失聲明
- 合同法第三章42條
- 2024年興安客運從業(yè)資格證考試模板
- 2024融資合同股權(quán)股份轉(zhuǎn)讓協(xié)議
- 2024工傷勞動合同范文
- 2024小區(qū)綠化工程合同
- 英語閱讀記錄卡-20210813175455
- 網(wǎng)球比賽計分表(共2頁)
- Y2系列電機外形及安裝尺寸(共2頁)
- 地錨抗拔力計算
- 補償收縮混凝土應(yīng)用技術(shù)規(guī)程JGJT1782009
- 豆類食物營養(yǎng)成分表
- 兒童福利機構(gòu)設(shè)備配置標準
- 智慧樹知到《配位化學本科生版》章節(jié)測試答案
- 最新實用培訓(xùn)技巧與方法課件PPT
- 羊頭崗村拆遷安置住宅—3#樓工程試驗方案
- 大同煤業(yè)股份有限公司會計信息披露存在的問題和對策研究論文設(shè)計
- 利用Ansoft HFSS仿真軟件實現(xiàn)微帶-波導(dǎo)過渡的設(shè)計
評論
0/150
提交評論