声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!
目录
3、把6个 Servlet逻辑处理代码放在 ActionServlet中
一、前言
上一篇文章我们介绍的内容:把 Servlet中jdbc 连接和操作(增删改查)数据库的代码抽取出来,以及结合dao和工厂模式,优化实现了“增删改查”员工信息的相关代码。详细可参考博文:原创 java服务器端开发-servlet:4_2、dao模式_工厂模式_“增删改查”员工信息
这篇文章我们将继续进行优化实现,之前的代码写了6个Servlet类进行“增删改查”员工信息,接下来我们把它整合成一个Servlet,即实现一个servlet处理多种请求_“增删改查”员工信息。
有关理论知识介绍,可参考博文:原创 java服务器端开发-servlet:4、dao 、一个servlet处理多种请求、servlet处理请求资源路径、将中文数据插入数据库
二、如何让一个servlet处理多种请求?
step1,使用后缀匹配模式
我们可以把之前的,配置文件代码:web.xml 修改成如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>web10</display-name>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>web.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<!-- 后缀匹配:
(1)使用"*."开头,后接任意的1个或者多个字符
(2)匹配所有以".do"结尾的请求。
常见如下“url-pattern”标签 -->
<url-pattern>*.do</url-pattern>
<!-- 之前是这样写的 -->
<!-- <url-pattern>/show</url-pattern> -->
</servlet-mapping>
</web-app>
step2,分析请求资源路径
1、新建一个ActionServlet
之前的6个 Servlet代码就不要啦,新建一个ActionServlet
package web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* http://localhost:8080/web10/show.do
* http://localhost:8080/web10/add.do
* http://localhost:8080/web10/del.do
* http://localhost:8080/web10/delAll.do
* http://localhost:8080/web10/load.do
* http://localhost:8080/web10/update.do
*
* @author luminal
*/
public class ActionServlet extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 步骤1:获得请求资源路径
String uri = request.getRequestURI();
System.out.println("uri--->" + uri);// /web10/show.do
// 步骤2:把请求资源路径简化
String action = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
System.out.println("action--->" + action);// /show
// 步骤3:匹配资源路径
if (action.equals("/show")) {
System.out.println("查找员工列表...");
} else if (action.equals("/add")) {
System.out.println("添加员工信息...");
} else if (action.equals("/del")) {
System.out.println("删除个人员工信息...");
} else if (action.equals("/delAll")) {
System.out.println("删除所有员工信息...");
} else if (action.equals("/load")) {
System.out.println("查找一条员工信息,前端页面可编辑,用于修改员工信息....");
} else if (action.equals("/update")) {
System.out.println("修改员工信息-操作修改数据库...");
}
}
}
2、效果演示-匹配 url路径
启动tomact,部署web项目,在谷歌浏览器输入:http://localhost:8080/web10/show
这时候会看到控制台打印如下:
现在路径可以匹配到了,那么我们不妨把其他 6个 Servlet逻辑处理代码,放在上面的条件语句当中
3、把6个 Servlet逻辑处理代码放在 ActionServlet中
下面是把6个 Servlet逻辑处理代码放在 ActionServlet中的具体代码
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.EmployeeDAO;
import entity.Employee;
import util.Factory;
/**
* http://localhost:8080/web10/show.do
* http://localhost:8080/web10/add.do
* http://localhost:8080/web10/del.do
* http://localhost:8080/web10/delAll.do
* http://localhost:8080/web10/load.do
* http://localhost:8080/web10/update.do
* @author luminal
*/
public class ActionServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//步骤1:获得请求资源路径
String uri = request.getRequestURI();
//步骤2:把请求资源路径简化
String action = uri.substring(uri.lastIndexOf("/"),
uri.lastIndexOf("."));
//步骤3:匹配简化后的资源路径
//依据分析结果,调用不同的分支进行处理
//http://ip:port/appname/show.do
if(action.equals("/show")){//查找员工列表
System.out.println("查找员工列表...");
try {
out.println("<table border='1' width='60%' " +
"cellpadding='0' cellspacing='0'>");
out.println("<tr><td>ID</td><td>姓名</td>" +
"<td>薪水</td><td>年龄</td>" +
"<td>操作</td></tr>");
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
List<Employee> employees =
dao.findAll();
for(int i=0;i<employees.size();i++){
Employee e = employees.get(i);
int id = e.getId();
String name = e.getName();
double salary = e.getSalary();
int age = e.getAge();
out.println("<tr><td>" + id
+ "</td><td>" + name
+ "</td><td>" + salary
+"</td><td>" + age
+ "</td><td>" +
"<a href='del.do?id="
+ id + "'>删除</a> " +
"<a href='load.do?id="
+ id + "'>修改</a></td></tr>");
}
out.println("</table>");
out.println("<a href='addEmp.html'>添加新员工</a>");
out.println("<a href='delAll.do'>" + "删除所有雇员</a>");
} catch (Exception e) {
e.printStackTrace();
out.println("系统繁忙,稍后重试");
}
}else if(action.equals("/add")){//添加员工信息
System.out.println("添加员工信息...");
//读请求参数
String name = request.getParameter("name");
String salary = request.getParameter("salary");
String age = request.getParameter("age");
//服务端验证一定要有,此处省略...
//将员工信息插入数据库
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
Employee e = new Employee();
e.setName(name);
e.setSalary(Double.parseDouble(salary));
e.setAge(Integer.parseInt(age));
dao.save(e);
response.sendRedirect("show.do");
} catch (Exception e) {
e.printStackTrace();
out.println("系统繁忙,稍后重试");
}
}else if(action.equals("/del")){//删除个人员工信息
System.out.println("删除个人员工信息...");
/* 获取请求的id */
int id = Integer.parseInt(
request.getParameter("id"));
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
dao.delete(id);
response.sendRedirect("show.do");
}catch(Exception e){
e.printStackTrace();
out.println("系统繁忙,稍后重试");
}
}else if(action.equals("/delAll")){//删除所有员工信息
System.out.println("删除所有员工信息...");
try {
//不要设计任何具体的实现: 具体实现类EmployeeDAOImpl
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
dao.deleteAllData();
response.sendRedirect("show.do");
}catch(Exception e){
e.printStackTrace();
out.println("系统繁忙,稍后重试");
}
}else if(action.equals("/load")){//查找一条员工信息,前端页面可编辑
System.out.println("查找一条员工信息,前端页面可编辑,用于修改员工信息....");
int id = Integer.parseInt(request.getParameter("id"));
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance(
"EmployeeDAO");
Employee e = dao.findById(id);
if(e != null){
String name = e.getName();
double salary = e.getSalary();
int age = e.getAge();
out.println("<form action='update.do?id=" + id + "' method='post'>");
out.println("id:" + id + "<br/>");
out.println("姓名:<input name='name' value='"
+ name + "'/><br/>");
out.println("薪水:<input name='salary' value='"
+ salary + "'/><br/>");
out.println("年龄:<input name='age' value='"
+ age + "'/><br/>");
out.println("<input type='submit' value='提交'/>");
out.println("</form>");
}
}catch(Exception e){
e.printStackTrace();
out.println("系统繁忙,稍后重试");
}
}else if(action.equals("/update")){//修改员工信息-操作修改数据库
System.out.println("修改员工信息-操作修改数据库...");
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
double salary = Double.parseDouble(request.getParameter("salary"));
int age = Integer.parseInt(request.getParameter("age"));
// 将员工信息插入数据库
try {
EmployeeDAO dao =
(EmployeeDAO)Factory.getInstance("EmployeeDAO");
Employee e = new Employee();
e.setId(id);
e.setName(name);
e.setSalary(salary);
e.setAge(age);
dao.update(e);
response.sendRedirect("show.do");
} catch (Exception e) {
e.printStackTrace();
out.println("系统繁忙,稍后重试");
}
}
}
}
4、注意:重定向、表单提交等位置,需要修改为点do
response.sendRedirect("show.do");
三、执行流程简单介绍
步骤1:浏览器输入地址
http://localhost:8080/web10/show.do
匹配找到 ActionServlet 类
步骤2:获取资源路径、简化路径、匹配路径
步骤3:使用工厂、dao模式,封装好 jdbc 连接数据库
1、Factory工厂类,使用工厂模式,读取配置文件,里面对应的包类名
2、依据包类名,通过反射机制创建一个EmployeeDAO实例
3、EmployeeDAO是一个接口,声明了增删改查相关方法
4、EmployeeDAOImpl 实现了 EmployeeDAO 接口的增删改查相关方法,
增删改查相关方法里面,对封装好的 jdbc 连接管理工具类(连接数据库),进行了调用。
5、ActionServlet 里面进行了增删改查相关方法的调用
6、使用重定向等知识点。表格以代码形式,使用 out.println 进行显示