使用纯粹的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表和插入数据!

第二步:准备一套HTML页面(项目原型)
(1)把HTML页面准备好,然后将HTML页面中的链接都能够跑通。(页面流转没问题)
(2)此时设计的页面显示的内容都是写死的,后期连接数据库会进行动态获取。
(3)应该设计的页面(模板框架)
欢迎页面:welcome.html
列表页面:list.html(以列表页面为核心,展开其他操作)
新增页面:add.html
修改页面:modify.html
详情页面:look.html
注意:以下的页面都只是作为框架使用,目前都是写死的,后面会逐渐在代码中动态获取的形式!
①欢迎页面:welcome.html可以跳转到列表页面list.html
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>欢迎使用OA系统title>
- head>
- <body>
-
- <a href="list.html">查看部门列表a>
- body>
- html>
②列表页面:list.html可以跳转到新增、修改、详情页面
- 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>1td>
- <td>10td>
- <td>销售部td>
- <td>
-
- <a href="">删除a>
- <a href="modify.html">修改a>
- <a href="detail.html">详情a>
- td>
- tr>
- <tr>
- <td>2td>
- <td>20td>
- <td>研发部td>
- <td>
-
- <a href="">删除a>
- <a href="modify.html">修改a>
- <a href="detail.html">详情a>
- td>
- tr>
- <tr>
- <td>3td>
- <td>30td>
- <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>
页面效果如下:

③新增页面:add.html可以跳转到列表页面list.html
- 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" /><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
- 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="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
- 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>listservlet-name>
- <servlet-class>com.bjpowernode.oa.web.action.DeptListServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>listservlet-name>
- <url-pattern>/dept/listurl-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(" ");
- out.print("");
- out.print(" ");
- out.print(" ");
- out.print("
"); - out.print(" ");
- out.print(" ");
- out.print("
部门列表
"); - out.print("
"); - out.print("
");- out.print("
");- out.print("
序号 "); - out.print("
部门编号 "); - out.print("
部门名称 "); - out.print("
操作 "); - out.print("
"); - /*上面一部分是死的*/
-
- // 连接数据库
- 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");
- // 这里代码是动态的
- }
-
- } catch (SQLException e) {
- e.printStackTrace();
- }finally {
- // 6.关闭资源
- DBUtil.close(conn,ps,rs);
- }
-
- /*下面一部分是死的*/
- out.print("
"); - out.print("
"); - out.print(" 新增部门");
- out.print(" ");
- out.print("");
-
- }
- }
(4)最终链接数据库得到的动态页面如下:

第六步:查看部门详情
①用户点击的详情页面在“查看部门列表的”后端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>detailservlet-name>
- <servlet-class>com.bjpowernode.oa.web.action.DeptDetailServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>detailservlet-name>
- <url-pattern>/dept/detailurl-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("");
- out.print("");
- out.print(" ");
- out.print(" ");
- out.print("
部门详情 "); - out.print(" ");
- out.print(" ");
- out.print("
部门详情
"); - out.print("
"); -
- // 根据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 + "
"); - out.print("部门名称:" + dname + "
"); - out.print("部门位置:" + loc + "
"); - }
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- DBUtil.close(conn, ps, rs);
- }
-
- out.print(" ");
- out.print(" ");
- out.print("");
- }
- }
⑤ 这样就能做到点击哪个部门的详情就显示哪个部门的内容

第七步:删除部门
(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>deleteservlet-name>
- <servlet-class>com.bjpowernode.oa.web.action.DeptDelServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>deleteservlet-name>
- <url-pattern>/dept/deleteurl-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);
- }
- }
- }
⑤删除失败,跳转的页面
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>errottitle>
- 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请求,这是和前面不一样的!
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>新增部门title>
- head>
- <body>
- <h1>新增部门h1>
- <hr >
-
-
-
- <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>addservlet-name>
- <servlet-class>com.bjpowernode.oa.web.action.DeptAddServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>addservlet-name>
- <url-pattern>/dept/addurl-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>modifyservlet-name>
- <servlet-class>com.bjpowernode.oa.web.action.DeptModifyServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>modifyservlet-name>
- <url-pattern>/dept/modifyurl-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("");
- out.print("");
- out.print(" ");
- out.print(" ");
- out.print("
修改部门 "); - out.print(" ");
- out.print(" ");
- out.print("
修改部门
"); - out.print("
"); - out.print(" );
-
- // 连接数据库
- 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("部门编号
"); - out.print("部门名称
"); - out.print("部门位置
"); -
- }
-
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- // 关闭资源
- DBUtil.close(conn, ps, rs);
- }
-
- out.print("
"); - out.print(" ");
- out.print(" ");
- out.print("");
- }
-
- }
第十步:修改部门
①前端代码
第二次点击修改按钮,才是真正意义上的数据修改,需要发送新的请求!
修改和新增差不多,都需要向前端发送数据,肯定也是使用的是post请求方式!
- <form action='' method='get'>
- <form action='"+contextPath+"/dept/update' method='post'>
②写web.xml文件
- <servlet>
- <servlet-name>updateservlet-name>
- <servlet-class>com.bjpowernode.oa.web.action.DeptUpdateServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>updateservlet-name>
- <url-pattern>/dept/updateurl-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等技术对这个项目进行一步步的优化;目前我们需要掌握其中的原理即可!