自定义MVC系列(一)之自定义MVC简介

目录

一. 什么是MVC?

MVC结构

 MVC的不足:

二. 自定义MVC的运行原理

三. 自定义MVC框架与三层架构的区别 

四. 基础的增删改查代码实现

前端

四. 自定义MVC实现 

中央控制器

子控制器

继承子控制器

jsp界面


一. 什么是MVC?

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 它是一种软件设计典范。

用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。

MVC结构

模型(Model):是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。

视图(View):是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。

控制器(Controller):是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式。

Model:常用javabean去实现,通过各种类来对数据库的数据进行获取,并封装在对象当中。

View:常用JSP来实现,通过可直接观察的JSP页面来展示我们从数据库中获取的数据。

Controller:常用servlet来实现,通过servlet来获取经过javabean包装过的对象(已存入数据库中的数据),然后再发送数据传输到JSP界面。  

 MVC的不足:

1.不能跨层调用

2.只能从上往下进行调用,View-->Controller-->Model

二. 自定义MVC的运行原理

核心组件说明:

中央控制器(ActionServlet):负责接收所有的请求,并分别给控制器具体处理。

子控制器(Action):负责处理中央处理器分配的请求。

 用户发送请求 → 中央控制器接受用户请求 → 分析请求连接/获取到用户需要的类+方法 → 调用相对应的Model → 访问数据库服务器

三. 自定义MVC框架与三层架构的区别 

  1. 三层架构是基于业务逻辑来分的,而MVC是基于页面来分的;

  2. 三层是种软件架构,通过接口实现编程,MVC模式是一种复合设计模式,一种解决方案;

  3. 三层架构模式是体系结构模式,MVC是设计模式;

  4. 三层架构模式又可归于部署模式,MVC可归于表示模式。

四. 基础的增删改查代码实现

前端

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>最初的版本1</p>
弊端:每一张表的每一个操作,都要一个对应的servlet<br>
<a href="bookadd.action">增加</a>
<a href="bookdel.action">删除</a>
<a href="bookupd.action">修改</a>
<a href="bookquery.action">查询</a>

后台

package com.xissl.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/bookadd.action")
public class BookAddServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookaddservlet.add...");
		
	}
}
package com.xissl.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/bookupd.action")
public class BookUpdServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookupdservlet.upd...");
		
	}
}
package com.xissl.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/bookdel.action")
public class BookDelServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookdelservlet.del...");
		
	}
}
package com.xissl.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/bookquery.action")
public class BookQueryServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("bookqueryservlet.query...");
		
	}
}

四. 自定义MVC实现 

中央控制器

并不实际处理浏览器请求,它的职责是找到对应的子控制器去处理请求

package com.xissl.framework;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

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

import com.xissl.web.BookAction;

/**
 * 中央控制器
 * @author xissl
 *
 */
@WebServlet("*.action")
public class DispatherServlet extends HttpServlet{
//	存放子控制器的容器
	Map<String, Action> actionMap = new HashMap<String, Action>();
	
	@Override
	public void init() throws ServletException {
		actionMap.put("/book", new BookAction());
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String url = req.getRequestURI();
		url = url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));
		Action action = actionMap.get(url);
		action.execute(req, resp);
		
	}

}

子控制器

具体处理请求的方法

package com.xissl.framework;

import java.io.IOException;
import java.lang.reflect.Method;

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

/**
 * 子控制器
 * 处理浏览器发送的请求的类
 * @author xissl
 *
 */
public class Action {
	
	protected void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String methodName = req.getParameter("methodName");

		try {
			Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			method.setAccessible(true);
			method.invoke(this, req,resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

继承子控制器

package com.xissl.web;


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

import com.xissl.framework.Action;

public class BookAction extends Action {
	
	public void add(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("bookaddservlet.add...");
	}
	
	public void del(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("bookaddservlet.del...");
	}
	public void upd(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("bookaddservlet.upd...");
	}
	public void query(HttpServletRequest req,HttpServletResponse resp) {
		System.out.println("bookaddservlet.query...");
	}
	

}

jsp界面

<a href="book.action?methodName=add">增加</a>
<a href="book.action?methodName=del">删除</a>
<a href="book.action?methodName=upd">修改</a>
<a href="book.action?methodName=query">查询</a>

运行结果如下:

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不念那年晚春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值