如何从ModelView在JSP页面展示数据及报错问题排查
问题解答:ModelView 数据展示与属性查找错误排查
一、如何从ModelView向JSP页面展示数据
这个流程其实很清晰,分两步就能搞定:
1. 控制器中准备并传递数据
在Spring MVC的控制器方法里,先创建ModelView对象并指定要跳转的JSP页面,再用addObject方法把数据塞进去——单个字符串、自定义Bean、集合都能传:
@RequestMapping("/showUserInfo") public ModelView showUserInfo() { // 指定跳转的JSP页面(不用加.jsp后缀,Spring会自动处理) ModelView mv = new ModelView("userInfo"); // 传递单个字符串数据 mv.addObject("pageTitle", "用户信息展示"); // 传递自定义Bean对象(记得你的Bean类要有public的getter方法) User currentUser = new User(); currentUser.setId(1001); currentUser.setNickname("咖啡不加糖"); currentUser.setEmail("test@example.com"); mv.addObject("user", currentUser); // 传递集合数据 List<User> userList = new ArrayList<>(); userList.add(currentUser); userList.add(new User(1002, "代码敲不停", "dev@example.com")); mv.addObject("userList", userList); return mv; }
2. JSP页面中获取并渲染数据
在JSP里用EL表达式(${变量名})就能直接取数据,配合JSTL标签处理集合会更方便:
<!-- 遍历集合前先引入JSTL核心标签库 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <h2>${pageTitle}</h2> <!-- 展示单个Bean的属性 --> <div> <p>用户ID:${user.id}</p> <p>昵称:${user.nickname}</p> <p>邮箱:${user.email}</p> </div> <!-- 遍历集合数据 --> <table border="1"> <tr> <th>ID</th> <th>昵称</th> <th>邮箱</th> </tr> <c:forEach items="${userList}" var="item"> <tr> <td>${item.id}</td> <td>${item.nickname}</td> <td>${item.email}</td> </tr> </c:forEach> </table>
二、解决property["all properties"] not found at java.lang.string!错误
这个错误我碰到过好多次,本质就是你在JSP里尝试访问一个字符串对象的属性,但String类根本没有这个属性,常见场景有两种:
1. 控制器传错了数据类型
比如你本来想传一个User对象到JSP,结果不小心传成了字符串:
// 错误示例:把字符串当成User对象传递 mv.addObject("user", "这是一个字符串,不是User对象");
然后在JSP里写了${user.nickname}——String类哪有nickname属性?EL表达式会尝试调用user.getNickname(),自然找不到方法,就报这个错了。
2. 变量名拼写不匹配
比如控制器里是mv.addObject("userObj", currentUser),但JSP里写成了${user.nickname}——这时候user在页面上下文里可能是某个默认的字符串对象(或者空值),同样会触发错误。
排查和解决步骤:
- 检查控制器的
addObject代码:确认你传递的是预期的Bean对象,不是字符串或者其他类型。可以临时打印currentUser.getClass().getName(),看看是不是你的自定义Bean类。 - 检查JSP的EL表达式:变量名要和控制器里
addObject的键完全一致,比如控制器传的是user,JSP里就不能写成usr。 - 临时调试:在JSP里先打印变量的类型,比如
${user.getClass().getName()},如果输出是java.lang.String,那肯定是传错类型了,赶紧修改控制器代码。
举个正确的修复示例:
把控制器里的错误代码:
mv.addObject("user", "这是一个字符串");
改成:
mv.addObject("user", currentUser); // currentUser是你的UserBean实例
这样JSP里的${user.nickname}就能正常调用currentUser.getNickname(),不会再报错了。
内容的提问来源于stack exchange,提问作者the_way
相关产品推荐
相关产品推荐

