• Servlet小项目 | 基于纯Servlet手写一个单表的CRUD操作


    使用纯粹的Servlet完成单表【对部门的】的增删改查操作。(B/S结构的)

    目录

    一:设计数据库表及原型

    二:动态实现部门列表及详情页

    三:实现部门删除功能

    四:实现部门新增功能

    五:实现部门修改功能


    一:设计数据库表及原型

    第一步:准备一张数据库表(部门表dept)

    把sql语句写成一个脚本文件dept.sql!

    1. // 先删除数据库中这张表
    2. drop table if exists dept;
    3. // 创建表
    4. create table dept(
    5. deptno int primary key, // 部门编号作为主键
    6. dname varchar(255),
    7. loc varchar(255)
    8. );
    9. // 插入数据
    10. insert into dept(deptno, dname, loc) values(10, 'XiaoShouBu', 'BEIJING');
    11. insert into dept(deptno, dname, loc) values(20, 'YanFaBu', 'SHANGHAI');
    12. insert into dept(deptno, dname, loc) values(30, 'JiShuBu', 'GUANGZHOU');
    13. insert into dept(deptno, dname, loc) values(40, 'MeiTiBu', 'SHENZHEN');
    14. // 提交
    15. commit;
    16. // 查看表中的内容
    17. select * from dept;

     然后在指定的数据库中直接用 source命令+脚本文件绝对路径 即可创建dept表和插入数据!

    第二步:准备一套HTML页面(项目原型)

    (1)把HTML页面准备好,然后将HTML页面中的链接都能够跑通。(页面流转没问题)

    (2)此时设计的页面显示的内容都是写死的,后期连接数据库会进行动态获取。

    (3)应该设计的页面(模板框架)

    • 欢迎页面:welcome.html

    • 列表页面:list.html(以列表页面为核心,展开其他操作)

    • 新增页面:add.html

    • 修改页面:modify.html

    • 详情页面:look.html

    注意:以下的页面都只是作为框架使用,目前都是写死的,后面会逐渐在代码中动态获取的形式!

     ①欢迎页面:welcome.html可以跳转到列表页面list.html

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>欢迎使用OA系统title>
    6. head>
    7. <body>
    8. <a href="list.html">查看部门列表a>
    9. body>
    10. html>

    ②列表页面:list.html可以跳转到新增、修改、详情页面

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>部门列表页面title>
    6. head>
    7. <body>
    8. <h1 align="center">部门列表h1>
    9. <hr>
    10. <table border="1px" align="center" width="50%">
    11. <tr>
    12. <th>序号th>
    13. <th>部门编号th>
    14. <th>部门名称th>
    15. <th>执行操作th>
    16. tr>
    17. <tr>
    18. <td>1td>
    19. <td>10td>
    20. <td>销售部td>
    21. <td>
    22. <a href="">删除a>
    23. <a href="modify.html">修改a>
    24. <a href="detail.html">详情a>
    25. td>
    26. tr>
    27. <tr>
    28. <td>2td>
    29. <td>20td>
    30. <td>研发部td>
    31. <td>
    32. <a href="">删除a>
    33. <a href="modify.html">修改a>
    34. <a href="detail.html">详情a>
    35. td>
    36. tr>
    37. <tr>
    38. <td>3td>
    39. <td>30td>
    40. <td>运营部td>
    41. <td>
    42. <a href="">删除a>
    43. <a href="modify.html">修改a>
    44. <a href="detail.html">详情a>
    45. td>
    46. tr>
    47. table>
    48. <hr>
    49. <a href="add.html">新增部门a>
    50. body>
    51. html>

    页面效果如下: 

    ③新增页面:add.html可以跳转到列表页面list.html

    1. 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="list.html" method="get">
    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>

    ④修改页面:modify.html可以跳转到列表页面list.html

    1. 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="list.html" method="get">
    11. 部门编号<input type="text" name="deptno" value="10" readonly/><br>
    12. 部门名称<input type="text" name="dname" value="销售部" /><br>
    13. 部门位置<input type="text" name="loc" value="北京" /><br>
    14. <input type="submit" value="修改" /><br>
    15. form>
    16. body>
    17. html>

    ⑤详情页面:detail.html可以跳转到列表页面list.html

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>部门详情页面title>
    6. head>
    7. <body>
    8. <h1>部门详情页面h1>
    9. <hr>
    10. 部门编号:10 <br>
    11. 部门名称:销售部<br>
    12. 部门位置:北京<br>
    13. <input type="button" value="后退" onclick="window.history.back()"/>
    14. body>
    15. html>

    第三步:分析我们这个系统包括哪些功能

    (1)功能的定义:只要这个操作连接了数据库,就表示一个独立的功能。

    (2)包括了哪些功能?

    • 查看部门列表

    • 新增部门

    • 删除部门

    • 查看部门详细信息

    • 跳转到修改页面

    • 修改部门

    第四步:在IDEA当中搭建开发环境

    (1)创建一个webapp(给这个webapp添加servlet-api.jar和jsp-api.jar到classpath当中)

    (2)向webapp中添加连接数据库的jar包(mysql驱动)

    • 必须在WEB-INF目录下新建lib目录,然后将mysql的驱动jar包拷贝到这个lib目录下。这个目录名必须叫做lib,全部小写的。

    (3)编写一个JDBC的工具类,因为我们要多处使用JDBC代码,所以编写一个工具类。

    (4)编写一个属性配置文件xxx.properties。

    (5)将所有HTML页面拷贝到web目录下,接下来一步步替换成动态获取的方式。

    属性配置文件:jdbc.properties

    1. driver=com.mysql.jdbc.Driver
    2. url=jdbc:mysql://localhost:3306/bjpowernode
    3. username=root
    4. password=123

    JDBC工具类:DBUtil 

    1. package com.bjpowernode.oa.utils;
    2. import java.sql.*;
    3. import java.util.ResourceBundle;
    4. /**
    5. * JDBC的工具类
    6. */
    7. public class DBUtil {
    8. // 定义为静态变量:在类加载时执行,静态代码块和静态方法里面都需要静态变量。
    9. // 属性资源文件绑定,在resources包下,且不需要写“.properties”
    10. private static ResourceBundle bundle = ResourceBundle.getBundle("resources.jdbc");
    11. // 根据属性配置文件key获取value
    12. private static String driver = bundle.getString("driver");
    13. private static String url = bundle.getString("url");
    14. private static String user = bundle.getString("user");
    15. private static String password = bundle.getString("password");
    16. static {
    17. // 注册驱动(注册驱动只需要注册一次,放在静态代码块当中。DBUtil类加载的时候执行)
    18. try {
    19. Class.forName(driver);
    20. } catch (ClassNotFoundException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. /**
    25. * 获取数据库连接对象
    26. * @return conn 连接对象
    27. * @throws SQLException
    28. */
    29. public static Connection getConnection() throws SQLException {
    30. // 获取连接
    31. Connection conn = DriverManager.getConnection(url, user, password);
    32. return conn;
    33. }
    34. /**
    35. * 释放资源
    36. * @param conn 连接对象
    37. * @param ps 数据库操作对象
    38. * @param rs 结果集对象
    39. */
    40. public static void close(Connection conn, Statement ps, ResultSet rs){
    41. if (rs != null) {
    42. try {
    43. rs.close();
    44. } catch (SQLException e) {
    45. e.printStackTrace();
    46. }
    47. }
    48. if (ps != null) {
    49. try {
    50. ps.close();
    51. } catch (SQLException e) {
    52. e.printStackTrace();
    53. }
    54. }
    55. if (conn != null) {
    56. try {
    57. conn.close();
    58. } catch (SQLException e) {
    59. e.printStackTrace();
    60. }
    61. }
    62. }
    63. }

    二:动态实现部门列表及详情页

    第五步:实现第一个功能:查看部门列表

    tips:对于一个功能的实现;可以从后端往前端一步一步写,也可以从前端一步一步往后端写。千万不要想起来什么就写什么;假设这里从前端开始,那么一定是从用户点击按钮那里开始的!

    ①先修改前端页面的超链接路径,因为用户先点击的就是这个超链接;这里要链接数据库,肯定要执行一段Java代码

    1. <a href="list.html">查看部门列表a>
    2. <a href="/oa/dept/list">查看部门列表a>

    ②编写web.xml文件

    1. <servlet>
    2. <servlet-name>listservlet-name>
    3. <servlet-class>com.bjpowernode.oa.web.action.DeptListServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>listservlet-name>
    7. <url-pattern>/dept/listurl-pattern>
    8. servlet-mapping>

    ③编写DeptListServlet类继承HttpServlet类,然后重写doGet方法

    1. package com.bjpowernode.oa.web.action;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. public class DeptListServlet extends HttpServlet {
    8. @Override
    9. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    10. throws ServletException, IOException {
    11. }
    12. }

    ④在DeptListServlet类的doGet方法中连接数据库,查询所有的部门,动态的展示部门列表页面

    (1)分析list.html页面中哪部分是固定死的,哪部分是需要动态展示的,这点很重要。

    (2)list.html页面中的内容所有的双引号要替换成单引号,因为out.print("")这里有一个双引号,容易冲突。

    (3)把静态写死的数据,换成从数据库中动态获取的数据后;原来静态的list.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.ResultSet;
    12. import java.sql.SQLException;
    13. /**
    14. * @Author:朗朗乾坤
    15. * @Package:com.bjpowernode.oa.web.action
    16. * @Project:JavaWeb
    17. * @name:DeptListServlet
    18. * @Date:2022/11/10 19:05
    19. */
    20. public class DeptListServlet extends HttpServlet {
    21. @Override
    22. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    23. throws ServletException, IOException {
    24. // 设置响应的内容类型以及字符集
    25. response.setContentType("text/html;charset=UTF-8");
    26. // 输出到浏览器
    27. PrintWriter out = response.getWriter();
    28. // 获取应用的根路径
    29. String contextPath = request.getContextPath();
    30. out.print(" ");
    31. out.print("");
    32. out.print(" ");
    33. out.print(" ");
    34. out.print(" ");
    35. out.print(" ");
    36. out.print(" ");
    37. out.print("

      部门列表

      "
      );
    38. out.print("
      "
      );
    39. out.print(" ");
    40. out.print("
    41. ");
    42. out.print("
    43. ");
    44. out.print("
    45. ");
    46. out.print("
    47. ");
    48. out.print("
    49. ");
    50. out.print("
    51. ");
    52. /*上面一部分是死的*/
    53. // 连接数据库
    54. Connection conn = null;
    55. PreparedStatement ps = null;
    56. ResultSet rs = null;
    57. try {
    58. // 1,2. 注册驱动和获取连接
    59. conn = DBUtil.getCoonetion();
    60. // 3.获取预编译的数据库操作对象
    61. String sql = "select deptno,dname,loc from dept";
    62. ps = conn.prepareStatement(sql);
    63. // 4.执行sql
    64. rs = ps.executeQuery();
    65. // 处理查询结果集
    66. int i = 0;
    67. while(rs.next()){
    68. String deptno = rs.getString("deptno");
    69. String dname = rs.getString("dname");
    70. String loc = rs.getString("loc");
    71. // 这里代码是动态的
    72. out.print("
    73. ");
    74. out.print("
    75. ");
    76. out.print("
    77. ");
    78. out.print("
    79. ");
    80. out.print("
    81. ");
    82. out.print("
    83. ");
    84. }
    85. } catch (SQLException e) {
    86. e.printStackTrace();
    87. }finally {
    88. // 6.关闭资源
    89. DBUtil.close(conn,ps,rs);
    90. }
    91. /*下面一部分是死的*/
    92. out.print("
    93. 序号 部门编号 部门名称 操作
      "+(++i)+""+deptno+""+dname+"");
    94. out.print(" 删除");
    95. out.print(" 修改");
    96. out.print(" 详情");
    97. out.print("
    98. "
      );
    99. out.print("
      "
      );
    100. out.print(" 新增部门");
    101. out.print(" ");
    102. out.print("");
    103. }
    104. }

    (4)最终链接数据库得到的动态页面如下:

    第六步:查看部门详情

    ①用户点击的详情页面在“查看部门列表的”后端java代码里,需要修改一下路径,并且也要带上部门编号,格式是固定的不能随便写;对于项目名,可以调用request.getContextPath()动态获取,然后在进行字符串拼接即可!

    1. <a href="detail.html">详情a>
    2. <a href='"+contextPath+"/dept/detail?deptno="+deptno+"'>详情a>");

    ②重点:向服务器提交数据的格式:

    1. uri?name=value&name=value&name=value&name=value
    2. /dept/detail?deptno="+deptno+"

    ③写web.xml文件

    1. <servlet>
    2. <servlet-name>detailservlet-name>
    3. <servlet-class>com.bjpowernode.oa.web.action.DeptDetailServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>detailservlet-name>
    7. <url-pattern>/dept/detailurl-pattern>
    8. servlet-mapping>

    ④编写一个类:DeptDetailServlet继承HttpServlet,重写doGet方法

    (1)重点:request.getParameter("deptno")方法,前面我们传了部门编号deptno,实际上会显示到地址栏上;所以这里就需要调用getParameter方法,通过key获取value,拿到deptno的值;然后根据这个值进行查询,展示结果!

    (2)换成动态生成的页面数据后,原来静态的detail.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.ResultSet;
    12. import java.sql.SQLException;
    13. /**
    14. * @Author:朗朗乾坤
    15. * @Package:com.bjpowernode.oa.web.action
    16. * @Project:JavaWeb
    17. * @name:DeptDetailServlet
    18. * @Date:2022/11/10 20:24
    19. */
    20. public class DeptDetailServlet extends HttpServlet {
    21. @Override
    22. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    23. throws ServletException, IOException {
    24. response.setContentType("text/html;charset=UTF-8");
    25. PrintWriter out = response.getWriter();
    26. out.print("");
    27. out.print("");
    28. out.print(" ");
    29. out.print(" ");
    30. out.print(" 部门详情");
    31. out.print(" ");
    32. out.print(" ");
    33. out.print("

      部门详情

      "
      );
    34. out.print("
      "
      );
    35. // 根据deptno(key)获取value(部门编号)
    36. // 虽然是提交的30,但是服务器获取的是"30"这个字符串。
    37. String deptno = request.getParameter("deptno");
    38. // 连接数据库,根据部门编号查询部门信息。
    39. Connection conn = null;
    40. PreparedStatement ps = null;
    41. ResultSet rs = null;
    42. try {
    43. // 1,2. 注册驱动和获取连接
    44. conn = DBUtil.getCoonetion();
    45. // 3.获取预编译的数据库操作对象
    46. String sql = "select dname,loc from dept where deptno = ?";
    47. ps = conn.prepareStatement(sql); // 先编译
    48. ps.setString(1, deptno); // 在给部门编号(第一个?)赋值
    49. // 4.执行sql
    50. rs = ps.executeQuery();
    51. // 5.处理查询结果集,这个结果集一定只有一条记录,因为deptno是主键。
    52. if (rs.next()) {
    53. String dname = rs.getString("dname");
    54. String loc = rs.getString("loc");
    55. out.print("部门编号:" + deptno + "
      "
      );
    56. out.print("部门名称:" + dname + "
      "
      );
    57. out.print("部门位置:" + loc + "
      "
      );
    58. }
    59. } catch (SQLException e) {
    60. e.printStackTrace();
    61. } finally {
    62. DBUtil.close(conn, ps, rs);
    63. }
    64. out.print(" ");
    65. out.print(" ");
    66. out.print("");
    67. }
    68. }

    ⑤ 这样就能做到点击哪个部门的详情就显示哪个部门的内容

    三:实现部门删除功能

    第七步:删除部门

    (1)从前端页面开始,用户点击删除按钮的时候,应该提示用户是否删除;因为删除这个动作是比较危险的。任何系统在进行删除操作之前,是必须要提示用户的,因为这个删除的动作有可能是用户误操作。(在前端页面上写JS代码,来提示用户是否删除)

    (2)javascript:void(0) 表示:仍然保留住超链接的样子,点击此超链接之后,不进行页面的跳转!

    (3)onclick这里表示鼠标单击事件,点击超链接时执行一个回调函数,在回调函数里发送请求!

    (4)换成动态生成的页面数据后,原来静态的delete.html就可以干掉了!

    ①前端代码

    把这些前端代码输出到DeptListServlet类当中;相当于在java代码中写前端代码!

    注意:在JS代码中进行跳转,发送请求!

    1. <a href=''>删除a>")
    2. <a href='javascript:void(0)' onclick='del("+deptno+")'>删除a>")
    3. <script type="text/javascript">
    4. function del(dno){
    5. if(window.confirm("亲,删了不可恢复哦!")){
    6. document.location.href = "/oa/dept/delete?deptno=" + dno;
    7. }
    8. }
    9. script>

    ②以上的前端程序要写到后端的java代码当中:

    在列表DeptListServlet类的doGet方法当中,使用out.print()方法,将以上的前端代码输出到浏览器上即可。

    ③写web.xml文件

    1. <servlet>
    2. <servlet-name>deleteservlet-name>
    3. <servlet-class>com.bjpowernode.oa.web.action.DeptDelServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>deleteservlet-name>
    7. <url-pattern>/dept/deleteurl-pattern>
    8. servlet-mapping>

    ④编写DeptDelServlet继承HttpServlet,重写doGet方法

    删除完成后,需要重新进行连接数据库,进行查询打印信息,所以需要从DeptDeleteServlet这个servlet跳转到另外一个DeptListServlet(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.SQLException;
    12. /**
    13. * @Author:朗朗乾坤
    14. * @Package:com.bjpowernode.oa.web.action
    15. * @Project:JavaWeb
    16. * @name:DeptDelServlet
    17. * @Date:2022/11/14 14:42
    18. */
    19. public class DeptDelServlet extends HttpServlet {
    20. @Override
    21. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    22. throws ServletException, IOException {
    23. response.setContentType("text/htmp;charset=UTF-8");
    24. PrintWriter out = response.getWriter();
    25. // 根据部门编号,删除部门
    26. // 1. 获取部门编号,根据key获取value
    27. String deptno = request.getParameter("deptno");
    28. // 2. 连接数据库
    29. Connection conn = null;
    30. PreparedStatement ps = null;
    31. int count = 0;
    32. try {
    33. // 注册驱动和获取连接
    34. conn = DBUtil.getCoonetion();
    35. // 获取预编译的数据库操作对象
    36. String sql = "delete from dept where deptno = ?";
    37. ps = conn.prepareStatement(sql);
    38. ps.setString(1,deptno);
    39. // 返回值是:影响了数据库当中多少数据
    40. // 这里根据主键删除,肯定只影响的一条
    41. count = ps.executeUpdate();
    42. } catch (SQLException e) {
    43. e.printStackTrace();
    44. }finally {
    45. // 关闭资源
    46. DBUtil.close(conn,ps,null);
    47. }
    48. //3. 判断有没有删除成功
    49. // 判断删除成功了还是失败了。
    50. if (count == 1) {
    51. //删除成功,仍然跳转到部门列表页面
    52. //部门列表页面的显示需要执行另一个Servlet。怎么办?转发。
    53. request.getRequestDispatcher("/dept/list").forward(request, response);
    54. }else{
    55. // 删除失败
    56. request.getRequestDispatcher("/error.html").forward(request, response);
    57. }
    58. }
    59. }

    ⑤删除失败,跳转的页面

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>errottitle>
    6. head>
    7. <body>
    8. <h1>操作失败,<a href="javascript:void(0)" onclick="window.history.back()">返回a>h1>
    9. body>
    10. html>

    四:实现部门新增功能

    第八步:新增部门

    ①前端代码

    1. <a href='add.html'>新增部门a>
    2. <a href='"+contextPath+"add.html'>新增部门a>");

    这里保留了add.html文件,因为我们需要向服务器提交数据,需要提交一个表单!

    这里是向跳到add.html,然后通过这个表单在发出请求!并且我们是发送数据应该使用post请求而不是get请求,这是和前面不一样的!

    1. 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/add" 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>

    ②写web.xml文件

    1. <servlet>
    2. <servlet-name>addservlet-name>
    3. <servlet-class>com.bjpowernode.oa.web.action.DeptAddServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>addservlet-name>
    7. <url-pattern>/dept/addurl-pattern>
    8. servlet-mapping>

    ③编写DeptDelServlet继承HttpServlet,重写doPost方法(提交数据使用Post方式);而前面我们DeptListServlet用的都是Get请求,所以在跳转时就会出现405错误!

    怎么解决?两种方案

    • 第一种:在/dept/list Servlet中添加doPost方法,然后在doPost方法中调用doGet。

    • 第二种:重定向

    1. // 在DeptListServlet类中增加doPost方法中调用doGet方法
    2. @Override
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. doGet(request,response);
    5. }

    因为是向服务器发送数据,所以这里要通过getParameter()方法,获取到向服务器发送的数据;然后在执行sql语句,进行数据的插入操作;并且我们插入数据又要重新连接数据库,进行数据的打印,这和前面删除的操作实现相同的,需要从DepAddServlet这个servlet跳转到另外一个DeptListServlet(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.sql.Connection;
    9. import java.sql.PreparedStatement;
    10. import java.sql.SQLException;
    11. /**
    12. * @Author:朗朗乾坤
    13. * @Package:com.bjpowernode.oa.web.action
    14. * @Project:JavaWeb
    15. * @name:DeptAddServlet
    16. * @Date:2022/11/14 15:58
    17. */
    18. public class DeptAddServlet extends HttpServlet {
    19. @Override
    20. protected void doPost(HttpServletRequest request, HttpServletResponse response)
    21. throws ServletException, IOException {
    22. // 获取前端填写的部门的信息
    23. request.setCharacterEncoding("UTF-8"); // 解决乱码问题
    24. String deptno = request.getParameter("deptno");
    25. String dname = request.getParameter("dname");
    26. String loc = request.getParameter("loc");
    27. // 连接数据库执行insert语句
    28. Connection conn = null;
    29. PreparedStatement ps = null;
    30. int count = 0;
    31. try {
    32. // 注册驱动和获取连接
    33. conn = DBUtil.getCoonetion();
    34. // 获取预编译数据库操作对象
    35. String sql = "insert into dept(deptno,dname,loc) values(?,?,?)";
    36. ps = conn.prepareStatement(sql);
    37. ps.setString(1,deptno);
    38. ps.setString(2,dname);
    39. ps.setString(3,loc);
    40. // 执行sql
    41. count = ps.executeUpdate();
    42. } catch (SQLException e) {
    43. e.printStackTrace();
    44. }finally {
    45. DBUtil.close(conn,ps,null);
    46. }
    47. if (count == 1) {
    48. // 保存成功调转到列表页面
    49. request.getRequestDispatcher("/dept/list").forward(request,response);
    50. }else{
    51. // 保存失败,跳转到失败页面
    52. request.getRequestDispatcher("/error.html").forward(request,response);
    53. }
    54. }
    55. }

    五:实现部门修改功能

    (1)对于修改实际上有两次连接数据库的操作!

    (2)第一次在list页面点修改,实际上就相当于一个查询操作,需要连接连接数据库。

    (3)第二次点击按钮进行修改,才是真正的修改操作,又需要连接数据库。

    (4)换成动态生成的页面数据后,原来静态的modify.html就可以干掉了!

    第九步:跳转到修改部门的页面

    第一次list页面点击修改,只是相当于查询,点击哪个部门就把哪个部门的信息先展示出来!

    所以也需要把dpetno传过去,点击哪个deptno号就查询哪个部门,然后才能进行修改

    ①前端代码

    1. <a href='modify.html'>修改a>")
    2. <a href='"+contextPath+"/dept/modify?deptno="+deptno+"'>修改a>")

    ②写web.xml文件

    1. <servlet>
    2. <servlet-name>modifyservlet-name>
    3. <servlet-class>com.bjpowernode.oa.web.action.DeptModifyServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>modifyservlet-name>
    7. <url-pattern>/dept/modifyurl-pattern>
    8. servlet-mapping>

    ③编写DeptModifyServlet继承HttpServlet,重写doGet方法,编写连接数据库代码,进行查看;这里也需要调用getParameter()方法,获取到发送前端的部门编号

    1. package com.bjpowernode.oa.web.action;
    2. import com.bjpowernode.oa.utils.DBUtil;
    3. import javax.servlet.RequestDispatcher;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.IOException;
    9. import java.io.PrintWriter;
    10. import java.sql.Connection;
    11. import java.sql.PreparedStatement;
    12. import java.sql.ResultSet;
    13. import java.sql.SQLException;
    14. /**
    15. * @Author:朗朗乾坤
    16. * @Package:com.bjpowernode.oa.web.action
    17. * @Project:JavaWeb
    18. * @name:DeptModifyServlet
    19. * @Date:2022/11/14 18:34
    20. */
    21. public class DeptModifyServlet extends HttpServlet {
    22. @Override
    23. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    24. throws ServletException, IOException {
    25. response.setContentType("text/html;charset=UTF-8");
    26. PrintWriter out = response.getWriter();
    27. String contextPath = request.getContextPath();
    28. // 获取部门编号
    29. String deptno = request.getParameter("deptno");
    30. out.print("");
    31. out.print("");
    32. out.print(" ");
    33. out.print(" ");
    34. out.print(" 修改部门");
    35. out.print(" ");
    36. out.print(" ");
    37. out.print("

      修改部门

      "
      );
    38. out.print("
      "
      );
    39. out.print("
      ");
    40. // 连接数据库
    41. Connection conn = null;
    42. PreparedStatement ps = null;
    43. ResultSet rs = null;
    44. try {
    45. // 注册驱动和获取连接
    46. conn = DBUtil.getCoonetion();
    47. // 获取预编译的数据库操作对象
    48. String sql = "select dname,loc from dept where deptno = ?";
    49. ps = conn.prepareStatement(sql);
    50. ps.setString(1, deptno);
    51. // 执行sql
    52. rs = ps.executeQuery();
    53. // 处理查询结果集,肯定是只有一条数据
    54. if (rs.next()) {
    55. String dname = rs.getString("dname");
    56. String loc = rs.getString("loc");
    57. // 输出到页面
    58. out.print("部门编号
      "
      );
    59. out.print("部门名称
      "
      );
    60. out.print("部门位置
      "
      );
    61. }
    62. } catch (SQLException e) {
    63. e.printStackTrace();
    64. } finally {
    65. // 关闭资源
    66. DBUtil.close(conn, ps, rs);
    67. }
    68. out.print("
      "
      );
    69. out.print(" ");
    70. out.print(" ");
    71. out.print("");
    72. }
    73. }

    第十步:修改部门

    ①前端代码

    第二次点击修改按钮,才是真正意义上的数据修改,需要发送新的请求!

    修改和新增差不多,都需要向前端发送数据,肯定也是使用的是post请求方式!

    1. <form action='' method='get'>
    2. <form action='"+contextPath+"/dept/update' method='post'>

    ②写web.xml文件

    1. <servlet>
    2. <servlet-name>updateservlet-name>
    3. <servlet-class>com.bjpowernode.oa.web.action.DeptUpdateServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>updateservlet-name>
    7. <url-pattern>/dept/updateurl-pattern>
    8. servlet-mapping>

    ③编写DeptUpdateServlet继承HttpServlet,重写doPost方法,编写连接数据库代码,进行数据的修改,注意:对于主键deptno是不能修改的!

    所谓修改实际上就是调用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.sql.Connection;
    9. import java.sql.PreparedStatement;
    10. import java.sql.SQLException;
    11. /**
    12. * @Author:朗朗乾坤
    13. * @Package:com.bjpowernode.oa.web.action.com.bjpowernode.oa.web.action
    14. * @Project:JavaWeb
    15. * @name:DeptUpdateServlet
    16. * @Date:2022/11/14 19:19
    17. */
    18. public class DeptUpdateServlet extends HttpServlet {
    19. @Override
    20. protected void doPost(HttpServletRequest request, HttpServletResponse response)
    21. throws ServletException, IOException {
    22. // 解决请求体的中文乱码问题
    23. request.setCharacterEncoding("UTF-8");
    24. // 获取表单中的数据
    25. String deptno = request.getParameter("deptno");
    26. String dname = request.getParameter("dname");
    27. String loc = request.getParameter("loc");
    28. //连接数据库,执行更新语句
    29. Connection conn = null;
    30. PreparedStatement ps = null;
    31. int count = 0;
    32. try {
    33. // 注册驱动和获取连接
    34. conn = DBUtil.getCoonetion();
    35. // 获取预编译数据库操作对象
    36. String sql = "update dept set dname=?,loc=? where deptno = ?";
    37. ps = conn.prepareStatement(sql);
    38. ps.setString(1,dname);
    39. ps.setString(2,loc);
    40. ps.setString(3,deptno);
    41. // 执行sql,返回更新的条数
    42. count = ps.executeUpdate();
    43. } catch (SQLException e) {
    44. e.printStackTrace();
    45. }finally {
    46. DBUtil.close(conn,ps,null);
    47. }
    48. if(count == 1){
    49. // 更新成功,使用转发
    50. request.getRequestDispatcher("/dept/list").forward(request,response);
    51. }else{
    52. request.getRequestDispatcher("/error.html").forward(request,response);
    53. }
    54. }
    55. }

    总结:使用纯Servlet手写一个单表的CRUD操作,我们发现很繁琐,后期会通过注解、模板方法设计模式、JSP等技术对这个项目进行一步步的优化;目前我们需要掌握其中的原理即可!

  • 相关阅读:
    WPF Frame content binding page(Using MVVM)
    rdma软件架构的理解。
    助力AR眼镜轻量化,国内攻破二维扩瞳几何光波导量产
    VictoriaLogs 要凭什么革了各家日志存储的命
    CodeForces Round #821 (div.2) A~C
    springCloud-Nacos注册中心的搭建
    Vue2:网易云播放音乐并实现同步一次显示一行歌词
    大数据下一代变革之必研究数据湖技术Hudi原理实战双管齐下-后续
    Java配置线程池
    vue如何实现2个新标签之间的信息共享
  • 原文地址:https://blog.csdn.net/m0_61933976/article/details/127775231