我有以下jsp:
<%@ page import="java.util.Arrays" %>
<%@ page import="java.util.List" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html><body>
<%!
private static class Test {
private String val2;
private String val1;
public Test(String v1, String v2) {
val1 = v1;
val2 = v2;
}
public String getVal1() {
return val1;
}
public String getVal2() {
return val2;
}
};
private static List<Test> ITEMS = Arrays.asList(new Test("1","1"),new Test("2","2"));
%>
<%
pageContext.setAttribute("ITEMS",ITEMS);
%>
<c:forEach var="item" items="${ITEMS}">
${item.val1},${item.val2}
</c:forEach>
</body></html>
当 TOMCAT 执行它时 - 我们看到异常
javax.el.PropertyNotFoundException: Property 'val1' not readable on type java.lang.String
所以 EL 遍历集合,但由于某种原因,forEach 内部的 ${item} 变成了一个字符串。
但是,当您简单地更改private static class
为public static class
- 时,一切正常。
我不明白这不是问题,因为我们有解决方案。但我只是不明白为什么在这种情况下它需要公开。JSP 被翻译成 servlet,所以在翻译后的 java 代码中它无论如何都能看到。EL 不只是获取对象属性的反射材料吗(在我们的例子中,属性是public
,所以 EL 应该可以在没有反射修饰符的情况下获取它)。
如果有人知道 - 请回复。我将不胜感激!提前致谢。