当前位置: 首页 > 图灵资讯 > 技术篇> 使用纯Servlet完成单表的CRUD操作

使用纯Servlet完成单表的CRUD操作

来源:图灵教育
时间:2023-05-29 14:07:29

1.使用纯Servlet完成单表【对部门】的增删改查操作。(B/S结构。)262.实现步骤2.1第一步:准备数据库表。(sql脚本)代码在E:\java\course14CRUD

请注意,我们在这里添加dos窗口命令,使用命令sourceEE:\javacourse14\CRUD路径尽量不要用中文

dept.sql

# 部门表      drop table if exists dept;      create table dept(      deptno int primary key,          dname varchar(255),          loc varchar(255)      );      insert into dept(deptno, dname, loc) values(10, 'XiaoShouBu', 'BEIJING');      insert into dept(deptno, dname, loc) values(20, 'YanFaBu', 'SHANGHAI');      insert into dept(deptno, dname, loc) values(30, 'JiShuBu', 'GUANGZHOU');      insert into dept(deptno, dname, loc) values(40, 'MeiTiBu', 'SHENZHEN');      commit;      select * from dept;

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

-准备好HTML页面

-然后可以跑通HTML页面中的所有链接。(页面流通没问题。)

-应该设计哪些页面?

-欢迎页面:index.html

-列表页面:list.html(其他操作以列表页面为核心。)

-新增页面:add.html

-修改页面:edit.html

-详情页面:detail.html

2.3第三步:分析我们的系统包含哪些功能?26

-什么是功能?

-只要这个操作连接到数据库,就表示一个独立的功能。

-包括哪些功能?

-查看部门列表

-新增部门

-删除部门

-查看部门的详细信息

-跳转到修改页面

-修改部门

2.4第四步:在IDEA中建立开发环境26

-创建webapp(为此webapp添加servletetpp)-api.jar和jsp-api.jar到classpath。)

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

-必须在WEB-INF目录下建立新的lib目录,然后将mysql驱动jar包复制到lib目录下。这个目录名必须叫lib,都是小写的。

-JDBC工具类

-将所有HTML页面复制到web目录。

2.5第五步:实现第一个功能:262.5.查看部门列表26-27-27

-如何实现一个功能?

-建议:可以从后端一步一步写到前端。也可以从前端一步一步写到后端。可以。但是记住不要记得写什么。编写代码的过程最好是程序的执行过程。也就是说,你可以写程序执行的地方。这样的顺序流下来后,基本不会出现错误或意外。

-从哪里开始?

-假设从前端开始,必须从用户点击按钮开始。

第一:首先修改前端页面的超链接,因为用户首先点击这个超链接。

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

二是编写web.xml文件

<!--    欢迎页面配置  27-->    <servlet>        <servlet-name>list</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptListServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>list</servlet-name><!--        web.xml文件中的这条路径也是从“/”开始的,但不需要价格项目名称-->        <url-pattern>/dept/list</url-pattern>    </servlet-mapping>

第三:编写Deptlistservlet类继承Httpservlet类。然后重写doget方法。

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;////单表CRUD操作  27public class DeptListServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)             throws ServletException, IOException {            }}

第四:将数据库连接到Deptlistservlet类的doget方法中,查询所有部门,动态显示部门列表页面.

-分析list.html页面中哪一部分固定死亡,哪一部分需要动态显示。

-list.html页面中所有内容的双引号都应该被单引号取代,因为outml页面中的所有内容都应该被单引号取代.print(")这里有一个双引号,容易发生冲突。

-现在写完这个功能,你会觉得开发很繁琐,只用servlet写代码太繁琐了。

 while(rs.next()){            String deptno = rs.getString("a");            String dname = rs.getString("dname");            String loc = rs.getString("loc");                    out.print("<tr>");            out.print("<td>"+(++i)+"</td>");            out.print("<td>"+deptno+"</td>");            out.print("<td>"+dname+"</td>");            out.print("<td>");            out.print("<a href=''>删除</a>");            out.print("<a href='edit.html'>修改</a>");            out.print("<a href='detail.html'>详情</a>");            out.print("</td>");            out.print("</tr>");        }

第五步:查看部门细节。

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

-一定要先找到用户点的“细节”在哪里。找了很久,终于在后端的java程序中找到了

<a href=写一条路径>详情</a>

-详细信息需要连接数据库,因此点击此超链接后还需要执行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文件。

<!--    这是DeptdetailServlet的详细页面配置  27-->    <servlet>        <servlet-name>detail</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptDetailServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>detail</servlet-name>        <!--        web.xml文件中的这条路径也是从“/”开始的,但不需要价格项目名称-->        <url-pattern>/dept/detail</url-pattern>    </servlet-mapping>

-编写一个类别:DeptdetailServlet继承Httpservlet,重写doget方法。

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 DeptDetailServlet extends HttpServlet {            @Override            protected void doGet(HttpServletRequest request, HttpServletResponse response)                    throws ServletException, IOException {                //中文思路(思路来源:你想做什么?目标:查看部门详细信息。目标:查看部门详细信息。)                // 第一步:获取部门编号:                // 第二步:根据部门编号查询数据库,获取部门编号对应的部门信息。                // 第三步:在浏览器上响应部门信息。(显示一个细节。)            }        }

-doget方法:连接数据库,根据部门编号查询部门信息。动态显示部门详细信息页面。

第六步:删除部门28

-如何开始?从哪里开始?从前端页面开始,当用户点击删除按钮时,应提示用户是否删除。因为删除这个动作更危险。在删除任何系统之前,都必须提醒用户,因为删除的动作可能是错误的。(在前端页面上写下JS代码,以提示用户是否删除它。)

          <a href="javascript:void(0)" onclick="del(30)" >删除</a>        <script type="text/javascript">        function del(dno){        if(window.confirm("亲,删除不可恢复哦!")){        document.location.href = "/oa/dept/delete?")){        document.location.href = "/oa/dept/delete?deptno=" + dno;        }        }        </script>

-上述前端程序应写入后端java代码:

-在deptlistservletdoget方法中,使用outlistservletdoget方法.print()方法,将上述前端代码输出到浏览器上。

-解决404问题:

-http://localhost:8080/oa/dept/delete?deptno=30

 <servlet>              <servlet-name>delete</servlet-name>              <servlet-class>com.bjpowernode.oa.web.action.DeptDelServlet</servlet-class>          </servlet>          <servlet-mapping>              <servlet-name>delete</servlet-name>              <url-pattern>/dept/delete</url-pattern>          </servlet-mapping>

-编写Deptdelservlet继承Httpservlet,重写doget方法。

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 DeptDelServlet extends HttpServlet {            @Override            protected void doGet(HttpServletRequest request, HttpServletResponse response)                    throws ServletException, IOException {                // 根据部门编号删除部门。                            }        }

-删除成功或失败时的处理(这里我们选择转发,不使用重定向机制。)

// 判断删除是成功还是失败。          if (count == 1) {              ///成功删除              //仍然跳转到部门列表页面              //部门列表页面的显示需要执行另一个Servlet。怎么办?转发。              request.getRequestDispatcher("/dept/list").forward(request, response);          }else{              // 删除失败              request.getRequestDispatcher("/error.html").forward(request, response);          }

第七步:新部门29

-注:最终保存成功后,转发至/dept/list时,会出现405个错误。为什么?

-第一:post请求用于保存。dopost方法应在底层执行。

-第二:转发是一个请求,以前是post,然后是post,因为它是一个请求。

-第三:/dept/listservlet中只有doget方法。

-如何解决?两种解决方案

-第一种:在/deptdopost方法添加到listservlet中,然后在dopost方法中调用doget。

-二:重定向。

-第八步:跳转到修改部门页面30

-第九步:修改部门30:com中的代码.bjpowernode.oa.utilsDBUtil

package com.bjpowernode.oa.utils;import java.sql.*;import java.util.ResourceBundle;/** * JDBC工具类   27 */public class DBUtil {    // 静态变量:在类加载过程中执行。    // 而且有序。自上而下的顺序。    // 绑定属性资源文件    private static ResourceBundle bundle = ResourceBundle.getBundle("resources.jdbc");    // key根据属性配置文件获得value    private static String driver = bundle.getString("driver");    private static String url = bundle.getString("url");    private static String user = bundle.getString("user");    private static String password = bundle.getString("password");    static {        // 注册驱动(注册驱动只需注册一次,放置在静态代码块中。加载DBUTil类时执行。加载DBUTil类时执行。)        try {            // "com.mysql.jdbc.Driver" 是连接数据库的驱动,不能写死。因为Oracle数据库将来可能会连接起来。            // 在连接oracle数据库时,还需要修改java代码,这显然违反了OCP开关的原则。            // OCP开关原则:对扩展开放,对修改关闭。(什么是符合OCP?不需要修改java源代码进行功能扩展。)            //Class.forName("com.mysql.jdbc.Driver");            Class.forName(driver);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    /**     * 获取数据库连接对象     * @return conn 连接对象     * @throws SQLException     */    public static Connection getConnection() throws SQLException {        // 获取连接        Connection conn = DriverManager.getConnection(url, user, password);        return conn;    }    /**     * 释放资源     * @param conn 连接对象     * @param ps 数据库操作对象     * @param rs 结果集对象     */    public static void close(Connection conn, Statement ps, ResultSet rs){        if (rs != null) {            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (ps != null) {            try {                ps.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if (conn != null) {            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

DeptListServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;////单表CRUD操作  27public class DeptListServlet extends HttpServlet {    ///处理dopost请求  29    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request,response);    }    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///获取应用程序的根路径        String contextPath = request.getContextPath();        //设置项响应的内容类型和字符集,防止中文乱码问题        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        out.print("<!DOCTYPE html>");        out.print("<html>");        out.print("<head>");        out.print("<meta charset='utf-8'>");        out.print("<title>部门列表页面</title>");        ///这部分删除了操作  28        out.print("<script type='text/javascript'>");        out.print("    function del(dno) {");        out.print("        if(window.confirm('请,删除后无法恢复哦){";        out.print("            document.location.href='"+contextPath+"/dept/delete?deptno='+dno");        out.print("        }");        out.print("    }");        out.print("</script>");        out.print("</head>");        out.print("<body>");        out.print("<h1 align='center'>部门列表</h1>");        out.print("<hr>");        out.print("<table border='1px' align='center' width='50%'>");        out.print("<tr>");        out.print("<th>序号</th>");        out.print("<th>部门编号</th>");        out.print("<th>部门名称</th>");        out.print("<th>操作</th>");        out.print("</tr>");        ///上一部分是死的        //连接数据库,查询所有部分门        Connection conn = null;        PreparedStatement ps = null;        ResultSet rs = null;        try {            //获取连接            conn = DBUtil.getConnection();            //编写sql语句            String sql = "select deptno as a,dname,loc from dept";            ///获取预编译数据库操作对象            ps = conn.prepareStatement(sql);            //执行sql语句            rs = ps.executeQuery();            ///处理结果集            int i = 0;            while(rs.next()){                String deptno = rs.getString("a");                String dname = rs.getString("dname");                String loc = rs.getString("loc");                ////这部分是动态的                out.print("<tr>");                out.print("<td>"+(++i)+"</td>");                out.print("<td>"+deptno+"</td>");                out.print("<td>"+dname+"</td>");                out.print("<td>");                out.print("<a href" +                        "='javascript:void(0)' onclick='del("+deptno+")'>删除</a>");                out.print("<a href" +                        "='"+contextPath+"/dept/edit?deptno="+deptno+"'>修改</a>");                out.print("<a href" +                        "='"+contextPath+"/dept/detail?deptno="+deptno+"'>详情</a>");                out.print("</td>");                out.print("</tr>");            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            //关闭,释放资源            DBUtil.close(conn,ps,rs);        }        ////以下部分是死亡的        out.print("</table>");        out.print("<hr>");        out.print("<a href='"+contextPath+"/add.html'>新增部门</a>");        out.print("</body>");        out.print("</html>");    }}

DeptDelServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;////单表CRUD操作  28//删除页面  28public class DeptDelServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///根据部门编号删除部门编号        //设置项响应的内容类型和字符集,防止中文乱码问题        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        // 获取部门号        String deptno = request.getParameter("deptno");        Connection conn = null;        PreparedStatement ps = null;        int count = 0;        try {            //获取数据库连接            conn = DBUtil.getConnection();            ///开启事务(关闭自动提交机制)            conn.setAutoCommit(false);            //编写sql语句            ///获取预编译数据库操作对象            String sql = "delete from dept where deptno = ?";            ps = conn.prepareStatement(sql);            ps.setString(1,deptno);            // 返回值是:影响数据库表中有多少条记录。            count = ps.executeUpdate();            //事务提交            conn.commit();        } catch (SQLException e) {            ///遇到异常要回滚            if(conn!=null){                try {                    conn.rollback();                } catch (SQLException ex) {                    ex.printStackTrace();                }            }            e.printStackTrace();        } finally {            DBUtil.close(conn,ps,null);        }        ///判断删除是否成功或失败        if (count == 1){            ///成功删除            //仍然跳转到部门列表页面            //部门列表页面的显示需要执行另一个Servlet。怎么办?怎么办?转发。            //request.getRequestDispatcher("/dept/list").forward(request,response);            //重定向            response.sendRedirect(request.getContextPath()+"/dept/list");        }else{            ///删除失败            //request.getRequestDispatcher("/error.html").forward(request,response);            //重定向            response.sendRedirect(request.getContextPath()+"/error.html");        }    }}

DeptDetailServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;////单表CRUD操作  详情页面27//  27public class DeptDetailServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //设置项响应的内容类型和字符集,防止中文乱码问题        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        out.print("        <!DOCTYPE html>");        out.print("<html>");        out.print("<head>");        out.print("<meta charset='utf-8'>");        out.print("<title>部门详情</title>");        out.print("</head>");        out.print("<body>");        out.print("<h1>部门详情</h1>");        out.print("<hr>");        ///上部是死的        // 获取部门号        // /oa/dept/detail?fdsafdsas=30        // 虽然提交了30,但服务器获得了字符串“30”。        String deptno = request.getParameter("deptno");        Connection conn = null;        PreparedStatement ps = null;        ResultSet rs = null;        try {            //连接数据库,根部部门编号查询部门信息            conn = DBUtil.getConnection();            //编写sql语句            ///获取预编译数据库操作对象            String sql = "select deptno,dname,loc from dept where deptno=?";            ps = conn.prepareStatement(sql);            ps.setString(1,deptno);            //执行            rs = ps.executeQuery();            //处理结果集,这个结果集只有一个记录            while(rs.next()){                String dname = rs.getString("dname");                String loc = rs.getString("loc");                ///这部分是动态的                out.print("        门编号:"+deptno+" <br>");                out.print("        部门名称:“+dname+" <br>");                out.print("        部门位置:“+loc+" <br>");            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            ///关闭资源            DBUtil.close(conn,ps,rs);        }        ///下部死亡        out.print("<input type='button' value='后退' onclick='window.history.back()' />");        out.print("</body>");        out.print("</html>");    }}

DeptEditServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;////单表CRUD操作  30//修改页面  30public class DeptEditServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///获取根路径        String contextPath = request.getContextPath();        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.print("<!DOCTYPE html>");        out.print("<html>");        out.print("<head>");        out.print("<meta charset='utf-8'>");        out.print("<title>修改部门</title>");        out.print("</head>");        out.print("<body>");        out.print("<h1>修改部门</h1>");        out.print("<hr>");        out.print("<form action='"+contextPath+"/dept/modify' method='post'>");        //获取部门编号        String deptno = request.getParameter("deptno");        //连接数据库,根据部门编号查询部门信息        Connection conn = null;        PreparedStatement ps = null;        ResultSet rs = null;        try {            conn = DBUtil.getConnection();            String sql = "select dname,loc from dept where deptno=?";            ps = conn.prepareStatement(sql);            ps.setString(1,deptno);            rs = ps.executeQuery();            while(rs.next()){                String dname = rs.getString("dname");                String loc = rs.getString("loc");                //输出动态网页                out.print(部门编号<input type='text' name='deptno' value='"+deptno+"' readonly /><br> <!-- readonly代表部门编号不能修改 -->");                out.print(部门名称<input type='text' name='dname' value='"+dname+"'/><br>");                out.print(部门位置<input type='text' name='loc' value='"+loc+"'/><br>");            }        } catch (SQLException e) {            e.printStackTrace();        } finally {            DBUtil.close(conn,ps,rs);        }        out.print("<input type='submit' value='修改' /><br>");        out.print("</form>");        out.print("</body>");        out.print("</html>");    }}

DeptModifyServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;////单表CRUD操作  30////真正修改页面  30public class DeptModifyServlet extends HttpServlet {    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ////解决请求体中文乱码问题        request.setCharacterEncoding("UTF-8");        //获取表单数据        String deptno = request.getParameter("deptno");        String dname = request.getParameter("dname");        String loc = request.getParameter("loc");        ////连接数据库执行更新语句        Connection conn = null;;        PreparedStatement ps = null;        int count = 0;        try {            conn = DBUtil.getConnection();            String sql = "update dept set dname = ?,loc = ?,loc = ? where deptno = ?";            ps = conn.prepareStatement(sql);            ps.setString(1,dname);            ps.setString(2,loc);            ps.setString(3,deptno);            count = ps.executeUpdate();        } catch (SQLException e) {            e.printStackTrace();        } finally {            DBUtil.close(conn,ps,null);        }        if(count==1){            ///成功更新            // 跳转到部门列表页面(部门列表页面通过Java程序动态生成,因此,还需要再次执行另一个Servlet)            //request.getRequestDispatcher("/dept/list").forward(request,response);            //重定向            response.sendRedirect(request.getContextPath()+"/dept/list");        }else{            ///更新失败            //request.getRequestDispatcher("/error.html").forward(request,response);            //重定向            response.sendRedirect(request.getContextPath()+"/error.html");        }    }}

DeptSaveServlet

package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtil;import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;////单表CRUD操作  29//添加页面  29public class DeptSaveServlet extends HttpServlet {    @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //获取部门信息        // 注意乱码问题(Tomcat10不会出现这个问题)        request.setCharacterEncoding("UTF-8");        String deptno = request.getParameter("deptno");        String dname = request.getParameter("dname");        String loc = request.getParameter("loc");        ///连接数据库执行insert语句        Connection conn = null;        PreparedStatement ps = null;        int count = 0;        try {            conn = DBUtil.getConnection();            String sql = "insert into dept(deptno, dname, loc) values(?,?,?,?)";            ps = conn.prepareStatement(sql);            ps.setString(1,deptno);            ps.setString(2,dname);            ps.setString(3,loc);            count = ps.executeUpdate();        } catch (SQLException e) {            e.printStackTrace();        } finally {            DBUtil.close(conn,ps,null);        }        if(count==1) {            ///保存成功跳转到列表页面            //request.getRequestDispatcher("/dept/list").forward(request,response);            // 最好在这里使用重定向(浏览器会发送一个全新的请求。)            // 浏览器在地址栏上发送请求,即get请求。            response.sendRedirect(request.getContextPath()+"/dept/list");        }else{            ///保存失败跳转到错误页面            //request.getRequestDispatcher("/error.html").forward(request,response);            ///这里也建议使用重定向            response.sendRedirect(request.getContextPath()+"/error.html");        }    }}

SRC代码.resourcesjdbc.properties

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/bjpowernodeuser=rootpassword=lzl

index.html

<!-- 单表CRUD操作 欢迎页面    26 --><!DOCTYPE html><html><head><meta charset="utf-8"><title>oa系统欢迎使用</title></head><body><!--当前端超链接发送请求时,请求路径从“/”开始,并带有项目名称   27--><a href="/oa/dept/list">查看部门列表</a></body></html>

add.html

<!-- 单表CRUD操作 新增页面    26 --><!DOCTYPE html><html><head><meta charset="utf-8"><title>新增部门</title></head><body><h1>新增部门</h1><hr><form action="/oa/dept/save" method="post">部门编号<input type="text" name="deptno"/><br>部门名称<input type="text" name="dname"/><br>部门位置<input type="text" name="loc"/><br><input type="submit" value="保存" /><br></form></body></html>

error.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>error</title></head><body><h1>操作失败,<a href="javascript:void(0)" onclick="window.history.back()">返回</a></h1></body></html>

edit.html

<!-- 单表CRUD操作 修改页面    26 --><!DOCTYPE html><html><head><meta charset="utf-8"><title>修改部门</title></head><body><h1>修改部门</h1><hr><form action="list.html" method="get">部门编号<input type="text" name="deptno" value="20" readonly /><br> <!-- readonly代表部门编号不能修改 -->部门名称<input type="text" name="dname" value=“销售部”/><br>部门位置<input type="text" name="loc" value="北京"/><br><input type="submit" value="修改" /><br></form></body></html>

web配置文件.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="https://www.tulingxueyuan.cn/d/file/p/20230529/buk0rhazqip"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"         version="4.0"><!--    这是Deptlistservlet欢迎页面配置  27-->    <servlet>        <servlet-name>list</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptListServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>list</servlet-name><!--        web.xml文件中的这条路径也是从“/”开始的,但不需要价格项目名称-->        <url-pattern>/dept/list</url-pattern>    </servlet-mapping>    <!--    这是DeptdetailServlet的详细页面配置  27-->    <servlet>        <servlet-name>detail</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptDetailServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>detail</servlet-name>        <!--        web.xml文件中的这条路径也是从“/”开始的,但不需要价格项目名称-->        <url-pattern>/dept/detail</url-pattern>    </servlet-mapping>    <!--    这是DeptDelServlet删除页面配置  28-->    <servlet>        <servlet-name>delete</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptDelServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>delete</servlet-name>        <!--        web.xml文件中的这条路径也是从“/”开始的,但不需要价格项目名称-->        <url-pattern>/dept/delete</url-pattern>    </servlet-mapping>    <!--    这是Deptsaveservlet添加页面配置  29-->    <servlet>        <servlet-name>save</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptSaveServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>save</servlet-name>        <!--        web.xml文件中的这条路径也是从“/”开始的,但不需要价格项目名称-->        <url-pattern>/dept/save</url-pattern>    </servlet-mapping>    <!--    这是Depteditservlet修改页面配置  30-->    <servlet>        <servlet-name>edit</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptEditServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>edit</servlet-name>        <!--        web.xml文件中的这条路径也是从“/”开始的,但不需要价格项目名称-->        <url-pattern>/dept/edit</url-pattern>    </servlet-mapping>    <!--    这是DeptmodifyServlet修改页面配置  30-->    <servlet>        <servlet-name>modify</servlet-name>        <servlet-class>com.bjpowernode.oa.web.action.DeptModifyServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>modify</servlet-name>        <!--        web.xml文件中的这条路径也是从“/”开始的,但是项目名不需要价格-->        <url-pattern>/dept/modify</url-pattern>    </servlet-mapping></web-app>

E是html的源代码:\java学习javaWeb\courseCRUD操作\course14\单表oa