Struts中的Value Stack Contents 和Stack Context

    上次說到再JSP頁面使用進行<s:debug>進行調試;能夠看見Value Stack Contents 和Stack Context,它們到底表明什麼含義呢?java

1、獲取Value Stack Content

    在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

 

2、Value Stack Contents

    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

3、Stack Context

    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

    4、兩者關係

    OGNL的Stack Context是整個OGNL計算的、求值的Context,而 ValueStack只是StackContext內的根對象,OGNL的Stack Context裏除了Value Stack以外還有 parameters、request、session、application等命名對象;對象

   根對象和命名對象的區別在:

    1)訪問Stack Context裏面的命名對象須要在對象名前加#;

    2)當訪問Stack Context裏面的根對象的屬性時,能夠忽略對象名;

相關文章
相關標籤/搜索