JavaEE:如何从JSP下拉框取值到Servlet并会话存储后回显?
Hey there! 第一次发帖完全不用紧张,咱们一步步来搞定这个从下拉框取值存Session再回显的问题😉
先把前端JSP的基础配置捋顺
首先得确保你的下拉框和表单是正确设置的,这是取值的基础:
- 给
<select>标签加上name属性,Servlet就是靠这个name来获取值的,比如:<form action="AddToCartServlet" method="post"> <select name="selectedProduct"> <option value="javaEE-book">JavaEE入门指南</option> <option value="mysql-notes">MySQL笔记</option> <option value="spring-boot-course">SpringBoot实战课</option> </select> <button type="submit">add to card</button> </form>注意:每个
<option>一定要加value属性!如果没加,Servlet拿到的会是option里的显示文本(比如“JavaEE入门指南”),而不是你想要的标识值。
Servlet里处理取值和Session存List
接下来是Servlet的逻辑,要注意从Session里取List的时候,先判断是否存在,不存在就初始化:
@WebServlet("/AddToCartServlet") public class AddToCartServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取下拉框选中的值 String selectedItem = request.getParameter("selectedProduct"); // 处理中文乱码(如果需要的话) request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 2. 从Session中获取购物车List,不存在则创建新的 List<String> cartList = (List<String>) request.getSession().getAttribute("cart"); if (cartList == null) { cartList = new ArrayList<>(); request.getSession().setAttribute("cart", cartList); // 存回Session } // 3. 将选中的值加入List if (selectedItem != null && !selectedItem.isEmpty()) { cartList.add(selectedItem); } // 4. 跳回原来的JSP页面(这里用转发,重定向也可以,Session数据都能保留) request.getRequestDispatcher("/your-page.jsp").forward(request, response); } }
小提醒:如果你的值是中文,别忘了设置请求编码
request.setCharacterEncoding("UTF-8"),不然会出现乱码问题。
JSP页面回显Session中的List
最后把Session里的购物车内容显示出来,推荐用JSTL标签(更简洁,避免脚本代码),记得先导入标签库:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>购物车页面</title> </head> <body> <!-- 之前的表单部分 --> <form action="AddToCartServlet" method="post"> <select name="selectedProduct"> <option value="javaEE-book">JavaEE入门指南</option> <option value="mysql-notes">MySQL笔记</option> <option value="spring-boot-course">SpringBoot实战课</option> </select> <button type="submit">add to card</button> </form> <!-- 回显购物车内容 --> <h3>你的购物车:</h3> <c:if test="${not empty sessionScope.cart}"> <ul> <c:forEach items="${sessionScope.cart}" var="item"> <li>${item}</li> </c:forEach> </ul> </c:if> <c:if test="${empty sessionScope.cart}"> <p>购物车还是空的哦~</p> </c:if> </body> </html>
如果暂时还没学JSTL,用脚本代码也可以:
<h3>你的购物车:</h3> <% List<String> cart = (List<String>) session.getAttribute("cart"); if (cart != null && !cart.isEmpty()) { %> <ul> <% for (String item : cart) { %> <li><%= item %></li> <% } %> </ul> <% } else { %> <p>购物车还是空的哦~</p> <% } %>
常见坑点自查
- 是不是忘了给
<select>加name属性?这会导致request.getParameter()返回null - 是不是
<option>没设value?拿到的不是你想要的标识值 - 是不是每次Servlet里都new了一个新的List?这样会覆盖之前Session里的内容,一定要先判断Session里有没有再初始化
- 表单的
action路径是不是写错了?要和Servlet的@WebServlet注解里的路径一致
内容的提问来源于stack exchange,提问作者j0w
相关产品推荐
相关产品推荐

