欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVC分层开发模式

程序员文章站 2022-04-02 10:42:21
...

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跳转)
  • 工作流程图
    MVC分层开发模式

  • 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. 创建配置文件(核心控制器根据业务请求,跳到对应的服务类完成业务)
    MVC分层开发模式

  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层操作
相关标签: # servlet