使用Servlet完成单表的CRUD

电玩女神 2023-09-30 08:47 87阅读 0赞

#

  • 实现步骤
    • 第一步:准备一张数据库表。(sql脚本)
    • 第二步:准备一套HTML页面(项目原型)【前端开发工具使用HBuilder】
    • 第三步:分析我们这个系统包括哪些功能
    • 第四步:在IDEA当中搭建开发环境
    • 第五步:实现第一个功能:查看部门列表
    • 第六步:查看部门详情。
    • 第七步:删除部门
  • 第九步:跳转到修改部门的页面
  • 第十步:修改部门

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

实现步骤

第一步:准备一张数据库表。(sql脚本)

部门表

  1. drop table if exists dept;
  2. create table dept(
  3. deptno int primary key,
  4. dname varchar(255),
  5. loc varchar(255)
  6. );
  7. insert into dept(deptno, dname, loc) values(10, 'XiaoShouBu', 'BEIJING');
  8. insert into dept(deptno, dname, loc) values(20, 'YanFaBu', 'SHANGHAI');
  9. insert into dept(deptno, dname, loc) values(30, 'JiShuBu', 'GUANGZHOU');
  10. insert into dept(deptno, dname, loc) values(40, 'MeiTiBu', 'SHENZHEN');
  11. commit;
  12. select * from dept;
  13. +--------+------------+-----------+
  14. | deptno | dname | loc |
  15. +--------+------------+-----------+
  16. | 10 | XiaoShouBu | BEIJING |
  17. | 20 | YanFaBu | SHANGHAI |
  18. | 30 | JiShuBu | GUANGZHOU |
  19. | 40 | MeiTiBu | SHENZHEN |
  20. +--------+------------+-----------+

第二步:准备一套HTML页面(项目原型)【前端开发工具使用HBuilder】

  • 把HTML页面准备好
  • 然后将HTML页面中的链接都能够跑通。(页面流转没问题。)然后,具体哪一些数据是动态的,哪一些是静态的,到时候再分析
  • 应该设计哪些页面呢?

    • 欢迎页面:index.html
    • 列表页面:list.html(以列表页面为核心,展开其他操作。)
    • 新增页面:add.html
    • 修改页面:edit.html
    • 详情页面:detail.html

欢迎页面:

  1. <!DOCTYPE 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>

在这里插入图片描述
列表页面:

  1. <!DOCTYPE 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>1</td>
  19. <td>10</td>
  20. <td>销售部</td>
  21. <td><a href="">删除</a>
  22. <a href="edit.html">修改</a>
  23. <a href="detail.html">详情</a></td>
  24. </tr>
  25. <tr>
  26. <td>2</td>
  27. <td>20</td>
  28. <td>研发部</td>
  29. <td><a href="">删除</a>
  30. <a href="edit.html">修改</a>
  31. <a href="detail.html">详情</a></td>
  32. </tr>
  33. <tr>
  34. <td>3</td>
  35. <td>30</td>
  36. <td>运营部</td>
  37. <td><a href=>删除</a>
  38. <a href="edit.html">修改</a>
  39. <a href="detail.html">详情</a></td>
  40. </tr>
  41. </table>
  42. <a href="add.html" >新增部门</a>
  43. </body>
  44. </html>

在这里插入图片描述
目前页面都是写死的,后续的话,需要动态获取数据,比如说,我们在销售部那里点击修改,那么跳出的数据,部门名称就应该是销售部,点击哪一个部门,显示就应该是哪一个部门。这些值都是通过数据库查出来的,动态展示
修改部门的时候,部门编号是不能修改的,因为我们修改数据的时候,是通过部门编号作为筛选条件,来进行修改的

新增页面:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>新增部门</title>
  6. </head>
  7. <body>
  8. <form action="list.html" method="get">
  9. 部门编号<input type="text" name="deptno" /><br />
  10. 部门名称<input type="text" name="dname" /><br />
  11. 部门位置<input type="text" name="loc" /><br />
  12. <input type="submit" value="保存" /> <br />
  13. </form>
  14. </body>
  15. </html>

在这里插入图片描述
修改页面:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>修改部门</title>
  6. </head>
  7. <body>
  8. <form action="list.html" method="get">
  9. 部门编号<input type="text" name="deptno" value="20" readonly=""/><br />
  10. 部门名称<input type="text" name="dname" value="销售部"/><br />
  11. 部门位置<input type="text" name="loc" value="北京"/><br />
  12. <input type="submit" value="修改" /> <br />
  13. </form>
  14. </body>
  15. </html>

在这里插入图片描述

详情页面:

  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. 部门编号:20<br />
  11. 部门名称:销售部<br />
  12. 部门位置:北京<br />
  13. <input type="button" value="后退" onclick="window.history.back()" />
  14. </body>
  15. </html>

在这里插入图片描述

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

  • 什么叫做一个功能呢?

    • 只要 这个操作连接了数据库,就表示一个独立的功能。
  • 包括哪些功能?

    • 查看部门列表
    • 新增部门
    • 删除部门
    • 查看部门详细信息
    • 跳转到修改页面
    • 修改部门

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

  • 创建一个webapp(给这个webapp添加servlet-api.jar和jsp-api.jar到classpath当中。)
  • 向webapp中添加连接数据库的jar包(mysql驱动)

    • 必须在WEB-INF目录下新建lib目录,然后将mysql的驱动jar包拷贝到这个lib目录下。这个目录名必须叫做lib,全部小写的。
  • JDBC的工具类
  • package com.bjpowernode.oa.utils;

    import java.sql.*;
    import java.util.ResourceBundle;

    /**JDBC工具类

    • @author zengyihong
    • @create 2022—03—10 20:21
      */
      public class DBUtils {

      //静态变量,在类加载时执行,自上而下的顺序
      //根据属性配置文件的key获取value
      private static ResourceBundle boundle=ResourceBundle.getBundle(“resources.jdbc”);
      private static String driver=boundle.getString(“driver”);
      private static String url=boundle.getString(“url”);
      private static String user=boundle.getString(“user”);
      private static String password=boundle.getString(“password”);

      static {

      1. try {
      2. //连接数据库的驱动,不能写死,以后可能连接其他数据库,比如Oracle
      3. //OCP开闭原则:对扩展开放,对修改关闭(功能扩展的时候,不需要修改Java源代码)
      4. //Class.forName("com.mysql.jdbc.Driver");
      5. Class.forName(driver);
  1. } catch (ClassNotFoundException e) {
  2. e.printStackTrace();
  3. }
  4. }
  5. /**
  6. * 注册驱动只需要一次,可以使用静态代码块
  7. */
  8. public static Connection getConnection() throws SQLException {
  9. Connection conn= DriverManager.getConnection(url,user,password);
  10. return conn;
  11. }
  12. /**
  13. * 释放资源
  14. * @param conn 连接对象
  15. * @param ps 数据库操作对象
  16. * @param rs 结果集对象
  17. */
  18. public static void close(Connection conn, Statement ps, ResultSet rs){
  19. if (rs !=null){
  20. try {
  21. rs.close();
  22. } catch (SQLException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. try {
  27. if (ps !=null){
  28. ps.close();
  29. }
  30. } catch (SQLException e) {
  31. e.printStackTrace();
  32. }
  33. try {
  34. if (rs !=null){
  35. rs.close();
  36. }
  37. } catch (SQLException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  • 将所有HTML页面拷贝到web目录下。

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

  • 我们应该怎么去实现一个功能呢?

    • 建议:你可以从后端往前端一步一步写。也可以从前端一步一步往后端写。都可以。但是千万要记住不要想起来什么写什么。你写代码的过程最好是程序的执行过程。也就是说:程序执行到哪里,你就写哪里。这样一个顺序流下来之后,基本上不会出现什么错误、意外。
    • 从哪里开始?

      • 假设从前端开始,那么一定是从用户点击按钮那里开始的。
      • 第一:先修改前端页面的超链接,因为用户先点击的就是这个超链接。
      • 因为查看部门列表是要和数据库进行交互的,里面的数据不能是写死的,要实时更新数据,所以需要执行一个Java程序
        <a href="/oa/dept/list">查看部门列表</a>
  • 第二:编写web.xml文件

    1. <servlet-name>list</servlet-name>
    2. <servlet-class>com.bjpowernode.oa.web.action.DeptListServlet</servlet-class>

    1. <servlet-mapping>
    2. <servlet-name>list</servlet-name>
    1. <url-pattern>/dept/list</url-pattern>
    2. </servlet-mapping>
  • 第三:编写DeptListServlet类继承HttpServlet类。然后重写doGet方法。

  • 因为点击超链接是get请求
  • 再来回忆一下通信原理
    在这里插入图片描述

    package com.bjpowernode.oa.web.action;

    import jakarta.servlet.ServletException;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;

    import java.io.IOException;

    public class DeptListServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)

    1. throws ServletException, IOException {

    }
    }

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

  • 分析list.html页面中哪部分是固定死的,哪部分是需要动态展示的。

  • list.html页面中的内容所有的双引号要替换成单引号,因为out.print(“”)这里有一个双引号,容易冲突。
  • 现在写完这个功能之后,你会有一种感觉,感觉开发很繁琐,只使用servlet写代码太繁琐了。

    public class DeptListServlet extends HttpServlet {

    1. @Override
    2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    3. //获取应用的根路径
    4. String contextPath = request.getContextPath();
    5. response.setContentType("text/html;charset=UTF-8");
    6. PrintWriter writer = response.getWriter();
    7. writer.println(" <!DOCTYPE html> ");
    8. writer.println("<html>");
    9. writer.println("<head>");
    10. writer.println(" <meta charset='utf-8'>");
    11. writer.println(" <title>部门列表页面</title>");
    12. writer.println("</head>");
    13. writer.println("<body>");
    14. writer.println("<h1 align='center'>部门列表</h1>");
    15. writer.println("<hr />");
    16. writer.println("<table border='1px' align='center' width='50%'>");
    17. writer.println("");
    18. writer.println(" <tr>");
    19. writer.println("");
    20. writer.println(" <th>序号</th>");
    21. writer.println(" <th>部门编号</th>");
    22. writer.println(" <th>部门名称</th>");
    23. writer.println(" <th>操作</th>");
    24. writer.println("");
    25. writer.println(" </tr>");

    /**

    1. * 要分析页面哪些部分是静态的,哪些部分是动态的

    */

    1. //连接数据库,查询所有数据
    2. Connection conn=null;
    3. PreparedStatement ps=null;
    4. ResultSet rs=null;
    5. try {
    6. //获取连接
    7. conn= DBUtils.getConnection();
    8. //获取预编译的数据库操作对象
    9. String sql="select deptno,dname,loc from dept";
    10. ps = conn.prepareStatement(sql);
    11. //执行sql语句
    12. rs=ps.executeQuery();
    13. //处理结果集
    14. int i=0;
    15. while (rs.next()){
    16. String deptno=rs.getString("deptno");
    17. String dname = rs.getString("dname");
    18. String loc = rs.getString("loc");
    19. writer.println(" <tr>");
    20. writer.println(" <td>"+(++i)+"</td>");
    21. writer.println(" <td>"+deptno+"</td>");
    22. writer.println(" <td>"+dname+"</td>");
    23. writer.println(" <td><a href=''>删除</a>");
    24. writer.println(" <a href='edit.html'>修改</a>");
    25. /**
    26. * 点击详情的时候,我们点击哪一个部门,就应该显示相应部门的信息
    27. */
    28. writer.println(" <a href='detail.html'>详情</a></td>");
    29. writer.println(" </tr>");
  1. }
  2. } catch (SQLException e) {
  3. e.printStackTrace();
  4. }finally {
  5. //释放资源
  6. DBUtils.close(conn,ps,rs);
  7. }
  8. //<!-- 往下都是固定死的-->
  9. writer.println("</table>");
  10. writer.println("<a href='add.html' >新增部门</a>");
  11. writer.println("");
  12. writer.println("");
  13. writer.println("</body>");
  14. writer.println("</html>");
  15. }
  16. }

先来回顾一下,之前准备数据库中的表的数据

  1. +--------+------------+-----------+
  2. | deptno | dname | loc |
  3. +--------+------------+-----------+
  4. | 10 | XiaoShouBu | BEIJING |
  5. | 20 | YanFaBu | SHANGHAI |
  6. | 30 | JiShuBu | GUANGZHOU |
  7. | 40 | MeiTiBu | SHENZHEN |
  8. +--------+------------+-----------+

在这里插入图片描述

在这里插入图片描述

写这个小功能的体会:我们可以先写出静态页面,然后根据这个页面来分析,哪些部分是需要动态展示的,也就是要和数据库连接的,哪些部分是固定死的,再根据我们的分析去操作,这样思路会比较清晰,不然的话,可能东写一个,西写一个,最后自己都乱了。

第六步:查看部门详情。

  • 建议:从前端往后端一步一步实现。首先要考虑的是,用户点击的是什么?用户点击的东西在哪里?

    • 一定要先找到用户点的“详情”在哪里。找了半天,终于在后端的java程序中找到了

    详情

    • 详情 是需要连接数据库的,所以这个超链接点击之后也是需要执行一段java代码的。所以要将这个超链接的路径修改一下。
    • 注意:修改路径之后,这个路径是需要加项目名的。”/oa/dept/detail”
  • 技巧:
  • out.print("<a href='"+contextPath+"/dept/detail?deptno="+deptno+"'>详情</a>");
  • 重点:向服务器提交数据的格式:uri?name=value&name=value&name=value&name=value

    • 这里的问号,必须是英文的问号。不能中文的问号。
  • 解决404的问题。写web.xml文件。

    1. <servlet-name>detail</servlet-name>
    2. <servlet-class>com.bjpowernode.oa.web.action.DeptDetailServlet</servlet-class>


    1. <servlet-name>detail</servlet-name>
    2. <url-pattern>/dept/detail</url-pattern>

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

  1. 中文思路(思路来源于:你要做什么?目标:查看部门详细信息。)
  2. 第一步:获取部门编号
  3. 第二步:根据部门编号查询数据库,获取该部门编号对应的部门信息。
  4. 第三步:将部门信息响应到浏览器上。(显示一个详情。)
  5. package com.bjpowernode.oa.web.action;
  6. import com.bjpowernode.oa.utils.DBUtils;
  7. import jakarta.servlet.ServletException;
  8. import jakarta.servlet.http.HttpServlet;
  9. import jakarta.servlet.http.HttpServletRequest;
  10. import jakarta.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.io.PrintWriter;
  13. import java.sql.Connection;
  14. import java.sql.PreparedStatement;
  15. import java.sql.ResultSet;
  16. import java.sql.SQLException;
  17. /**
  18. * @author zengyihong
  19. * @create 2022--03--11 19:14
  20. */
  21. public class DeptDetailServlet extends HttpServlet {
  22. @Override
  23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24. response.setContentType("text/html;charset=UTF-8");
  25. PrintWriter writer = response.getWriter();
  26. writer.println(" <!DOCTYPE html>");
  27. writer.println("<html>");
  28. writer.println(" <head>");
  29. writer.println(" <meta charset='utf-8'>");
  30. writer.println(" <title>部门详情</title>");
  31. writer.println(" </head>");
  32. writer.println(" <body>");
  33. writer.println(" <h1>部门详情</h1>");
  34. writer.println(" <hr />");
  35. //获取部门编号
  36. // /oa/dept/detail?deptno=30
  37. //显然提交的是30,但是服务器获取的是30这个字符串
  38. String deptno = request.getParameter("deptno");
  39. //连接数据库,根据相关部门来查询部门信息
  40. Connection conn = null;
  41. PreparedStatement ps = null;
  42. ResultSet rs = null;
  43. //部门编号是主键,所以查询出来的记录最多就一条
  44. try {
  45. conn = DBUtils.getConnection();
  46. String sql = "select dname,loc from dept where deptno=?";
  47. ps = conn.prepareStatement(sql);
  48. ps.setString(1, deptno);
  49. rs = ps.executeQuery();
  50. if (rs.next()) {
  51. String dname = rs.getString("dname");
  52. String loc = rs.getString("loc");
  53. writer.println(" 部门编号:" + deptno + "<br />");
  54. writer.println(" 部门名称:" + dname + "<br />");
  55. writer.println(" 部门位置:" + loc + "<br />");
  56. }
  57. } catch (SQLException e) {
  58. e.printStackTrace();
  59. } finally {
  60. DBUtils.close(conn, ps, rs);
  61. }
  62. writer.println(" <input type='button' value='后退' οnclick='window.history.back()' />");
  63. writer.println(" </body>");
  64. writer.println("</html>");
  65. }
  66. }

接下来,看看效果

在这里插入图片描述
在这里插入图片描述
点击后退
在这里插入图片描述
在这里插入图片描述
可以看出,点击不同部门的详情,就会对应相应的信息
如果程序出现错误,显示4开头的错误代码,一般是前端代码问题,如果是5开头的错误代码,一般是Java程序出现问题

第七步:删除部门

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

    删除

    1. <script type="text/javascript">
    2. function del(dno){
    3. //弹出确认框,用户点击确定,返回true,点击取消,返回false
    4. var ok=window.confirm("亲,删了不可恢复哦");
    5. //在JS代码中如何发送请求给服务器
    6. //四种写法都可以
    7. //document.location.href="请求路径";
    8. // document.location="请求路径";

    // window.location.href=”请求路径”;
    // window.location=”请求路径”;
    //我们在点击删除的时候,要把删除哪一个部门的编号传进去

    1. document.location.href="/oa/dept/delete?deptno="+dno;
    2. }

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

    • DeptListServlet类的doGet方法当中,使用out.print()方法,将以上的前端代码输出到浏览器上。
  • 解决404的问题:

    • http://localhost:8080/oa/dept/delete?deptno=30
    • web.xml文件

    1. <servlet-name>delete</servlet-name>
    2. <servlet-class>com.bjpowernode.oa.web.action.DeptDelServlet</servlet-class>


    1. <servlet-name>delete</servlet-name>
    2. <url-pattern>/dept/delete</url-pattern>

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

  1. package com.bjpowernode.oa.web.action;
  2. import com.bjpowernode.oa.utils.DBUtils;
  3. import jakarta.servlet.ServletException;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.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 zengyihong
  13. * @create 2022--03--12 11:33
  14. */
  15. public class DeptDeleteServlet extends HttpServlet {
  16. @Override
  17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. //根据部门编号,删除部门
  19. //获取部门编号
  20. String deptno = request.getParameter("deptno");
  21. //连接数据库删除数据
  22. Connection conn=null;
  23. PreparedStatement ps=null;
  24. int count=0;
  25. try {
  26. conn= DBUtils.getConnection();
  27. //关闭自动提交,就是开启事务
  28. conn.setAutoCommit(false);
  29. String sql="delete from dept where deptno =?";
  30. ps=conn.prepareStatement(sql);
  31. ps.setString(1,deptno);
  32. //返回的是影响数据库表中多少条记录
  33. count = ps.executeUpdate();
  34. conn.commit();
  35. } catch (SQLException e) {
  36. //遇到异常要回滚
  37. if (conn !=null){
  38. try {
  39. conn.rollback();
  40. } catch (SQLException ex) {
  41. ex.printStackTrace();
  42. }
  43. }
  44. e.printStackTrace();
  45. }finally {
  46. DBUtils.close(conn,ps,null);
  47. }
  48. if (count == 1){
  49. //删除成功
  50. //仍然跳转到部门列表页面
  51. //部门列表页面的显示需要执行另外一个Servlet,怎么办?转发
  52. request.getRequestDispatcher("/dept/list").forward(request,response);
  53. }else {
  54. request.getRequestDispatcher("/error.html").forward(request,response);
  55. }
  56. }
  57. }

删除成功或者失败的时候的一个处理(这里我们选择了转发,并没有使用重定向机制。)

  1. // 判断删除成功了还是失败了。
  2. if (count == 1) {
  3. //删除成功
  4. //仍然跳转到部门列表页面
  5. //部门列表页面的显示需要执行另一个Servlet。怎么办?转发。
  6. request.getRequestDispatcher("/dept/list").forward(request, response);
  7. }else{
  8. // 删除失败
  9. request.getRequestDispatcher("/error.html").forward(request, response);
  10. }
  • 第八步:新增部门

    • 注意:最后保存成功之后,转发到 /dept/list 的时候,会出现405,为什么?

      • 第一:保存用的是post请求。底层要执行doPost方法。
      • 第二:转发是一次请求,之前是post,之后还是post,因为它是一次请求。
      • 第三:/dept/list Servlet当中只有一个doGet方法。
      • 怎么解决?两种方案

        • 第一种:在/dept/list Servlet中添加doPost方法,然后在doPost方法中调用doGet。
        • 第二种:重定向。
        • 在这里插入图片描述
          在这里插入图片描述
          在这里插入图片描述

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

  1. package com.bjpowernode.oa.web.action;
  2. import com.bjpowernode.oa.utils.DBUtils;
  3. import jakarta.servlet.ServletException;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.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)
  16. throws ServletException, IOException {
  17. // 获取应用的根路径。
  18. String contextPath = request.getContextPath();
  19. response.setContentType("text/html;charset=UTF-8");
  20. PrintWriter out = response.getWriter();
  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. out.print(" <form action='"+contextPath+"/dept/modify' method='post'>");
  31. // 获取部门编号
  32. String deptno = request.getParameter("deptno");
  33. // 连接数据库,根据部门编号查询部门的信息。
  34. Connection conn = null;
  35. PreparedStatement ps = null;
  36. ResultSet rs = null;
  37. try {
  38. conn = DBUtils.getConnection();
  39. String sql = "select dname, loc as location from dept where deptno = ?";
  40. ps = conn.prepareStatement(sql);
  41. ps.setString(1, deptno);
  42. rs = ps.executeQuery();
  43. // 这个结果集中只有一条记录。
  44. if(rs.next()){
  45. String dname = rs.getString("dname");
  46. String location = rs.getString("location"); // 参数"location"是sql语句查询结果列的列名。
  47. // 输出动态网页。
  48. out.print(" 部门编号<input type='text' name='deptno' value='"+deptno+"' readonly /><br>");
  49. out.print(" 部门名称<input type='text' name='dname' value='"+dname+"'/><br>");
  50. out.print(" 部门位置<input type='text' name='loc' value='"+location+"'/><br>");
  51. }
  52. } catch (SQLException e) {
  53. e.printStackTrace();
  54. } finally {
  55. DBUtils.close(conn, ps, rs);
  56. }
  57. out.print(" <input type='submit' value='修改'/><br>");
  58. out.print(" </form>");
  59. out.print(" </body>");
  60. out.print("</html>");
  61. }
  62. @Override
  63. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  64. doGet(req,resp);
  65. }
  66. }

第十步:修改部门

  1. package com.bjpowernode.oa.web.action;
  2. import com.bjpowernode.oa.utils.DBUtils;
  3. import jakarta.servlet.ServletException;
  4. import jakarta.servlet.http.HttpServlet;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.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 zengyihong
  13. * @create 2022--03--13 8:35
  14. */
  15. public class DeptModifyServlet extends HttpServlet {
  16. @Override
  17. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. //解决请求体的乱码问题
  19. request.setCharacterEncoding("UTF-8");
  20. response.setContentType("text/html;charset=UTF-8");
  21. //获取表单数据
  22. String deptno = request.getParameter("deptno");
  23. String dname = request.getParameter("dname");
  24. String loc = request.getParameter("loc");
  25. //连接数据库,执行更新语句
  26. Connection conn = null;
  27. PreparedStatement ps = null;
  28. int count=0;
  29. try {
  30. conn = DBUtils.getConnection();
  31. String sql = "update dept set dname=?,loc=? where deptno=? ";
  32. ps = conn.prepareStatement(sql);
  33. ps.setString(1, dname);
  34. ps.setString(2, loc);
  35. ps.setString(3, deptno);
  36. count = ps.executeUpdate();
  37. } catch (SQLException e) {
  38. e.printStackTrace();
  39. } finally {
  40. DBUtils.close(conn, ps, null);
  41. }
  42. if (count==1){
  43. //更新成功
  44. //跳到列表页面 部门列表页面是通过Java程序动态生成的,需要请求转发,所以需要执行另外一个servlet
  45. request.getRequestDispatcher("/dept/list").forward(request,response);
  46. }else{
  47. request.getRequestDispatcher("/error.html").forward(request,response);
  48. }
  49. }
  50. }

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

大家还是需要自己动手练习
这里使用的是纯粹的Servlet技术,比较麻烦,后续还会改造一下这个小项目

发表评论

表情:
评论列表 (有 0 条评论,87人围观)

还没有评论,来说两句吧...

相关阅读