关于Web应用程序中的getter的混淆

时间:2016-08-25 08:30:21

标签: java jsp java-ee

我正在使用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类的内部Author类放入getter之前,我一直收到错误DataManager

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. 即使在我输入getter之后,我也没有直接调用它们(即author.id而不是author.getId())是否存在编译器遵循的命名约定,所以我必须定义getFoo以获取foo变量的值?

3 个答案:

答案 0 :(得分:1)

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

有一个命名约定:如果字段名称为fooFieldExample,则getter的名称应为getFooFieldExample(注意foo的大F)

答案 1 :(得分:0)

  

为什么我必须添加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();

答案 2 :(得分:0)

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

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