【问题标题】:How to explain usages of square brackets ([]) operator in EL expressions如何解释 EL 表达式中方括号 ([]) 运算符的用法
【发布时间】:2013-06-11 18:36:10
【问题描述】:

当我阅读Spring PetClinic 示例应用程序时,我发现他们总是将 addmodify 功能放在一个 JSP 文件中,并且他们使用${owner['new']} 表达式来自定义当前页面上的元素,例如标签的 "New Owner""Owner"

[]运算符在JSP(Spring)环境中还有其他用法吗?

Controller文件有如下sn-p:

@RequestMapping(value = "/owners/new", method = RequestMethod.GET)
public String initCreationForm(Map<String, Object> model) {
    Owner owner = new Owner();
    model.put("owner", owner);
    return "owners/createOrUpdateOwnerForm";
}
@RequestMapping(value = "/owners/{ownerId}/edit", method = RequestMethod.GET)
public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) {
    Owner owner = this.clinicService.findOwnerById(ownerId);
    model.addAttribute(owner);
    return "owners/createOrUpdateOwnerForm";
}

JSP文件有如下sn-p:

<h2>
    <c:if test="${owner['new']}">New </c:if> Owner
</h2>

【问题讨论】:

    标签: java spring spring-mvc el jsp-tags


    【解决方案1】:

    [] 将允许您:

    获取一个属性,如果对象是一个bean(有getter和setter):

    ${car['type']}
    

    这将等价于car.getType();(或car.isType(),如果type 字段是boolean)。

    如果对象是Map,则获取键的值:

    ${carMap['Volvo']}
    

    carMapMap 时,这将等同于carMap.get('Volvo');

    如果对象是arrayList,则获取索引:

    ${cars[1]}
    

    如果carsarray,则这等效于cars[1];如果carsList,则等效于cars.get(1)

    更多详情/来源:http://docs.oracle.com/javaee/6/tutorial/doc/bnahu.html


    编辑:

    您的问题表达 (${owner['new']}) 属于第一种情况。在 petclinick 应用程序中,Owner 类是 Person 的子类,BaseEntity 的子类。而BaseEntity 有一个方法isNew()(所以Owner 也有这个方法)。

    这样,sn-p ${owner['new']} 等价于owner.isNew()

    【讨论】:

    • 谢谢你的回复,但是'new'是java关键字,不可能是你列出的情况!
    • 我明白你的意思了。在这种情况下,new 只是 String "new",而不是关键字。我编辑了答案。看看这个。希望它更清楚。
    • 嗯...我不确定我是否遵循您所说的。你明白了吗,还是仍然困惑?
    【解决方案2】:

    考虑下面的代码

    bikesMap.put("honda","cbr250r");
    bikesMap.put("yamaha","yzfr15");
    
    request.setAttribute("bikesMap",bikesMap);
    request.setAttribute("company","honda");
    

    所以如果我们写${bikesMap["company"],那么它就不会评估为"cbr250r",因为我们在[] 中提供的是一个字符串文字,所以容器会尝试找到一个不存在的键"company"。但是如果我们写${bikesMap[company]},那么这个EL 将评估为"cbr250r"

    ${bikesMap[compapny]} 将评估为"cbr250r",因为有一个名为company 的请求属性,company 的值即"honda"bikesMap 的键。

    ${bikesMap["company"]} 不会计算为 "cbr250r",因为没有名为 "company" 的键。

    [] 运算符优于点运算符的一个优点是它可以有效地访问列表和数组。可以写${bikesList["1"]},但不能写${bikesList.1}

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      相关资源
      最近更新 更多