




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Struts2教程1: 第一個Struts2程序 在本系列教程中我們將學(xué)習(xí)到Struts2的各種技術(shù)。在本教程中使用的工具和程序庫的版本如下: 開發(fā)工具:MyEclipse6Web服務(wù)器:Tomcat6Struts版本:Struts.1JDK版本:JDK_12J2EE版本:Java EE5.0 在本系列教程中Web工程的上下文路徑都是struts2,如果在Web根目錄有一個index.jsp文件,則訪問路徑如下:http:/localhost:8080/struts2/index.jsp 由于MyEclipse6
2、目前并不支持Struts2,所以我們需要到去下載Struts2安裝包。要想正常使用Struts2,至少需要如下五個包(可能會因為Struts2的版本不同,包名略有差異,但包名的前半部是一樣的)。struts2-core-.1.jarxwork-.jarcommons-logging-.jarfreemarker-.jarognl-.jar Struts2雖然在大版本號上是第二個版本,但基本上在配置和使用上已經(jīng)完全顛覆了Struts1.x的方式(當(dāng)然,Struts2仍然是基于MVC模式的,也是動作驅(qū)動的,可能這是唯一沒變的東西)。Struts2實(shí)際上是在Web
3、work基礎(chǔ)上構(gòu)建起來的MVC框架。我們從Struts2的源代碼中可以看到,有很多都是直接使用的xwork(Webwork的核心技術(shù))的包。既然從技術(shù)上來說Struts2是全新的框架,那么就讓我們來學(xué)習(xí)一下這個新的框架的使用方法。 如果大家使用過Struts1.x,應(yīng)該對建立基于Struts1.x的Web程序的基本步驟非常清楚。讓我們先來回顧一下建立基于Struts1.x的Web程序的基本步驟。1. 安裝Struts。由于Struts的入口點(diǎn)是ActionServlet,所以
4、得在web.xml中配置一下這個Servlet。2. 編寫Action類(一般從tion.Action類繼承)。3. 編寫ActionForm類(一般從類繼承),這一步不是必須的,如果要接收客戶端提交的數(shù)據(jù),需要執(zhí)行這一步。4. 在struts-config.xml文件中配置Action和ActionForm。5.
5、0; 如果要采集用戶錄入的數(shù)據(jù),一般需要編寫若干JSP頁面,并通過這些JSP頁面中的form將數(shù)據(jù)提交給Action。下面我們就按著編寫struts1.x程序的這五步和struts2.x程序的編寫過程一一對應(yīng),看看它們誰更“酷”。下面我們來編寫一個基于Struts2的Web程序。這個程序的功能是讓用戶錄入兩個整數(shù),并提交給一個Struts Action,并計算這兩個數(shù)的代數(shù)和,如果代碼和為非負(fù)數(shù),則跳轉(zhuǎn)到positive.jsp頁面,否則跳轉(zhuǎn)到negative.jsp頁面。 【第1步】 安裝Struts2
6、160; 這一步對于Struts1.x和Struts2都是必須的,只是安裝的方法不同。Struts1的入口點(diǎn)是一個Servlet,而Struts2的入口點(diǎn)是一個過濾器(Filter)。因此,Struts2要按過濾器的方式配置。下面是在web.xml中配置Struts2的代碼:<filter> <filter-name>struts2</filter-name> <filter-class>
7、60; org.apache.struts2.dispatcher.FilterDispatcher </filter-class></filter><filter-mapping> <filter-name>struts2</filter-name>
8、60;<url-pattern>/*</url-pattern></filter-mapping> 【第2步】 編寫Action類 這一步和Struts1.x也必須進(jìn)行。只是Struts1.x中的動作類必須從Action類中繼承,而Struts2.x的動作類需要從類繼承。下面是計算兩個整數(shù)代碼和的Action類,代碼如下:package action; import com.opensymphony.xwork2.ActionSupport; p
9、ublic class FirstAction extends ActionSupport private int operand1; private int operand2; public String execute() throws Exception
10、; if (getSum() >= 0) / 如果代碼數(shù)和是非負(fù)整數(shù),跳到positive.jsp頁面 return "positive"
11、0; else / 如果代碼數(shù)和是負(fù)整數(shù),跳到negative.jsp頁面 return "negative"
12、 public int getOperand1() return operand1; public void setOper
13、and1(int operand1) System.out.println(operand1); this.operand1 = operand1; public int
14、getOperand2() return operand2; public void setOperand2(int operand2) System.out
15、.println(operand2); this.operand2 = operand2; public int getSum() return operand1 + operand2; &
16、#160;/ 計算兩個整數(shù)的代碼數(shù)和 從上面的代碼可以看出,動作類的一個特征就是要覆蓋execute方法,只是Struts2的execute方法沒有參數(shù)了,而Struts1.x的execute方法有四個參數(shù)。而且execute方法的返回值也不同的。Struts2只返回一個String,用于表述執(zhí)行結(jié)果(就是一個標(biāo)志)。上面代碼的其他部分將在下面講解?!镜?步】 編寫ActionForm類 在本例中當(dāng)然需要使用ActionForm了。在Struts1.x中,必須要單獨(dú)建立一個ActionF
17、orm類(或是定義一個動作Form),而在Struts2中ActionForm和Action已經(jīng)二合一了。從第二步的代碼可以看出,后面的部分就是應(yīng)該寫在ActionForm類中的內(nèi)容。所以在第2步,本例的ActionForm類已經(jīng)編寫完成(就是Action類的后半部分)?!镜?步】 配置Action類 這一步struts1.x和struts2.x都是必須的,只是在struts1.x中的配置文件一般叫struts-config.xml(當(dāng)然也可以是其他的文件名),而且一般放到WEB-INF目錄中。而在struts2.x中的配置文件一般為struts.xml,
18、放到WEB-INF"classes目錄中。下面是在struts.xml中配置動作類的代碼:<?xml version="1.0" encoding="UTF-8" ?> <!ts-2.0.dtd"> <struts> <package name="struts2" namespace="/mystrut
19、s" extends="struts-default"> <action name="sum" class="action.FirstAction">
20、; <result name="positive">/positive.jsp</result> <result name="negative">/negative.jsp</result>
21、60; </action> </package> </struts> 在<struts>標(biāo)簽中可以有多個<package>,第一個<package>可以指定一個Servlet訪問路徑(不包括動作名),如“/mystruts”。extends屬性繼承一個默認(rèn)的配置文件“struts-default”,一般都繼承于它,大家可以先不去管它。<action>標(biāo)簽中的name屬性表示動
22、作名,class表示動作類名。 <result>標(biāo)簽的name實(shí)際上就是execute方法返回的字符串,如果返回的是“positive”,就跳轉(zhuǎn)到positive.jsp頁面,如果是“negative”,就跳轉(zhuǎn)到negative.jsp頁面。在<struts>中可以有多個<package>,在<package>中可以有多個<action>。我們可以用如下的URL來訪問這個動作:http:/localhost:8080/struts2/mystruts/sum.action 注:Struts1.x的動
23、作一般都以.do結(jié)尾,而Struts2是以.action結(jié)尾?!镜?步】 編寫用戶錄入接口(JSP頁面)1. 主界面(sum.jsp) 在Web根目錄建立一個sum.jsp,代碼如下:<% page language="java" import="java.util.*" pageEncoding="GBK" %> <% taglib prefix=&qu
24、ot;s" uri="/struts-tags"%> <html> <head> <title>輸入操作數(shù)</title> </head>
25、160; <body> 求代數(shù)和 <br/> <s:form action="mystruts/sum.action" >&
26、#160; <s:textfield name="operand1" label=" 操作數(shù)1"/>
27、 <s:textfield name="operand2" label=" 操作數(shù)2" /> <s:submit value
28、="代數(shù)和" /> </s:form> </body> </html> 在sum.jsp中使用了Struts2帶的tag。在Struts2中已經(jīng)將Struts1.
29、x的好幾個標(biāo)簽庫都統(tǒng)一了,在Struts2中只有一個標(biāo)簽庫/struts-tags。這里面包含了所有的Struts2標(biāo)簽。但使用Struts2的標(biāo)簽大家要注意一下。在<s:form>中最好都使用Struts2標(biāo)簽,盡量不要用HTML或普通文本,大家可以將sum.jsp的代碼改為如下的形式,看看會出現(xiàn)什么效果: . . 求代數(shù)和
30、0; <br/> <s:form action="mystruts/sum.action" > 操作數(shù)1:<s:textfield name="operand1" /><
31、br/>操作數(shù)2:<s:textfield name="operand1" /><br/> <s:submit value="代數(shù)和" />
32、160; </s:form> . . 提示一下,在<s:form>中Struts2使用<table>定位。2. positive.jsp<% page language="java" import="java.util.*" pageEncoding
33、="GBK"%> <% taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>顯示代數(shù)和</title> </head>
34、160; <body> 代數(shù)和為非負(fù)整數(shù)<h1><s:property value="sum" /></h1> </body> </html> 3.
35、 negative.jsp <% page language="java" import="java.util.*" pageEncoding="GBK"%> <% taglib prefix="s" uri="/struts-tags" %> <html>
36、 <head> <title>顯示代數(shù)和</title> </head> <body> 代數(shù)和為負(fù)整數(shù)<h1><s:property value="sum" /></h
37、1> </body> </html> 這兩個jsp頁面的實(shí)現(xiàn)代碼基本一樣,只使用了一個<s:property>標(biāo)簽來顯示Action類中的sum屬性值。<s:property>標(biāo)簽是從request對象中獲得了一個對象中得到的sum屬性,如我們可以使用如下的代碼來代替<s:property value=”sum”/>:
38、 <% com.opensymphony.xwork2.util.OgnlValueStack ovs = (com.opensymphony.xwork2.util.OgnlValueStack)request.getAttribute("struts.valueStack"); out.println(ovs.findString("sum"); %> 啟動Tomcat后,在IE中輸入如下的URL來測試這個例子:http:/localhost:8080/stru
39、ts2/sum.jsp Struts2教程2:處理一個form多個submit 在很多Web應(yīng)用中,為了完成不同的工作,一個HTML form標(biāo)簽中可能有兩個或多個submit按鈕,如下面的代碼所示:<!-if !supportLineBreakNewLine-><html action="" method="post"> <input type="submit" value="保存" /><
40、input type="submit" value="打印" /></html> 由于在<form>中的多個提交按鈕都向一個action提交,使用Struts2 Action的execute方法就無法判斷用戶點(diǎn)擊了哪一個提交按鈕。如果大家使用過Struts1.x就會知道在Struts之前的版本需要使用一個LookupDispatchAction動作來處理含有多個submit的form。但使用LookupDispatchAction動作需要訪問屬性文件,還需要映射,比較麻煩。從開始,加入
41、了一個EventDispatchAction動作。這個類可以通過java反射來調(diào)用通過request參數(shù)指定的動作(實(shí)際上只是判斷某個請求參數(shù)是不存在,如果存在,就調(diào)用在action類中和這個參數(shù)同名的方法)。使用EventDispatchAction必須將submit的name屬性指定不同的值以區(qū)分每個submit。而在Struts2中將更容易實(shí)現(xiàn)這個功能。當(dāng)然,我們也可以模擬EventDispatchAction的方法通過request獲得和處理參數(shù)信息。但這樣比較麻煩。在Struts2中提供了另外一種方法,使得無需要配置可以在同一個action類中執(zhí)行不同的方法(默認(rèn)執(zhí)行的是execut
42、e方法)。使用這種方式也需要通過請求參來來指定要執(zhí)行的動作。請求參數(shù)名的格式為action!method.action注:由于Struts2只需要參數(shù)名,因此,參數(shù)值是什么都可以。下面我就給出一個實(shí)例程序來演示如何處理有多個submit的form:【第1步】實(shí)現(xiàn)主頁面(more_submit.jsp) <% page language="java" import="java.util.*" pageEncoding="GBK"%><% taglib
43、;prefix="s" uri="/struts-tags" %><html> <head> <title>My JSP 'hello.jsp' starting page</title> </head> <body> &l
44、t;s:form action="submit.action" > <s:textfield name="msg" label="輸入內(nèi)容"/> <s:submit name="save" value="保存&qu
45、ot; align="left" method="save"/> <s:submit name="print" value="打印" align="left" method="print" />
46、0; </s:form> </body></html>在more_submit.jsp中有兩個submit:保存和打印。其中分別通過method屬性指定了要調(diào)用的方法:save和print。因此,在Action類中必須要有save和print方法。【第2步】實(shí)現(xiàn)Action類(MoreSubmitAction) package action;import javax.servlet.http.*;import com.opensymphony.xwork2.ActionSupport;i
47、mport erceptor.*;public class MoreSubmitAction extends ActionSupport implements ServletRequestAware private String msg; private javax.servlet.http.HttpServletRequest request;
48、60; / 獲得HttpServletRequest對象 public void setServletRequest(HttpServletRequest request) this.request = request; /
49、 處理save submit按鈕的動作 public String save() throws Exception request.setAttribute("result", "成功保存" + msg + ""); &
50、#160; return "save" / 處理print submit按鈕的動作 public String print() throws Exception requ
51、est.setAttribute("result", "成功打印" + msg + ""); return "print" public String getMsg()
52、 return msg; public void setMsg(String msg) this.msg = msg; 上面的代碼需要注意如下兩點(diǎn):save和print方法必須存在,否則會拋出異常。S
53、truts2 Action動作中的方法和Struts1.x Action的execute不同,只使用Struts2 Action動作的execute方法無法訪問request對象,因此,Struts2 Action類需要實(shí)現(xiàn)一個Struts2自帶的攔截器來獲得request對象,攔截器如下:erceptor. ServletRequestAware【第3步】配置Struts2 Actionstruts.xml的代碼如下:<?xml version="1.0" encoding="UTF-8&qu
54、ot; ?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "/dtds/struts-2.0.dtd"><struts>
55、160; <package name="demo" extends="struts-default" > <action name="submit" class="action.MoreSubmitAction">
56、0; <result name="save" > /result.jsp </result>
57、60; <result name="print"> /result.jsp </result> &
58、#160; </action> </package> </struts>【第4步】編寫結(jié)果頁(result.jsp) <% page pageEncoding="GBK"%><html> <head> <title>提交結(jié)果</t
59、itle> </head> <body> <h1>$result</h1> </body></html>在result.jsp中將在save和print方法中寫到request屬性中的執(zhí)行結(jié)果信息取出來,并輸出到客戶端。啟動Tomcat后,在IE中執(zhí)行如下的URL來測試程序: http:/localhost:8080/moresubmit/more_submit.jsp大
60、家也可以直接使用如下的URL來調(diào)用save和print方法:調(diào)用save方法:http:/localhost:8080/moresubmit/submit!save.action調(diào)用print方法:http:/localhost:8080/moresubmit/submit!print.action源代碼:Struts2教程3:struts.xml常用配置解析 在本文中將詳細(xì)講述struts.xml文件的常用配置及注意事項。1. 使用<include>標(biāo)簽重用配置文件在Struts2中提供了一個默認(rèn)
61、的struts.xml文件,但如果package、action、interceptors等配置比較多時,都放到一個struts.xml文件不太容易維護(hù)。因此,就需要將struts.xml文件分成多個配置文件,然后在struts.xml文件中使用<include>標(biāo)簽引用這些配置文件。這樣做的優(yōu)點(diǎn)如下:結(jié)構(gòu)更清晰,更容易維護(hù)配置信息。配置文件可以復(fù)用。如果在多個Web程序中都使用類似或相同的配置文件,那么可以使用<include>標(biāo)簽來引用這些配置文件,這樣可以減少工作量。假設(shè)有一個配置文件,文件名為newstruts.xml,代碼如下: <?xml
62、60;version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "/dtds/struts-2.0.dtd&
63、quot;><struts> <package name="demo" extends="struts-default" > <action name="submit" class="action.MoreSubmitAction">
64、60; <result name="save" > /result.jsp </result>
65、160; <result name="print"> /result.jsp </result>
66、 </action> </package> </struts> 則struts.xml引用newstruts.xml文件的代碼如下:<?xml version="1.0" enc
67、oding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "/dtds/struts-2.0.dtd"><struts>
68、 <include file="newstruts.xml"/> <package name="test" extends="struts-default"> </package> </struts> 大家要注意一下,用<in
69、clude>引用的xml文件也必須是完成的struts2的配置。實(shí)際上<include>在引用時是單獨(dú)解析的xml文件,而不是將被引用的文件插入到struts.xml文件中。2. action的別名 在默認(rèn)情況下,Struts2會調(diào)用動作類的execute方法。但有些時候,我們需要在一個動作類中處理不同的動作。也就是用戶請求不同的動作時,執(zhí)行動作類中的不同的方法。為了達(dá)到這個目的,可以在<action>標(biāo)簽中通過method方法指定要
70、指行的動作類的方法名,并且需要為不同的動作起不同的名子(也稱為別名)。如下面代碼所示:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "ht
71、tp://dtds/struts-2.0.dtd"><struts><package name="demo" extends="struts-default" > <action name="test" class="action.MyAction"> &
72、#160; </action> <action name="my" class="action. MyAction" method="my"> &
73、#160; </action> </package> </struts>上面代碼的兩個動作的class屬性都指向同一個類,name為這個類起了兩個動作別名:test和my。在動作my中,使用了method屬性指定要要運(yùn)行的方法名為my。 在MyAction類中必須要有m
74、y方法,代碼如下:package action;import com.opensymphony.xwork2.ActionSupport;public class MyAction extends ActionSupport public String execute() throws Exception
75、160; / 處理test動作的代碼 public String my() throws Exception / 處理my動作的代碼
76、60; 除了在struts.xml中配置別名,還可以通過請求參數(shù)來描述指定動作(并不需要在struts.xml中配置)。請求參數(shù)的格式如下:http:/localhost:8080/contextPath/actionName!method.action關(guān)于通過請求指定動作的詳細(xì)內(nèi)容,請參閱筆者寫的Struts2教程2:處理一個form多個submit。3. 為action指定參數(shù)在struts2中還可以為action指定一個或多個參數(shù)。大家還記著struts1.x是如何設(shè)置的action參數(shù)不? 在
77、struts1.x中可以使用<action>標(biāo)簽的parameter屬性為其指定一個action參數(shù),如果要指定多個,就只能通過逗號(,)或其他的分隔符將不同的參數(shù)隔開。而在struts2中可以通過<param>標(biāo)簽指定任意多個參數(shù)。代碼如下:<action name="submit" class="action.MyAction"><param name="param1">value1</param><param n
78、ame="param2">value2</param> <result name="save" > /result.jsp </result> </action>
79、0; 當(dāng)然,在action中讀這些參數(shù)也非常簡單,只需要象獲取請求參數(shù)一樣在action類中定義相應(yīng)的setter方法即可(一般不用定義getter方法)。如下面的代碼將讀取param1和param2參數(shù)的值:package action;import com.opensymphony.xwork2.ActionSupport;public class MyAction extends ActionSupport private String
80、 param1; private String param2; public String execute() throws Exception System.out.println(param1 + param2);
81、; public void setParam1(String param1) this.param1 = param1; public void setParam2(String param2)
82、0; this.param2 = param2; 當(dāng)struts2在調(diào)用execute之前,param1和param2的值就已經(jīng)是相應(yīng)參數(shù)的值了,因此,在execute方法中可以直接使用param1和param2。4. 選擇result類型 在默認(rèn)時,<result>標(biāo)簽的
83、type屬性值是“dispatcher”(實(shí)際上就是轉(zhuǎn)發(fā),forward)。開發(fā)人員可以根據(jù)自己的需要指定不同的類型,如redirect、stream等。如下面代碼所示:<result name="save" type="redirect"> /result.jsp</result>這此result-type可以在struts2-core-.1.jar包或struts2源代碼中的struts-default.xml文件中找到,在這個文件中找到<
84、result-types>標(biāo)簽,所有的result-type都在里面定義了。代碼如下:<result-types> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name="dispa
85、tcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
86、 <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <result-type name="redirect" class="org.apache.struts2.dispatcher.Servl
87、etRedirectResult"/> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> <result-type name="stream" c
88、lass="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="x
89、slt" class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> <!-
90、;Deprecated name form scheduled for removal in Struts . The camelCase versions are preferred. See ww-1707 -> <result-type name="redirect-action" class=&q
91、uot;org.apache.struts2.dispatcher.ServletActionRedirectResult"/> <result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" /></result-types>5.
92、 全局result有很多時候一個<result>初很多<action>使用,這時可以使用<global-results>標(biāo)簽來定義全局的<result>,代碼如下: <struts> <package name="demo" extends="struts-default"> <global-res
93、ults> <result name="print">/result.jsp</result> </global-results> <action name="submit
94、" class="action.MoreSubmitAction"> </action> <action name="my" class="action.MoreSubmitAction&q
95、uot; method="my"> </action> </package></struts> 如果<action>中沒有相應(yīng)的<result>,Struts2就會使用全局的<result>。在本文中將詳細(xì)講述strut
96、s.xml文件的常用配置及注意事項。1. 使用<include>標(biāo)簽重用配置文件在Struts2中提供了一個默認(rèn)的struts.xml文件,但如果package、action、interceptors等配置比較多時,都放到一個struts.xml文件不太容易維護(hù)。因此,就需要將struts.xml文件分成多個配置文件,然后在struts.xml文件中使用<include>標(biāo)簽引用這些配置文件。這樣做的優(yōu)點(diǎn)如下:結(jié)構(gòu)更清晰,更容易維護(hù)配置信息。配置文件可以復(fù)用。如果在多個Web程序中都使用
97、類似或相同的配置文件,那么可以使用<include>標(biāo)簽來引用這些配置文件,這樣可以減少工作量。假設(shè)有一個配置文件,文件名為newstruts.xml,代碼如下: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts C
98、onfiguration 2.0/EN" "/dtds/struts-2.0.dtd"><struts> <package name="demo" extends="struts-default" > <action
99、60;name="submit" class="action.MoreSubmitAction"> <result name="save" > /r
100、esult.jsp </result> <result name="print">
101、 /result.jsp </result> </action> </package>
102、60;</struts> 則struts.xml引用newstruts.xml文件的代碼如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN"
103、; "/dtds/struts-2.0.dtd"><struts> <include file="newstruts.xml"/> <package name="test" extends="struts-default">
104、160; </package> </struts> 大家要注意一下,用<include>引用的xml文件也必須是完成的struts2的配置。實(shí)際上<include>在引用時是單獨(dú)解析的xml文件,而不是將被引用的文件插入到struts.xml文件中。2. action的別名 在默認(rèn)情況下,Struts2會調(diào)用動作類的
105、execute方法。但有些時候,我們需要在一個動作類中處理不同的動作。也就是用戶請求不同的動作時,執(zhí)行動作類中的不同的方法。為了達(dá)到這個目的,可以在<action>標(biāo)簽中通過method方法指定要指行的動作類的方法名,并且需要為不同的動作起不同的名子(也稱為別名)。如下面代碼所示:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "/dtds/struts-2.0.dtd"><struts><package name="demo&
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手車銷售質(zhì)量保證合同書
- 政府項目招標(biāo)與投標(biāo)操作手冊
- 分季度財務(wù)預(yù)算明細(xì)表
- 農(nóng)村農(nóng)業(yè)項目資金使用協(xié)議
- 基礎(chǔ)工作流程簡明教程與指南
- 員工辦公電腦使用說明書
- 理發(fā)師學(xué)徒專用合同
- 《數(shù)學(xué)函數(shù)圖像理解與問題解決》
- 企業(yè)戰(zhàn)略聯(lián)盟合作能力提升效果評估預(yù)案
- 汽車股份轉(zhuǎn)讓合同
- 2024北京租房合同協(xié)議書下載
- 2023年深圳市龍華區(qū)招聘社區(qū)網(wǎng)格員考試試題及答案
- 《預(yù)應(yīng)力混凝土管樁基礎(chǔ)技術(shù)規(guī)程》DB42@489-2008
- 社區(qū)老人智能手機(jī)使用培訓(xùn)課件
- 2024年7月13日云南省昆明市直遴選筆試真題及解析綜合管理崗
- 個人信息安全保護(hù)管理規(guī)定
- 化工行業(yè)員工職業(yè)發(fā)展規(guī)劃
- DL∕T 1881-2018 智能變電站智能控制柜技術(shù)規(guī)范
- 2023北京順義區(qū)招錄鄉(xiāng)村振興協(xié)理員及考察筆試歷年典型考題及考點(diǎn)剖析附答案帶詳解
- 中國慢性冠脈綜合征患者診斷及管理指南2024版解讀
- 超全讀書筆記-2萬字
評論
0/150
提交評論