上一篇
html调用jsp操作数据库
- 行业动态
- 2025-05-01
- 2310
HTML表单提交数据至JSP,通过JDBC驱动连接数据库,执行SQL语句实现
HTML调用JSP操作数据库实现流程
环境准备
组件 | 版本/要求 | 说明 |
---|---|---|
应用服务器 | Apache Tomcat 9+ | 支持JSP/Servlet规范 |
数据库 | MySQL 8.0+ | 示例使用关系型数据库 |
JDBC驱动 | mysql-connector-java 8.0+ | 放入WEB-INF/lib目录 |
开发工具 | Eclipse/IntelliJ IDEA | 支持Java Web开发的IDE |
项目结构 | Dynamic Web Project | 包含WebContent/WEB-INF目录 |
实现步骤
创建数据库表
CREATE DATABASE testdb; USE testdb; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL, email VARCHAR(100) );
配置JDBC连接
// DBUtil.java public class DBUtil { 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"; static { try { Class.forName("com.mysql.cj.jdbc.Driver"); // 加载驱动 } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }
创建数据访问对象(DAO)
// UserDAO.java public class UserDAO { public void addUser(User user) { String sql = "INSERT INTO users(username,password,email) VALUES(?,?,?)"; try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, user.getUsername()); ps.setString(2, user.getPassword()); ps.setString(3, user.getEmail()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } public List<User> getAllUsers() { List<User> users = new ArrayList<>(); String sql = "SELECT FROM users"; try (Connection conn = DBUtil.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setEmail(rs.getString("email")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } return users; } }
创建实体类
// User.java public class User { private int id; private String username; private String password; private String email; // getters and setters }
创建Servlet处理请求
// UserServlet.java @WebServlet("/user") public class UserServlet extends HttpServlet { private UserDAO userDAO = new UserDAO(); @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码 request.setCharacterEncoding("UTF-8"); // 获取表单参数 String username = request.getParameter("username"); String password = request.getParameter("password"); String email = request.getParameter("email"); // 创建用户对象 User user = new User(); user.setUsername(username); user.setPassword(password); user.setEmail(email); // 调用DAO保存数据 userDAO.addUser(user); // 转发到成功页面 request.setAttribute("msg", "用户添加成功"); request.getRequestDispatcher("/success.jsp").forward(request, response); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<User> users = userDAO.getAllUsers(); request.setAttribute("users", users); request.getRequestDispatcher("/list.jsp").forward(request, response); } }
创建JSP视图页面
<!-add_user.jsp --> <html> <head><title>添加用户</title></head> <body> <h2>用户注册</h2> <form action="user" method="post"> 用户名: <input type="text" name="username"><br> 密码: <input type="password" name="password"><br> 邮箱: <input type="email" name="email"><br> <input type="submit" value="提交"> </form> </body> </html>
<!-list.jsp --> <html> <head><title>用户列表</title></head> <body> <h2>用户列表</h2> <table border="1"> <tr> <th>ID</th> <th>用户名</th> <th>邮箱</th> </tr> <c:forEach var="user" items="${users}"> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.email}</td> </tr> </c:forEach> </table> </body> </html>
关键技术点说明
技术点 | 说明 |
---|---|
请求转发 | 使用request.getRequestDispatcher().forward() 实现零跳转 |
字符编码 | 必须设置request.setCharacterEncoding("UTF-8") 防止中文乱码 |
预编译语句 | 使用PreparedStatement 防止SQL注入 |
自动资源管理 | 使用try-with-resources确保数据库连接自动关闭 |
JSP标准标签库 | 使用JSTL标签(<c:forEach> )简化集合遍历 |
MVC分层架构 | JSP仅负责视图展示,业务逻辑通过Servlet处理,数据访问通过DAO完成 |
相关问题与解答
Q1:如何实现数据库连接池优化?
A:推荐使用DBCP或C3P0连接池,修改DBUtil类:
public class DBUtil { private static DataSource dataSource; static { BasicDataSource ds = new BasicDataSource(); ds.setUrl("jdbc:mysql://localhost:3306/testdb"); ds.setUsername("root"); ds.setPassword("password"); ds.setInitialSize(5); // 初始连接数 ds.setMaxActive(10); // 最大连接数 dataSource = ds; } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }
优点:提升并发性能,有效管理连接资源。
Q2:如何增强系统安全性?
A:建议采取以下措施:
- 密码加密存储:使用MD5/SHA算法哈希密码
- 输入验证:在Servlet层校验参数合法性(如邮箱格式)
- 异常处理:捕获SQLException并记录日志,避免暴露错误细节
- 防止XSS攻击:对输出内容进行HTML转义(使用
<c:out>
原创文章,作者:未希,如若转载,请注明出处:https://www.xixizhuji.com/ask/1763237.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。