为什么类可以在JSTL中使用未定义的成员?

时间:2014-04-12 13:57:14

标签: java jsp el

我正在阅读一本书中的JSP教程并且遇到一个难以理解的程序。

它有两个bean,一个是Message.java,另一个是MessageServies.java,如下所示。

package com.jeecourse.model;

public class Message {
private String name;
private String text;
public Message() {
}
public Message(String name, String text) {
    this.name = name;
    this.text = text;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getText() {
    return text;
}
public void setText(String text) {
    this.text = text;
}
}

和MessageService.java

package com.jeecourse.model;

public class MessageService {
private Message[] fakeMessages;

public MessageService() {
    fakeMessages = new Message[3];
    fakeMessages[0] = new Message("Jimmy", "Jimmy's message!");
    fakeMessages[1] = new Message("Jack", "Jack's message!");
    fakeMessages[2] = new Message("Tom", "Tom's message!");
}

public Message[] getMessages() {
    return fakeMessages;
}

}

最后是带有EL的message.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="messageService" class="com.jeecourse.model.MessageService"/>
<html>
   <head>
       <meta http-equiv="Content-Type"
                content="text/html; charset=UTF-8">
       <title>NoteBook</title>
    </head>
  <body>
    <table style="text-align: left; width: 100%;" border="1">
        <tr>
            <td>Name</td><td>Message</td>
        </tr>
        <c: forEach var="message" items="${messageService.messages}">
            <tr>
                <td>${message.name}</td><td>${message.text}</td>
            </tr>
        </c: forEach>
    </table>
   </body>
  </html>  

请注意,它在EL表达式中使用messageService.messages。很奇怪,messageService既没有这样的成员,也没有这样的功能。但它可以工作。为什么呢?

1 个答案:

答案 0 :(得分:0)

当您编写${messageService.messages}时,它会在编译时转换为messageService.getMessages。就像${message.text}实际调用message.getText()一样。

对于这种&#34;魔法&#34;在命名方法时遵循一些约定很重要。如果没有,编译器就不知道在使用缩写版本时应该调用哪个方法。

您可以在此处查看有关EL的更多信息:https://stackoverflow.com/tags/el/info 此功能位于页面顶部。