1. 程式人生 > >Struts框架配置詳解

Struts框架配置詳解

Struts是一個非常優秀的MVC框架,是應用最廣泛的 Java Web 應用開發框架。

    基於Struts開發的應用有3類元件構成:控制器元件、模型元件和檢視元件。
控制器元件包括 ActionServlet (Struts的核心控制器)  還包括自定義的Action類(繼承org.apache.struts.action.Action )代表使用者的一個操作。
Struts框架主要是基於配置檔案的,它最主要的配置檔案為 struts-config.xml (Struts 2.0以前的版本)

    下面主要介紹如何在專案中使用Struts 和 Struts 的配置:
    使用Struts框架,首先要匯入Struts庫,可以到Struts的官方網站下載, 也可以直接在MyEclipse來快速新增(在專案上單擊右鍵 選MyEclipse –> Add Struts Capabilities),然後建立Struts的配置檔案 struts-config.xml 如果是用後一種方式加入的Struts庫,那麼MyEclipse會自動生成一個 strtus-config.xml 配置檔案 。 接下來我們要在 we.xml 中配置Struts的核心控制器 ActionServlet  。
     web.xml 中增加的配置如下:
     
<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>
               <load-on-startup>0</load-on-startup>
      </servlet>

      <servlet-mapping>
                <servlet-name>action</servlet-name>
                <url-pattern>*.action</url-pattern>
      </servlet-mapping>

  
配置詳解:  <init-param>節點用於配置ActionServlet的初始化引數 ,這裡將Struts的配置檔案的路徑作為引數,讓程式建立ActionServlet時載入Strtus的配置檔案 struts-config.xml ;  <load-on-startup>節點用於配置ActionServlet的載入順序,值為0表示伺服器啟動時就載入,並且載入順序為第一。 <url-pattern>節點配置 ActionServlet 的訪問路徑, 值 *.action 表示 凡是以.action結尾的請求都交由Struts處理。

     接下來是自定義Action的配置,自定義Action分為普通Action(只能處理使用者的某個特定的請求的Action) 和 DispatcherAction(可以處理多種請求的Action) 。 自定義Action的配置包括ActionForm的配置和Action的配置。  首先展示普通Action的配置。 例如這個普通Action的類名為 LoginAction 對應的 ActionForm為 LoginForm 。 則在 struts-config.xml中的配置如下:

       <struts-config>
                  <!-- FormBean 的配置 -->
                  <form-beans>
                           <form-bean name=”loginForm” type=”com.kj.struts.form.LoginForm” />
                  </form-beans>
                 
                  <!--Action 的配置 –>
                  <action-mappings>
                           <action name=”loginForm” input="login.jsp"  path=”/login” scope=”request” 
                                        type=”com.kj.struts.action.LoginAction” >
                                   <forward name=”input” path=”/login.jsp” />
                                   <forward name=”welcom” path=”/welcome.jsp” />
                           </action>
                  </action-mappings>
       </struts-config>

配置詳解: <form-bean>節點用於配置FormBean 主要屬性有 name 和 type , 在<action-mappings>節點內配置所有的自定義Action  <Action>節點用於配置每個Action的詳細資訊. 屬性 name 用於指定Action使用的ActionForm的引用名(即form-bean 的name屬性的值);   屬性input 指定ActionForm的 validate 方法驗證出錯時轉向的頁面;    屬性 path 指定action的訪問路徑;  屬性 scope 用於設定action對應的ActionForm的作用範圍; 屬性 type 用於指定此action對應的類;  <forward>節點用於配置action的跳轉路徑,可以配置多個,對應action處理的不同結果。

     DispatcherAction 在 struts-config.xml 中的配置如下:

       <struts-config>
                  <!-- FormBean 的配置 -->
                  <form-beans>
                           <form-bean name=”loginForm” type=”com.kj.struts.form.LoginForm” />
                  </form-beans>
                 
                  <!--Action 的配置 –>
                  <action-mappings>
                           <action name=”loginForm”
  parameter=”login”  path=”/login” scope=”request” 
                                        type=”com.kj.struts.action.LoginDispatcherAction” >
                                   <forward name=”input” path=”/login.jsp” />
                                   <forward name=”welcom” path=”/welcome.jsp” />
                           </action>
                  </action-mappings>
       </struts-config>

配置詳解: DispatcherAction的配置與普通Action基本一致,唯一的不同是 DispatcherAction 要多配置一個屬性 parameter 用於指示DispatcherAction 執行哪個方法。

     每建立一個新的自定義Action 就要建立相應的 ActionForm 類 而且如果ActionFrom要獲取的值太多,就要定義很多的屬性,很麻煩。Struts提供了動態 FormBean的配置,使得所有FormBean的屬性都可以在配置form-bean時配置完成,不必再編寫相應的FormBean類了。 動態Form( DynaActionForm) 的配置如下:

<struts-config>
                  <!-- FormBean 的配置 -->
                  <form-beans>
                           <form-bean name=”loginForm” type=”org.apache.struts.action.DynaActionForm”>
                                      <form-property name=”username” type=”java.lang.String” />
                                      <form-property name=”password” type=”java.lang.String” />
                           </form-bean>
                  </form-beans>
                 
                  <!--Action 的配置 –>
                  <action-mappings>

                 
 </action-mappings>
       </struts-config>

配置詳解: 動態ActionForm (DynaActionForm) 與普通ActionForm 配置的區別有三點: 1.type屬性的值為固定的 org.apache.struts.action.DynaActionForm  Struts提供的動態ActionForm類。   2. ActionFrom的屬性直接在配置檔案裡配置,使用<form-property>節點配置ActionForm的屬性。 3. 動態ActionForm 在Action中使用時和ActionForm有所不同,首先要用  DynaActionForm dynaForm = (DynaActionForm)from;  將form物件轉成DynaActionForm型別, 然後使用 dynaForm.getString(“username”); 的方式取值,  如何屬性的型別是其他型別 可以使用 Integer id =  (Integer)dynaForm.get(“id”);   的方式取值, 注意get方法取出的值是Object型別,必須轉型。
      動態ActionForm雖然不需要定義ActionForm類,但是還是要在 struts-config.xml 中配置相應的屬性,配置依然很複雜,所以應用很少。    更好的解決方式是在ActionForm中 定義實體實體物件屬性, 用實體物件來封裝眾多的屬性,  這樣做就不需要設定很多的屬性了,使用的時候也只需要將頁面 input 的name屬性設定為 物件屬性名.屬性名 (例如 <input type=”text” name=”user.username” />)即可。
    注意: 使用實體類作為ActionForm的屬性時, 定義該屬性一定要使用new User() 的方式建立例項,否則使用時會報 “未將物件引用設定到物件例項” 的錯誤  ,  實體屬性定義方式如下:
                         private User user = new User();