JEE Web应用中如何在JSP读取Servlet传递的数组元素?
如何在JSP中读取Servlet传递的JSON格式数组元素?
问题描述
我开发了一个基于JEE的Web应用,遇到的问题是:从Servlet向JSP传递数组类型的数据,但不知道如何读取每个元素。
Servlet中的代码如下:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection c = DriverManager.getConnection("jdbc:sqlserver://localhost\\SQL2008R2:99;database=Netos_DB;user=sa;password=123"); Statement statement = c.createStatement(); int xVal; Float yVal; String nom; String name = request.getParameter("nom"); PreparedStatement ps = c.prepareStatement("select * from V502_client where M500_NOM=?"); ps.setString(1, name); ResultSet resultSet = ps.executeQuery(); while(resultSet.next()){ xVal = resultSet.getInt("Mois"); yVal = resultSet.getFloat("ChiffreAffaire"); nom=resultSet.getString("M500_NOM"); map = new HashMap<Object,Object>(); map.put("x", xVal); map.put("y", yVal);map.put("z",nom); list.add(map); dataPoints = gsonObj.toJson(list); } request.getSession().setAttribute("data", dataPoints); RequestDispatcher rd = request.getRequestDispatcher("graph.jsp"); rd.forward(request, response);
当我进入JSP页面后,写了:<div> ${data} </div>,但页面显示的是[{"x":3,"y":2280.0,"z":"3EG"},{"x":6,"y":4200.0,"z":"3EG"}],我需要知道如何读取其中的每个元素。
解决方案
我给你两种实用的处理方式,你可以根据场景选择:
方法一:直接传递List对象(JEE后端推荐方案)
你现在是把List转成JSON字符串再存到Session,其实可以直接传递List对象,用JSTL标签就能轻松遍历读取元素:
修改Servlet代码:
把循环里的dataPoints = gsonObj.toJson(list);移到循环外,直接存储List到Session:while(resultSet.next()){ xVal = resultSet.getInt("Mois"); yVal = resultSet.getFloat("ChiffreAffaire"); nom=resultSet.getString("M500_NOM"); Map<Object,Object> map = new HashMap<>(); map.put("x", xVal); map.put("y", yVal); map.put("z",nom); list.add(map); } // 直接存储List对象,无需转JSON request.getSession().setAttribute("dataList", list); RequestDispatcher rd = request.getRequestDispatcher("graph.jsp"); rd.forward(request, response);在JSP中遍历读取:
先引入JSTL核心标签库,再用<c:forEach>遍历List:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <div> <c:forEach items="${dataList}" var="item"> <p>月份: ${item.x}, 营业额: ${item.y}, 名称: ${item.z}</p> </c:forEach> </div>这样页面就会逐个展示每个元素的属性值了。
方法二:解析JSON字符串(适合前端JS处理场景)
如果坚持要传递JSON字符串,可以用JavaScript把它解析成JS数组,再遍历读取:
<div id="dataContainer"></div> <script> // 获取Session中的JSON字符串 var jsonData = "${data}"; // 解析为JavaScript数组 var dataArray = JSON.parse(jsonData); // 遍历数组并渲染到页面 var container = document.getElementById('dataContainer'); dataArray.forEach(function(item) { var itemElement = document.createElement('div'); itemElement.innerHTML = `月份:${item.x},营业额:${item.y},名称:${item.z}`; container.appendChild(itemElement); }); </script>
小优化提示
你Servlet里的dataPoints = gsonObj.toJson(list);放在while循环里是冗余的,每次循环都会重新序列化整个List,浪费性能,建议移到循环外面哦。
内容的提问来源于stack exchange,提问作者imanealami
相关产品推荐
相关产品推荐

