MVC架构下JSP无法显示用户个人资料(无报错)
问题分析与修复方案
你遇到的问题主要来自三个核心点:SQL语句的错误拼接、JSTL循环的作用域误用,还有一处小的注释笔误,我来逐一帮你解决:
1. SQL语句语法错误(最关键问题)
在CustomerViewQuery的list()方法里,你的PreparedStatement字符串拼接完全错误:
PreparedStatement pst = con.prepareStatement("SELECT * FROM customers WHERE username='\"+uName+\"'");
这种写法会把"+uName+"这个固定字符串当作username的值去查询,既取不到你传入的uName变量内容,还会直接导致SQL语法报错。正确的做法是使用参数占位符,这不仅能解决语法问题,还能避免SQL注入风险:
PreparedStatement pst = con.prepareStatement("SELECT * FROM customers WHERE username=?"); pst.setString(1, uName); // 给占位符赋值,1代表第一个?的位置
2. JSTL循环的作用域错误
你的CustomerProfile.jsp里,<c:forEach>标签是空的,所有表单字段都在循环外部,这就导致${customer}变量在循环外根本不存在,自然取不到任何数据。
因为你是根据username查询单个用户的详情,这里有两种修复方式:
方案一:把表单放进循环(兼容多结果场景)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:forEach items="${customers}" var="customer"> <div class="container mt-5"><br> <form role="form" action="CustomerController" data-toggle="validator" method="post" id="registerForm"> <!-- 所有表单字段都放在循环内部 --> <div class="form-group row"> <label for="name" class="col-sm-2 col-form-label">Name</label> <div class="col-sm-10"> <input type="text" name="name" value="${customer.name}" placeholder="Name"> </div> </div> <!-- 其他字段省略 --> </form> </div> </c:forEach>
方案二:直接取列表第一个元素(更适合单用户场景)
因为username是唯一的,查询结果只会有一个用户,所以可以不用循环,直接取列表的第一个元素:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:set var="customer" value="${customers[0]}" /> <div class="container mt-5"><br> <form role="form" action="CustomerController" data-toggle="validator" method="post" id="registerForm"> <!-- 正常使用${customer.name}等表达式 --> </form> </div>
3. Servlet里的注释笔误(不影响功能,但建议修正)
在CustomerProfileController的doGet方法里,你写了一句错误的注释:
// Will be available as ${products} in JSP
但实际你存入request的属性是customers,所以应该改成:
// Will be available as ${customers} in JSP
额外调试建议
可以在Servlet里加一句调试代码,确认是否从数据库查到了数据:
System.out.println("查询到的用户数量:" + customers.size());
如果输出为0,说明SQL查询逻辑还有问题;如果输出为1,那就是JSP的渲染问题,按照上面的方案修复即可。
内容的提问来源于stack exchange,提问作者Kasun
相关产品推荐
相关产品推荐

