使用IncludeAction類包含Web資源
雖然在JSP頁(yè)面中可以使用標(biāo)簽包含另一個(gè)Web資源,但Struts框架提倡在包含Web資源時(shí)應(yīng)先經(jīng)過(guò)Struts控制器處理后,再由Struts控制器負(fù)責(zé)包含Web資源。org.apache.struts.actions.IncludeAction類提供了包含其他Web資源的功能。使用IncludeAction類要在struts-config.xml中配置元素。配置IncludeAction類的代碼如下:
input="/firstValidator.jsp" validate="false"
name="firstValidatorForm" parameter="/firstValidator.jsp" />
在配置上面代碼時(shí)應(yīng)注意兩點(diǎn):
1. firstValidator.jsp頁(yè)面使用了firstValidatorForm進(jìn)行數(shù)據(jù)驗(yàn)證,所有應(yīng)將元素的validate屬性設(shè)為“false”。否則在運(yùn)行include動(dòng)作時(shí)就會(huì)進(jìn)行驗(yàn)證。在這時(shí)firstValidatorForm中的所有屬性都沒(méi)有被賦值。所以每個(gè)屬性都無(wú)法通過(guò)驗(yàn)證。讀者可以將validate屬性設(shè)為“true”,看看會(huì)發(fā)生什么情況。
2. IncludeAction類的功能和效果與標(biāo)簽完全一樣。這就意味著在IncludeAction包含的其他Web資源中無(wú)法改變響應(yīng)信息頭。這樣就無(wú)法改變Content-Type字段的值。因此,按著上面的設(shè)置來(lái)運(yùn)行程序,所有的中文信息會(huì)顯示亂碼。解決的方法有很多,如可以自己實(shí)現(xiàn)一個(gè)IncludeAction類的子類,在子類的execute方法中設(shè)置Content-Type的值?;蚨几?jiǎn)單的方法是在過(guò)濾器(EncodingFilter)中加入如下的代碼:
response.setCharacterEncoding("GBK");
在IE中輸入http://localhost:8080/samples/include.do可訪問(wèn)include動(dòng)作。
雖然在JSP頁(yè)面中可以使用標(biāo)簽把請(qǐng)求轉(zhuǎn)發(fā)給另一個(gè)Web資源,但Struts框架提倡在轉(zhuǎn)發(fā)Web資源時(shí)應(yīng)先經(jīng)過(guò)Struts控制器處理后,再由Struts控制器轉(zhuǎn)發(fā)Web資源。org.apache.struts.actions.ForwardAction類提供了轉(zhuǎn)發(fā)其他Web資源的功能。使用ForwardAction類要在struts-config.xml文件中配置元素。下面的代碼演示了如何在元素中使用ForwardAction類來(lái)包含其他的Web資源:
input="/firstValidator.jsp" validate="false"
name="firstValidatorForm" parameter="/firstValidator.jsp" />
由于經(jīng)過(guò)轉(zhuǎn)發(fā)的Web資源可以改變Content-Type字段的值,因此,使用ForwardAction類進(jìn)行轉(zhuǎn)發(fā)時(shí),無(wú)需再另外改變Content-Type字段的值(因?yàn)樵趂irstValidator.jsp頁(yè)面中已經(jīng)設(shè)置了Content-Type的值)。
在IE中輸入http://localhost:8080/samples/forward.do可訪問(wèn)forward動(dòng)作。
雖然在JSP頁(yè)面中可以使用
input="/firstValidator.jsp" validate="false"
name="firstValidatorForm" parameter="/firstValidator.jsp" />
在配置上面代碼時(shí)應(yīng)注意兩點(diǎn):
1. firstValidator.jsp頁(yè)面使用了firstValidatorForm進(jìn)行數(shù)據(jù)驗(yàn)證,所有應(yīng)將元素的validate屬性設(shè)為“false”。否則在運(yùn)行include動(dòng)作時(shí)就會(huì)進(jìn)行驗(yàn)證。在這時(shí)firstValidatorForm中的所有屬性都沒(méi)有被賦值。所以每個(gè)屬性都無(wú)法通過(guò)驗(yàn)證。讀者可以將validate屬性設(shè)為“true”,看看會(huì)發(fā)生什么情況。
2. IncludeAction類的功能和效果與
response.setCharacterEncoding("GBK");
在IE中輸入http://localhost:8080/samples/include.do可訪問(wèn)include動(dòng)作。
雖然在JSP頁(yè)面中可以使用
input="/firstValidator.jsp" validate="false"
name="firstValidatorForm" parameter="/firstValidator.jsp" />
由于經(jīng)過(guò)轉(zhuǎn)發(fā)的Web資源可以改變Content-Type字段的值,因此,使用ForwardAction類進(jìn)行轉(zhuǎn)發(fā)時(shí),無(wú)需再另外改變Content-Type字段的值(因?yàn)樵趂irstValidator.jsp頁(yè)面中已經(jīng)設(shè)置了Content-Type的值)。
在IE中輸入http://localhost:8080/samples/forward.do可訪問(wèn)forward動(dòng)作。