EL表达式源码解读(作用域)
eg.${param.name}为例说明
底层代码如下:
if (base == null && property != null) {//base是
int idx = Arrays.binarySearch(SCOPE_NAMES, property.toString());
if (idx >= 0) {
PageContext page = (PageContext) context
.getContext(JspContext.class);
context.setPropertyResolved(true);
switch (idx) {
case APPLICATIONSCOPE:
return ScopeManager.get(page).getApplicationScope();
case COOKIE:
return ScopeManager.get(page).getCookie();
case HEADER:
return ScopeManager.get(page).getHeader();
case HEADERVALUES:
return ScopeManager.get(page).getHeaderValues();
case INITPARAM:
return ScopeManager.get(page).getInitParam();
case PAGECONTEXT:
return ScopeManager.get(page).getPageContext();
case PAGESCOPE:
return ScopeManager.get(page).getPageScope();
case PARAM:
return ScopeManager.get(page).getParam();
case PARAM_VALUES:
return ScopeManager.get(page).getParamValues();
case REQUEST_SCOPE:
return ScopeManager.get(page).getRequestScope();
case SESSION_SCOPE:
return ScopeManager.get(page).getSessionScope();
}
}
EL表达式的解析器,会根据传入的字符串表达式(即this.image)与上下方来解析表达式
最后会返回一个Map数据
这个Map是参数的键值Map,根据键获取值,键是property的值(name),然后把返回的结果当前参数传入到write()方法中,最后页面就输出EL表达式的值了