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

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 Servlet小项目 | 基于纯Servlet手写一个单表的CRUD操作,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

目录

一:设计数据库表及原型

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

三:实现部门删除功能

四:实现部门新增功能

五:实现部门修改功能


一:设计数据库表及原型

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

把sql语句写成一个脚本文件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;

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

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

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

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

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

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

  • 欢迎页面:welcome.html

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

  • 新增页面:add.html

  • 修改页面:modify.html

  • 详情页面:look.html

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

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>欢迎使用OA系统</title>
	</head>
	<body>
		<!-- 点击跳转到部门列页面list.html -->
		<a href="list.html">查看部门列表</a>
	</body>
</html>

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>部门列表页面</title>
	</head>
	<body>
		<h1 align="center">部门列表</h1>
		<hr>
		<table border="1px" align="center" width="50%">
			<tr>
				<th>序号</th>
				<th>部门编号</th>
				<th>部门名称</th>
				<th>执行操作</th>
			</tr>
			<tr>
				<td>1</td>
				<td>10</td>
				<td>销售部</td>
				<td>
					<!-- 执行操作跳转到对应的页面 -->
					<a href="">删除</a>
					<a href="modify.html">修改</a>
					<a href="detail.html">详情</a>
				</td>
			</tr>
			<tr>
				<td>2</td>
				<td>20</td>
				<td>研发部</td>
				<td>
					<!-- 执行操作跳转到对应的页面 -->
					<a href="">删除</a>
					<a href="modify.html">修改</a>
					<a href="detail.html">详情</a>
				</td>
			</tr>
			<tr>
				<td>3</td>
				<td>30</td>
				<td>运营部</td>
				<td>
					<!-- 执行操作跳转到对应的页面 -->
					<a href="">删除</a>
					<a href="modify.html">修改</a>
					<a href="detail.html">详情</a>
				</td>
			</tr>
		</table>
		<!-- 新增部门 -->
		<hr>
		<!-- 跳转到新增页面 -->
		<a href="add.html">新增部门</a>
	</body>
</html>

页面效果如下: 

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

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>新增部门页面</title>
	</head>
	<body>
		<h1>新增部门</h1>
		<hr>
		<!-- form表单,get方式提交 -->
		<!-- 新增完提交后,返回到列表页面:list.html -->
		<form action="list.html" method="get">
			部门编号<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>

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>修改部门页面</title>
	</head>
	<body>
		<h1>修改部门</h1>
		<hr>
		<!-- 修改完提交后,返回到列表页面:list.html -->
		<form action="list.html" method="get">
			<!-- 以下的value实际上是动态获取的,后期会进行修改 -->
			<!-- 但是部门编号是不能修改的,加上readonly,表示只读 -->
			部门编号<input type="text" name="deptno" value="10" readonly/><br>
			部门名称<input type="text" name="dname" value="销售部" /><br>
			部门位置<input type="text" name="loc" value="北京" /><br>
			<input type="submit"  value="修改" /><br>
		</form>
	</body>
</html>

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>部门详情页面</title>
	</head>
	<body>
		<h1>部门详情页面</h1>
		<hr>
		部门编号:10 <br>
		部门名称:销售部<br>
		部门位置:北京<br>
		<!-- 没有表单,利用按钮进行回退到上一步 -->
		<input type="button"  value="后退"  onclick="window.history.back()"/>
	</body>
</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

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

JDBC工具类:DBUtil 

package com.bjpowernode.oa.utils;

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

/**
 * JDBC的工具类
 */
public class DBUtil {

    // 定义为静态变量:在类加载时执行,静态代码块和静态方法里面都需要静态变量。
    // 属性资源文件绑定,在resources包下,且不需要写“.properties”
    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 {
            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();
            }
        }
    }

}

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

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

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

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

<a href="list.html">查看部门列表</a>
<!--修改为-->
<a href="/oa/dept/list">查看部门列表</a>

②编写web.xml文件

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

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

package com.bjpowernode.oa.web.action;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class DeptListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }
}

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

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

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

(3)把静态写死的数据,换成从数据库中动态获取的数据后;原来静态的list.html就可以干掉了!

package com.bjpowernode.oa.web.action;

import com.bjpowernode.oa.utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.oa.web.action
 * @Project:JavaWeb
 * @name:DeptListServlet
 * @Date:2022/11/10 19:05
 */
public class DeptListServlet 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 contextPath = request.getContextPath();

        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 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 {
            // 1,2. 注册驱动和获取连接
            conn = DBUtil.getCoonetion();
            // 3.获取预编译的数据库操作对象
            String sql = "select deptno,dname,loc from dept";
            ps = conn.prepareStatement(sql);
            // 4.执行sql
            rs = ps.executeQuery();
            // 处理查询结果集
            int i = 0;
            while(rs.next()){
                String deptno = rs.getString("deptno");
                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='modify.html'>修改</a>");
                out.print("					<a href='detail.html'>详情</a>");
                out.print("				</td>");
                out.print("			</tr>");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 6.关闭资源
            DBUtil.close(conn,ps,rs);
        }

/*下面一部分是死的*/
        out.print("		</table>");
        out.print("		<hr >");
        out.print("		<a href='add.html'>新增部门</a>");
        out.print("	</body>");
        out.print("</html>");

    }
}

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

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

第六步:查看部门详情

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

<a href="detail.html">详情</a>
<!--进行修改,并传入部门编号-->
<a href='"+contextPath+"/dept/detail?deptno="+deptno+"'>详情</a>");

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

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

③写web.xml文件

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

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

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

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

package com.bjpowernode.oa.web.action;

import com.bjpowernode.oa.utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.oa.web.action
 * @Project:JavaWeb
 * @name:DeptDetailServlet
 * @Date:2022/11/10 20:24
 */
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 >");

        // 根据deptno(key)获取value(部门编号)
        // 虽然是提交的30,但是服务器获取的是"30"这个字符串。
        String deptno = request.getParameter("deptno");

        // 连接数据库,根据部门编号查询部门信息。
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 1,2. 注册驱动和获取连接
            conn = DBUtil.getCoonetion();
            // 3.获取预编译的数据库操作对象
            String sql = "select dname,loc from dept where deptno = ?";
            ps = conn.prepareStatement(sql); // 先编译
            ps.setString(1, deptno); // 在给部门编号(第一个?)赋值
            // 4.执行sql
            rs = ps.executeQuery();
            // 5.处理查询结果集,这个结果集一定只有一条记录,因为deptno是主键。
            if (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>");
    }
}

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

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

三:实现部门删除功能

第七步:删除部门

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

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

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

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

①前端代码

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

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

<a href=''>删除</a>")
<!--修改为-->
<a href='javascript:void(0)' onclick='del("+deptno+")'>删除</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()方法,将以上的前端代码输出到浏览器上即可。

③写web.xml文件

<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方法

删除完成后,需要重新进行连接数据库,进行查询打印信息,所以需要从DeptDeleteServlet这个servlet跳转到另外一个DeptListServlet(servlet),这里目前使用的是转发!

package com.bjpowernode.oa.web.action;

import com.bjpowernode.oa.utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.oa.web.action
 * @Project:JavaWeb
 * @name:DeptDelServlet
 * @Date:2022/11/14 14:42
 */
public class DeptDelServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/htmp;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 根据部门编号,删除部门
        // 1. 获取部门编号,根据key获取value
        String deptno = request.getParameter("deptno");
        // 2. 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        int count = 0;
        try {
            // 注册驱动和获取连接
            conn = DBUtil.getCoonetion();
            // 获取预编译的数据库操作对象
            String sql = "delete from dept where deptno = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,deptno);
            // 返回值是:影响了数据库当中多少数据
            // 这里根据主键删除,肯定只影响的一条
            count = ps.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 关闭资源
            DBUtil.close(conn,ps,null);
        }

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

⑤删除失败,跳转的页面

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

四:实现部门新增功能

第八步:新增部门

①前端代码

<a href='add.html'>新增部门</a>
<!--修改为-->
<a href='"+contextPath+"add.html'>新增部门</a>");

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

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>新增部门</title>
	</head>
	<body>
		<h1>新增部门</h1>
		<hr >
        <!--<form action="list.html" method="get"-->
        <!--修改,提交数据需要post请求-->
        <!--form action="/oa/dept/add" method="post"-->
		<form action="/oa/dept/add" 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>

②写web.xml文件

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

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

怎么解决?两种方案

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

  • 第二种:重定向

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

因为是向服务器发送数据,所以这里要通过getParameter()方法,获取到向服务器发送的数据;然后在执行sql语句,进行数据的插入操作;并且我们插入数据又要重新连接数据库,进行数据的打印,这和前面删除的操作实现相同的,需要从DepAddServlet这个servlet跳转到另外一个DeptListServlet(servlet),这里目前使用的还是转发!

package com.bjpowernode.oa.web.action;

import com.bjpowernode.oa.utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.oa.web.action
 * @Project:JavaWeb
 * @name:DeptAddServlet
 * @Date:2022/11/14 15:58
 */
public class DeptAddServlet 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");
        // 连接数据库执行insert语句
        Connection conn = null;
        PreparedStatement ps = null;
        int count = 0;
        try {
            // 注册驱动和获取连接
            conn = DBUtil.getCoonetion();
            // 获取预编译数据库操作对象
            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);
            // 执行sql
            count = ps.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,ps,null);
        }

        if (count == 1) {
            // 保存成功调转到列表页面
            request.getRequestDispatcher("/dept/list").forward(request,response);
        }else{
            // 保存失败,跳转到失败页面
            request.getRequestDispatcher("/error.html").forward(request,response);
        }


    }
}

五:实现部门修改功能

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

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

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

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

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

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

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

①前端代码

<a href='modify.html'>修改</a>")
<!--修改为-->
<a href='"+contextPath+"/dept/modify?deptno="+deptno+"'>修改</a>")

②写web.xml文件

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

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

package com.bjpowernode.oa.web.action;

import com.bjpowernode.oa.utils.DBUtil;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.oa.web.action
 * @Project:JavaWeb
 * @name:DeptModifyServlet
 * @Date:2022/11/14 18:34
 */
public class DeptModifyServlet 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 contextPath = request.getContextPath();
        // 获取部门编号
        String deptno = request.getParameter("deptno");

        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='' method='get'>");

        // 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 注册驱动和获取连接
            conn = DBUtil.getCoonetion();
            // 获取预编译的数据库操作对象
            String sql = "select dname,loc from dept where deptno = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, deptno);
            // 执行sql
            rs = ps.executeQuery();
            // 处理查询结果集,肯定是只有一条数据
            if (rs.next()) {
                String dname = rs.getString("dname");
                String loc = rs.getString("loc");
                // 输出到页面
                out.print("部门编号<input type='text' name='deptno' value='"+deptno+"' readonly /><br>");
                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>");
    }

}

第十步:修改部门

①前端代码

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

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

<form action='' method='get'>
<!--修改为-->
<form action='"+contextPath+"/dept/update' method='post'>

②写web.xml文件

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

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

所谓修改实际上就是调用getParameter()方法拿到前端提交的数据,然后直接插入到数据库

package com.bjpowernode.oa.web.action;

import com.bjpowernode.oa.utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.oa.web.action.com.bjpowernode.oa.web.action
 * @Project:JavaWeb
 * @name:DeptUpdateServlet
 * @Date:2022/11/14 19:19
 */
public class DeptUpdateServlet 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.getCoonetion();
            // 获取预编译数据库操作对象
            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);
            // 执行sql,返回更新的条数
            count = ps.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,ps,null);
        }

        if(count == 1){
            // 更新成功,使用转发
            request.getRequestDispatcher("/dept/list").forward(request,response);
        }else{
            request.getRequestDispatcher("/error.html").forward(request,response);
        }
    }
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128437.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!