Java EE servlet与MySQL表单 工程实现增加查询数据
Java EE servlet与MySQL表单 工程实现增加查询数据
前段页面示意
实现“增加数据”
输入数据如下:
提示“成功添加留言”
点击“查看所有留言内容”:显示留言内容,实现“查询数据”
此时在MySQL中就能查询到新添加的数据信息
工程建立演示
导入工程-配置tomcat
工程目录分析
创建数据库和表
创建与代码相对的数据库guestbook和表guestbook
小tips:创建表时,id通常为主键,同时设置自动递增
运行代码
在工程处右键,点击Run As,再点击Run on Server
选择tomcat,点击finish。
在浏览器中输入地址
地址为:http://localhost:8080/项目名称/某网页.htm
前段页面操作
增加数据,提示成功添加留言
此时在sql数据库中刷新可查看到表中存储的数据
继续添加数据,在数据库中则能看到更多的信息
addMessage代码分析
package webbook.guestbook;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import webbook.util.StringUtil;/*** 添加留言Servlet* 处理用户提交的留言信息,将其保存到数据库中* 映射URL为"/addMessage",通过@WebServlet注解配置*/
@WebServlet("/addMessage")
public class AddMessageServlet extends HttpServlet {// 序列化版本ID,用于版本控制private static final long serialVersionUID = -8349454122547148005L;/*** 处理HTTP POST请求的方法* 当用户提交留言表单时,此方法会被调用* * @param request HTTP请求对象,包含客户端提交的数据* @param response HTTP响应对象,用于向客户端返回数据* @throws ServletException 如果发生Servlet相关的异常* @throws IOException 如果发生输入输出异常*/public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 数据库连接信息String url = "jdbc:mysql://localhost:3306/guestbook"; // 数据库URLString username = "root"; // 数据库用户名String password = "root"; // 数据库密码// SQL插入语句,使用占位符(?)防止SQL注入String sql = "insert into guestbook (name,email,phone,title,time) values(?,?,?,?,?)";int result = 0; // 执行SQL语句后影响的行数,初始化为0Connection conn = null; // 数据库连接对象,初始化为null// 设置请求编码为UTF-8,确保正确解析中文参数request.setCharacterEncoding("utf-8");// 从请求中获取表单参数String name = request.getParameter("name"); // 获取姓名参数String title = request.getParameter("title"); // 获取标题参数// 设置响应内容类型和编码response.setContentType("text/html;charset=utf-8");// 获取响应输出流,用于向客户端返回HTML内容PrintWriter out = response.getWriter();out.println("<html>");out.println("<head><title>guestbook input page</title></head>");out.println("<body>");// 验证姓名是否为空if (StringUtil.validateNull(name)) {out.println("对不起,姓名不能为空,请您重新输入!<br>");out.println("<a href=\""+request.getContextPath()+"/addMessage.htm\">添加新的留言</a><br>");} // 验证标题是否为空else if (StringUtil.validateNull(title)) {out.println("对不起,主题不能为空,请您重新输入!<br>");out.println("<a href=\""+request.getContextPath()+"/addMessage.htm\">添加新的留言</a><br>");} // 如果姓名和标题都不为空,则处理留言数据else {try {// 加载MySQL JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");// 建立数据库连接conn = DriverManager.getConnection(url, username, password);// 创建预编译语句对象,防止SQL注入攻击PreparedStatement pstmt = conn.prepareStatement(sql);// 设置参数:姓名(过滤HTML标签防止XSS攻击)pstmt.setString(1, StringUtil.filterHtml(name));// 设置参数:邮箱(过滤HTML标签)pstmt.setString(2, StringUtil.filterHtml(request.getParameter("email")));// 设置参数:电话(过滤HTML标签)pstmt.setString(3, StringUtil.filterHtml(request.getParameter("phone")));// 设置参数:标题(过滤HTML标签)pstmt.setString(4, StringUtil.filterHtml(title));// 创建日期格式化对象,用于格式化当前时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");// 设置参数:时间(使用当前时间)pstmt.setString(5, sdf.format(new java.util.Date()));// 执行SQL插入操作,返回影响的行数result = pstmt.executeUpdate();// 关闭预编译语句对象,释放资源pstmt.close();} catch (ClassNotFoundException e) {// 处理数据库驱动类未找到异常e.printStackTrace();} catch (SQLException e) {// 处理数据库操作异常e.printStackTrace();} finally {// 无论是否发生异常,都确保关闭数据库连接try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}// 根据插入操作的结果输出相应信息if (result == 0) {out.println("对不起,添加留言不成功,请您重新输入!<br>");out.println("<a href=\""+request.getContextPath()+"/addMessage.htm\">添加新的留言</a><br>");} else {out.println("祝贺您,成功添加留言。<br>");out.println("<a href=\""+request.getContextPath()+"/getMessages\">查看所有留言内容</a><br>");}// 输出HTML结束标签out.println("</body>");out.println("</html>");// 刷新输出流,确保所有内容都被发送到客户端out.flush();// 关闭输出流out.close();}}
}
GetMessage代码分析
package webbook.guestbook;import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import webbook.util.StringUtil;/*** 获取留言列表Servlet* 处理获取所有留言信息的请求,从数据库中读取留言数据并以HTML格式展示* 映射URL为"/getMessages",通过@WebServlet注解配置*/
@WebServlet("/getMessages")
public class GetMessagesServlet extends HttpServlet {// 序列化版本ID,用于版本控制private static final long serialVersionUID = 5964428201228635704L;/*** 处理HTTP GET请求的方法* 当用户访问留言列表页面时,此方法会被调用* * @param request HTTP请求对象* @param response HTTP响应对象,用于向客户端返回HTML内容* @throws ServletException 如果发生Servlet相关的异常* @throws IOException 如果发生输入输出异常*/public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 数据库连接信息String url = "jdbc:mysql://localhost:3306/guestbook"; // 数据库URL和数据库名String username = "root"; // 数据库用户名String password = "root"; // 数据库密码// SQL查询语句:查询所有留言并按id降序排列(最新的在前)String sql = "select * from guestbook order by id desc";Connection conn = null; // 数据库连接对象// 设置响应内容类型和编码,确保正确显示中文response.setContentType("text/html;charset=utf-8");// 获取响应输出流,用于向客户端返回HTML内容PrintWriter out = response.getWriter();// 输出HTML页面开始部分out.println("<html>");out.println("<head><title>display messages</title></head>");out.println("<body>");// 添加返回留言页面的链接out.println("<a href=\"" + request.getContextPath() + "/addMessage.htm\">添加新的留言内容</a><br>");out.println("留言内容<br><br>"); // 页面标题try {// 1. 加载MySQL JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");// 2. 建立数据库连接conn = DriverManager.getConnection(url, username, password);// 3. 创建预编译语句对象PreparedStatement pstmt = conn.prepareStatement(sql);// 4. 执行查询操作,获取结果集ResultSet rs = pstmt.executeQuery();// 5. 遍历结果集,逐条显示留言信息while (rs.next()) {// 调用printRow方法格式化输出单条留言this.printRow(out, rs);}// 6. 释放资源:关闭结果集和预编译语句rs.close();pstmt.close();} catch (ClassNotFoundException e) {// 处理数据库驱动类未找到异常e.printStackTrace();} catch (SQLException e) {// 处理数据库操作异常e.printStackTrace();} finally {// 无论是否发生异常,都确保关闭数据库连接try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}// 输出HTML页面结束部分out.println(" </body>");out.println("</html>");// 刷新输出流,确保所有内容都被发送到客户端out.flush();// 关闭输出流out.close();}/*** 格式化输出单条留言信息的方法* 将数据库中的一条记录以HTML表格形式输出* * @param out 输出流对象,用于向客户端输出HTML内容* @param rs 数据库结果集对象,包含当前记录的字段数据* @throws SQLException 如果访问数据库字段时发生异常*/private void printRow(PrintWriter out, ResultSet rs) throws SQLException {// 创建表格,设置固定布局和自动换行属性out.println("<table width=\"600\" border=\"1\" style=\"table-layout:fixed;word-break:break-all\">");// 输出编号字段out.println("<tr><td width=\"50\">编号</td>");out.println("<td width=\"550\">" + rs.getInt("id") + "</td></tr>");// 输出姓名字段out.println("<tr><td>姓名</td><td>" + rs.getString("name") + "</td></tr>");// 输出电话字段,如果为空则显示"没填"out.println("<tr><td>电话</td><td>" + StringUtil.chanageNull(rs.getString("phone"), "没填") + "</td></tr>");// 输出邮箱字段,如果为空则显示"没填"out.println("<tr><td>email</td><td>" + StringUtil.chanageNull(rs.getString("email"), "没填") + "</td></tr>");// 输出主题字段,valign="top"确保顶部对齐out.println("<tr><td valign=\"top\">主题</td><td>" + rs.getString("title") + " </td></tr>");// 输出时间字段out.println("<tr><td>时间</td><td>" + rs.getString("time") + " </td></tr>");// 结束表格并添加换行out.println("</table><br>");}
}