模型-视图-控制器(MVC)
1、优点:
- 提高javaWeb开发代码的复用性,避免了重复性开发
- 有效帮助开发人员实现业务开发中的【事务管理】
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();
}
}