首页 > 其他分享 >使用纯Servlet完成单表的CRUD操作

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

时间:2023-05-28 15:36:03浏览次数:42  
标签:java request CRUD 单表 sql print import Servlet out

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

2. 实现步骤

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

代码在E:\java\course14\CRUD  

注意这里我们添加表的方式是dos窗口命令,使用命令source  E:\java\course14\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添加servlet-api.jar和jsp-api.jar到classpath当中。)

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

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

    - JDBC的工具类

    - 将所有HTML页面拷贝到web目录下。

2.5 第五步:实现第一个功能:  26

2.5.1 查看部门列表  26-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操作  27
public class DeptListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        
    }
}
第四:在DeptListServlet类的doGet方法中连接数据库,查询所有的部门,动态的展示部门列表页面.

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

      - list.html页面中的内容所有的双引号要替换成单引号,因为out.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?deptno=" + dno;
        		}
        	}
        </script>

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

      - DeptListServlet类的doGet方法当中,使用out.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/list Servlet当中只有一个doGet方法。

      - 怎么解决?两种方案

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

        - 第二种:重定向。


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


  - 第九步:修改部门  30

代码在com.bjpowernode.oa.utils

DBUtil

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类加载的时候执行。)
        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操作  27
public 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
//删除页面  28
public 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
//详情页面  27
public 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
//修改页面  30
public 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
//真正的修改页面  30
public 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 = ? 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
//添加页面  29
public 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.resources

jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bjpowernode
user=root
password=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="http://www.w3.org/2001/XMLSchema-instance"
         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>

html的源码在E:\java学习\javaWeb\course\course14\单表的CRUD操作\oa

标签:java,request,CRUD,单表,sql,print,import,Servlet,out
From: https://blog.51cto.com/u_15784725/6365082

相关文章

  • 如何证明Servlet是单例的?
    Servlet是web体系里面最重要的部分,下面罗列几道常见的面试题,小伙伴们一定要好好记住哈。1.Servlet是单例的吗,如何证明?Servlet一般都是单例的,并且是多线程的。如何证明Servlet是单例模式呢?很简单,重写Servlet的init方法,或者添加一个构造方法。然后,在web.xml中配置。如:<?xml ve......
  • 之前servlet可用,之后修改,调用又表现为空白
    之前能够显示。看自己代码发现自己上层发完,无处理,没进行跳转。 修改后可以 ......
  • Expected MultipartHttpServletRequest: is a MultipartResolver configured方案。
    //1.报错:ExpectedMultipartHttpServletRequest:isaMultipartResolverconfigured?//2.解决<!--uploadify文件上传组件--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>......
  • 黑马优化Servlet
    问题:平常我们编写servlet的时候,经常会一个java文件写一个方法调用这样很麻烦,会写一堆的Servlet文件解决方法:编写基本的baseservlet,之后其他的文件采用/Brand/*调用该方法,替换HttpServlet,根据请求的最后一段路径来进行方法分发BaseServlet.java文件packagecom.hailei.web.ser......
  • 上下文管理者(ServletContext)
    作用1.获取全局初始化参数2.资源共享(servlet通信)能让上下文呢的Servlet相互关联起来3.获取资源文件生命周期创建服务器启动的时候会为每个项目创建一个servletContext上下文对象,servleContext是项目的一个引用销毁在服务器关闭或者移除项目的时候servletContext销毁获取方......
  • Java-Servlet解析
    前言从事Javaweb项目开发有一段时间了,一直不理解它是怎么一回事,后来查询资料发现这里面涉及到几个东西,分别是tomcat、JavaEE中13个规范之一的servlet、以及springMVC。于是就去学习了一下,发现这里里面都是围绕这servlet进行的操作。于是就有了今天的这个总结。Servlet定义Servl......
  • ServletContext接口详解
    1. ServletContext是什么?  14 *  ServletContext是接口,是Servlet规范中的一员。2. ServletContext是谁实现的?14 *  Tomcat服务器(WEB服务器)实现了ServletContext接口。 *  public class org.apache.catalina.core.ApplicationContextFacade implements ServletCont......
  • 为什么MySQL单表不能超过2000万行?
    摘要:MySQL一张表最多能存多少数据?本文分享自华为云社区《为什么MySQL单表不能超过2000万行?》,作者:GaussDB数据库。最近看到一篇《我说MySQL每张表最好不要超过2000万数据,面试官让我回去等通知》的文章,非常有趣。文中提到,他朋友在面试的过程中说,自己的工作就是把用户操作信息......
  • java web之中,如果Servlet中有耗时较长的计算,该怎么做才好?
    javaweb之中,如果Servlet中有耗时较长的计算,该怎么做才好?下面用Thread.sleep(5000)来模拟耗时较长的计算:publicclasscalcServletextendsHttpServlet{ /** *Destructionoftheservlet.<br> */ publicvoiddestroy(){ super.destroy();//Justputs"destroy"s......
  • servJump extends HttpServlet //request.getRequestDispatcher //response.sendRed
    packagecom.test;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.HashMap;importjava.util.Map;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;impo......