Java后台框架篇--EL表达式为什么可以取到struts值栈中的值
2017-09-28 22:25
405 查看
1,el表达式自身就是会从request,session,application,pagecontext获取
2,由于在StrutsPrepareAndExecuteFilter中包装了request( request = prepare.wrapRequest(request);)StrutsRequestWrapper,
这个request又重写了getAttribute方法:
这个方法实现了从原来的requset,session等获取,然后获取不到再从值栈获取
public Object getAttribute(String s) {
if (s != null && s.startsWith("javax.servlet")) {
// don't bother with the standard javax.servlet attributes, we can short-circuit this
// see WW-953 and the forums post linked in that issue for more info
return super.getAttribute(s);
}
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);
if (ctx != null) {
if (attribute == null) {
boolean alreadyIn = false;
Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute");
if (b != null) {
alreadyIn = b.booleanValue();
}
// note: we don't let # come through or else a request for
// #attr.foo or #request.foo could cause an endless loop
if (!alreadyIn && s.indexOf("#") == -1) {
try {
// If not found, then try the ValueStack
ctx.put("__requestWrapper.getAttribute", Boolean.TRUE);
ValueStack stack = ctx.getValueStack();
if (stack != null) {
attribute = stack.findValue(s);
}
} finally {
ctx.put("__requestWrapper.getAttribute", Boolean.FALSE);
}
}
}
}
return attribute;
}
2,由于在StrutsPrepareAndExecuteFilter中包装了request( request = prepare.wrapRequest(request);)StrutsRequestWrapper,
这个request又重写了getAttribute方法:
这个方法实现了从原来的requset,session等获取,然后获取不到再从值栈获取
public Object getAttribute(String s) {
if (s != null && s.startsWith("javax.servlet")) {
// don't bother with the standard javax.servlet attributes, we can short-circuit this
// see WW-953 and the forums post linked in that issue for more info
return super.getAttribute(s);
}
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);
if (ctx != null) {
if (attribute == null) {
boolean alreadyIn = false;
Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute");
if (b != null) {
alreadyIn = b.booleanValue();
}
// note: we don't let # come through or else a request for
// #attr.foo or #request.foo could cause an endless loop
if (!alreadyIn && s.indexOf("#") == -1) {
try {
// If not found, then try the ValueStack
ctx.put("__requestWrapper.getAttribute", Boolean.TRUE);
ValueStack stack = ctx.getValueStack();
if (stack != null) {
attribute = stack.findValue(s);
}
} finally {
ctx.put("__requestWrapper.getAttribute", Boolean.FALSE);
}
}
}
}
return attribute;
}
相关文章推荐
- Java后台框架篇--Struts2.0与验证框架
- Java后台框架篇--Struts2.0之牛刀小试
- Java后台框架篇--Struts2.0标签库
- Java后台框架篇--Struts2.0简单使用
- Java后台框架篇--Struts2.0核心与工作原理
- Java后台框架篇--Struts2.0控制器组件
- Java后台框架篇--Struts2.0之总结
- Java后台框架篇--Struts之简介
- Java后台框架篇--Struts2.0与Action
- Java后台框架篇--Struts2.0之Action的参数接收
- Java后台框架篇--Struts2.0与OGNL表达式
- Java后台框架篇--Struts与SSH
- Java后台框架篇--Struts2.0之结果视图类型
- Java后台框架篇--Struts2.0UI组件标签
- struts2 request内幕 为什么在struts2用EL表达式可以取值
- Java后台框架篇--Spring的三种配置方式
- java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?
- jsp中为什么后台传递过来的数据没有空格 而jsp页面上用EL表达式接收就会显示有空格
- java框架篇---Struts入门
- java为什么只有实现了Serializable接口才可以序列化