???Struts應(yīng)用的配置
??????Struts的配置是兩個(gè)文件web.xml以及struts配置文件
?????? 1.web.xml
?????????配置ActionServlet,其方法與配置普通的Servlet一致,涉及的元素是<servlet> (名稱,類,參數(shù)),<servlet-mapping> (servlet所要處理的URL),<taglib> (客戶化標(biāo)簽庫)


< servlet >
???? < servlet-name > action </ servlet-name >
???? < servlet-class > org.apache.struts.action.ActionServlet </ servlet-class >
???? < init-param >
???????? < param-name > config </ param-name >
???????? < param-value > /WEB-INF/struts-config.xml </ param-value >
???? </ init-param >
???? < init-param >
???????? < param-name > config/moduleA </ param-name >
???????? < param-value > /WEB-INF/struts-moduleA.xml </ param-value >
???? </ init-param >
</ servlet >
< servlet-mapping >
???? < servlet-name > action </ servlet-name >
???? < url-pattern > *.do </ url-pattern >
</ servlet-mapping >
??????ActionServlet支持用戶類,只需要改變這里的<servlet-class>即可使用自定義類;
??????<servlet>/<init-param>標(biāo)簽中,config代表Struts配置文件所在的位置,這里需要注意 config/moduleA的寫法,它代表著一個(gè)模塊moduleA以及支持該模塊的配置文件
??????<init-param>可以具有多個(gè),在這里可以保存一些客戶化的參數(shù),使用servlet.getInitParameter("paramname")的方式即可以取得。
??????<url-parttern>代表該servlet所要處理的URL,支持通配符,*.do代表所有以 .do 為后綴的請求都交由該servlet來處理


< taglib >
???? < taglib-uri > /WEB-INF/struts-html.tld </ taglib-uri >
???? < taglib-location > /WEB-INF/struts-html.tld </ taglib-location >
</ taglib >
??????<taglib-location>:指定標(biāo)簽庫的物理位置,即實(shí)際存放在什么地方。


< welcome-file-list >
???? < welcome-file > welcome.jsp </ welcome-file >
???? < welcome-file > index.html </ welcome-file >
</ welcome-file-list >
??????該元素不能被配置成Action,如果有此需要的話則應(yīng)在這里配置一個(gè)JSP,并在JSP里面<logic:forward name="key" />進(jìn)行跳轉(zhuǎn)


< error-page >
???? < error-code > 404 </ error-code >
???? < location > /common/404.html </ location >
</ error-page >
??????<error-code>:指定需要處理的錯(cuò)誤號(hào);
??????<location>:指定出錯(cuò)后跳轉(zhuǎn)的處理頁面,這里可以設(shè)置JSP頁面。


< error-page >
???? < exception-type > javax.servlet.ServletException </ exception-type >
???? < location > /common/system_error.jsp </ location >
</ error-page >
?????????RuntimeException 或 Error
?????????ServletException
?????????IOException
?????? 2.Struts配置文件
?????????Struts配置的相關(guān)類位于org.apache.struts.config包中,其中ModuleConfig接口是整個(gè)樹的頂點(diǎn),各種配置信息都放入ModuleConfig的實(shí)現(xiàn)類中(由于存在著多模塊,因此會(huì)有多個(gè)實(shí)現(xiàn))。因此從ModuleConfig接口中可以取得各種配置信息,當(dāng)然需要先通過selectModule()來選擇需要操作的具體實(shí)現(xiàn)。
?????????還需要注意的一點(diǎn)就是在Struts配置文件里面DTD文件嚴(yán)格定義了各個(gè)元素出現(xiàn)的先后順序。


< data-sources >
???? < data-source? type ="org.apache.commons.dbcp.BasicDataSource" >
???????? < set-property? property ="dirverClassName" ?value ="com.microsoft.jdbc.sqlserver.SQLServerDriver" ? />
???????? < set-property? property ="url" ?value ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=addressbook;" ? />
???????? < set-property? property ="username" ?value ="sa" ? />
???????? < set-property? property ="password" ?value ="i?am?ddm" ? />
???????? < set-property? property ="autoCommit" ?value ="false" ? />
???????? < set-property? property ="readOnly" ?value ="false" ? />
???????? < set-property? property ="minCount" ?value ="2" ? />
???????? < set-property? property ="maxCount" ?value ="20" ? />
???????? < set-property? property ="description" ?value ="SQL?Server2000" ? />
???? </ data-source >
???? < data-source? key ="datasource.other" ?type ="

????????

???? </ data-source >
</ data-sources >
??????<data-source>:數(shù)據(jù)源的參數(shù),由于可以有多個(gè)數(shù)據(jù)源,因此<data-source>有一個(gè)屬性 key 用于區(qū)分,如果沒有 key 屬性,Struts將此做為缺省的數(shù)據(jù)源,該缺省數(shù)據(jù)源實(shí)際上也是有 key 值的,對(duì)應(yīng)于Globals.DATA_SOURCE_KEY的值,實(shí)際值是 "org.apache.struts.action.DATA_SOURCE"字串。
?????????:key 屬性的值不允許重復(fù),自行指定key屬性后,在Action中操作為 this.getDataSource(request,key),在其它地方則需要從ServletContext(application范圍)中用 (DataSource)getAttribute(key),參數(shù)key的值與該屬性值完全相同,因此在配置文件中該屬性應(yīng)該具有一定的區(qū)別性,如"datasource.other"等,以避免在引用時(shí)出現(xiàn)麻煩,另外如果在配置文件中各個(gè)data-source都配置了key屬性,那么在應(yīng)用僅能通過對(duì)應(yīng)的key值進(jìn)行調(diào)用,而不會(huì)存在著缺省數(shù)據(jù)源("org.apache.struts.action.DATA_SOURCE");
?????????:使用Myeclipse插件配DBCP時(shí)還需要手工修改 幾處 。


< form-beans >
???? < form-bean? name ="loginForm" ?type ="com.ddm.struts.addressbook.form.LoginForm" ? />
</ form-beans >
??????<form-bean>:ActionFormBean的參數(shù)。
?????????className:該標(biāo)簽對(duì)應(yīng)的配置類,Struts中與之對(duì)應(yīng)的類是"org.apache.struts.config.FormBeanConfig",有需要時(shí)也可自行指定
?????????name:該ActionForm的唯一標(biāo)識(shí)符
?????????type:ActionForm的類名


< form-bean? name ="userForm" ?type ="org.apache.struts.action.DynaActionForm" >
???? < form-property? name ="firstName" ?type ="java.lang.String" ? />
???? < form-property? name ="lastName" ?type ="java.lang.String" ? />
???? < form-property? name ="age" ?type ="java.lang.Integer" ?initial ="18" ? />
</ form-bean >
??????<form-property>:配置ActionForm的成員屬性
?????????name:屬性名稱
?????????type:屬性類型,必須是對(duì)象類型。如果是Java簡單數(shù)據(jù)類型需要使用包裝類
?????????inital:初始值,可缺省,與類的屬性可以不用初始化的特性相同
??????另:這個(gè)動(dòng)態(tài)ActionForm還很有些名堂,現(xiàn)在只能逐步推進(jìn)了


< global-exceptions >
???? < exception
???????? className ="org.apache.struts.config.ExceptionConfig"
????????handler ="org.apache.struts.action.ExceptionHandler"
????????key ="global.error.login"
????????bundle ="bundle01"
????????path ="/err.jsp"
????????scope ="request"
????????type ="com.ddm.struts.addressbook.LoginException"
???? />
</ global-exceptions >
??????<exception>:配置異常處理
?????????className:與<exception>標(biāo)簽對(duì)應(yīng)的配置類,缺省是"org.apache.struts.config.ExceptionConfig";
?????????handler:異常處理類,缺省是"org.apache.struts.action.ExceptionHandler";
?????????key:描述異常的消息在資源文件中的key;
?????????bundle:資源文件,可缺省;
?????????path:Struts捕獲到指定類型的異常后,轉(zhuǎn)發(fā)的處理路徑;
?????????scope:ActionMessages實(shí)例的存放范圍,缺省為"request",還可取值"session";
?????????type:異常的類型


< global-forwards >
???? < forward
???????? className ="org.apache.struts.action.ActionForward"
????????contextRelative ="false"
????????name ="login"
????????path ="/login.jsp"
????????redirect ="false"
???? />
???? < forward
???????? name ="toModuleA"
????????contextRelative ="true"
????????path ="/moduleA/index.do"
????????redirect ="true"
???? />
</ global-forwards >
??????<forward>:配置forward
?????????className:與<forward>標(biāo)簽對(duì)應(yīng)的配置類,缺省為"org.apache.struts.action.ActionForward";
?????????contextRelative:缺省值為"false",表示path相對(duì)于應(yīng)用;當(dāng)取值為"true"時(shí),表示path屬性給出的是相對(duì)于當(dāng)前上下文的URL,如果配置用于子模塊之間切換的forward,則此項(xiàng)需設(shè)為"true";
?????????name:名稱;
?????????path:轉(zhuǎn)發(fā)的路徑,必須以"/"打頭
?????????redirect:缺省值為"false",表示請求轉(zhuǎn)發(fā),取值"true"時(shí),表示重定向,子模塊切換用的forward,此項(xiàng)需設(shè)為"true"?


<action-mappings>
????<action
????????className="org.apache.struts.action.ActionMapping"
????????attribute="loginForm"
????????input="/login.jsp"
????????name="loginForm"
????????path="/login"
????????scope="request"
????????validate="true"
????????parameter="36"
????????roles=""
????????unknown="false"
????????type="com.ddm.struts.addressbook.action.LoginAction"
????????forward="

????????include="

????>
????????<exception?
????????????key="global.error.login"
????????????path="/err.jsp"
????????????type="com.ddm.struts.address.LoginException"
????????/>
????????<forward?name="loginSuccess"?path="/menu.jsp"?/>
????????<forward?name="loginFaile"?path="/login.jsp"?/>
????</action>
</action-mappings>
??????<action>:配置Action
?????????className:標(biāo)簽對(duì)應(yīng)的配置類,缺省為"org.apache.struts.action.ActionMapping"
?????????attribute:name屬性所對(duì)應(yīng)的ActionForm實(shí)例的 key ,通過這個(gè)attribute操作它,如 (LoginForm)request.getAttribute("loginForm"); ;
?????????input:輸入U(xiǎn)RL,轉(zhuǎn)發(fā)到該 Action 時(shí)如果 ActionForm.validate() 檢驗(yàn)失敗,Action 將把請求轉(zhuǎn)發(fā)到該URL,請看?;
?????????name:與Action對(duì)應(yīng)的ActionForm的 name ,與<form-bean>標(biāo)簽的name屬性相匹配;
?????????path:Action的訪問路徑,必須以"/"打頭,不需要后綴
?????????scope:與Action對(duì)應(yīng)的ActionForm的存在范圍,缺省是"session",可取值"request";
?????????validate:是否需要調(diào)用ActionForm的 validate() 方法進(jìn)行檢驗(yàn),缺省是"true",可取值"false",ActionForm將不會(huì)對(duì)提交的數(shù)據(jù)進(jìn)行表單校驗(yàn);
?????????parameter:可附加的參數(shù),在Action中可以用 mapping.getParameter() 來獲取;
?????????roles:指定允許調(diào)用該Action的安全角色,與容器設(shè)置的安全角色匹配,由容器來判斷;
?????????unknown:表示是否處理用戶發(fā)出的所有無效的Action URL,默認(rèn)為"false";
?????????type:Action的類名;
?????????forward:指定轉(zhuǎn)發(fā)的URL,相當(dāng)于使用ForwardAction
?????????include:指定包含的URL,相當(dāng)于使用IncludeAction
?????????<exception>:Action局部異常捕獲,參看<global-exceptions>小節(jié)
?????????<forward>:Action局部forward,參看<global-forwards>小節(jié)
??????注意:
?????????<action>標(biāo)簽的type,forward,include三種屬性互斥。


<controller
????className="org.apache.struts.config.ControllerConfig"
????contentType="text/html;charset=UTF-8"
????locale="true"
????nochache="false"
????proccessorClass="org.apache.struts.action.RequestProcessor"
/>
?????????className:標(biāo)簽的配置類,缺省為"org.apache.struts.config.ControllerConfig";
?????????contentType:指定響應(yīng)結(jié)果的內(nèi)容類型和字符編碼,如果在Action和JSP中設(shè)置將會(huì)覆蓋掉該設(shè)置;
?????????locale:指定是否把 Locale 對(duì)象保存到session中,默認(rèn)值為"false";
?????????nochache:是否在客戶端緩存,缺省為"false",可選"true",struts將在響應(yīng)中加入特定的頭參數(shù)以防止頁面被緩存
?????????processorClass:指定負(fù)責(zé)處理 Request 的類,缺省為"org.apache.struts.action.RequestProcessor",如果有多模塊則應(yīng)在各模塊指定自己的處理類;
?????????bufferSize:指定上傳文件的輸入緩沖,默認(rèn)為"4096";
?????????tempDir:指定處理上傳文件的臨時(shí)工作目錄,Servlet容器可以自行分配。


<message-resources?
????className="org.apache.struts.config.MessageResourcesConfig"
????factory="org.apache.struts.util.PropertyMessageResourcesFactory"
????key="org.apache.struts.action.MESSAGE"
????null="true"
????parameter="com.ddm.struts.addressbook.ApplicationResources"?
/>
?????????className:標(biāo)簽的配置類,缺省為"org.apache.struts.config.MessageResourcesConfig";
?????????factory:資源的工廠類,缺省為"org.apache.struts.util.PropertyMessageResourcesFactory";
?????????key:指定 Resource Bundle 存放在 ServletContext 中的 key,缺省為Globals.MESSAGES_KEY的值 "org.apache.struts.MESSAGE" ,可以自行指定key,使用如resource.bundle01加以區(qū)別,可通過 (MessageResources)servletContext.getAttribute(key) 拿到,Struts提供的客戶化標(biāo)簽中常常可以見到一個(gè) bundle 屬性,該屬性即對(duì)應(yīng)于這里的 key 值;
?????????null:指定如何處理未知的消息,缺省為"true",返回空字串,可選"false",將返回類似"???key???"的字串;
?????????parameter:資源文件的存放路徑。


<plug-in?className="com.ddm.struts.addressbook.bean.UserBean">
????<set-property?property="path"?value="/WEB-INF/user.xml"?/>
</plug-in>
??????<set-property>:設(shè)置插件的屬性,可具有多個(gè),該插件類必須實(shí)現(xiàn)與本屬性對(duì)應(yīng)的setter/getter,在Struts初始化時(shí)自動(dòng)set。
??????插件必須實(shí)現(xiàn) org.apache.struts.action.PlugIn 接口,該接口具有兩個(gè)方法:
public?void?init(ActionServlet?servlet,ApplicationConfig?config)?throws?ServletException;
??????init方法將于Struts應(yīng)用啟動(dòng)時(shí)被調(diào)用,是一個(gè)初始化客戶資源的接口,而且由Struts傳入的參數(shù)也便于設(shè)置各種環(huán)境。public?void?destroy();
??????destroy方法于Struts應(yīng)用關(guān)閉時(shí)調(diào)用,是一個(gè)釋放客戶資源的接口。??????多應(yīng)用模塊的配置
??????多應(yīng)用模塊的劃分有助于應(yīng)用的并行開發(fā),提高效率。
??????步驟:
?????????1.為每個(gè)子應(yīng)用創(chuàng)建單獨(dú)的 Struts 配置文件;
?????????2.在 web.xml 中配置每個(gè)子應(yīng)用的信息,參看 這里 ;
?????????3.應(yīng)用中實(shí)現(xiàn)切換:<forward> 或 在<action>標(biāo)簽中使用 SwitchAction 來實(shí)現(xiàn)切換