<struts-config>
<data-sources />
<form-beans>
<form-bean name="greetForm" type="com.insigma.struts.GreetForm"></form-bean><!-- 放置所有的ActionForm配置-->
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
<action path="/CreetAction" type="com.insigma.struts.CreetAction" name="greetForm"><!-- 放置所有的Action配置-->
<forward name="greet" path="/greet.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="com.insigma.struts.ApplicationResources" /><!-- 配置資源文件的路徑-->
</struts-config>
(2),實現View-jsps:
jsp在struts中的兩個作用:提供用戶輸入接口和展示數據。一般來說,不會讓用戶直接訪問struts的jsp文件,都是通過Action進行轉發,所以jsp表單數據一般來自ActionForm,而其他的動態數據一般來自于Action的request里的屬性(Attribute);
Struts為jsp提供了豐富的標簽庫,尤其是Html標簽庫,讓jsp和actionForm成為了一個整體,提交表單的時候可以自動填充ActionForm,響應的時候可以為表單的輸入框自動添加數據,而對于其他的動態數據,可以使用struts的標簽庫,也可以使用JStl,是數據的展示非常簡便。
(3),實現Modle-ActionForms:
ActionForm充當的是數據層的作用,他為開發者保存數據提供了方便,尤其對于大型的web項目來說,一個頁面可能包含幾十個甚至上百個輸入框,如果開發者的每一個請求參數都通過request.getParameter()的方式獲取的 話,工作量會非常大,而且不利于維護,有了ActionForm以后,他可以幫助開發者自動填充數據。而且,它還提供了一些數據驗證的功能。
自定義的ActionForm需要繼承org.apache.struts.action.ActionForm類,然后把需要添加的字段作為成員變量進行設置,并為這些變量加上set和get方法。
import org.apache.struts.action.ActionForm;
public class GreetForm extends ActionForm {
String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
ActionForm完成以后,還需要在struts-config.xml里進行配置以后,才能供Action使用。使用標簽為<form-bean>,它包含form的名稱、name的屬性和類型type屬性。
(4),實現Controller-Actions:
Action代表了一次動作,邏輯代碼、數據裝填代碼和請求轉發代碼都會放在Action里,它是struts最核心最重要的地方。
自定義的Action需要繼承自org.apache.struts.action.Action類,而且需要覆蓋它的execute方法,當有請求指向該Action時,struts會實例化該action在調用execute()方法。
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
它包含4個參數:ActionMapping、ActionForm、HttpServletRequest、HttpServletResponse,最后的兩個參數與servlet的請求和響應是完全相同的。ActionMapping指的是該action映射的信息,通常會調用該對象的findForward()方法轉到下一個資源護或視圖jsp,該方法的參數即下一個資源的名稱,在struts-config.xml通過<forward>進行配置,他是一個超類,往往需要強制類型轉換,通過<action>的name屬性指定,
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class CreetAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html,charset=utf-8");
//轉換成ActionForm
GreetForm gForm=(GreetForm)form;
//往請求范圍內設置用戶名屬性變量
request.setAttribute("username",gForm.getUsername());
//返回名字為greet的view
return mapping.findForward("greet");
}
}
然后在struts-config.xml里進行設置。
(5),訪問Action的URL:
struts的可操作元素往往是以Action為單元的,有多少Action,就代表了多少個可進行的動作。Action的URl與ActionServlet的配置是有關系的,默認的情況下,所有的Action是以“.do”結尾的。
6,Struts標簽庫::
(1),Bean常用標簽庫:
Struts的Bean標簽庫是為了訪問jsp的javabean和他們的屬性而設計的。它是對jsp的動作標簽<jsp:useBean>的改進,讓開發者更好的使用請求參數、請求頭和cookie等信息。但是他和jstl、el有一些重復的地方。
盡管如此,有一個標簽時struts特有的,那就是,<bean:message/>,它是用力啊嘟嘟資源文件數據的。有的時候,一些常用的常量,如錯誤描述、多語言文本等保存在struts的資源文件ApplicationResources.properties里面便于維護。但是定義一個javabean來訪問這些數據顯得有些多余,皆可以直接使用這個標簽,非常的方便。
資源文件ApplicationResources.properties的內容是以鍵值對的形式書寫的,中間以“=”隔開,key=value.在使用<bean:message/>的時候,只需要指定該標簽的key屬性即可,它對應的就是資源文件的左邊的名稱,然后該標簽就會返回相應的文本值。
(2)html常用標簽:
HTML標簽庫是Struts使用最多的標簽庫,它架起了jsp與Action和ActionForm的橋梁。它主要提供了大多數的表單元素即數據管理功能。他在標單方面表現的比jstl和el更優秀一些。如果要構建一個表單,Html標簽庫是目前最好的選擇。
<html:form>是用來包含其他標簽的,他的action屬性的值,應該和struts-config.xml里面的<action>的path屬性的值相同,也是以斜線開頭。他們中的大多住都包含一個property屬性,與ActionForm的屬性相對應,也就是如果ActionForm有一個username屬性,那么property也許寫成username。
7,Struts的高級特性:
1,使用多種Action:
Struts針對不同的情況,除了原始的Action以外,還提出了DispatchAction、LookupDispatchAction、MappingDispatchAction,后面的三個都可以將多個action方法寫在一個Action里面。
Struts的多種Action
名稱 使用情況 使用簡介
Action 普遍的action 直接使用即可
DispatchAction 表單包含多個參數時使用 需要從客戶端接受一個參數,該參數的值對應方法的名稱
lookupDispatchAction 表單包含多個提交按鈕的時候 需要重載getKeyMethodMap()方法,返回參數與方法名之間的對應 @ 關系
MappingDispatchAction 客戶端不便于傳遞參數時適用 需要配置文件的<action>標簽的parameter屬性,指定Action的方法@ 名稱
(1),DispatchAction的實現類為org.apache.struts.actions.DispatchAction,他需要從客戶端接受一個參數,該參數的值與方法名對應。Struts會根據struts-config.xml里面配置的<action>標簽的parameter屬性來獲取請求參數,然后利用java的反射機制調用方法名與參數值相同的方法。這些方法的參數列表和返回類型與Action的execute()方法完全相同。使用DispatchAction大致可以分為以下幾步:
1>自定義一個繼承自DispatchAction的類。把需要對外的每個action動作寫成一個方法。方法的參數列表和返回類型與Action的execute()方法完全相同。
2>在struts-config.xml里配置Action。與配置一個普通的Action差不多,只是需要多加一個parameter屬性,一般為action或method,他指定了客戶端需要傳遞的參數名。
3>為客戶端表單添加一個隱藏的輸入框,他的值為需要調用的方法名。如果http請求采用提交表單的形式,隱藏的輸入框是最好的選擇;若是通過url訪問Action的話,則需要在url后面加上請求參數。
(2),lookupDispatchAction:的實現類是org.apache.struts.actions.lookupDispatchAction,它主要適合于一個表單里有多個按鈕的情況。lookupDispatchAction也需要從客戶端接受一個參數,但是參數的值與方法名的對應關系需要一個getKeyMethodMap()方法來確定,該方法返回一個Map,該Map的Key與Value與資源文件ApplicationResources.properties的key和value對應。使用lookupDispatchAction的步驟:
1》,自定義一個lookupDispatchAction類把需要對外的每個action動作寫成一個方法,該方法的參數列表和返回類型與action的execute()方法完全相同。然后實現父類的getKeyMethodMap()方法,該方法返回的Map與資源文件的部分內容相對應。
2》在資源文件ApplicationResources.properties里定義按鈕的名稱
3》在struts-config.xml里配置Action。與普通的配置Action差不多,只需多家一個parameter屬性,一般為action或method,他制定了客戶端需要指定的參數名。
4》當客戶端表單包含兩個提交按鈕時,用<bean:message>標簽來定義按鈕的value,并按鈕的name為參數的名字。
(3),MappingDispatchAction:MappingDispatchAction:的實現類為org.apache.struts.actions.MappingDispatchAction.
它無需從客戶端接收參數,直接通過struts-config.xml里的<action>的屬性parameter指定方法名,客戶端不許咬任何配置,使用起來就像一個普通的eAction一樣。他的確定就是可能導致struts-config的配置非常長,因為每一個方法都需加一個<action>標簽。盡管如此,他還是要比原來的Action要好一點,至少不需要寫那么多的action類了,所以MappingDispatchAction:更適合直接通過url訪問Action。使用MappingDispatchAction:的步驟:
1》定義一個繼承自MappingDispatchAction:的類,把需要對外的每個action動作寫成一個方法,該方法的參數列表和返回類型與execute()方法的完全相同。
2》在struts-config里配置該action,與一個普通的Action差不多,對于沒一個方法會對應一個<action>標簽,他們的path各不相同,另外,parameter屬性的值就是一個方法名。
3》,客戶端訪問MappingDispatchAction的時候,無論是表單還是直接使用url,與普通的Action沒有區別。
8,使用多種ActionForm:
針對不同的情況,除了最原始的ActionForm以外,還提供了動態的ActionForm(DynaActionForm)和懶惰ActionForm(LazyValidatorForm)。在具體的開發過程中,可以有多種選擇,如果數據量大或用途比較廣泛,可以用普通ActionForm;如果數據量很小,則使用動態的DynaActionForm;如果數據量不太確定,那就是用懶惰的LazyValidatorForm
1》DynaActionForm的實現類為org.apache.struts.action.DynaActionForm,之所以稱他為動態的ActionForm,是因為它是Action不比單獨定義一個ActionForm類,而可以通過在配置文件里通過XML的形式定義ActionForm的字段及其類型。
此時的<form-bean>標簽里的type屬性應該是DynaActionForm的完整類名,然后再在其中嵌入<form-property>標簽來定義屬性,支持的數據類型包含8中java基本類型,String和時間類型。在Action的execute()方法和其他的action方法里。通過DynaActionForm.get()方法獲取所需的參數。
2》lazyValidatorForm:
lazyValidatorForm的實現類是org.apache.struts.validator.lazyValidatorForm,他比起DynaActionForm來說更簡單。lazyValidatorForm連用Xml定義字段的步驟都不必要了,他會自動將請求參數全部作為ActionForm的屬性,所有的Action都可以使用它。只不過,對于使用lazyValidatorForm的Action在配置的時候,需要設置<action>標簽的的validate屬性的為false。
與DynaActionForm類似,在action的execute()方法或其他的action方法里。通過lazyValidatorForm.get()方法獲取所需的參數。