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