【问题标题】:How does EL statement: ${person.dog.name} know that attribute "person" is of type Person? [duplicate]EL 语句:${person.dog.name} 如何知道属性“person”是 Person 类型? [复制]
【发布时间】:2021-04-10 20:12:05
【问题描述】:

我有这些来自 Head First 书中的图片:


我希望您注意替换 ${person.dog.name} 的代码。我唯一想知道的是它如何知道属性“person”是Person类型的对象?当然getAttribute()返回的是Object,所以必须强制转换为Person,但是怎么知道是Person类做的呢?

我猜这段代码以前使用findAttribute() 来查找存储值为“person”的属性的范围。后来它尝试使用getAttribute() 获取它。所以在它找到它之后,它得到它——但它仍然不知道它在现实中得到了什么。那么它是如何/在哪里“确定”它是 Person 类型的呢?

【问题讨论】:

    标签: java jsp el


    【解决方案1】:

    它没有。使用反射解析属性,方法是在 person 解析为的任何对象上查找方法 getDog(),然后重复该过程。

    【讨论】:

      【解决方案2】:

      EL 引擎看到 person 并在美化的 HashMap 中查找它(request.setAttribute 正在填充 - 美化的哈希图)。

      它在那里找到一个对象,因为你设置了它。它获取这个对象并在其上调用.getClass(),它返回Person.class。然后它在dog 上运行一个大写函数以生成getDog。然后它会扫描所有使用.getFields() 的字段以及所有使用.getMethods() 的方法,查找名为dog 的字段或名为getDog 的无参数实例方法。它找到方法并调用它。

      重复此原则,了解它最终如何处理 .name 部分。

      现在 EL 有一个对象(在任何对象上调用 getName 的结果是通过在 person 上反射调用 getDog 所返回的),并将其放置到位。

      我不认为是 HTML 转义了它,所以这是一本“有用”的书,告诉您如何使用过时的技术 (JSP) 来制造安全漏洞。太好了。

      你有一本新书吗?你可能想买不到 10 年的东西:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        • 2023-04-08
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 2016-07-28
        • 1970-01-01
        相关资源
        最近更新 更多