我想实现自定义JSP列表标记,但是在访问自定义列表对象的属性时遇到问题。下面的示例在name页面上访问List2test.jsp属性,给出错误org.apache.jasper.JasperException: java.lang.NumberFormatException: For input string: "name"。如何解决呢?

public class List2 extends ArrayList<String> {

    public String getName() {
        return "name";
    }
}

test.jsp
<%-- java.lang.NumberFormatException --%>
${list.name}

<%-- this works ok --%>
<c:forEach  items="${list}" var="item">
   ${item}
</c:forEach>

编辑

整个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>

整个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}

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";
    }
}

最佳答案

我认为这是由于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;
    }
}

10-07 19:30
查看更多