博客信息

mvc之自定义框架

发布时间:『 2019-01-27 10:20』  博客类别:自定义mvc  阅读(979)

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,就是用户向后台发送请求。可以定义一个中央控制器,

去处理用户的请求。中央控制器不直接处理请求,说白了中央控制器不写具体的业务

逻辑。中央控制器去找具体的子控制器去完成具体业务逻辑,来对应用户的请求。

小李飞刀_mvc


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();
}



 

关键字:     自定义mvc框架  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有