Arquitetura MVC personalizada [Parte 1]

Índice

I. Introdução

1. O que é a arquitetura MVC

2. Os benefícios de usar a arquitetura MVC

3. A diferença entre arquitetura MVC e arquitetura de três camadas

4. A ideia da arquitetura MVC

Dois, MVC personalizado

1. Versão inicial

2. Versão avançada

3. Versão otimizada para reflexão

4. Versão aprimorada de reflexão


I. Introdução

1. O que é a arquitetura MVC

A arquitetura MVC (Model-View-Controller), a arquitetura Model-View-Controller, é um padrão de design de software comum para organizar e separar diferentes componentes de um aplicativo.

  • Modelo (Model) : Representa os dados e a lógica de negócios no aplicativo. O modelo é responsável por processar leitura e escrita de dados, verificação, cálculo e outras operações, bem como processar a lógica de negócios relacionada aos dados. Os modelos geralmente não interagem diretamente com a interface do usuário, mas passam por controladores para buscar e atualizar dados.

  • View (View) : representa a interface do usuário no aplicativo. As visualizações são responsáveis ​​por apresentar dados ao usuário e receber entradas do usuário. As visualizações geralmente não contêm nenhuma lógica de negócios, mas são atualizadas e recuperadas pelos controladores. Um modelo pode ter várias visualizações e as visualizações podem ser exibidas em diferentes formas, como páginas da Web, interfaces de aplicativos móveis, etc.

  • Controller (Controller) : Responsável por manipular a entrada do usuário, controlar o fluxo do aplicativo e coordenar a interação entre o modelo e a exibição. Os controladores recebem a entrada do usuário e atualizam os modelos e visualizações de acordo. Converte a operação do usuário em uma requisição do modelo ou atualização da visão, de forma a realizar a interação entre dados e interface.

2. Os benefícios de usar a arquitetura MVC

A vantagem da arquitetura MVC é que ela pode obter boa reutilização de código, escalabilidade, capacidade de manutenção e capacidade de teste. Ao separar as diferentes responsabilidades do aplicativo, cada componente muda de forma independente, reduzindo o grau de acoplamento e também permitindo que a equipe de desenvolvimento colabore e gerencie melhor os projetos.

Caso de vida:

Se há um restaurante, há apenas um dono. Comprar, atender clientes, cozinhar, servir e fazer check-out são todos feitos pelo chefe. Não é demorado e trabalhoso? Se ele recrutar pessoas para fazer essas coisas para ele, economizará muito tempo e nós tem uma coisa para uma pessoa, se houver um problema em um determinado link, ele pode ser conectado diretamente.

Casos de projeto:

O restaurante é o nosso projeto, a página jsp é o chefe, e ele faz tudo. A quantidade de código é muito grande e não favorece a manutenção. Neste momento, precisamos fazer o "gerenciamento de classificação" para transformar nosso código em uma arquitetura MVC.MVC é Model (model) - view (view) - controller (controlador). Cada um deles lida com suas próprias tarefas, alta coesão e baixo acoplamento, melhorando a eficiência de nossa escrita de código e pós-manutenção.

3. A diferença entre arquitetura MVC e arquitetura de três camadas

1. A arquitetura de três camadas é baseada na lógica de negócios, enquanto a MVC é baseada em páginas;

2. O três camadas é um tipo de arquitetura de software, que realiza a programação por meio da interface.O modo MVC é um modo de design composto e uma solução;

3. O padrão de arquitetura de três camadas é um padrão de arquitetura e o MVC é um padrão de design;

4. O padrão de arquitetura de três camadas pode ser atribuído ao padrão de implantação e o MVC pode ser atribuído ao padrão de apresentação.

Nota : A arquitetura MVC e a arquitetura de três camadas não são mutuamente exclusivas e podem ser combinadas e ajustadas de acordo com as necessidades reais. Por exemplo, a arquitetura MVC pode ser usada como parte da camada de apresentação para gerenciar a interação da interface do usuário e, ao mesmo tempo, uma arquitetura de três camadas é usada para dividir as responsabilidades na camada de lógica de negócios e na camada de acesso a dados .

4. A ideia da arquitetura MVC

 Conforme mostrado na figura, a view é responsável por exibir os dados do modelo para o usuário, e fornecer uma interface de usuário para interação com o usuário, enviando requisições para o Servlet, que é o controller, e o controller controla o comportamento do o aplicativo recebendo a entrada do usuário e, em seguida, vai para o back-end, ou seja, a camada de acesso aos dados obtém os dados correspondentes e atualiza o modelo e a visualização de acordo com a interação.

Dois, MVC personalizado

Iteração de versão: vou conduzi-lo passo a passo para evoluir para a arquitetura MVC que usamos hoje, para que todos possam sentir de forma mais intuitiva por que ela é usada e como evoluiu.

1. Versão inicial

Versão 1: Um parâmetro de solicitação (operação) corresponde a um servlet

package com.xw.servlet;

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;

/**
 * 模拟版本一mvc新增操作
 */
@WebServlet("/BookAdd.do")
public class BookAddServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("我是版本一的mvc__新增操作。。。");
	}

}

Desvantagens: Os servlets acima precisam ser escritos várias vezes, e um servlet deve ser escrito para uma operação, o que é muito complicado e não conduz à manutenção.

2. Versão avançada

Versão 2: Adição, exclusão, modificação e consulta são todos um Servlet, e o julgamento da operação se é executado no Servlet
package com.xw.servlet;

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;

/**
 * 模拟版本二mvc增删改查共用一个Servlet操作
 */
@WebServlet("/BookCRUD.do")
public class BookCRUDServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收请求参数
		String parameter = request.getParameter("CrudName");
		//判断前端传递过来的是什么参数
		if(parameter.equals("add")) {
			add(request,response);
		}else if(parameter.equals("upd")) {
			upd(request,response);
		}else if(parameter.equals("del")) {
			del(request,response);
		}else if(parameter.equals("list")) {
			list(request,response);
		}
	}

	private void list(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本二的查询");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本二的删除");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本二的修改");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本二的新增");
		
	}

}

Desvantagens: Embora apenas um servlet precise ser escrito, uma ramificação condicional if precisa ser adicionada toda vez que uma operação é adicionada.Se nossos requisitos de operação aumentarem, a quantidade de código será muito redundante.

3. Versão otimizada para reflexão

Versão 3: O mecanismo de reflexão otimiza se o julgamento da condição

package com.xw.servlet;

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

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

/**
 * 模拟版本三mvc增删改查反射机制优化if条件判断
 */
@WebServlet("/BookClass.do")
public class BookClassCRUDServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收请求参数
		String CrudName = request.getParameter("CrudName");
		
		try {
			//获取该servlet的所有方法
			Method m = this.getClass().getDeclaredMethod(CrudName, HttpServletRequest.class, HttpServletResponse.class);
			//打开访问权限
			m.setAccessible(true);
			//调用该类的方法
			m.invoke(this,request,response );
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
	}

	private void list(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本三反射机制优化的查询");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本三反射机制优化的删除");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本三反射机制优化的修改");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本三反射机制优化的新增");
		
	}

}

Desvantagens: Embora apenas um servlet precise ser escrito e não haja necessidade de escrever se julgar condição, mas na categoria de projeto, não temos apenas um livro, mas também Mercadorias, Estudantes, etc. também precisamos escrever vários servlets, um servlet corresponde a uma tabela.

4. Versão aprimorada de reflexão

Crie o controlador central DispatchServlet para receber a solicitação e enviar a solicitação para o subcontrolador correspondente e concluir o caminho da solicitação no método init e a configuração correspondente da classe do subcontrolador e o processamento da solicitação do método doPost.

package com.xw.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.xw.servlet.BookAction;
import com.xw.servlet.GoodsAction;

/**
 * 中央控制器拦截请求根据请求找到子控制器
 */
@WebServlet("*.do")
public class DispatchServlet extends HttpServlet {
	//保存子控制器
	private Map<String, ActionSupport> actionMap = new HashMap<String, ActionSupport>();
	
	@Override
	public void init() throws ServletException {
		//初始化子控制值
		actionMap.put("/book", new BookAction());
		
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取到url请求
		 String url = request.getRequestURI();
		//截取指定需要操作的表
		url=url.substring(url.lastIndexOf("/"),url.lastIndexOf("."));
		//根据请求截取到key找到对应的子控制器
		ActionSupport actionSupport = actionMap.get(url);
		//调用子控制器处理业务逻辑
		actionSupport.execute(request, response);
	}

}

Crie um subcontrolador abstrato de ação e defina o método de execução para manipular o processamento de lógica de negócios principal específico.

package com.xw.framework;

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

/**子控制器并定义execute方法,用于处理具体的核心业务逻辑处理
 * @author Java方文山
 *
 */
public interface Action {
		public String execute(HttpServletRequest req, HttpServletResponse resp);
}

Crie ActionSupport e herde a classe abstrata Action, reescreva o método execute e localize o subcontrolador Servlet salvo na coleção Map correspondente por meio de reflexão para implementar o processamento da camada de lógica de negócios.

package com.xw.framework;

import java.lang.reflect.Method;

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


import com.sun.corba.se.spi.orbutil.fsm.FSM;
import com.sun.corba.se.spi.orbutil.fsm.Input;

/**重写execute方法,实现业务逻辑处理
 * @author Java方文山
 *
 */
public  class ActionSupport implements Action {

	public String execute(HttpServletRequest req, HttpServletResponse resp) {
		String invoke = null;
		try {
			//接收请求参数
			String CrudName = req.getParameter("CrudName");
			//获取该servlet的所有方法
			Method m = this.getClass().getDeclaredMethod(CrudName, HttpServletRequest.class, HttpServletResponse.class);
			//打开访问权限
			m.setAccessible(true);
			//调用该类的方法
			invoke = (String) m.invoke(this, req, resp);
			
		} catch (Exception e) {
			e.printStackTrace();
		
	}
		return invoke;

	}

}

Crie BookAction para herdar ActionSuppor para realizar o processamento da lógica de negócios.

package com.xw.servlet;

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

import com.xw.framework.ActionSupport;


public class BookAction extends ActionSupport {
	private void list(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的查询——book");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的删除——book");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的修改——book");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的新增——book");
		
	}
	
}

Aqui concluímos nossa arquitetura MVC de quarta geração! !

Quando precisamos operar outra tabela, precisamos apenas configurar o subcontrolador no controlador central DispatchServlet e finalmente escrever a camada de lógica de negócios do subcontrolador.

Por exemplo :

Também preciso adicionar, excluir, modificar e consultar a tabela Mercadorias

① Configure o subcontrolador

 ② Escrever sub-controlador

package com.xw.servlet;

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

import com.xw.framework.ActionSupport;


public class GoodsAction extends ActionSupport {
	private void list(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的查询——goods");
		
	}

	private void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的删除——goods");
		
	}

	private void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的修改——goods");
		
	}

	private void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是版本四反射机制优化的新增——goods");
		
	}
	
}

Em seguida, teste e veja os resultados da impressão

 

É mais simples do que as três gerações anteriores? Depois de lê-lo, você entendeu melhor o uso do MVC?

Até agora, meu primeiro MVC personalizado é compartilhado aqui! ! !

Acho que você gosta

Origin blog.csdn.net/weixin_74318097/article/details/131463495
Recomendado
Clasificación