咨询JSF中EL表达式${text['somefield']}的工作原理及text类型
关于EL表达式
${text['somefield']}的解析 嘿,这个问题问得很到位!我来帮你理清这个表达式的工作逻辑,以及你疑惑的text到底是什么~
首先,text可能是什么?
EL表达式中的标识符(比如这里的text)会按照特定优先级顺序去查找对应的对象:
- 先检查**页面作用域(pageScope)**里是否有名为
text的属性 - 接着是请求作用域(requestScope)
- 然后是会话作用域(sessionScope)
- 最后是应用作用域(applicationScope)
- 如果以上作用域都找不到匹配项,才会去查找托管Bean(也就是那些通过
@ManagedBean注解或者faces-config.xml配置的Bean)
所以text有可能是一个托管Bean,也有可能是某个作用域中存放的普通对象(比如Map、自定义类实例、数组等)——具体取决于它是在哪里被定义和放入的。
然后,['somefield']的作用是什么?
EL里的['属性名/键名']语法有两种核心用途:
- 等价于
.语法:比如${text.somefield}和${text['somefield']}是完全等价的,都是用来访问对象的属性(本质上是调用对应的getSomefield()getter方法)。 - 处理特殊场景:当属性名包含特殊字符(比如空格、
-这类符号),或者属性名是动态变量时(比如${text[dynamicKey]}),就必须用这种方括号写法。
另外,如果text本身是一个数组、List或者Map,['somefield']还可以用来访问对应的元素(比如Map的key,不过如果是数组/List的话,这里的somefield得是数字索引,所以更可能是Map的key)。
和你熟悉的${someBean.text['somefield']}的区别
你熟悉的这种写法是嵌套访问:先找到someBean这个托管Bean,然后获取它的text属性,再访问该属性的somefield元素/属性。
而${text['somefield']}是直接访问:直接查找名为text的对象,然后访问它的somefield属性/元素——这个text本身就可能是一个托管Bean,或者是某个Bean放入作用域的属性。
举两个实际例子
例子1:text是托管Bean
假设我们有一个托管Bean:
@ManagedBean(name = "text") public class TextBean { // 场景A:普通属性 private String somefield = "Hello from Bean"; public String getSomefield() { return somefield; } // 场景B:Map属性 private Map<String, String> fieldMap = new HashMap<>(); public TextBean() { fieldMap.put("somefield", "Hello from Map"); } public Map<String, String> getFieldMap() { return fieldMap; } }
- 对于场景A,
${text['somefield']}会调用getSomefield(),返回Hello from Bean - 如果是场景B,对应的表达式会是
${text.fieldMap['somefield']},返回Hello from Map
例子2:text是作用域中的对象
假设在某个Bean的方法里,把一个Map放入请求作用域:
@ManagedBean public class SomeActionBean { public String doAction() { Map<String, String> textMap = new HashMap<>(); textMap.put("somefield", "Hello from Request Scope"); FacesContext.getCurrentInstance().getExternalContext() .getRequestMap().put("text", textMap); return "somePage"; } }
此时在跳转后的页面中,${text['somefield']}就会从request作用域拿到textMap,返回Hello from Request Scope。
内容的提问来源于stack exchange,提问作者magallanes
相关产品推荐
相关产品推荐

