Eclipse自动完成JSTL,JSP

时间:2013-05-28 09:54:25

标签: eclipse jsp autocomplete jstl

我正在使用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是缺少或错误的,还是没有自动完成功能?

1 个答案:

答案 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表达没有,它们只是字符串。