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>