1. 什么是MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,
它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码
Model1 jsp+jdbc
Model2 ->MVC
核心思想:各司其职
2. MVC结构
V
jsp/ios/android
C
servlet/action
M
实体域模型(名词)
过程域模型(动词)
注1:不能跨层调用
注2:只能出现由上而下的调用
3. 自定义MVC工作原理图
5. 通过XML对自定义mvc框架进行增强
5.1 将Action的信息配置到xml(反射实例化)
解决了在框架代码中去改动,以便于完成客户需求,这个是不合理的
5.2 通过结果码控制页面的跳转
5.3 将一组相关的操作放到一个Action中(反射调用方法)
DispatcherAction
methodName:add/minus/mul/div
CalAction extends DispatcherAction
提供一组与execute方法的参数、返回值相同的方法,只有方法名不一样
5.4 利用ModelDriver接口对Java对象进行赋值(反射读写属性)
BeanUtils.populate(calBean, parameterMap);
ModelDriver接口返回的对象不能为空
5.5 使得框架的配置文件可变
1、将Action的信息配置到xml
xml:
<?xml version="1.0" encoding="UTF-8"?>
<!--
config标签:可以包含0~N个action标签
-->
<config>
<action path="/addCal" type="com.zhuyuncong.web.AddCalAction">
<forward name="rs" path="/rs.jsp" redirect="false" />
</action>
<action path="/delCal" type="com.zhuyuncong.web.DelCalAction">
<forward name="rs" path="/rs.jsp" redirect="false" />
</action>
</config>
主控制器的改动:
package com.luoxiaogang.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.zhuyuncong.web.AddCalAction;
import com.zhuyuncong.web.CccCalAction;
import com.zhuyuncong.web.ChuCalAction;
import com.zhuyuncong.web.DelCalAction;
/**
* 中央控制器
* 作用:接收请求,通过请求寻找处理请求对应的子控制器
* @author MACHENIKE
*
*/
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 9213618038567713003L;
ConfigModel configModel;
// private Map<String, Action> actionMap = new HashMap<>();
public void init() {
// actionMap.put("/addCal", new AddCalAction());
// actionMap.put("/delCal", new DelCalAction());
// actionMap.put("/cccCal", new CccCalAction());
// actionMap.put("/chuCal", new ChuCalAction());
try {
configModel = ConfigModelFactory.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
init();
String url = req.getRequestURI();
url = url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));
ActionModel actionModel = configModel.get(url);
if(actionModel == null) {
throw new RuntimeException("你没有配置action对象,找不到对应的子控制器来处理浏览器发送的请求");
}
try {
try {
//如果url是/addCal
//Action action = (Action)Class.forName(com.zhuyuncong.web.AddCalAction).newInstance()
//Action action = new AddCalAction(); 上面代码与下面代码结果相同
Action action = (Action) Class.forName(actionModel.getType()).newInstance();
action.execute(req, resp);
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Action action = actionMap.get(url);
}
}
2、通过结果码控制页面的跳转
把子控制器的跳转全部写到主控制器中
子控制器:
package com.luoxiaogang.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zhuyuncong.framework.Action;
public class AddCalAction implements Action {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String num1 = req.getParameter("num1");
String num2 = req.getParameter("num2");
req.setAttribute(&#