3

I'm using Eclipse, making a dynamic web project and have included JSTL in my JSPs. Everything works fine, I have core autocomplete available and so on.

The problem is as follows: when I foreach with JSTL a specific array list of custom objects, I can't access properties of an instance. Here's an example:

<c:forEach var="person" items="${listOfPeople}">
    <c:out value="${person.name}" />
</c:forEach>    

So, a person has a property getName(). If I use scriplets e.g.:

<% 
   Person p = new Person();
   p.getName(); 
%>

Eclipse enables autocomplete on object p, but when I use JSTL, there is no autocomplete on instance.

Is it something missing or wrong with my Eclipse, or is it meant to work without autocomplete?

4

1 回答 1

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

并且标签本身调用他自己的求值器从表达式中获取值。

在运行时,person在页面范围内搜索键,如果在那里找不到,则在请求范围内搜索,然后在会话范围内搜索,直到找到为止。然后找到的任何东西都必须有一个getName方法,这就是所谓的等。

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

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

于 2013-05-30T20:32:34.500 回答