JavaWeb项目JSP间传递price变量返回null问题解决
问题根因
request作用域的属性仅在单次服务端转发的请求生命周期内有效。你在Availability.java中把price存入request转发到display.jsp的流程是通的,但display.jsp里的<a href="seat.jsp">是客户端发起的全新GET请求,上一轮请求里存的所有属性会被完全销毁,所以seat.jsp里拿不到值返回null。
另外你现有JS代码里写的document.getElementById("p")取到的是整个DOM元素对象,不是价格数值,就算DOM存在也无法正常参与金额计算。
修复方案
1. 修改display.jsp,跳转时携带price参数
最简便的方式是直接把price拼在跳转链接的查询参数里,把原有a标签替换为:
<center><a href="seat.jsp?price=${price}" class="button"> <span>View Seats </span></a></center>
如果不希望参数暴露在URL中,也可以在display.jsp头部把值存入session作用域:
<% session.setAttribute("price", request.getAttribute("price")); %>
注意:session存值使用完成后要及时移除,避免不同订单间的值串扰
2. 修改seat.jsp,正确读取价格数值
你现在的跳转逻辑是打开全新页面,display.jsp的DOM节点不会被带到seat.jsp,所以不能通过getElementById取值,要直接从传参里拿纯数字值。
如果用URL传参的方式,在seat.jsp的JS代码开头新增参数解析逻辑,替换原有错误的DOM取值:
var firstSeatLabel = 1; // 从URL查询参数中解析price并转为数字类型 const urlSearchParams = new URLSearchParams(window.location.search); const unitPrice = Number(urlSearchParams.get('price')); $(document).ready(function() { var $cart = $('#selected-seats'), $counter = $('#counter'), $total = $('#total'), sc = $('#seat-map').seatCharts({ map: [ 'ff_ff', 'ff_ff', 'ee_ee', 'ee_ee', 'ee___', 'ee_ee', 'ee_ee', 'ee_ee', 'eeeee', ], seats: { f: { price : unitPrice, // 替换原有document.getElementById("p") }, e: { price : unitPrice, // 替换原有document.getElementById("p") }, }, // naming、legend、点击事件等其余原有代码保持不变即可
如果用session存值的方式,直接通过EL表达式取值即可,省去URL解析步骤:
const unitPrice = Number(${price});
后续同样替换seats配置里的DOM取值代码即可。
内容的提问来源于stack exchange,提问作者Belle
相关产品推荐
相关产品推荐

