Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EL如何在不知道对象的类的情况下处理对象的方法和字段_Java_Jsp_El - Fatal编程技术网

Java EL如何在不知道对象的类的情况下处理对象的方法和字段

Java EL如何在不知道对象的类的情况下处理对象的方法和字段,java,jsp,el,Java,Jsp,El,当我们在jsp中做类似的事情时,我无法理解它是如何工作的 ${someObject.doMethod()} 我不明白的是,我们在这里没有定义object类,但是jasper编译了这个类,这段代码可以工作。 我的意思是我们不写信 ${SomeClass someObject.doMethod()} 请解释一下它是如何工作的。EL在后台使用。因此,在您的示例中,首先从当前上下文中获取someObject(您可以将其视为Map),然后进一步解析表达式的其余部分。例如,如果它以()结尾,则在对象上搜

当我们在jsp中做类似的事情时,我无法理解它是如何工作的

${someObject.doMethod()}
我不明白的是,我们在这里没有定义object类,但是jasper编译了这个类,这段代码可以工作。 我的意思是我们不写信

${SomeClass someObject.doMethod()}
请解释一下它是如何工作的。

EL在后台使用。因此,在您的示例中,首先从当前上下文中获取
someObject
(您可以将其视为
Map
),然后进一步解析表达式的其余部分。例如,如果它以
()
结尾,则在对象上搜索具有给定名称的方法。如果它类似于
${someObject.someField}
,那么将查找一个公共getter,名为
getSomeField()
,等等


@capture的一个好评论——需要注意的一件重要事情是EL是在运行时计算的。因此,如果在某些表达式中使用的对象或方法实际上不存在,则不会收到任何编译器错误/警告。

如果这是Jasper问题,请在问题中添加相应的标记…这是正确的答案,因此我不想再发布另一个,但我要补充的是,EL不会在编译时计算,而是在运行时。因此,在这个例子中,所讨论的对象上可能不存在doMethod(),在它尝试计算表达式之前,不会处理这个问题。@谢谢,我本来也打算写这个,但忘了。我已经编辑了我的答案。我理解你的意思吗?你的意思是,每次我请求某个jsp页面(article.jsp for ex)时,EL都会计算我的表达式,并通过反射执行我的方法?简短回答-是的。例如,如果您有
${someObject.message}
,并且
getMessage()
返回
您好,它将呈现为
你好。但是,以JSF为例,如果您有
@iJava-这基本上是正确的。jsp页面首先被编译成.java文件,然后被编译成.class文件并执行。但是在计算EL时,它使用反射来找到适当的方法来调用,并针对对象调用它。但是,在大多数情况下,创建.class文件的过程并不尝试评估
someObject
的类型,它只是将其视为将传递给反射API的对象。