一.什么是MVC?
MVC全名:Model View Controller,其中Model(模型层)、View(视图层)、Controller(控制层)
它是一种软件设计典范,用于业务逻辑处理、数据、界面显示分离。
常用模式:
model1:jsp+jdbc
model2:mvc
三层架构和MVC的区别?
三层架构是一个经典的分层思想,将开发模式分为三层,每个人专注自己擅长模块即可
MVC是一种设计模式,其目的是让html和业务逻辑分开。
二.MVC结构?
V(视图层)
C(控制层)
M(模型层)
注:1)不能跨层调用;
2)只能由上往下进行调用;View -> Controller -> Model
三.自定义MVC工作原理图
*.action 调度 截取*(请求路径名) 处理具体业务逻辑
JSP -----------> Servlet(中央控制器)--------------------->Action(子控制器)--->Model(Dao、DB)
4.MVC实现
案例:
1)创建抽象类Action,定义抽象方法execute(处理具体逻辑)
package com.zking.framework;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 子控制器:做具体的核心业务逻辑
* @author 李婷
*
*/
public abstract class Action{
public abstract void execute(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException ;
}
2)创建HelloAction并继承抽象类Action,重写execute方法
package com.zking.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zking.framework.Action;
/**
* 自定义子控制器 :执行业务逻辑的核心。
* @author 李婷
*
*/
public class HelloAction extends Action {
@Override
public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Hello");
}
}
3)在ActionServlet中定义私有Map<String,Action>(根据不同请求路径名调用不同逻辑处理Action类)
4)在ActionServlet中的init方法初始化Map集合
map.put('请求路径','逻辑处理Action类')
5)在ActionServlet中的doPost方法中处理请求
package com.zking.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zking.action.HelloAction;
/**
* ActionServlet:中央控制器 用于接受请求,发送请求 不做“事”
* @author 李婷
*
*/
public class ActionServlet extends HttpServlet{
//该集合用于定义请求路径与子控制器类Action之间的绑定关系
// 例如:/helloAction -> HellowAction extends Action
private Map<String,Action> actions=new HashMap<>();
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
actions.put("/helloAction",new HelloAction());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
// 获取请求路径
String path = req.getServletPath();
// 获取路径名
int start=path.indexOf("/");
int end=path.lastIndexOf(".");
String substring = path.substring(start, end);
System.out.println(substring);
// 根据请求路径名获取对应的子控制器类Action去处理
Action action = actions.get(substring);
action.execute(req, resp);
}
}