1. 什么是MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,
它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码
Model1 jsp+jdbc
Model2 ->MVC
核心思想:各司其职
req.getServletPath() 单纯的一个请求
req.getContextPath() 项目名
req.getRequestURI() 项目名+请求
req.getRequestURL() 请求的全路径
2. MVC结构
V
jsp/ios/android
C
servlet/action
M
实体域模型(名词)
过程域模型(动词)
注1:不能跨层调用
注2:只能出现由上而下的调用
3. 自定义MVC工作原理图
主控制动态调用子控制器调用完成具体的业务逻辑
(火车、控制台、车轨)
请求、主控制器、子控制器
火车 火车控制室 铁轨
用户的请求 中央控制器 子控制器
火车进站,火车控制室来决定火车是否能够进站,火车的信号发送,发送什么信号,
是有铁轨来决定,就是要进站的火车需要进入的铁轨上是没车的。
在程序中,浏览器点击enter,就是用户向后台发送请求。可以定义一个中央控制器,
去处理用户的请求。中央控制器不直接处理请求,说白了中央控制器不写具体的业务
逻辑。中央控制器去找具体的子控制器去完成具体业务逻辑,来对应用户的请求。
4. 通过XML对自定义mvc框架进行增强
4.1 将Action的信息配置到xml(反射实例化)
4.2 通过结果码控制页面的跳转
4.3 将一组相关的操作放到一个Action中(反射调用方法)
DispatcherAction
methodName:add/minus/mul/div
CalAction extends DispatcherAction
提供一组与execute方法的参数、返回值相同的方法,只有方法名不一样
4.4 利用ModelDriver接口对Java对象进行赋值(反射读写方法)
BeanUtils.populate(calBean, parameterMap);
ModelDriver接口返回的对象不能为空
4.5 使得框架的配置文件可变
注1:Action多例模式?因为Action的属性要用来接收参数
5、自定义框架思路
5.1、 定义主控器,用来处理浏览器发来的所有.action结尾的请求
5.2、 定义子控制器,用于处理具体的业务
5.3、 在主配置文件中初始化所有的子控制器
5.4、 定义两个子控制器处理不同的业务逻辑
5.5、 在jsp中分别发送两个不同的请求,看是否由不同的子控制器去处理不同的请求。
核心代码:
中央控制器
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { // 将配置文件换做成可配置的 String xmlPath = this.getInitParameter("configLocation"); if(xmlPath == null || "".equals(xmlPath)) { ConfigModel = ConfigModelFactory.newInstance(); }else { ConfigModel = ConfigModelFactory.newInstance(xmlPath); } String url = req.getRequestURI(); String proName = req.getContextPath(); url = url.replace(proName, ""); url = url.substring(0, url.indexOf(".")); ActionModel actionModel = ConfigModel.get(url); String clzPath = actionModel.getType(); Action action = (Action)Class.forName(clzPath).newInstance(); // 如果当前处理业务的子控制器是实现了modelDriven接口的话 if(action instanceof ModelDriven) { ModelDriven md = (ModelDriven)action; Object model = md.getModel(); BeanUtils.populate(model, req.getParameterMap()); } // 处理具体的业务 String code = action.execute(req, resp); ForwardModel forwardModel = actionModel.get(code); String path = forwardModel.getPath(); String redirect = forwardModel.getRedirect(); // 结果码处理 if("false".equals(redirect)) { req.getRequestDispatcher(path).forward(req, resp); }else { resp.sendRedirect(req.getContextPath()+path); } } catch (Exception e) { e.printStackTrace(); } }
public String execute(HttpServletRequest req, HttpServletResponse resp) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { String methodName = req.getParameter("methodName"); Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); m.setAccessible(true); return (String) m.invoke(this, req, resp); }
模型驱动接口
public interface ModelDriven<T> { public T getModel(); }
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有