jsp查询数据库并显示页面上

  发布时间:2026-10-17 06:21:02   作者:玩站小弟   我要评论
打开Tomcat的日志,看到一行SQLException,心里就有数了——JSP页面上那个空白的表格,问题出在数据库连接上。很多人第一次写JSP查数据,代码看着没问题,页面就是不出东西。我见过一个案例 。

打开Tomcat的询数日志,看到一行SQLException,据库心里就有数了——JSP页面上那个空白的并显表格,问题出在数据库连接上。示页很多人第一次写JSP查数据,面上代码看着没问题,询数页面就是据库不出东西。我见过一个案例,并显开发者把`Class.forName("com.mysql.jdbc.Driver")`写在了`doGet`方法里,示页每次请求都重新加载驱动,面上Tomcat跑三天就OOM了。询数驱动加载应该放在`ServletContextListener`里,据库或者至少放到`static`块里,并显只执行一次。示页

先看一个能跑起来的面上最小代码结构。假设你用的是MySQL 8,数据库叫`testdb`,表叫`users`,字段就`id`和`name`两个。在JSP文件顶部,用`<%@ page import="java.sql.*" %>`引入包。然后写一个脚本片段:

<% Connection conn = null; Statement stmt = null; ResultSet rs = null; try {  Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; conn = DriverManager.getConnection(url, "root", "123456"); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT id, name FROM users"); %> <table border="1"> <tr><th>ID</th><th>姓名</th></tr> <% while(rs.next()) {  %> <tr> <td><%= rs.getInt("id") %></td> <td><%= rs.getString("name") %></td> </tr> <% } %> </table> <% } catch(Exception e) {  e.printStackTrace(); } finally {  if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(conn != null) conn.close(); } %> 

这段代码能跑,但有个坑:`rs.close()`在`finally`里,如果`rs`已经关了再关一次会抛异常。更稳妥的做法是用`try-with-resources`,不过JSP里写起来啰嗦,很多人就忍了。我自己的习惯是写个工具类`DBUtil`,把`getConnection()`和`close()`封装好,JSP里只调方法。这样页面里看不到`Class.forName`,清爽很多。

数据库连接信息不要硬编码在JSP里。改密码的时候你会想死。放到`web.xml`的`<context-param>`里,或者用`properties`文件。我见过一个项目,JSP里直接写`root/root`,上线后数据库密码改了,二十多个JSP文件挨个改,改到凌晨两点。用`ServletContext`的`getInitParameter()`读一次,全局生效。

还有编码问题。MySQL 8默认`utf8mb4`,但JDBC连接串里不加`characterEncoding=utf8`,中文可能变成问号。页面顶部要写`<%@ page contentType="text/html;charset=UTF-8" %>`,响应编码和数据库编码两头都要管。有一次我查出来的数据在控制台打印正常,页面上就是乱码,查了半天发现是`response.setContentType`没设对。

性能方面,JSP里直接查数据库只适合小数据量。如果`users`表有十万行,这个页面会卡死。分页是必须的,`LIMIT`配合`PreparedStatement`,别用字符串拼接。我见过用`Statement`拼`WHERE name = '" + request.getParameter("name") + "'`的,SQL注入一打一个准。改成`PreparedStatement`,`?`占位,安全又省心。

最后说个实际观察。很多教程教人在JSP里写`while(rs.next())`直接输出,但生产环境最好把数据封装成`List<Map<String,Object>>`,在Servlet里查好,`request.setAttribute`传到JSP,JSP只负责用JSTL的`<c:forEach>`渲染。这样MVC分层清楚,JSP里看不到`java.sql`包,调试也方便。纯JSP查库适合练手,真做项目还是分开写。

  • Tag:

相关文章

  • 2014年互联网上爆出近几十万12306

    2014年那个冬天,12306的数据库像一口烧开的大锅,几十万条用户数据顺着网线泼了出来。黑客把打包好的信息挂在暗网上叫卖,姓名、身份证号、手机号、密码,明码标价,比春运黄牛票还便宜。 我有个同事老周
    2026-10-17
  • 虚假股票平台诈骗案例

    老周在手机上看财经新闻时,弹出一条广告:“专家一对一荐股,稳赚不赔。”他点了进去,被拉进一个叫“金麒麟策略”的微信群。群里每天有人晒盈利截图,喊单的老师口气笃定:“跟上布局,三成仓位,明天涨停。”老周
    2026-10-17
  • 彩票测试出奖号软件

    彩票软件测出奖号?我直接告诉你结论:市面上所有号称能预测彩票开奖结果的软件,全是骗人的。不是概率低,不是不精准,是根本不可能。我花了两周时间,下载了七八款这类App,充了会员,试了所谓的“AI智能算法
    2026-10-17
  • web安全深度剖析电子书

    《web安全深度剖析》这书我翻了三遍。第一遍当故事看,第二遍照着漏洞复现,第三遍才真正看懂那些攻击手法背后的逻辑链条。今天不聊目录,直接说几个让我脊背发凉的细节。 书里有个经典案例讲的是某电商平台的越
    2026-10-17
  • 网站开发流程

    网站开发这事儿,说穿了就是一场从零到一的组装游戏。上周我帮朋友改一个本地餐饮店的订餐页面,前后花了三周,才真正明白流程里那些坑有多深。你以为写代码是最难的?错了,最难的是搞清楚你到底要做什么。 第一步
    2026-10-17
  • 了解有关漏洞的信息并分享启示

    2021年12月,Log4j2的漏洞被公开时,我正躺在沙发上刷手机。那条新闻弹出来,我第一反应是“又一个Java库出事了”,直到看到“Apache Struts2”几个字——2017年Equifax数
    2026-10-17

最新评论