在JSP(JavaServer Pages)中添加查询命令通常涉及前端表单提交、后端Servlet处理以及数据库交互等环节,目的是实现用户输入查询条件后,从数据库中检索数据并展示在页面上,以下是详细的实现步骤和代码示例,帮助理解JSP如何集成查询功能。

创建前端查询表单
用户通过HTML表单输入查询条件,表单提交后由后端Servlet处理,表单的action属性指向处理查询的Servlet路径,method属性通常使用post(避免GET请求的参数长度限制和安全隐患),创建一个查询用户信息的表单,包含用户名输入框和提交按钮:
<form action="UserQueryServlet" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username">
<button type="submit">查询</button>
</form>
这里name="username"是关键,Servlet通过该名称获取用户输入的查询条件。
后端Servlet接收查询请求
Servlet作为控制器,负责接收前端请求、获取查询参数,并调用数据库查询方法,需要重写doPost方法(因为表单提交方式为post),并通过request.getParameter()获取表单数据。
@WebServlet("/UserQueryServlet")
public class UserQueryServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置请求编码,防止中文乱码
request.setCharacterEncoding("UTF-8");
// 获取查询参数
String username = request.getParameter("username");
// 调用数据库查询方法
List<User> userList = UserDao.queryUsers(username);
// 将查询结果存入request作用域,转发到JSP页面展示
request.setAttribute("userList", userList);
request.getRequestDispatcher("userList.jsp").forward(request, response);
}
}
关键点:

request.setCharacterEncoding("UTF-8"):解决POST请求中文乱码问题(GET请求需在Tomcat的server.xml中配置URIEncoding=”UTF-8″)。request.setAttribute():将查询结果存入request作用域,供后续JSP页面访问。forward():转发到展示结果的JSP页面(避免浏览器地址栏变化,且能共享request数据)。
数据库连接与查询实现
数据库查询通常通过JDBC(Java Database Connectivity)完成,包括加载驱动、建立连接、执行SQL、处理结果集等步骤,建议使用PreparedStatement防止SQL注入,并通过连接池(如Druid)优化性能,以下是UserDao类的实现示例:
public class UserDao {
// 数据库连接参数(实际开发中建议从配置文件读取)
private static final String URL = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "password";
public static List<User> queryUsers(String username) {
List<User> userList = new ArrayList<>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3. 编写SQL语句(使用?作为占位符)
String sql = "SELECT * FROM users WHERE username LIKE ?";
pstmt = conn.prepareStatement(sql);
// 4. 设置参数(%表示模糊匹配)
pstmt.setString(1, "%" + username + "%");
// 5. 执行查询
rs = pstmt.executeQuery();
// 6. 处理结果集
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setEmail(rs.getString("email"));
userList.add(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7. 关闭资源(防止泄漏)
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return userList;
}
}
数据库连接参数说明(表格形式):
| 参数名 | 示例值 | 说明 |
|---|---|---|
| URL | jdbc:mysql://localhost:3306/testdb | 数据库连接地址,包含协议、主机、端口、数据库名及参数(如时区、SSL) |
| USER | root | 数据库用户名 |
| PASSWORD | password | 数据库密码 |
| Driver Class | com.mysql.cj.jdbc.Driver | MySQL驱动类名(不同数据库驱动不同,如Oracle为oracle.jdbc.driver.OracleDriver) |
JSP页面展示查询结果
Servlet转发到JSP页面后,通过EL表达式和JSTL(JSP Standard Tag Library)展示查询结果,创建userList.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>查询结果</title>
</head>
<body>
<h2>用户列表</h2>
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<th>ID</th>
<th>用户名</th>
<th>邮箱</th>
</tr>
<c:forEach var="user" items="${userList}">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
关键点:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>:引入JSTL核心标签库,简化循环和条件判断。${userList}:EL表达式获取Servlet中存入的userList数据。<c:forEach>:遍历集合,生成表格行。
异常处理与优化
- SQL注入防护:始终使用
PreparedStatement而非直接拼接SQL字符串,避免用户输入恶意代码(如username = "admin' OR '1'='1")。 - 资源管理:在
finally块中关闭Connection、Statement、ResultSet,防止数据库连接泄漏。 - 编码统一:前后端编码保持一致(UTF-8),包括JSP页面(
<%@ page contentType="text/html;charset=UTF-8" %>)、Servlet(request.setCharacterEncoding("UTF-8"))及数据库连接参数(useUnicode=true&characterEncoding=UTF-8)。 - 性能优化:使用连接池(如Druid、HikariCP)管理数据库连接,避免频繁创建和销毁连接;对大数据量查询分页处理(通过
LIMIT和OFFSET)。
相关问答FAQs
问题1:JSP查询时出现中文乱码怎么办?
解答:中文乱码通常由编码不一致导致,需分情况处理:

- POST请求:在Servlet中调用
request.setCharacterEncoding("UTF-8");在JSP页面添加<%@ page contentType="text/html;charset=UTF-8" %>。 - GET请求:Tomcat默认使用ISO-8859-1编码,需在
server.xml的<Connector>标签中添加URIEncoding="UTF-8",或在Servlet中手动转换:String username = new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8")。 - 数据库存储:确保数据库表和字段的字符集为
utf8mb4(如MySQL),避免存入乱码。
问题2:如何优化JSP查询性能?
解答:优化查询性能可从以下方面入手:
- 数据库层面:为查询字段(如
username)添加索引,避免全表扫描;使用EXPLAIN分析SQL执行计划,优化查询语句。 - 代码层面:使用连接池(如HikariCP)管理连接,减少连接创建开销;关闭不必要的资源(ResultSet、Statement、Connection);对大数据量查询分页(如
SELECT * FROM users LIMIT 10 OFFSET 0)。 - 缓存层面:引入Redis等缓存工具,缓存频繁查询的结果(如热门用户信息),减少数据库访问次数。
- 前端层面:使用异步请求(AJAX)避免页面刷新,提升用户体验;对复杂查询添加加载提示,避免用户重复提交。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/14214.html