JSP传参到Servlet抛出java.lang.NumberFormatException异常如何解决
问题根源
你遇到的NumberFormatException异常并非出现在你贴出的Servlet代码中,而是来自你转发到的ChannelDoctorForm.jsp页面的EL表达式写法错误。
从错误栈的javax.el.ListELResolver.toInteger调用记录可以看到:EL解析器在处理你存入request的list属性时,尝试把字符串"name"转换为整数作为列表的索引下标,转换失败才抛出了该异常。
错误原因
你在Servlet中存入request的list是List集合类型,如果你在JSP中直接写${list.name},EL的列表解析器会默认将.name后的name识别为列表的索引值,才会尝试做字符串转整数的操作,自然会转换失败。
解决方案
根据你的使用场景选对应修改方式即可:
- 如果你只需要取列表中第一个
Staff对象的name属性,将JSP中的EL表达式修改为:
${list[0].name}
先通过下标取到列表中的Staff对象,再读取它的name属性。
- 如果你需要遍历整个列表输出所有
Staff的信息,使用JSTL的forEach标签遍历:
<!-- 页面顶部先引入JSTL核心标签库 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- 遍历列表 --> <c:forEach items="${list}" var="staff"> <p>医生姓名:${staff.name}</p> </c:forEach>
- 如果你实际只需要传递单个
Staff对象,不需要用列表存储,可以直接修改Servlet代码:
// 删掉List相关代码,直接存单个对象 Staff doc= new Staff(); doc.setName(name); request.setAttribute("doc", doc);
之后在JSP中直接读取对象属性即可,不会触发列表解析的问题:
${doc.name}
额外优化建议
你当前声明List时没有指定泛型,建议修改为List<Staff> list = new ArrayList<>();,可以避免后续出现不必要的类型转换异常。
内容的提问来源于stack exchange,提问作者Ryan anjelo
相关产品推荐
相关产品推荐

