使用纯粹的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
<!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>
页面效果如下:
③新增页面: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)最终链接数据库得到的动态页面如下:
第六步:查看部门详情
①用户点击的详情页面在“查看部门列表的”后端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
③写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)换成动态生成的页面数据后,原来静态的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>");
}
}
⑤ 这样就能做到点击哪个部门的详情就显示哪个部门的内容
三:实现部门删除功能
第七步:删除部门
(1)从前端页面开始,用户点击删除按钮的时候,应该提示用户是否删除;因为删除这个动作是比较危险的。任何系统在进行删除操作之前,是必须要提示用户的,因为这个删除的动作有可能是用户误操作。(在前端页面上写JS代码,来提示用户是否删除)
(2)javascript:void(0) 表示:仍然保留住超链接的样子,点击此超链接之后,不进行页面的跳转!
(3)onclick这里表示鼠标单击事件,点击超链接时执行一个回调函数,在回调函数里发送请求!
①前端代码
<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方法
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>");
<!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);
}
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);
}
}
}
五:实现部门修改功能
第九步:跳转到修改部门的页面
①前端代码
<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方法,编写连接数据库代码,进行查看
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是不能修改的!
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);
}
}
}