Eclipse自动完成JSTL,JSP

Non*_*one 3 eclipse jsp jstl autocomplete

我正在使用Eclipse,制作一个动态的Web项目,并在我的JSP中包含了JSTL.一切正常,我有核心自动完成等等.

问题如下:当我foreach使用JSTL自定义对象的特定数组列表时,我无法访问实例的属性.这是一个例子:

<c:forEach var="person" items="${listOfPeople}">
    <c:out value="${person.name}" />
</c:forEach>    
Run Code Online (Sandbox Code Playgroud)

所以,person有一个属性getName().如果我使用scriplets例如:

<% 
   Person p = new Person();
   p.getName(); 
%>
Run Code Online (Sandbox Code Playgroud)

Eclipse在对象上启用自动完成功能p,但是当我使用JSTL时,实例上没有自动完成功能.

我的Eclipse是缺少或错误的,还是没有自动完成工作?

Bog*_*dan 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
Run Code Online (Sandbox Code Playgroud)

服务器将评估表达式并将值返回给标记.

如果您使用的是JSP 1.x版本,则可能会得到类似这样的内容(preudocode):

COutTag tag = new COutTag();
tag.setPageContext(pageContext);
tag.setValue("${person.name}");
tag.doStartTag();
// ... etc
Run Code Online (Sandbox Code Playgroud)

并且标记本身调用自己的求值程序从表达式中获取值.

在运行时,person在页面范围内搜索密钥,如果找不到,则在请求范围内搜索,然后在会话范围内搜索,直到找到它为止.然后发现的任何东西必须有一个getName方法,并且被称为等.

JSP通常用作视图,在某处您person创建对象并将其放置在范围内,并将流转发到JSP.您的IDE如何在设计时知道运行时每个范围内的内容?它不知道没有自动完成.

如果您改为<% Person p = new Person(); p.getName(); %>那么这是一个包含Java代码的scriptlet,并且您的IDE知道是一个Person类并且可以检查它并且知道属性和方法,因此您有自动完成,但是对于EL表达式没有,它们只是字符串.