上次說到再JSP頁面使用進行<s:debug>進行調試;能夠看見Value Stack Contents 和Stack Context,它們到底表明什麼含義呢?java
在Action中能夠經過ActionContext獲取ValueStack 對象。session
@SuppressWarnings("serial") public class QryAppKindInfoAction extends BaseAction { private Logger logger = Logger.getLogger(QryAppKindInfoAction.class); private IAppKindInfoService appKindInfoService; private List<AppKindInfoVO> appkindInfos; // 查詢類別的List列表 private AppKindInfoQryVO qryvo = new AppKindInfoQryVO(); @Override public String execute(Map sessionMap) throws Exception { logger.debug("enter into QryAppKindInfoAction.execute()..."); try { Map map = appKindInfoService.list(qryvo); if (appkindInfos == null) { appkindInfos = new ArrayList<AppKindInfoVO>(); } //經過ActionContext 獲取valueStack ActionContext actionContext = ActionContext.getContext(); ValueStack valueStack = actionContext.getValueStack(); Map<String, Object> context = valueStack.getContext(); return SUCCESS; } catch (Exception e) { throw e; } } public IAppKindInfoService getAppKindInfoService() { return appKindInfoService; } public void setAppKindInfoService(IAppKindInfoService appKindInfoService) { this.appKindInfoService = appKindInfoService; } public List<AppKindInfoVO> getAppkindInfos() { return appkindInfos; } public void setAppkindInfos(List<AppKindInfoVO> appkindInfos) { this.appkindInfos = appkindInfos; } public AppKindInfoQryVO getQryvo() { return qryvo; } public void setQryvo(AppKindInfoQryVO qryvo) { this.qryvo = qryvo; } }
訪問該Action,進行調試,能夠看到在value Stack中包含了一個OgnlContext,該Context下包含了一個根對象,根對象root,就是該Action中的屬性值。以下圖所示。app
Struts2使用標準的Context來進行 OGNL表達式求值,OGNL的頂級對象就是一個Context,這個Context對象就是一個Map,其根對象就是Value Stack。若是想訪問Value Stack裏面的appinfo屬性,能夠經過${appinfo}; Struts2會將Action中的實列保存至Value Stack中,無需寫#便可以訪問Action中的屬性,如訪問appinfo中的appName屬性,能夠使用<s:property value="appName">的形式訪問,也能夠經過${appName}的形式訪問,想當於返回Action中的getAppName()方法;ide
Struts2能夠直接從對象中獲取屬性,Struts2提供了一個特殊的OGNL屬性訪問器,它能夠自動搜尋Stack Context的全部實列,直到找到匹配的屬性;如Stack Context中包含一個student實列,該實列擁有studentName屬性,獲取該對象的studentName屬性則用#student.studentName;此外Struts2還保存了一些命名對象,它們不是Stack Context的根對象,而是保存在其中;如如下對象:this
parameters對象:用於訪問HTTP請求參數,使用#parameters[param]或者#parameters.param獲取;spa
request對象:用於訪問HttpServletRequest的屬性,使用#request[param]或者#request.param獲取;debug
session對象:用於訪問HttpSession的屬性,使用#session[param]或者#session.param獲取;調試
application對象:用於訪問ServletContext的屬性,使用#application[param]或者#application.param獲取;code
OGNL的Stack Context是整個OGNL計算的、求值的Context,而 ValueStack只是StackContext內的根對象,OGNL的Stack Context裏除了Value Stack以外還有 parameters、request、session、application等命名對象;對象
根對象和命名對象的區別在:
1)訪問Stack Context裏面的命名對象須要在對象名前加#;
2)當訪問Stack Context裏面的根對象的屬性時,能夠忽略對象名;