MVC分层开发模式

1. 什么是mvc开发模式

  • mvc不是一种技术,只是一种开发模式
  • 使用分层开发模式能在大型项目中,让开发人员更好的协同工作
  • 便于项目的维护和扩展
    1. M: Model 模型层->数据库层->dao
    2. V: View 视图层->收集和展示用户数据->html/jsp
    3. C: Controller->数据封装->逻辑处理->流程控制->servlet/action/controller

2. 基于servlet手写mvc框架

  • 什么是框架?

是一种标准或者规范,使用别人写好的东西,按照他的制造好的轮子,他的流程,去开发我想要实现的功能,提高开发效率,降低开发成本。

  • 框架的分类,分为前后端框架
  1. 前端框架分为功能性的和美观性的
  2. 功能性的:
    jQuery,vue,angular 判断数据合法性,dom操作
  3. 美观性的:
    bootstrap,easyui,react,qucikui…
  • 什么是mvc框架

mvc是后端框架,专门用来解决controller与view层数据交互的问题,对这个交互过程中的各种操作进行规范和封装,让开发人员在开发web应用程序时对请求响应的控制更为方便(数据层的访问不属于mvc框架内)

  • mvc框架的职责
  1. 规范开发流程
  2. 对请求数据进行封装(如页面有100个表单 多个表单)
  3. 流程跳转的规范 (是转发,重定向,还是js跳转)
  • 工作流程图

  • ActionServlet好比一个大哥 (mvc框架的核心功能),大哥接收到老板的任务(接收到业务请求时),安排小弟(服务对象,实现业务的类)来完成任务,小弟最后执行任务(完成逻辑处理),把结果返回大哥,最后结果返回(流程控制)老板(客户端)。

  • 基于servlet的mvc框架核心成员

    1. ActionServlet servlet 接收特定的请求,mvc框架的入口
    2. Action接口service方法,规范所有小弟的服务方法
    3. 小弟xxxAction实现接口,完成逻辑处理,为客户端提供服务
    4. .properties键值对配置文件,描述业务请求与xxxAction类的路径 (反射根据业务请求,取到配置文件的服务类)
    5. 可封装response流,输出js代码跳转
  • 核心控制器ActionServlet

  1. 配置文件
  <servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>com.lovely.mvc.ActionServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>*.do</url-pattern> <!-- 如接收query.do 的业务请求-->
  </servlet-mapping>
  1. action接口,规范服务类
package com.lovely.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
	
	// service服务方法接口,返回要跳转的页面url
	public String service(HttpServletRequest req, HttpServletResponse resp);

}

  1. 创建配置文件(核心控制器根据业务请求,跳到对应的服务类完成业务)

  2. 控制器代码

package com.lovely.mvc;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ActionServlet extends HttpServlet {

	/**
	 * 核心控制servlet
	 * 根据访问方式 和 类的路径信息 到对应的servlet来处理
	 */
	private static final long serialVersionUID = 1L;
	
	private Properties property = null;
	
	@Override
	public void init() throws ServletException {
		property = new Properties();
		// 加载配置文件
		
		InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/config.properties");
		
		try {
			property.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (in != null)
					in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String uri = req.getRequestURI();
		String key = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));
		System.out.println(uri + "\t" + key);
		
		// 根据请求对象 拿到对应的类 进行服务
		String value = property.get(key).toString();
		
		try {
			// 反射拿到类对象
			Class<?> c = Class.forName(value);
			
			// 创建action对象
			Action action = (Action) c.newInstance();
			
			String result = action.service(req, resp);
			
			if (result != null) {
				// 根据返回结果 决定是请求转发 还是重定向
				if (result.startsWith("forward")) {
					String path = result.split(":")[1];
					req.getRequestDispatcher(path).forward(req, resp);
				} else if (result.startsWith("redirect")) {
					String path = result.split(":")[1];
					resp.sendRedirect(req.getContextPath() + path);
				} else {
					// 写路径默认请求转发
					req.getRequestDispatcher(result).forward(req, resp);
				}				
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

}

  1. 提供服务对象类(以查询为例)
package com.lovely.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lovely.dao.CommonDao;
import com.lovely.entity.Ticket;
import com.lovely.mvc.Action;

public class QueryAction implements Action {

	@Override
	public String service(HttpServletRequest req, HttpServletResponse resp) {
		
		CommonDao dao = new CommonDao();
		req.setAttribute("list", dao.queryAll(Ticket.class));
		
		// 返回转发的地址
		return "/list.jsp";
	}

}

  • 以上就算一个基于servlet实现的mvc框架了,别人已经有更牛的框架,这里只是拿来分析。
  • 上面的代码,离不开数据库操作,请看
    反射和注解对dao层操作

猜你喜欢

转载自blog.csdn.net/qq_44783283/article/details/107129803