文章目录
- mvc的概念
- 常用的模式
- 三层架构与mvc的区别
一、mvc的概念
MVC全名:Model View Controller,其中Model(模型层)、View(视图层、Controller(控制层)
它是一种软件设计典范,用于业务逻辑处理、数据、界面显示分离
二、常用模式:
- model1:jsp+jdbc
- model2:mvc
高内聚 低耦合 各司其职
三、 三层架构与mvc的区别
三层架构是一个经典的分层思想,将开发模式分为三层,每个人专注自己擅长模块即可
MVC是一种设计模式,其目的是让html和业务逻辑分开
2.MVC结构:
V(视图层) --》JSP/HTML/freemarker
C(控制层) --》Servlet/Action/Controller
M(模型层) --》entity、dao
entity:实体域模型(名词)
dao:过程域模型(动词)
注:1)不能跨层调用;
2)只能由上往下进行调用;View -> Controller -> Model
自定义mvc工作原理图:
*.action 调度 截取*(请求路径名) 处理具体业务逻辑
JSP -----------> Servlet(中央控制器)-------------------------------->Action(子控制器)--->Model(Dao、DB)
案例:
先建一个包放中央控制器(ActionServlet):
package com.jiangjiayan.mvc.framework;
import java.io.IOException;
import java.lang.reflect.Executable;
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.jiangjiayan.mvc.action.AddAction;
import com.jiangjiayan.mvc.action.HelloAction;
/**
* 自定义mvc中的中央控制器
* @author jiangjiayan
*
*/
public class ActionServlet extends HttpServlet {
private Map<String, Action> map;
@Override
public void init() throws ServletException {
map =new HashMap<String, Action>();
map.put("/helloAction", new HelloAction());
map.put("/addAction", new AddAction());
super.init();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求路径
///J2EE_mvc/helloAction.action
String requestURI = req.getRequestURI();
System.out.println(requestURI);
System.out.println(req.getRequestURI());
int start=requestURI.lastIndexOf("/");
int end=requestURI.lastIndexOf(".action");
//截取请求路径中的mvc/*.action 的/*部分
String actionName = requestURI.substring(start,end);
System.out.println(actionName);
//通过截取路径的actionName找到对应的子控制器 父类的引用,子类的对象
//相当于里式替换原则:Action action=new HelloAction();
Action action= map.get(actionName);//等于 new HelloAction
//执行execute方法
action.execute(req, resp);
}
}
在建一个控制器的父类 ,完成具体的业务逻辑(Action):
public abstract class Action {
public abstract String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException ;
}
之后建一个子类(AddAction )继承Action :
public class AddAction extends Action {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num1=req.getParameter("num1");
String num2=req.getParameter("num2");
int num3=Integer.parseInt(num1)+Integer.parseInt(num2);
req.setAttribute("num3", num3);
req.getRequestDispatcher("index.jsp").forward(req, resp);
return null;
}
}
最后运行的结果: