我正在使用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;}
}
我有两个(基本的)问题:
为什么我必须添加getter才能访问公共内部类的变量?
即使在我输入getter之后,我也没有直接调用它们(即author.id
而不是author.getId()
)是否存在编译器遵循的命名约定,所以我必须定义getFoo
以获取foo
变量的值?
答案 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。