JSTL表达式语言访问对象属性

Chr*_*isM 7 methods getter jstl el

今天我正在按照一个教程让我挠头一小时.考虑:

public class MyClass {
    public int getTotal() {
        amount = 100;
        return amount;
    }
}
Run Code Online (Sandbox Code Playgroud)

以及JSP的摘录:

<p>Total: ${objectOfTypeMyClass.total}</p> //object instantiated elsewhere
Run Code Online (Sandbox Code Playgroud)

代码中没有任何地方声明或使用过名为" total " 的实例变量.在整个项目中(除了JSP之外)对"total"一词的唯一引用是方法getTotal().

因此,在经历了一些绝望的最后一次尝试之后,表达式语言似乎将$ {someObject.var}计算为"调用someObject对象的getVar()方法" .

我使用这个长篇教程超过一个星期,认为$ {someObject.var}说"从someObject直接获取保存的实例变量" var " .

我是否一直都错了,我的观察是正确的,为了使用EL引用任何实例变量,你必须提供一个名为getVarname()的相应getter方法,其中" Varname "是实例变量的名称?

此外,EL在这方面似乎不区分大小写.在上面的示例中,$ {objectOfTypeMyClass.total}中的 "total" 全部为小写,其中方法getTotal()具有大写"T".

虽然我们在这里,为什么我们不需要实例化变量"total"?我猜EL实际上并没有引用实例变量......只是一个getter方法?

是什么赋予了?

Bal*_*usC 8

我是否一直都错了,我的观察是正确的,为了使用EL引用任何实例变量,你必须提供一个名为getVarname()的相应getter方法,其中"Varname"是实例变量的名称?

那是对的.EL遵循EL 规范中描述的JavaBeans 规范.

此外,EL在这方面似乎不区分大小写.在上面的示例中,$ {objectOfTypeMyClass.total}中的"total"全部为小写,其中方法getTotal()具有大写"T".

不,它当然不是不区分大小写的.它是指定的行为.${bean.Total}不会有用.

虽然我们在这里,为什么我们不需要实例化变量"total"?我猜EL实际上并没有引用实例变量......只是一个getter方法?

这是因为它应该遵守Javabean规范.

总而言之,阅读这两个规格,一切都会很清楚:)

也可以看看: