模型-视图-控制器(MVC)

1、优点:

  1. 提高javaWeb开发代码的复用性,避免了重复性开发
  2. 有效帮助开发人员实现业务开发中的【事务管理】

2、组成:

C: controller,控制层
M: model,业务模型层,完成业务处理。包括dao层(直接操作数据库)和service层(调用dao层来完成业务实现,负责管理所调用的dao层的【事务管理】)
V: view,视图层,将处理结果写入到响应包 JSP

3、Dao层的作用:

在这里插入图片描述

4、Dao层的实现:

在这里插入图片描述

5、独立使用Dao层处理业务存在的问题:

在这里插入图片描述

6、service层作用:

在这里插入图片描述

7、service层的实现:

在这里插入图片描述

8、java.lang.ThreadLocal:本地线程库

public static void main(String[] args){
		ThreadLocal threadLocal = new ThreadLocal();
		Object obj = threadLocal.get();
		if(null==obj){
			String str = "666";
			threadLocal.set(str);
		}
		obj = threadLocal.get();
		System.out.println(obj);
		threadLocal.remove();
		obj = threadLocal.get();
		System.out.println(obj);
	}

9、service的简化开发:

在这里插入图片描述

10、代理设计模式:

在这里插入图片描述
在这里插入图片描述

代理模式例子:程序员送花
在这里插入图片描述
PGService.java:

package 代理模式实现.service;
/**
 * 程序员接口
 * @author Jack
 *
 */
public interface PGService {
	public void giveFlower();//送花
}

PGServiceImpl.java:

package 代理模式实现.serviceimpl;

import 代理模式实现.service.PGService;
/**
 * 程序员接口的实现类
 * @author Jack
 *
 */
public class PgServiceImpl implements PGService{

	@Override
	public void giveFlower() {
		System.out.println("姑娘,这是给你的花。。。");
	}

}

Agent.java:

package 代理模式实现.agentutil;

import 代理模式实现.service.PGService;
import 代理模式实现.serviceimpl.PgServiceImpl;
/**
 * 代理实现类:
 * 1、实现与被帮助对象同样的接口
 * 2、将需要帮助对象作为属性声明
 * 3、通过构造方法得到需要帮助的对象
 * 4、在代理方法中,让被帮助的对象完成主要功能---送花
 * @author Jack
 *
 */
public class Agent implements PGService{

	private PgServiceImpl 程序员;
	
	public Agent(PgServiceImpl 程序员){
		this.程序员 = 程序员;
	}
	@Override
	public void giveFlower() {
		this.程序员.giveFlower();//被帮助的对象自己送花
		//代理对象帮忙增强
		System.out.println("我这个兄弟,是一个伟大的程序员,只要有键盘和手他就能解决一切问题。");
	}

}

TestMain.java:

package 代理模式实现.test;

import 代理模式实现.agentutil.Agent;
import 代理模式实现.service.PGService;
import 代理模式实现.serviceimpl.PgServiceImpl;

public class TestMain {
	public static void main(String[] args) {
		PgServiceImpl 张三 = new PgServiceImpl();
		PGService 李四 = new Agent(张三);
		李四.giveFlower();
	}
}

在这里插入图片描述

11、动态代理模式:

在这里插入图片描述

12、动态代理实现类的开发步骤:

在这里插入图片描述
动态代理实现类例子:
在这里插入图片描述

DeptService.java:

package 动态代理模式.service;

public interface DeptService {
	public void save();
	public void delete();
}

DeptServiceImpl.java:

package 动态代理模式.serviceimpl;

import 动态代理模式.service.DeptService;

public class DeptServiceImpl implements DeptService{

	@Override
	public void save() {
		System.out.println("DeptServiceImpl来完成插入数据业务");
	}

	@Override
	public void delete() {
		System.out.println("DeptServiceImpl来完成删除数据业务");
	}

}

EmpService.java:

package 动态代理模式.service;

public interface EmpService {
	public void update();
	public void select();
}

EmpServiceImpl.java:

package 动态代理模式.serviceimpl;

import 动态代理模式.service.EmpService;

public class EmpServiceImpl implements EmpService{

	@Override
	public void update() {
		System.out.println("EmpServiceImpl来完成具体的更新业务");
	}

	@Override
	public void select() {
		System.out.println("EmpServiceImpl来完成具体的查询业务");
	}

}

Agent.java:

package 动态代理模式.util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

public class Agent implements InvocationHandler{

	private Object obj;
	
	public Agent(Object obj){
		this.obj=obj;
	}
	/**
	 * invoke方法时JVM调用的
	 * invoke方法的三个参数由JVM提供
	 * @param proxy:需要被帮助的对象
	 * @param method:本次正常调用的方法 update,select。。。
	 * @param args:本次正常调用的方法在运行时得到的实参
	 * 
	 * JVM接收到一个命令:一个被帮助对象.一个需要增强的方法
	 * EmpService obj = xxxx;
	 * obj.save("mike",10000);
	 * 
	 * JVM将当前的命令分解:
	 * save方法 封装为Method类型对象
	 * save方法运行时所得到的实参 封装到一个Object类型的数组【"mike","10000"】
	 * 然后将这三个内容作为参数交给代理实现类中的invoke
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		Object result = null;
		//1、得到本次要增强的方法名
		String methodName = method.getName();
		//2、输出日志
		System.out.println(new Date()+":"+methodName+"开始执行.....");
		result = method.invoke(obj, args);
		System.out.println(new Date()+":"+methodName+"执行结束.....");
		return result;
	}
	
	public Object getAgent(){
		/**
		 * 参数1:类加载器classLoader:正在帮助的对象隶属class
		 */
		Object lisi = Proxy.newProxyInstance(obj.getClass().getClassLoader(),
				obj.getClass().getInterfaces(), this);
		return lisi;
	}
}

TestMain.java:

package 动态代理模式.test;

import java.lang.reflect.InvocationHandler;

import 动态代理模式.service.DeptService;
import 动态代理模式.service.EmpService;
import 动态代理模式.serviceimpl.DeptServiceImpl;
import 动态代理模式.serviceimpl.EmpServiceImpl;
import 动态代理模式.util.Agent;

public class TestMain {
	public static void main(String[] args) {
		empTest();
		deptTest();
	}
	private static void empTest(){
		EmpService service = new EmpServiceImpl();
		InvocationHandler AgentManager = new Agent(service);
		EmpService lisi = (EmpService)((Agent) AgentManager).getAgent();
		lisi.select();
		lisi.update();
	}
	private static void deptTest(){
		DeptService service = new DeptServiceImpl();
		InvocationHandler AgentManager = new Agent(service);
		DeptService lisi = (DeptService)((Agent)AgentManager).getAgent();
		lisi.save();
		lisi.delete();
	}
}

在这里插入图片描述

13、MVC流程示意图:

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐