我想实现自定义JSP列表标记,但是访问自定义列表对象的属性有问题.以下示例访问页面上的name属性会出错.怎么解决这个?List2test.jsporg.apache.jasper.JasperException: java.lang.NumberFormatException: For input string: "name"
public class List2 extends ArrayList<String> {
public String getName() {
return "name";
}
}
Run Code Online (Sandbox Code Playgroud)
test.jsp的
<%-- java.lang.NumberFormatException --%>
${list.name}
<%-- this works ok --%>
<c:forEach items="${list}" var="item">
${item}
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
编辑
整个test.jsp工作
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:forEach items="${list}" var="item">
${item}
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
整个test.jsp 不工作
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
${list.name}
Run Code Online (Sandbox Code Playgroud)
TestController.java:
@Controller
public class TestController {
@ModelAttribute("list")
public List2 testList() {
List2 l = new List2();
l.add("foo");
l.add("bar");
return l;
}
/* test.jsp */
@RequestMapping("/test")
public String test() {
return "test";
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这是因为JSP EL允许使用.或[]访问对象属性.但两者对List实例都有特殊含义:它意味着访问第n个元素.你可以这样写${list[2]}或${list.2}.由于EL检测到您的对象是集合的实例,因此它会尝试将名称转换为数字,并且您会收到此异常.
请注意,这只是对您获得的异常的解释.我没有检查规范,看看它是否是Tomcat的错误或是否是预期的行为.
你应该很少延伸ArrayList.大多数情况下,最好使用委托,从而将列表包装在另一个对象中.难道你不能像下面这样的东西吗?
public class List2 {
private List list;
public String getName() {
return "name";
}
public List getList() {
return list;
}
}
Run Code Online (Sandbox Code Playgroud)