在JSP中保存数据到数据库通常通过结合Servlet和JDBC实现,以下是详细步骤和最佳实践,遵循MVC设计模式,确保代码安全、高效且符合E-A-T原则(专业性、权威性、可信度):
核心步骤
准备工作
- 数据库设计
创建数据表(例如users
表):CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL );
- 导入JDBC驱动
将数据库驱动(如MySQL的mysql-connector-java-8.0.28.jar
)放入项目的WEB-INF/lib
目录。
创建JavaBean(数据模型)
public class User { private String name; private String email; // Getter和Setter方法(必需) public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
编写DAO类(数据访问层)
public class UserDAO { private static final String URL = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC"; private static final String USER = "root"; private static final String PASSWORD = "your_password"; public void saveUser(User user) throws SQLException { String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, user.getName()); pstmt.setString(2, user.getEmail()); pstmt.executeUpdate(); } // try-with-resources自动关闭连接 } }
关键点:
- 使用
PreparedStatement
防止SQL注入攻击。 - 资源自动关闭(Java 7+特性),避免内存泄漏。
创建Servlet(控制器)
@WebServlet("/SaveUserServlet") public class SaveUserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 从JSP表单获取参数 String name = request.getParameter("name"); String email = request.getParameter("email"); // 2. 封装到JavaBean User user = new User(); user.setName(name); user.setEmail(email); // 3. 调用DAO保存数据 try { UserDAO userDAO = new UserDAO(); userDAO.saveUser(user); request.setAttribute("message", "用户保存成功!"); } catch (SQLException e) { request.setAttribute("error", "数据库错误: " + e.getMessage()); } // 4. 转发结果到JSP页面 request.getRequestDispatcher("/result.jsp").forward(request, response); } }
创建JSP页面(视图)
- 表单页面(
form.jsp
)<form action="SaveUserServlet" method="post"> 姓名:<input type="text" name="name" required><br> 邮箱:<input type="email" name="email" required><br> <input type="submit" value="保存"> </form>
- 结果页面(
result.jsp
)<%@ page contentType="text/html;charset=UTF-8" %> <body> <% if (request.getAttribute("message") != null) { %> <p style="color:green">${message}</p> <% } %> <% if (request.getAttribute("error") != null) { %> <p style="color:red">${error}</p> <% } %> </body>
安全与性能优化
- 防御SQL注入
- 始终使用
PreparedStatement
,禁止拼接SQL字符串:// 错误示例(高危!) String sql = "INSERT INTO users VALUES ('" + name + "','" + email + "')";
- 始终使用
- 连接池管理
使用Tomcat的DBCP
或HikariCP
替代DriverManager
:<!-- 在META-INF/context.xml中配置 --> <Resource name="jdbc/yourDB" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/your_db"/>
- 异常处理
- 在Servlet中捕获异常并返回友好错误信息,避免直接向用户暴露堆栈跟踪。
- 输入验证
在Servlet中添加校验逻辑:if (name == null || name.trim().isEmpty()) { request.setAttribute("error", "姓名不能为空"); request.getRequestDispatcher("/form.jsp").forward(request, response); return; }
为什么避免在JSP中写Java代码?
- MVC原则:JSP应仅负责展示数据,业务逻辑和数据库操作交给Servlet和DAO。
- 可维护性:分离代码使后期修改更安全。
- 安全性:防止脚本漏洞(如JSP中直接执行SQL)。
替代方案(增强可维护性)
- 使用ORM框架
如Hibernate或MyBatis,简化数据库操作:// Hibernate示例 Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.save(user); // 直接保存Java对象 session.getTransaction().commit();
- 框架集成
采用Spring MVC + Spring JDBC,通过注解管理事务和依赖注入。
注意事项
- 字符编码:在Servlet和JSP中统一设置UTF-8:
<%@ page pageEncoding="UTF-8" %>
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8");
- 事务管理:对多个操作使用数据库事务保证数据一致性。
- 错误日志:记录异常到日志文件(如Log4j),而非仅打印到控制台。
JSP保存数据的正确流程:
JSP表单 → Servlet处理 → JavaBean封装 → DAO操作数据库 → 返回结果到JSP
关键实践:
- 严格分离MVC各层职责
- 使用预编译语句(
PreparedStatement
)防注入 - 通过连接池优化性能
- 输入验证与友好错误提示
引用说明:本文方法参考Oracle官方JDBC教程、OWASP SQL注入防护指南、Apache Tomcat连接池文档及《Java Web开发实战经典》中的MVC设计模式实践,技术细节遵循Java EE 8规范,确保权威性和可靠性。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/38227.html