【问题标题】:confusion about getters in web application [duplicate]关于 Web 应用程序中的 getter 的困惑 [重复]
【发布时间】:2016-08-25 08:30:20
【问题描述】:

我正在使用 servlet 和 jsp 制作一个非常基本的 Web 应用程序,并且我进行了以下设置:

public class DataManager {
    //some method implementations omitted since they are not important
    public DataManager(){}

    public class Author{
        public int id;
        public String name;
        public String born;
        public String died;
    }

    public Author getAuthor(int authorId){} 
    public ArrayList<Author> getAuthors(){}
}

public class AuthorsServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        ServletContext context = getServletContext();
        DataManager dm = (DataManager) context.getAttribute("datamanager");
        ArrayList<DataManager.Author> authors = dm.getAuthors();

        request.setAttribute("authors", authors);
        request.getRequestDispatcher("/authors.jsp").forward(request, response);

    }
}

在我的 jsp 文件中:

<c:forEach var="author" items="${authors}">
    <tr>
        <td>${author.id}</td>
        <td><a href="author.jsp">${author.name}</a></td>
        <td>${author.born}</td>
        <td>${author.died}</td>
    </tr>
</c:forEach>

但是我一直收到一个错误,上面写着Property 'id' not found on type db.DataManager$Author,直到我在我的DataManager 类的内部Author 类中放入吸气剂:

public class Author{
    public int id;
    public String name;
    public String born;
    public String died;
    public int getId(){ return id; }
    public String getName(){ return name;}
    public String getBorn(){return born; }
    public String getDied(){ return died;}
}

我有两个(基本的)问题:

  1. 为什么我必须添加 getter 才能访问公共内部类的变量?

  2. 1234563获取foo 变量的值?

【问题讨论】:

标签: java jsp jakarta-ee


【解决方案1】:

运行时环境自动调用author.getId() 以评估${author.id}。这就是为什么你需要定义 getter(明确地,因为 Java 没有隐式地定义它们)即使字段是公共的。

有一个命名约定:如果filed的名字是fooFieldExample,getter的名字应该是getFooFieldExample(注意foo的大F)

【讨论】:

  • 不是编译器。这发生在运行时,使用反射。
  • @JBNizet 这如何使用反射?抱歉,我只对这个概念比较熟悉。
  • 在运行时,当 JSP 被执行时,EL 表达式 author.id 被解释,服务器因此找到一个名为“author”的属性,它可以是任何东西,然后寻找一个公共实例此对象中名为“getId()”的方法,并调用它。 getter 是否返回一个字段,以及该字段是否命名为“id”,完全无关紧要。 JSP EL 使用 JavaBean 属性,而不是字段。
【解决方案2】:

将类字段声明为私有并为它们定义 Getter 和 setter 是通常的 Java 最佳实践(几乎是必须的)。 它们在 Java 中非常常见,以至于大多数框架甚至标准都依赖它们,例如:JSP EL 语言在 author.getId() 中转换这个 author.id。

您应该将您的字段声明为私有并使用 getter 和 setter。

【讨论】:

    【解决方案3】:

    为什么我必须添加 getter 才能访问公共内部类的变量?

    因为这是 jsp 规范所期望的,$author.id 语句转换 author.getId() 其中 id 应该有一个公共访问器方法 getId();

    即使在我放入 getter 之后,我也没有直接调用它们(即 author.id 而不是 author.getId())编译器遵循的命名约定,所以我必须定义 getFoo 来获取foo 变量的值?

    是的,这是命名约定。请记住,JSP 是为了设计目的而由页面设计者开发的。JSps 不是由 Java 程序员设计的。所以$author.id对非程序员来说更方便。

    表达式$author.id 是一种表达式语言语法,用于访问JSP 页面中可用的变量。表达式语言$author.id被翻译成author.getId();

    【讨论】:

    • 那么这也适用于非 JSP 的情况吗?假设我有 ArrayList&lt;DataManager.Author&gt; authors = dm.getAuthors();then I do authors.get(1).name 之类的东西,如果没有 Author 类中的吸气剂,在 DataManager 之外的范围内,这是否可以工作?
    • @Liumx31 没有。访问 Java 代码中的公共字段会访问公共字段。它使用getter是你调用getter。但是,一般来说,字段永远不应该是公开的。
    • @PrasadKharkar 你说的是完全错误的。
    • @JBNizet,你能指导我吗?
    • 嗯,您的回答说 id 必须是可公开访问的,这是错误的。 getId() getter 必须是,但不是字段。然后在您的最后一条评论中,您说需要公共 getter 才能访问 Java 中的公共字段,这也是错误的。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多