MailReader-Struts1.3.8配置文件分析
MailReader-Struts1.3.8配置文件分析
MailReader是Struts自帶的4個例子之一,本文分析Struts1.3.8版本里的配置文件。MailReader的Tour文件是必讀材料。
按照web.xml,struts-config.xml,validation.xml的順序分別分析。
l Web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <!— 指出struts的配置文件 --> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <!— 所有.do的請求經過struts的ActionServlet處理 --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!— 未處理的異常,最后頁面會跳到Error.jsp --> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/Error.jsp</location> </error-page> </web-app> |
l Struts-config.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <!— 定義FormBean --> <form-beans> <!— DynaValidatorForm 的 FormBean可以實現繼承,這里的BaseForm就是一個抽象類,包含3個屬性 --> <!-- BaseAction form bean (abstract) --> <form-bean name="BaseForm" type="org.apache.struts.validator.DynaValidatorForm"> <!-- 屬性由名字和類型構成,還可以有初始值 --> <form-property name="username" type="java.lang.String" /> <form-property name="password" type="java.lang.String" /> <form-property name="task" type="java.lang.String" initial="Create" /> </form-bean> <!-- LogonForm 繼承自BaseForm --> <!-- LogonAction form bean --> <form-bean name="LogonForm" extends="BaseForm" /> <!-- RegistrationForm 繼承自BaseForm,多了4個屬性 --> <!-- RegistrationAction form bean --> <form-bean name="RegistrationForm" extends="BaseForm"> <form-property name="fromAddress" type="java.lang.String" /> <form-property name="fullName" type="java.lang.String" /> <form-property name="password2" type="java.lang.String" /> <form-property name="replyToAddress" type="java.lang.String" /> </form-bean> <!-- SubscriptionForm 繼承自BaseForm,多了3個屬性。reset 屬性不知道什么用 --> <!-- SubscriptionAction form bean --> <form-bean name="SubscriptionForm" extends="BaseForm"> <form-property name="autoConnect" type="java.lang.Boolean" initial="FALSE" reset="true" /> <form-property name="host" type="java.lang.String" /> <form-property name="type" type="java.lang.String" /> </form-bean> </form-beans> <!-- 定義全局的Exception --> <global-exceptions /> <!-- ==== Global Forward Definitions ==== --> <!-- 定義全局的Forward --> <global-forwards> <!-- 如果在Action里找不到相應的forward,就用這里的forward。 Path不僅可以是jsp文件,而且可以是下一個action,即.do請求。 --> <forward name="Logoff" path="/Logoff.do"/> <forward name="Logon" path="/Logon.do"/> <forward name="Failure" path="/Error.do"/> </global-forwards> <!-- 定義Action-Mapping --> <action-mappings>
<!-- 通配符定義的action,例如/Logon.do的請求,頁面轉向/Logon.jsp 定義在最前面,在其他位置找不到相應的配置,才執行此配置 --> <!-- Display any other page (Logon, MainMenu) - Wildcards must come first! --> <action path="/*" forward="/{1}.jsp"></action> <!-- 對于/Welcome.do的請求,要經過WelcomeAction處理之后,如果是返回Success,才轉向/Welcome.jsp --> <!-- Display welcome page --> <action path="/Welcome" type="com.yourcompany.struts.apps.mailreader.action.WelcomeAction"> <forward name="Success" path="/Welcome.jsp" /> </action> <!-- 實際沒用,只是為了學習 --> <!-- Display welcome page <action path="/Welcome" forward="/Welcome.jsp" /> --> <!-- Logoff之前,用LogoffAction作一些處理,最后回到Welcome.do --> <!-- Process a user logoff --> <action path="/Logoff" type="com.yourcompany.struts.apps.mailreader.action.LogoffAction"> <forward name="Success" path="/Welcome.do"/> </action>
<!-- 設置Local之前,用LocaleAction作一些處理,最后回到Welcome.do Parameter屬性是定義MappingDispatchAction類里的方法名,但這里的Success只是表示一個參數,因為LocaleAction里定義了一個execute方法。 用途是:target = mapping.getParameter(); --> <!-- Change locale action --> <action path="/Locale" type="com.yourcompany.struts.apps.mailreader.action.LocaleAction" parameter="Success"> <forward name="Success" path="/Welcome.do"/> </action>
<!-- 登錄的Action,validate表示用了服務端驗證,和plugin有關,如果驗證失敗就讓頁面轉入input標識的forward請求。 Name指出了ActionForm的名字 Cancellable不知道是什么意思 --> <!-- Process a user logon --> <action path="/SubmitLogon" type="com.yourcompany.struts.apps.mailreader.action.LogonAction" name="LogonForm" scope="request" cancellable="true" validate="true" input="Logon"> <!-- 如果拋出ExpiredPasswordException就轉入/ChangePassword.do請求 --> <exception key="expired.password" type="org.apache.struts.apps.mailreader.dao.ExpiredPasswordException" path="/ChangePassword.do"/> <forward name="Success" path="/MainMenu.do"/> </action> <!-- 類似ActionForm,Action也可以用繼承。為了防止抽象的Action被請求,故用//作為前綴。 參數{1}代表子類的通配符* --> <!-- "Abstract" mapping to use as base --> <!-- Input like as forward --> <action path="http://BaseAction" input="Input" type="com.yourcompany.struts.apps.mailreader.action.{1}Action" name="{1}Form" scope="request"> <forward name="Success" path="/{1}.jsp" /> <forward name="Input" path="/{1}.jsp" /> </action> <!-- /Delete*通配符匹配action,減少配置文件內容。 例如/DeleteSubscription. 父類的參數{1}就代表Subscription Parameter=Delete表示,執行SubscriptionAction的Delete函數。 --> <action path="/Delete*" extends="http://BaseAction" parameter="Delete" validate="false" /> <action path="/Edit*" extends="http://BaseAction" parameter="Edit" validate="false" /> <action path="/Save*" extends="http://BaseAction" parameter="Save" cancellable="true" validate="true"> <forward name="Success" path="/MainMenu.do" /> </action>
<!-- Matches SaveSubscription action --> <!-- If extends understood wildcards, we could specify only Success here. --> <action path="/SaveSubscription" extends="/Save*" type="com.yourcompany.struts.apps.mailreader.action.SubscriptionAction" name="SubscriptionForm"> <forward name="Success" path="/EditRegistration.do"/> <forward name="Input" path="/Subscription.do"/> </action> <!-- Display the "walking tour" documentation --> <action path="/Tour" forward="/tour.html"/>
</action-mappings>
<!-- ==== Controller Configuration ==== --> <!-- 沒弄清楚啥意思,雖然下面有注釋 --> <controller pagePattern="$M$P" inputForward="true"/> <!-- pagePattern: use this pattern when creating URIs to resources. $M=module, $P=path --> <!-- inputForward: The "input" parameter on "action" elements is the name of a local or global "forward" rather than a module-relative path -->
<!-- 定義資源文件 --> <message-resources parameter="com.yourcompany.struts.ApplicationResources" /> <message-resources parameter="com.yourcompany.struts.AlternateApplicationResources" key="alternate" />
<!-- 定義插件 --> <!-- 和驗證有關,使用了common-validator --> <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml"/> </plug-in>
<!-- 和MailReader的xml數據庫有關,這里用到一個被封裝好的jar包 --> <plug-in className="com.yourcompany.struts.apps.mailreader.plugin.MemoryDatabasePlugIn"> <set-property property="pathname" value="/WEB-INF/database.xml" /> </plug-in>
<!-- 和下拉框有關,有點過于復雜 --> <plug-in className="org.apache.struts.plugins.DigestingPlugIn"> <set-property property="key" value="serverTypes"/> <set-property property="configPath" value="/WEB-INF/server-types.xml"/> <set-property property="digesterPath" value="/WEB-INF/lvb-digester-rules.xml"/> </plug-in> </struts-config> |
l Validation.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd"> <form-validation> <!-- ==== Default Language Form Definitions ==== --> <formset> <!-- 被驗證的Form的定義,對應DynaActionForm的名字 Depends表示驗證的方式 Key表示在資源文件定義的名字 --> <form name="LogonForm"> <field property="username" depends="required"> <arg key="prompt.username"/> </field> <field property="password" depends="required, minlength,maxlength"> <arg key="prompt.password"/> <arg key="${var:minlength}" name="minlength" resource="false"/> <arg key="${var:maxlength}" name="maxlength" resource="false"/> <var> <var-name> maxlength </var-name> <var-value> 16 </var-value> </var> <var> <var-name> minlength </var-name> <var-value> 3 </var-value> </var> </field> </form> <form name="RegistrationForm"> <field property="fromAddress" depends="required,email"> <arg key="prompt.fromAddress"/> </field> <field property="fullName" depends="required"> <arg key="prompt.fullName"/> </field> <field property="replyToAddress" depends="email"> <arg key="prompt.replyToAddress"/> </field> <field property="username" depends="required"> <arg key="prompt.username"/> </field> </form> <form name="SubscriptionForm"> <field property="host" depends="required"> <arg key="prompt.mailHostname"/> </field> <field property="username" depends="required"> <arg key="prompt.mailUsername"/> </field> <field property="password" depends="required"> <arg key="prompt.mailPassword"/> </field> </form> </formset> </form-validation> |
posted on 2008-07-06 21:32 MingIsMe 閱讀(915) 評論(0) 編輯 收藏 所屬分類: 16 案例分析