二、删除员工的功能
创建一个servlet
名为EmpDeleteServlet
,以下是属性修改效果图
web.xml
在原来基础上自动添加相应代码,我们对其添加注释
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 对com.bzxy.test包下的HelloServlet进行配置 -->
<servlet>
<servlet-name>hello</servlet-name> <!-- 对要配置的Servlet起别名 -->
<servlet-class>com.bzxy.test.HelloServlet</servlet-class> <!-- 配置的Servlet的位置,写所在的包名+类名即可 -->
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name> <!-- 要和上面的servlet-name的内容保持一致 -->
<url-pattern>/ho</url-pattern> <!-- 浏览器访问服务器端servlet的url地址 -->
</servlet-mapping>
<!-- 对com.bzxy.test包下的RegisteServlet进行配置 -->
<servlet>
<servlet-name>RegisteServlet</servlet-name> <!-- 对要配置的Servlet起别名 -->
<servlet-class>com.bzxy.test.RegisteServlet</servlet-class> <!-- 配置的Servlet的位置,写所在的包名+类名即可 -->
</servlet>
<!-- 对com.bzxy.emp包下的EmpListServlet进行配置 -->
<servlet>
<servlet-name>EmpListServlet</servlet-name>
<servlet-class>com.bzxy.emp.EmpListServlet</servlet-class>
</servlet>
<!-- 对com.bzxy.emp包下的EmpDeleteServlet进行配置 -->
<servlet>
<servlet-name>EmpDeleteServlet</servlet-name>
<servlet-class>com.bzxy.emp.EmpDeleteServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisteServlet</servlet-name> <!-- 要和上面的servlet-name的内容保持一致 -->
<url-pattern>/registe</url-pattern> <!-- 浏览器访问服务器端servlet的url地址 -->
</servlet-mapping>
<servlet-mapping>
<servlet-name>EmpListServlet</servlet-name>
<url-pattern>/list</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>EmpDeleteServlet</servlet-name>
<url-pattern>/delete</url-pattern>
</servlet-mapping>
</web-app>
测试doGet、doPost、service方法的区别
代码部分:
EmpDeleteServlet.java
package com.bzxy.emp;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//服务器端的servlet -- 删除员工的信息
public class EmpDeleteServlet extends HttpServlet {
//浏览器端发送的是get请求方式 -- doGet和service方法
//浏览器端发送的是post请求方式 -- doPost和service方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("测试doGet...");
}
//do Post 快捷键 Alt + /
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("测试doPost...");
}
//service 快捷键 Alt + /
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
System.out.println("测试service...");
}
}
registe.html
<!-- 版本信息 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- action="" 表示点击提交按钮此表单会向哪个servlet发送请求,双引号中写哪一个url-pattern地址,
此表单就会向哪一个servlet发送请求。【访问页面,点击提交,成功访问到RegisteServlet】-->
<!-- 默认浏览器地址栏中会显示数据,method="get";而不显示则修改为,method="post" -->
<form action="delete" method="post">
用户名:<input type="text" name="username"/>
<br/>
密码:<input type="password" name="pwd"/>
<br/>
兴趣爱好:读书<input type="checkbox" name="love" value="readbook"/>
写字<input type="checkbox" name="love" value="write"/>
打球<input type="checkbox" name="love" value="playball"/>
上网<input type="checkbox" name="love" value="online"/>
<br/>
<input type="submit" name="smt" value="提交"/>
</form>
<!-- 测试超链接的请求方式 -->
<a href="http://www.baidu.com">你好</a>
<br/>
<!-- 没有传递参数,username接收为空,异常为NullPointerException -->
<!-- <a href="registe">hello</a> -->
<a href="ho">hello</a>
<br/>
<a href="registe?username=ls&pwd=123&love=ds&love=xz&id=1001">点我可访问RegisteServlet</a>
</body>
</html>
service方法优先执行
第一步:
在registe.html
中修改代码:
第二步:
若在浏览器中输入http://localhost:8080/servlettest/registe.html
,则如图下显示:
第三步:
点击提交
,在控制台内看到如图所示:
上述做法为EmpDeleteServlet.java
代码不进行注释,所造成的结果
在get请求方式两种方法都支持,优先执行service
方法
doGet方法
在EmpDeleteServlet.java
代码内部注释掉service
方法
再点击提交
,故控制台内如图显示:
doPost方法
在registe.html
中修改代码:
在EmpDeleteServlet.java
代码内部注释掉service
及doGet
方法
再提交
,故控制台内如图显示:
service方法
在registe.html
中修改代码为get
或post
使用service
方法都可以,效果图如下:
post
控制台内显示:
get
控制台内显示:
针对上述问题的讨论,我们选用doGet
方法,其他方法注释掉,原因如下:
在浏览器端向服务器端发送请求的几种方式:
1)浏览器地址栏输入地址回车
2)点击超链接
3)表单 --> get post
4)普通按钮 button + js -->
具体上述几种方式用法可点击本处
选用点击超链接的方式,而其为get请求方式,故删除请求方式使用doGet请求方式
通过EmpDeleteServlet去连接数据库,进行删除操作
第一步:
package com.bzxy.emp;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//服务器端的Servlet -- 员工信息显示的
public class EmpListServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1)在该servlet中要将mysql数据库中的数据获取到(jdbc)
ResultSet rs = null;
try {
//① 注册加载驱动 (需要在Web项目中,引入的mysqlxx.jar包需要注册加载后才能正常使用)
//!Java项目不需要,Web项目
Class.forName("com.mysql.jdbc.Driver");
//② 获得数据库mysql的连接
//jdbc、mysql、localhost(本地地址)、3306(端口号)、test1(库名)
String url = "jdbc:mysql://localhost:3306/test1";
String username = "root";
String pwd = "";
Connection con = DriverManager.getConnection(url, username, pwd);
System.out.println("连接为:" + con);
//③ 预编译sql语句
String sql = "select * from emp";
PreparedStatement prep = con.prepareStatement(sql);
//④ 执行sql语句,获得结果集
rs = prep.executeQuery();
//先将结果集rs中数据输出在控制台上测试一下
/*
while (rs.next()) {
System.out.println(rs.getInt("id") + "," + rs.getString("name") + "," + rs.getString("pwd")+ ","
+ rs.getDouble("salary") + "," + rs.getDate("birthday"));
}
*/
} catch (Exception e) {
e.printStackTrace();
}
//2)在该Servlet中将获取的数据显示在页面中
response.setContentType("text/html;charset=utf-8");
try {
//获得PrintWriter,向页面端写内容
PrintWriter pw = response.getWriter();
//使用pw向页面输出一个表格
pw.println("<table border='1' cellspacing='0' width='600' align='center'>");
//表格的标题
pw.println("<caption>员工信息表</caption>");
//表格的第一行 编号、姓名、密码、工资、
pw.println("<tr align='center'><td>编号</td><td>姓名</td><td>密码</td><td>工资</td><td>生日</td><td>操作</td></tr>");
//表格的第二行到第N行
while (rs.next()) {
//pw.println(rs.getInt("id") + "," + rs.getString("name") + "," + rs.getString("pwd")+ ","
//+ rs.getDouble("salary") + "," + rs.getDate("birthday") + "<br/>");
pw.println("<tr align='center'><td>" + rs.getInt("id")+ "</td><td>" + rs.getString("name") + "</td><td>"
+ rs.getString("pwd") + "</td><td>" + rs.getDouble("salary") + "</td><td>"
+ rs.getDate("birthday") + "</td><td>删除</td></tr>");
}
//表格的最后一行
pw.println("<tr><td colspan='6'><a href='http://www.baidu.com'>点我添加员工信息</a></td></tr>");
pw.println("</table>");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
修改代码:
效果图:
若在浏览器中输入http://localhost:8080/servlettest/list
,则如图下显示:
第二步:
测试数据库mysql是否连接成功
代码如下:
package com.bzxy.emp;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//服务器端的servlet -- 删除员工的信息
public class EmpDeleteServlet extends HttpServlet {
//浏览器端发送的是get请求方式 -- doGet和service方法
//浏览器端发送的是post请求方式 -- doPost和service方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1)通过EmpDeleteServlet去连接数据库,进行删除 -- jdbc技术
try {
//① 注册加载驱动
Class.forName("com.mysql.jdbc.Driver");
//② 获得数据库的连接
//jdbc:(连接)mysql://localhost(本地地址):3306(端口号)/test1(使用的库)
String url = "jdbc:mysql://localhost:3306/test1";
String username = "root";
String pwd = "";
Connection con = DriverManager.getConnection(url, username, pwd);
System.out.println("连接为:" + con);
//③ 预编译sql语句
//④ 执行sql语句
} catch (Exception e) {
e.printStackTrace();
}
//2)通过EmpDeleteServlet,将删除成功后的结果在页面上显示出来
//System.out.println("测试doGet...");
}
//do Post 快捷键 Alt + /
/*
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("测试doPost...");
}
*/
//service 快捷键 Alt + /
/*
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
System.out.println("测试service...");
}
*/
}
若在浏览器中输入http://localhost:8080/servlettest/list
,则如图下显示:
点击删除,出现此形式:
控制台显示为这种格式的,说明连接成功:
第三步:
在EmpDeleteServlet.java
中修改代码:
若在浏览器中输入http://localhost:8080/servlettest/list
,则如图下显示:
每把鼠标移动到编号1 2 3 4
对应的删除
,左下角显示为:
第四步:
在EmpDeleteServlet.java
中,添加代码
package com.bzxy.emp;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//服务器端的servlet -- 删除员工的信息
public class EmpDeleteServlet extends HttpServlet {
//浏览器端发送的是get请求方式 -- doGet和service方法
//浏览器端发送的是post请求方式 -- doPost和service方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//通过request接收删除超链接请求中的参数值localhost:8080/servlettest/delete?id=1/2/3..
String s = request.getParameter("id");
System.out.println("参数值为:" + s);
//1)通过EmpDeleteServlet去连接数据库,进行删除 -- jdbc技术
try {
//① 注册加载驱动
Class.forName("com.mysql.jdbc.Driver");
//② 获得数据库的连接
//jdbc:(连接)mysql://localhost(本地地址):3306(端口号)/test1(使用的库)
String url = "jdbc:mysql://localhost:3306/test1";
String username = "root";
String pwd = "";
Connection con = DriverManager.getConnection(url, username, pwd);
System.out.println("连接为:" + con);
//③ 预编译sql语句
String sql = "delete from emp where id=?";
PreparedStatement prep = con.prepareStatement(sql);
//Integer.parseInt("3") --> 3 将字符串类型转换成int类型
prep.setInt(1, Integer.parseInt(s));
//④ 执行sql语句
prep.executeUpdate(); //删除、修改和插入都调用executeUpdate方法
} catch (Exception e) {
e.printStackTrace();
}
//2)通过EmpDeleteServlet,将删除成功后的结果在页面上显示出来
//System.out.println("测试doGet...");
}
//do Post 快捷键 Alt + /
/*
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("测试doPost...");
}
*/
//service 快捷键 Alt + /
/*
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
System.out.println("测试service...");
}
*/
}
其中存在bug,setInt
爆红,原因接收的值为字符串类型,效果图如下:
解决方法:
在控制台显示:
第五步:
测试运行,若在浏览器中输入http://localhost:8080/servlettest/list
,则如图下显示:
点击编号为3
对应的删除,地址跳转结果为:
空白
需手动输入http://localhost:8080/servlettest/list
,则如图下显示:
查询mysql数据库,对应的编号3
员工删除成功,效果图如下:
通过EmpDeleteServlet,将删除成功后的结果在页面中显示出来
代码部分:
package com.bzxy.emp;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//服务器端的servlet -- 删除员工的信息
public class EmpDeleteServlet extends HttpServlet {
//浏览器端发送的是get请求方式 -- doGet和service方法
//浏览器端发送的是post请求方式 -- doPost和service方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//通过request接收删除超链接请求中的参数值localhost:8080/servlettest/delete?id=1/2/3..
String s = request.getParameter("id");
System.out.println("参数值为:" + s);
//1)通过EmpDeleteServlet去连接数据库,进行删除 -- jdbc技术
try {
//① 注册加载驱动
Class.forName("com.mysql.jdbc.Driver");
//② 获得数据库的连接
//jdbc:(连接)mysql://localhost(本地地址):3306(端口号)/test1(使用的库)
String url = "jdbc:mysql://localhost:3306/test1";
String username = "root";
String pwd = "";
Connection con = DriverManager.getConnection(url, username, pwd);
System.out.println("连接为:" + con);
//③ 预编译sql语句
String sql = "delete from emp where id=?";
PreparedStatement prep = con.prepareStatement(sql);
//Integer.parseInt("3") --> 3 将字符串类型转换成int类型
prep.setInt(1, Integer.parseInt(s));
//④ 执行sql语句
prep.executeUpdate(); //删除、修改和插入都调用executeUpdate方法
} catch (Exception e) {
e.printStackTrace();
}
//2)通过EmpDeleteServlet,将删除成功后的结果在页面上显示出来
//删除成功以后,只需要重新回到http://localhost:8080/servlettest/list地址就可以了
//重定向:当事情执行完毕以后,重新回到某一个地址
//response.sendRedirect("url-pattern的地址"),根据url-pattern的地址来访问哪个servlet
response.sendRedirect("list");
//System.out.println("测试doGet...");
}
//do Post 快捷键 Alt + /
/*
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("测试doPost...");
}
*/
//service 快捷键 Alt + /
/*
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
System.out.println("测试service...");
}
*/
}
效果图:
把对应编号1 2 4
都删除,显示结果为:
注意:点击删除
成功以后,自动回到http://localhost:8080/servlettest/list
地址