一个jsp页面嵌入了java代码,查询出数据库表user的所有记录:
<%
List<User> userList = UserService.getAllUser();
%>如果用下面的形式:
<c:forEach items="<%=userList %>" var="list">
${list.userId};${list.name};
</c:forEach>
${list.userId}获取不到值,对应数据库中的字段是user_id这种组合字段;${list.name}可以取到值,对应数据库中的字段name;
前面那种组合字段为什么取不到值???如果userList直接是后台方法定义的变量传到前台jsp页面,如下面直接在jsp页面调用:
<c:forEach items="${userList }" var="list">
${list.userId};${list.name};
</c:forEach>
这种形式的调用就都能取到值。jspjavac标签
<%
List<User> userList = UserService.getAllUser();
%>如果用下面的形式:
<c:forEach items="<%=userList %>" var="list">
${list.userId};${list.name};
</c:forEach>
${list.userId}获取不到值,对应数据库中的字段是user_id这种组合字段;${list.name}可以取到值,对应数据库中的字段name;
前面那种组合字段为什么取不到值???如果userList直接是后台方法定义的变量传到前台jsp页面,如下面直接在jsp页面调用:
<c:forEach items="${userList }" var="list">
${list.userId};${list.name};
</c:forEach>
这种形式的调用就都能取到值。jspjavac标签
不应该。
除非后台的逻辑和下面的不一样
<%
List<User> userList = UserService.getAllUser();
%>
看看User对象中包含哪些成员对象
userId,name属性第二种形式list.userId能取到值,至于第一种形式取不到值我觉得是很奇怪,我这里查询取数是直接执行sql语句的,所有没有通过hibernate定义字段之间的对应关系。
你的意思是怎么输出User对象?UserService.getAllUser()方法执行的sql是:
String sql = "select * from user order by user_id asc;";
List<User> list = (List<User>) db.queryList(User.class, sql);
return list;
user.toString();
看看你的所有成员变量是什么
<%
.......
List<User> userList = UserService.getAllUser();
out.println(userList.get(1).toString());
out.println(userList.get(1).getUseId());
out.println(userList.get(1).getName());
%>
结果是:
com.model.User@1911ec8
0
李明这里输出就不正常了,难道User实体类的定义要和数据库表user字段一致才可以???
User实体类属性userId改为id第一种情况
<c:forEach items="<%=userList %>" var="list">
${list.id};${list.name};
</c:forEach>
这两个值都能取出来了。这里就是不明白,在jsp页面java块查出来的记录为什么需要实体User定义的属性和数据库表user的字段一致,页面才能取到值。
而直接从后台方法传到页面的就不需要这样。
String sql = "select * from user order by id asc;";
List<User> list = (List<User>) super.queryForList(User.class, sql);//用实体“格式化”super.queryForList调用的是下面的方法:protected <T> List<T> queryForList(String sql, Class<T> elementType, StatementParameter param) throws SQLException {
try {
return this.getJdbcTemplate().query(sql, param.getArgs(), new BeanPropertyRowMapper<T>(elementType));
}
catch (EmptyResultDataAccessException e) {
return null;
}
catch (DataAccessException e) {
throw new SQLException(e);
}
}
String sql = "select * from user order by id asc;";
List<User> list = (List<User>) super.queryForList(User.class, sql);//用实体“格式化”super.queryForList调用的是下面的方法:protected <T> List<T> queryForList(String sql, Class<T> elementType, StatementParameter param) throws SQLException {
try {
return this.getJdbcTemplate().query(sql, param.getArgs(), new BeanPropertyRowMapper<T>(elementType));
}
catch (EmptyResultDataAccessException e) {
return null;
}
catch (DataAccessException e) {
throw new SQLException(e);
}
}
是这样啊,这就要请大牛了
List<User> userList = UserService.getAllUser();
%>至少要看下userList有没有数据
可以用打印一个SIZE就行了。java.javasm.com
System.out.println(userList.size());
貌似el表达式取的值就是 对象的get方法
也就是说
User对象中有属性id,name
对应的get方法为getId()getName()
那么jsp页面可用${user.id}${user.name}取到值
就是get后面的单词 第一个变小写
如果还是上面的属性
但是对应的get方法为getIid(),getNname()
那么通过上面的方法是取不到值的
要这样${user.iid}${user.nname} 即Iid→iid Nname→nname
<%
List<User> userList = UserService.getAllUser();
request.setAttribute("list",userList);
%><c:forEach items="${list}" var="list">
${list.userId};${list.name};
</c:forEach>
这样就取出了,版主对jstl,el表达式不熟悉啊,
其一:jstl不能喝脚本(<%= %>)一起使用,必须和el表达式一起使用
其二:el表达式(${list}),总是在page,request,session.application这个四个范围内搜索对象
<%
.......
List<User> userList = UserService.getAllUser();
out.println(userList.get(1).toString());
out.println(userList.get(1).getUseId());
out.println(userList.get(1).getName());
%>
结果是:
com.model.User@1911ec8
0
李明这里输出就不正常了,难道User实体类的定义要和数据库表user字段一致才可以???
hibernate配置文件出问题了或者是映射关系没弄对的缘故吧。