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();