问题七:为什么el表达式可以访问valueStack?
struts框架中所使用的request对象,是增强后的request
${username}—–>request.getAttribute(“username”);
增强后的request,会首先在request域中查找,还会在valueStack中查找。
StrutsPreparedAndExecuteFilter的doFilter代码中 request = prepare.wrapRequest(request);
* 对Request对象进行了包装 ,StrutsRequestWrapper
* 重写request的 getAttribute
Object attribute = super.getAttribute(s);
if (attribute == null) {
attribute = stack.findValue(s);
}
访问request范围的数据时,如果数据找不到,去值栈中找
request对象 具备访问值栈数据的能力 (查找root的数据)
OGNL表达式的常见使用:$ % #
1.#号
代表ActionContext.getContext ()上下文
用法二 : 不写# 默认在 值栈中root中进行查找
在root中查找name属性
* 查询元素时,从root的栈顶元素 开始查找, 如果访问指定栈中元素
访问栈中第二个元素name属性
* 访问第二个元素对象
用法三:进行投影映射(结合复杂对象的遍历)
就是把某一部分拿出来,
2.对集合进行投影,只得到设定的属性
2)遍历时,对数据设置条件
遍历集合只要price大于1500商品
1500}” var=”product”>
—
3)综合
只显示价格大于1500 商品名称
1500}.{name}” var=”pname”>
2.%号
%作用:就是用于设定当前是否要解析其为 ognl表达式.
%{表达式} 当前表达式会被做为ognl解析.
%{'表达式'} 当前表达式不会被做为ognl解析。
<s:property value="表达式"> 对于s:property标签,它的value属性会被默认做为ognl.
以后,所有表达式如果想要让其是ognl %{表达式}
3. 号 作用:就是在配置文件中使用ognl表达式来获取valueStack中数据.
1.struts.xml
<result type="stream">
<param name="contentType">${contentType}</param>
</result>
2.在校验文件中使用
${min} ${max}
${minLength} ${maxLength}
3.在国际化文件中使用
在properties文件中
username=${#request.username}
在jsp页面
<s:text name="username">
-----------------------------------------------------------------
总结: #就是用于获取数据 %就是用于设置是否是ognl表达式 $就是在配置文件中使用ognl.