我正在使用Eclipse,制作一个动态的Web项目,并在我的JSP中包含了JSTL。一切正常,我有核心自动完成功能等等。
问题如下:当我foreach
使用JSTL自定义对象的特定数组列表时,我无法访问实例的属性。这是一个例子:
<c:forEach var="person" items="${listOfPeople}">
<c:out value="${person.name}" />
</c:forEach>
因此,person
有一个属性getName()
。如果我使用scriplets,例如:
<%
Person p = new Person();
p.getName();
%>
Eclipse在对象p
上启用自动完成功能,但是当我使用JSTL时,实例上没有自动完成功能。
我的Eclipse是缺少或错误的,还是没有自动完成功能?
答案 0 :(得分:5)
EL表达式没有自动完成功能。 EL表达式只是在JSP执行时得到的字符串(当JSP转换为Servlet时它们仍然是字符串)。
代码如:<c:out value="${person.name}" />
被翻译成类似这样的东西(伪代码):
COutTag tag = new COutTag();
tag.setPageContext(pageContext);
tag.setValue(ExpressionEvaluator.evaluate("${person.name}"));
tag.doStartTag();
// ... etc
服务器将评估表达式并将值返回给标记。
如果你使用的是JSP 1.x版本,你可能会得到类似这样的内容(preudocode):
COutTag tag = new COutTag();
tag.setPageContext(pageContext);
tag.setValue("${person.name}");
tag.doStartTag();
// ... etc
和表达式中的标记本身calls his own evaluator to get a value。
在运行时,在页面范围内搜索person
密钥,如果找不到,则在请求范围内查找会话范围等,直到找到它为止。然后找到的任何东西都必须有一个getName
方法,并且它被称为等等。
JSP通常用作视图,在某处创建person
对象并将其放在范围内,并将流转发到JSP。您的IDE如何在设计时知道运行时每个范围内的内容?它不知道没有自动完成。
如果您改为<% Person p = new Person(); p.getName(); %>
,那么这是一个包含Java代码的脚本,您的IDE知道它是一个Person
类,可以检查它并知道属性和方法,因此您可以自动完成,但对于EL表达没有,它们只是字符串。