如何解释EL表达式中方括号([])运算符的用法

时间:2013-06-15 03:16:58

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

当我阅读Spring PetClinic示例应用程序时,我发现他们总是将 add modify 功能放入单个JSP文件中,并使用{{1用于自定义当前页面上的元素的表达式,例如标签的所有者”“所有者”

JSP(Spring)环境中是否有${owner['new']}运算符的其他用法?

Controller文件包含以下代码段:

[]

JSP文件包含以下代码段:

@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";
}

2 个答案:

答案 0 :(得分:4)

[]将允许您:

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

${car['type']}

如果car.getType();字段为car.isType(),则相当于type(或boolean

如果对象是Map

,则获取密钥的值
${carMap['Volvo']}

carMap.get('Volvo');carMap时,这相当于Map

获取索引,如果对象是arrayList

${cars[1]}

如果cars[1]cars或等同于array,如果cars.get(1)cars,则相当于List

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


修改

您的问题的表达式(${owner['new']})属于第一种情况。在petclinick应用程序中,Owner类是Person的子类,它是BaseEntity的子类。 BaseEntityisNew()方法(因此Owner也有方法)。

这样,代码段${owner['new']}相当于owner.isNew()

答案 1 :(得分:0)

考虑以下代码

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

request.setAttribute("bikesMap",bikesMap);
request.setAttribute("company","honda");

因此,如果我们编写${bikesMap["company"],那么它将不会评估为"cbr250r",因为我们在[]中提供的是字符串文字,因此容器会尝试查找密钥{{1}哪个不存在。但是如果我们写"company",那么这个EL将会变成${bikesMap[company]}

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

${bikesMap["company"]}不会评估为"cbr250r",因为没有名为"company"的密钥。

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

希望这有帮助