代碼貼士
調(diào)用ActionContext類的getParameters()方法將請求中的參數(shù)封裝到Map對象中,并保存該Map對象。
調(diào)用ActionContext類的get()方法獲取一個與請求對應(yīng)的Map對象,并保存該Map對象。
調(diào)用ActionContext類的getSession()方法獲取一個與會話對應(yīng)的Map對象,并保存該Map對象。
所以,在用戶控制器中,若要對請求或會話存取數(shù)據(jù),可使該Action控制器繼承相應(yīng)的接口。例如:
package com.yxq.action;
import java.util.Map;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class s extends ActionSupport implements RequestAware,SessionAware {
private Map request;
private Map session;
public void setRequest(Map request) { //繼承RequestAware接口必須實現(xiàn)的方法
this.request=request;
}
public void setSession(Map session) { //繼承SessionAware接口必須實現(xiàn)的方法
this.session=session;
}
public String execute() throws Exception {
request.get("userName"); //獲取請求中userName屬性值
session.put("longer","yxq"); //向會話中存儲值
return SUCCESS;
}
}
通過對攔截器中的Map對象進行存取數(shù)據(jù)的操作,以實現(xiàn)對請求或會話進行存儲數(shù)據(jù)的操作,這將避免用戶實現(xiàn)的Action控制器對Servlet API的依賴。
2.模型組件
實際上模型組件概念的范圍是很廣的,對于實現(xiàn)了MVC體系結(jié)構(gòu)的Struts 2.0框架來說,在模型的設(shè)計方面并沒有提供太多的幫助。在Java Web應(yīng)用中,模型通常由JavaBean組成,一種JavaBean被指定用來封裝表單數(shù)據(jù),實現(xiàn)了視圖與控制器之間的數(shù)據(jù)傳遞;另一種則實現(xiàn)了具體的業(yè)務(wù),稱為系統(tǒng)的業(yè)務(wù)邏輯組件。
在MVC體系結(jié)構(gòu)中,位于控制層的業(yè)務(wù)控制器負責(zé)接收請求,然后調(diào)用業(yè)務(wù)邏輯組件處理請求,最后轉(zhuǎn)發(fā)請求到指定視圖。所以,真正用來處理請求的是系統(tǒng)中的模型組件。
3.視圖組件
在Struts 2.0中,請求處理結(jié)束后,返回的視圖不僅可以是JSP頁面、Action動作,還可以是其他的視圖資源,如FreeMarker模板、Velocity模板和XSLT等。
Struts 2.0完成了請求的處理后,將根據(jù)在配置文件中的配置,決定返回怎樣的視圖,這主要通過<result>元素的type屬性來決定。若返回FreeMarker模板,則設(shè)置type屬性的值為freemarker;若返回Velocity模板,則設(shè)置為velocity;若返回另外一個Action動作,則設(shè)置為redirectAction;在沒有設(shè)置type屬性的情況下,默認返回的視圖為JSP頁面。例如下面的配置:
<action name="returnType" class="com.yxq.action.ReturnAction">
<result>/welcome.jsp</result> <!-- 返回JSP頁面 -->
<result name="vm" type=" velocity ">/welcome.vm </result> <!-- 返回Velocity模板 -->
<result name="action " type=" redirectAction ">myReturn.action</result> <!-- 返回Action動作 -->
</action>
4.配置文件
Struts 2.0會默認加載Web應(yīng)用WEB-INF/classes目錄下的struts.xml配置文件,通過該文件的配置為用戶請求指定處理類,并設(shè)置該請求處理結(jié)束后返回的視圖資源。在開發(fā)大型項目時,這往往會導(dǎo)致struts.xml文件過于龐大,降低了可讀性。此時可以自己創(chuàng)建配置文件,然后在struts.xml文件中通過<include>元素包含這些文件。例如在struts.xml文件中包含名為myxml.xml的文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="myxml.xml"/> <!-- 包含myxml.xml文件 -->
</struts>
在myxml.xml文件中配置用戶請求與處理類的關(guān)系。例如下面的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name=" example" extends="struts-default">
<action name="my" class="com.yxq.action. MyAction">
<result>/welcome.jsp </result>
</action>
……//其他<action>元素的配置
</package>
</struts>
代碼貼士
Struts 2.0配置文件的根元素。
包元素。name屬性指定了包名稱;extends屬性指定了繼承的另一個包元素;struts-default是在struts-default.xml文件中定義的包的名稱。struts-default.xml位于struts2-core-2.0.11.jar文件下,在該文件的struts-default包元素中,定義了<result>元素的type屬性所能指定的視圖類型、Struts 2.0中提供的攔截器以及對繼承了struts-default包的XML配置文件中配置的所有Action類默認執(zhí)行的攔截器。
<action>元素,用來配置業(yè)務(wù)控制器與請求的關(guān)系。
<result>元素,指定請求處理結(jié)束后返回的視圖資源。
5.消息資源文件
在Struts 2.0中,用來存儲提示信息的properties資源文件有以下3種:應(yīng)用范圍內(nèi)的資源文件、包(package)范圍內(nèi)的資源文件和Action類范圍內(nèi)的資源文件。
應(yīng)用范圍內(nèi)的資源文件。
該資源文件在整個應(yīng)用內(nèi)都可以被訪問,通常稱為全局資源文件,它需要在struts.properties配置文件中指定。例如,在WEB-INF/classes目錄下創(chuàng)建了一個名為allMessage.properties的全局資源文件,在struts.properties文件中需進行如下配置:
struts.custom.i18n.resources=allMessage
若將文件保存在WEB-INF/classes/messages目錄下,需進行如下配置:
struts.custom.i18n.resources= messages.allMessage
struts.properties文件通常應(yīng)被存放到Web應(yīng)用的WEB-INF/classes目錄下,Struts 2.0會自動加載該文件,該文件以key=value的形式存儲了一些在Struts 2.0啟動時對Web應(yīng)用進行的配置,key用來表示配置選項名稱,value表示配置選項的值,如解決Struts 2.0中文亂碼的問題。
包(package)范圍內(nèi)的資源文件。
包范圍內(nèi)的資源文件必須命名為package_xx_XX.properties,其中xx表示語言代碼,XX表示地區(qū)代碼,例如package_zh_CN.properties表示中文(中國)。通過這樣命名,可以實現(xiàn)應(yīng)用程序國際化。也可忽略語言代碼與地區(qū)代碼,命名為package.properties,表示任意語言(地區(qū))。包范圍內(nèi)的資源文件只可被當(dāng)前包中的類文件訪問。例如,存在如圖1.60所示的包結(jié)構(gòu),在actionA子包中存在一個package.properties資源文件,則actionA子包中的類文件可以訪問package.properties資源文件,而actionB子包中的類文件則不能訪問??蓪ackage.properties文件存放在com/yxq目錄下,使得可以訪問com/yxq目錄下所有子目錄中的類文件。
Action類范圍內(nèi)的資源文件。
該資源文件只可被某一個Action類訪問,它必須與訪問它的Action類存放在同一個目錄下,并且文件的命名與該Action類的名稱相同。例如,在com.yxq.action包下存在MyAction.java類文件,若在com.yxq.action下創(chuàng)建一個MyAction.properties資源文件,則該文件只可被MyAction.java類文件訪問。
1.15 本 章 小 結(jié)
本章講解的是如何應(yīng)用Struts 2.0開發(fā)一個Web項目。通過本章的學(xué)習(xí),讀者應(yīng)該對Struts 2.0框架有初步的了解,并能夠成功搭建Struts 2.0框架,應(yīng)用該框架開發(fā)一個簡單的Web應(yīng)用程序。
另外,通過閱讀本章內(nèi)容,讀者應(yīng)對一個項目的開發(fā)過程有進一步的了解,并要時刻牢記——在進行任何項目的開發(fā)之前,一定要做好充分的前期準備,如完善的需求分析、清晰的業(yè)務(wù)流程、合理的程序結(jié)構(gòu)、簡單的數(shù)據(jù)關(guān)系等,這樣在后期的程序開發(fā)中才會得心應(yīng)手、有備無患。