java服务器端开发-servlet:4_3、实现一个servlet处理多种请求_“增删改查”员工信息

声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!

目录

一、前言

二、如何让一个servlet处理多种请求?

step1,使用后缀匹配模式

step2,分析请求资源路径

1、新建一个ActionServlet

2、效果演示-匹配 url路径

3、把6个 Servlet逻辑处理代码放在 ActionServlet中

4、注意:重定向、表单提交等位置,需要修改为点do

三、执行流程简单介绍

步骤1:浏览器输入地址

步骤2:获取资源路径、简化路径、匹配路径

步骤3:使用工厂、dao模式,封装好 jdbc 连接数据库


一、前言

上一篇文章我们介绍的内容:把 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>&nbsp;" +
									"<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 进行显示

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值