J2EE Servlet循环内设置requestAttribute及ArrayList传值至JSP问题咨询
硬木项目材料清单:Servlet传集合到JSP的正确姿势
嘿,我来帮你搞定这个J2EE项目里的Servlet和JSP数据传递问题~先理清楚你的核心需求:把计算好的ArrayList<Tree>材料集合传给JSP展示,同时聊聊你问的「循环内用request.setAttribute」的坑。
一、核心需求实现:传递整个集合到JSP
你完全没必要在循环里单独处理每个Tree对象,直接把整个集合一次性设为request属性就好,简单高效还符合规范。
Servlet端代码示例
String execute(HttpServletRequest request, HttpServletResponse response) throws LoginSampleException { // 调用数据库方法获取所需树木材料集合 ArrayList<Tree> trees = yourHardwoodService.getRequiredTrees(); // 把整个集合设置为request属性,属性名可以自定义(比如"treeList") request.setAttribute("treeList", trees); // 转发到目标JSP页面(这里假设是material_list.jsp) // 如果是用框架的返回字符串跳转,就直接返回JSP路径;如果是原生Servlet,用RequestDispatcher转发 return "material_list.jsp"; // 原生Servlet转发写法: // request.getRequestDispatcher("/material_list.jsp").forward(request, response); }
JSP端展示代码(推荐用JSTL)
先确保你的项目已经引入JSTL依赖,然后在JSP里通过循环遍历集合展示每个Tree的信息:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>硬木项目材料清单</title> </head> <body> <h2>所需硬木材料列表</h2> <table border="1" cellpadding="8"> <tr> <th>树木种类</th> <th>所需数量</th> <!-- 这里可以添加Tree类的其他属性列,比如规格、材质等 --> </tr> <!-- 遍历request里的treeList集合,每个元素用var="tree"指代 --> <c:forEach items="${treeList}" var="tree"> <tr> <td>${tree.type}</td> <td>${tree.quantity}</td> <!-- 对应Tree类的getter方法,比如getType()、getQuantity() --> </tr> </c:forEach> </table> </body> </html>
如果暂时不想用JSTL,也可以用原生脚本(但不推荐,因为混合代码不好维护):
<!DOCTYPE html> <html> <head> <title>硬木项目材料清单</title> </head> <body> <h2>所需硬木材料列表</h2> <table border="1" cellpadding="8"> <tr> <th>树木种类</th> <th>所需数量</th> </tr> <% ArrayList<Tree> treeList = (ArrayList<Tree>) request.getAttribute("treeList"); for(Tree tree : treeList) { %> <tr> <td><%= tree.getType() %></td> <td><%= tree.getQuantity() %></td> </tr> <% } %> </table> </body> </html>
二、关于循环内使用request.setAttribute的问题
先直接给结论:这种做法完全没必要,而且会踩坑。
- 属性覆盖问题:如果你在循环里写
request.setAttribute("tree", tree),每次循环都会把之前的"tree"属性值覆盖掉,最终request里只会保留最后一个Tree对象,根本没法展示所有材料。 - 冗余维护问题:就算你给每个Tree设置不同的属性名(比如
"tree_1"、"tree_2"),JSP页面里也得逐个写对应的取值代码,不仅代码冗余,而且没法动态适配集合大小(比如集合里元素数量变了,JSP代码还要改)。 - 性能浪费问题:循环里多次调用
setAttribute,比起一次性传递整个集合,多了很多不必要的操作,性能上也不划算。
所以,直接传递整个集合,让JSP遍历展示,才是最合理的解决方案~
内容的提问来源于stack exchange,提问作者kristheman
相关产品推荐
相关产品推荐

