• 【JavaWeb】Servlet系列——使用纯Servlet做一个单表的CRUD操作(实际操作实现篇)


    目录

    1、首页信息

    2、查看操作

    3、删除操作

    4、修改操作

    5、增加操作

    6、DBUtil工具类

    7、配置文件

    路径配置文件

    资源配置文件

    8、IDEA整体目录结构

    9、遇到的问题

    已解决

    未解决


    1、首页信息

    使用纯Servlet做一个单表的CRUD操作,这是单表的List页面

     通过查询数据库,通过response.getWriter方法得到一个流将前端页面代码和数据都展示在List页面上(浏览器通过解析能响应出相应的页面),由于只使用了纯Servlet,前端代码写在后端程序当中,非常痛苦。

    1. package com.bjpowernode.oa.web.action;
    2. import com.bjpowernode.oa.utils.DBUtil;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. import java.sql.Connection;
    10. import java.sql.PreparedStatement;
    11. import java.sql.ResultSet;
    12. import java.sql.SQLException;
    13. public class DeptListServlet extends HttpServlet {
    14. @Override
    15. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. doGet(req,resp);
    17. }
    18. @Override
    19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    20. response.setContentType("text/html;charset=UTF-8");
    21. PrintWriter out = response.getWriter();
    22. String contextPath = request.getContextPath();
    23. out.print("<!DOCTYPE html>");
    24. out.print("<html>");
    25. out.print(" <head>");
    26. out.print(" <meta charset='utf-8'>");
    27. out.print(" <title>部门列表页面</title>");
    28. out.print(" </head>");
    29. out.print(" <body>");
    30. out.print("<script type='text/javascript'>");
    31. out.print(" function del(dno){");
    32. out.print(" if(window.confirm('亲,删了不可恢复哦!')){");
    33. out.print(" document.location.href = '"+contextPath+"/dept/delete?deptno='+dno");
    34. out.print(" }");
    35. out.print(" }");
    36. out.print("</script>");
    37. out.print("");
    38. out.print(" <h1 align='center'>部门列表</h1>");
    39. out.print(" <hr >");
    40. out.print(" <table border='1px' align='center' width='50%'>");
    41. out.print(" <tr>");
    42. out.print(" <th>序号</th>");
    43. out.print(" <th>部门编号</th>");
    44. out.print(" <th>部门名称</th>");
    45. out.print(" <th>操作</th>");
    46. out.print(" </tr>");
    47. Connection conn = null;
    48. PreparedStatement ps = null;
    49. ResultSet rs = null;
    50. try {
    51. conn = DBUtil.getConnertion();
    52. String sql = "select deptno as a,dname,loc from dept";
    53. ps = conn.prepareStatement(sql);
    54. rs = ps.executeQuery();
    55. int i = 0;
    56. while(rs.next()){
    57. String deptno = rs.getString("a");
    58. String dname = rs.getString("dname");
    59. String loc = rs.getString("loc");
    60. out.print("<tr>");
    61. out.print(" <td>"+(++i)+"</td>");
    62. out.print(" <td>"+deptno+"</td>");
    63. out.print(" <td>"+dname+"</td>");
    64. out.print(" <td>");
    65. out.print(" <a href='javascript:void(0)' onclick='del("+deptno+")'>删除</a>");
    66. out.print(" <a href='"+contextPath+"/dept/edit?deptno="+deptno+"'>修改</a>");
    67. out.print(" <a href='"+contextPath+"/dept/detail?deptno="+deptno+"'>详情</a>");
    68. out.print(" </td>");
    69. out.print("</tr>");
    70. }
    71. } catch (SQLException e) {
    72. e.printStackTrace();
    73. } finally {
    74. DBUtil.close(conn,ps,rs);
    75. }
    76. out.print(" </table>");
    77. out.print(" <hr >");
    78. out.print(" <a href='"+contextPath+"/add.html'>新增部门</a>");
    79. out.print(" </body>");
    80. out.print("</html>");
    81. }
    82. }

    2、查看操作

    这一个动态获取部门信息的操作,前端发送请求后,在URL当中向后端传送了name和value信息,后端拿到这些信息后,通过数据库的查询,将其完整的信息响应到页面当中 ,在后退这个按钮当中使用了js代码

    1. package com.bjpowernode.oa.web.action;
    2. import com.bjpowernode.oa.utils.DBUtil;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. import java.sql.Connection;
    10. import java.sql.PreparedStatement;
    11. import java.sql.ResultSet;
    12. import java.sql.SQLException;
    13. public class DeptDetailServlet extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. response.setContentType("text/html;charset=UTF-8");
    17. PrintWriter out = response.getWriter();
    18. PreparedStatement ps = null;
    19. ResultSet rs = null;
    20. Connection conn = null;
    21. out.print("<!DOCTYPE html>");
    22. out.print("<html>");
    23. out.print(" <head>");
    24. out.print(" <meta charset='utf-8'>");
    25. out.print(" <title>部门详情</title>");
    26. out.print(" </head>");
    27. out.print(" <body>");
    28. out.print(" <h1>部门详情</h1>");
    29. out.print(" <hr >");
    30. String deptno = request.getParameter("deptno");
    31. try {
    32. conn = DBUtil.getConnertion();
    33. String sql = "select dname,loc from dept where deptno = ?";
    34. ps = conn.prepareStatement(sql);
    35. ps.setString(1,deptno);
    36. rs = ps.executeQuery();
    37. while(rs.next()){
    38. String dname = rs.getString("dname");
    39. String loc = rs.getString("loc");
    40. out.print(" 部门编号:"+deptno+" <br>");
    41. out.print(" 部门名称:"+dname+"<br>");
    42. out.print(" 部门位置:"+loc+"<br>");
    43. }
    44. } catch (SQLException e) {
    45. e.printStackTrace();
    46. } finally {
    47. DBUtil.close(conn,ps,rs);
    48. }
    49. out.print("<input type='button' value='后退' onclick='window.history.back()'/>");
    50. out.print(" </body>");
    51. out.print("</html>");
    52. }
    53. }

    3、删除操作

     这里使用了js代码,让用户确认是否真正删除,点击删除超链接后同样也会将name和value信息传到后端,当中后端通过sql语句完成数据的删除,删除后立即通过资源的转发跳转到了list页面

    1. package com.bjpowernode.oa.web.action;
    2. import com.bjpowernode.oa.utils.DBUtil;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. import java.sql.Connection;
    10. import java.sql.PreparedStatement;
    11. import java.sql.ResultSet;
    12. import java.sql.SQLException;
    13. public class DeptDelServlet extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. String deptno = request.getParameter("deptno");
    17. Connection conn = null;
    18. PreparedStatement ps = null;
    19. int count = 0;
    20. try {
    21. conn = DBUtil.getConnertion();
    22. conn.setAutoCommit(false);
    23. String sql = "delete from dept where deptno = ?";
    24. ps = conn.prepareStatement(sql);
    25. ps.setString(1,deptno);
    26. count = ps.executeUpdate();
    27. conn.commit();
    28. } catch (SQLException e) {
    29. if (conn != null) {
    30. try {
    31. conn.rollback();
    32. } catch (SQLException e1) {
    33. e1.printStackTrace();
    34. }
    35. }
    36. e.printStackTrace();
    37. } finally {
    38. DBUtil.close(conn,ps,null);
    39. }
    40. if (count == 1) {
    41. request.getRequestDispatcher("/dept/list").forward(request,response);
    42. }else{
    43. request.getRequestDispatcher("/error.html").forward(request,response);
    44. }
    45. }
    46. }

    4、修改操作

    第一步:用户在list页面点击修改超链接后 ,同样在URL中像后端发送需要修改的部门编号,后端通过getparameter方法拿到这些信息后,查询数据库,连同前端代码,一起响应到网页当中。

    1. package com.bjpowernode.oa.web.action;
    2. import com.bjpowernode.oa.utils.DBUtil;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. import java.sql.Connection;
    10. import java.sql.PreparedStatement;
    11. import java.sql.ResultSet;
    12. import java.sql.SQLException;
    13. public class DeptEditServlet extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. response.setContentType("text/html;charset=UTF-8");
    17. PrintWriter out = response.getWriter();
    18. String contextPath = request.getContextPath();
    19. Connection conn = null;
    20. PreparedStatement ps = null;
    21. ResultSet rs = null;
    22. out.print("<!DOCTYPE html>");
    23. out.print("<html>");
    24. out.print(" <head>");
    25. out.print(" <meta charset='utf-8'>");
    26. out.print(" <title>修改部门</title>");
    27. out.print(" </head>");
    28. out.print(" <body>");
    29. out.print(" <h1>修改部门</h1>");
    30. out.print(" <hr >");
    31. out.print(" <form action='"+contextPath+"/dept/modify' method='post'>");
    32. String deptno = request.getParameter("deptno");
    33. try {
    34. conn = DBUtil.getConnertion();
    35. String sql = "select dname,loc from dept where deptno = ?";
    36. ps = conn.prepareStatement(sql);
    37. ps.setString(1,deptno);
    38. rs = ps.executeQuery();
    39. if (rs.next()) {
    40. String dname = rs.getString("dname");
    41. String loc = rs.getString("loc");
    42. out.print(" 部门编号<input type='text' name='deptno' value='"+deptno+"' readonly /><br>");
    43. out.print(" 部门名称<input type='text' name='dname' value='"+dname+"'/><br>");
    44. out.print(" 部门位置<input type='text' name='loc' value='"+loc+"'/><br>");
    45. }
    46. } catch (SQLException e) {
    47. e.printStackTrace();
    48. } finally {
    49. DBUtil.close(conn,ps,rs);
    50. }
    51. out.print(" <input type='submit' value='修改'/><br>");
    52. out.print(" </form>");
    53. out.print(" </body>");
    54. out.print("</html>");
    55. }
    56. }

    第二步:点击修改按钮之后,再通过另一个service完成数据的真正修改操作。最后跳转到list页面

    1. package com.bjpowernode.oa.web.action;
    2. import com.bjpowernode.oa.utils.DBUtil;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.sql.Connection;
    9. import java.sql.PreparedStatement;
    10. import java.sql.SQLException;
    11. public class DeptModifyServlet extends HttpServlet {
    12. @Override
    13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    14. response.setContentType("text/html;charset=UTF-8");
    15. String deptno = request.getParameter("deptno");
    16. String dname = request.getParameter("dname");
    17. String loc = request.getParameter("loc");
    18. Connection conn = null;
    19. PreparedStatement ps = null;
    20. int count = 0;
    21. try {
    22. conn = DBUtil.getConnertion();
    23. String sql = "update dept set dname = ?, loc = ? where deptno = ?";
    24. ps = conn.prepareStatement(sql);
    25. ps.setString(1, dname);
    26. ps.setString(2, loc);
    27. ps.setString(3, deptno);
    28. count = ps.executeUpdate();
    29. } catch (SQLException e) {
    30. e.printStackTrace();
    31. } finally {
    32. DBUtil.close(conn, ps, null);
    33. }
    34. if (count == 1) {
    35. // 更新成功
    36. // 跳转到部门列表页面(部门列表页面是通过Java程序动态生成的,所以还需要再次执行另一个Servlet)
    37. //request.getRequestDispatcher("/dept/list").forward(request, response);
    38. response.sendRedirect(request.getContextPath() + "/dept/list");
    39. }else{
    40. // 更新失败
    41. //request.getRequestDispatcher("/error.html").forward(request, response);
    42. response.sendRedirect(request.getContextPath() + "/error.html");
    43. }
    44. }
    45. }

    5、增加操作

    不知何种问题,无法打开新增部门超链接跳转的页面,404报错

    主要实现思想:与修改类似,不再赘述。 

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>新增部门</title>
    6. </head>
    7. <body>
    8. <h1>新增部门</h1>
    9. <hr >
    10. <form action="/oa/dept/save" method="post">
    11. 部门编号<input type="text" name="deptno"/><br>
    12. 部门名称<input type="text" name="dname"/><br>
    13. 部门位置<input type="text" name="loc"/><br>
    14. <input type="submit" value="保存"/><br>
    15. </form>
    16. </body>
    17. </html>
    1. package com.bjpowernode.oa.web.action;
    2. import com.bjpowernode.oa.utils.DBUtil;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. import java.sql.Connection;
    10. import java.sql.PreparedStatement;
    11. import java.sql.SQLException;
    12. public class DeptSaveServlet extends HttpServlet {
    13. @Override
    14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    15. response.setContentType("text/html;charset=UTF-8");
    16. PrintWriter out = response.getWriter();
    17. Connection conn =null;
    18. PreparedStatement ps = null;
    19. String deptno = request.getParameter("deptno");
    20. String dename = request.getParameter("dename");
    21. String loc = request.getParameter("loc");
    22. int count = 0;
    23. try {
    24. conn = DBUtil.getConnertion();
    25. String sql ="insert into dept(deptname,dename,loc) value(?,?,?)";
    26. conn.prepareStatement(sql);
    27. ps.setString(1,deptno);
    28. ps.setString(2,dename);
    29. ps.setString(3,loc);
    30. count = ps.executeUpdate();
    31. } catch (SQLException e) {
    32. e.printStackTrace();
    33. } finally {
    34. DBUtil.close(conn,ps,null);
    35. }
    36. if (count ==1) {
    37. request.getRequestDispatcher("/dept/list").forward(request,response);
    38. }else{
    39. request.getRequestDispatcher("/error.html").forward(request,response);
    40. }
    41. }
    42. }

    6、DBUtil工具类

    手写了DBUtil工具类,封装了一部分的jdbc连接数据库操作,大大减少了代码量

    1. package com.bjpowernode.oa.utils;
    2. import java.sql.*;
    3. import java.util.ResourceBundle;
    4. public class DBUtil {
    5. private static ResourceBundle bundle = ResourceBundle.getBundle("resources.jdbc");
    6. private static String driver = bundle.getString("driver");
    7. private static String url = bundle.getString("url");
    8. private static String user = bundle.getString("user");
    9. private static String password = bundle.getString("password");
    10. static {
    11. //注册驱动
    12. try {
    13. Class.forName(driver);
    14. } catch (ClassNotFoundException e) {
    15. e.printStackTrace();
    16. }
    17. }
    18. //获取连接
    19. public static Connection getConnertion() throws SQLException {
    20. Connection conn = DriverManager.getConnection(url, user, password);
    21. return conn;
    22. }
    23. //释放资源
    24. public static void close(Connection conn, Statement ps, ResultSet rs){
    25. if (rs != null) {
    26. try {
    27. rs.close();
    28. } catch (SQLException e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. if (ps != null) {
    33. try {
    34. ps.close();
    35. } catch (SQLException e) {
    36. e.printStackTrace();
    37. }
    38. }
    39. if (conn != null) {
    40. try {
    41. conn.close();
    42. } catch (SQLException e) {
    43. e.printStackTrace();
    44. }
    45. }
    46. }
    47. }

    7、配置文件

    路径配置文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <!--修改部门-->
    7. <servlet>
    8. <servlet-name>modify</servlet-name>
    9. <servlet-class>com.bjpowernode.oa.web.action.DeptModifyServlet</servlet-class>
    10. </servlet>
    11. <servlet-mapping>
    12. <servlet-name>modify</servlet-name>
    13. <url-pattern>/dept/modify</url-pattern>
    14. </servlet-mapping>
    15. <!--查看部门列表-->
    16. <servlet>
    17. <servlet-name>List</servlet-name>
    18. <servlet-class>com.bjpowernode.oa.web.action.DeptListServlet</servlet-class>
    19. </servlet>
    20. <servlet-mapping>
    21. <servlet-name>List</servlet-name>
    22. <url-pattern>/dept/list</url-pattern>
    23. </servlet-mapping>
    24. <!--查看部门详细信息-->
    25. <servlet>
    26. <servlet-name>Detail</servlet-name>
    27. <servlet-class>com.bjpowernode.oa.web.action.DeptDetailServlet</servlet-class>
    28. </servlet>
    29. <servlet-mapping>
    30. <servlet-name>Detail</servlet-name>
    31. <url-pattern>/dept/detail</url-pattern>
    32. </servlet-mapping>
    33. <!--删除部门-->
    34. <servlet>
    35. <servlet-name>Del</servlet-name>
    36. <servlet-class>com.bjpowernode.oa.web.action.DeptDelServlet</servlet-class>
    37. </servlet>
    38. <servlet-mapping>
    39. <servlet-name>Del</servlet-name>
    40. <url-pattern>/dept/delete</url-pattern>
    41. </servlet-mapping>
    42. <!--跳转到修改页面-->
    43. <servlet>
    44. <servlet-name>Edit</servlet-name>
    45. <servlet-class>com.bjpowernode.oa.web.action.DeptEditServlet</servlet-class>
    46. </servlet>
    47. <servlet-mapping>
    48. <servlet-name>Edit</servlet-name>
    49. <url-pattern>/dept/edit</url-pattern>
    50. </servlet-mapping>
    51. <!--保存部门-->
    52. <servlet>
    53. <servlet-name>save</servlet-name>
    54. <servlet-class>com.bjpowernode.oa.web.action.DeptSaveServlet</servlet-class>
    55. </servlet>
    56. <servlet-mapping>
    57. <servlet-name>save</servlet-name>
    58. <url-pattern>/dept/save</url-pattern>
    59. </servlet-mapping>
    60. </web-app>

    资源配置文件

    1. driver=com.mysql.cj.jdbc.Driver
    2. url=jdbc:mysql://localhost:3306/bjpowernode
    3. user=root
    4. password=123456

    8、IDEA整体目录结构

    9、遇到的问题

    已解决

    配置文件绑定错误

    配置文件class类路径错误

    配置文件忘记写路径

    js当中路径中,变量在字符串中的格式错误

    sql语句错误,忘记加条件,导致数据显示错误

    post用doPost接收,不要用doGet

    未解决

    WEB-INF下的lib添加mysql 驱动jar包之后,一定还需要在TomCat的lib下也添加mysql驱动jar包吗,为什么有的不在TomCat的lib下添加mysql驱动jar包也能访问到数据库的数据,有的必须添加jar包才能访问到数据。

    404错误,未找出,导致增加操作的页面无法打开

  • 相关阅读:
    DBCO的PEG连接剂1480516-75-3,DBCO-PEG4-Maleimide(MAL)
    pytest一些常见的插件
    王杰国庆作业day6
    精英反向黄金正弦鲸鱼算法-附代码
    Kotlin委托属性(1)
    安全防御——防火墙一
    【Unity小技巧】如何在 Unity 中使用我们的Cinemachine虚拟相机跟踪多个目标
    Django学习日志08
    Github 2024-07-11 Go开源项目日报 Top10
    吴恩达老师机器学习课程笔记 07 正则化
  • 原文地址:https://blog.csdn.net/m0_61163395/article/details/125528099