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


< 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>標簽中,config代表Struts配置文件所在的位置,這里需要注意 config/moduleA的寫法,它代表著一個模塊moduleA以及支持該模塊的配置文件
??????<init-param>可以具有多個,在這里可以保存一些客戶化的參數,使用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>:指定標簽庫的物理位置,即實際存放在什么地方。


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


< error-page >
???? < error-code > 404 </ error-code >
???? < location > /common/404.html </ location >
</ error-page >
??????<error-code>:指定需要處理的錯誤號;
??????<location>:指定出錯后跳轉的處理頁面,這里可以設置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配置的相關類位于org.apache.struts.config包中,其中ModuleConfig接口是整個樹的頂點,各種配置信息都放入ModuleConfig的實現類中(由于存在著多模塊,因此會有多個實現)。因此從ModuleConfig接口中可以取得各種配置信息,當然需要先通過selectModule()來選擇需要操作的具體實現。
?????????還需要注意的一點就是在Struts配置文件里面DTD文件嚴格定義了各個元素出現的先后順序。


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


< form-beans >
???? < form-bean? name ="loginForm" ?type ="com.ddm.struts.addressbook.form.LoginForm" ? />
</ form-beans >
??????<form-bean>:ActionFormBean的參數。
?????????className:該標簽對應的配置類,Struts中與之對應的類是"org.apache.struts.config.FormBeanConfig",有需要時也可自行指定
?????????name:該ActionForm的唯一標識符
?????????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:屬性類型,必須是對象類型。如果是Java簡單數據類型需要使用包裝類
?????????inital:初始值,可缺省,與類的屬性可以不用初始化的特性相同
??????另:這個動態ActionForm還很有些名堂,現在只能逐步推進了


< 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>標簽對應的配置類,缺省是"org.apache.struts.config.ExceptionConfig";
?????????handler:異常處理類,缺省是"org.apache.struts.action.ExceptionHandler";
?????????key:描述異常的消息在資源文件中的key;
?????????bundle:資源文件,可缺省;
?????????path:Struts捕獲到指定類型的異常后,轉發的處理路徑;
?????????scope:ActionMessages實例的存放范圍,缺省為"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>標簽對應的配置類,缺省為"org.apache.struts.action.ActionForward";
?????????contextRelative:缺省值為"false",表示path相對于應用;當取值為"true"時,表示path屬性給出的是相對于當前上下文的URL,如果配置用于子模塊之間切換的forward,則此項需設為"true";
?????????name:名稱;
?????????path:轉發的路徑,必須以"/"打頭
?????????redirect:缺省值為"false",表示請求轉發,取值"true"時,表示重定向,子模塊切換用的forward,此項需設為"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:標簽對應的配置類,缺省為"org.apache.struts.action.ActionMapping"
?????????attribute:name屬性所對應的ActionForm實例的 key ,通過這個attribute操作它,如 (LoginForm)request.getAttribute("loginForm"); ;
?????????input:輸入URL,轉發到該 Action 時如果 ActionForm.validate() 檢驗失敗,Action 將把請求轉發到該URL,請看?;
?????????name:與Action對應的ActionForm的 name ,與<form-bean>標簽的name屬性相匹配;
?????????path:Action的訪問路徑,必須以"/"打頭,不需要后綴
?????????scope:與Action對應的ActionForm的存在范圍,缺省是"session",可取值"request";
?????????validate:是否需要調用ActionForm的 validate() 方法進行檢驗,缺省是"true",可取值"false",ActionForm將不會對提交的數據進行表單校驗;
?????????parameter:可附加的參數,在Action中可以用 mapping.getParameter() 來獲取;
?????????roles:指定允許調用該Action的安全角色,與容器設置的安全角色匹配,由容器來判斷;
?????????unknown:表示是否處理用戶發出的所有無效的Action URL,默認為"false";
?????????type:Action的類名;
?????????forward:指定轉發的URL,相當于使用ForwardAction
?????????include:指定包含的URL,相當于使用IncludeAction
?????????<exception>:Action局部異常捕獲,參看<global-exceptions>小節
?????????<forward>:Action局部forward,參看<global-forwards>小節
??????注意:
?????????<action>標簽的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:標簽的配置類,缺省為"org.apache.struts.config.ControllerConfig";
?????????contentType:指定響應結果的內容類型和字符編碼,如果在Action和JSP中設置將會覆蓋掉該設置;
?????????locale:指定是否把 Locale 對象保存到session中,默認值為"false";
?????????nochache:是否在客戶端緩存,缺省為"false",可選"true",struts將在響應中加入特定的頭參數以防止頁面被緩存
?????????processorClass:指定負責處理 Request 的類,缺省為"org.apache.struts.action.RequestProcessor",如果有多模塊則應在各模塊指定自己的處理類;
?????????bufferSize:指定上傳文件的輸入緩沖,默認為"4096";
?????????tempDir:指定處理上傳文件的臨時工作目錄,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:標簽的配置類,缺省為"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加以區別,可通過 (MessageResources)servletContext.getAttribute(key) 拿到,Struts提供的客戶化標簽中常常可以見到一個 bundle 屬性,該屬性即對應于這里的 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>:設置插件的屬性,可具有多個,該插件類必須實現與本屬性對應的setter/getter,在Struts初始化時自動set。
??????插件必須實現 org.apache.struts.action.PlugIn 接口,該接口具有兩個方法:
public?void?init(ActionServlet?servlet,ApplicationConfig?config)?throws?ServletException;
??????init方法將于Struts應用啟動時被調用,是一個初始化客戶資源的接口,而且由Struts傳入的參數也便于設置各種環境。public?void?destroy();
??????destroy方法于Struts應用關閉時調用,是一個釋放客戶資源的接口。??????多應用模塊的配置
??????多應用模塊的劃分有助于應用的并行開發,提高效率。
??????步驟:
?????????1.為每個子應用創建單獨的 Struts 配置文件;
?????????2.在 web.xml 中配置每個子應用的信息,參看 這里 ;
?????????3.應用中實現切換:<forward> 或 在<action>標簽中使用 SwitchAction 來實現切換