自定义MVC的初步实现

本文详细介绍了如何使用Servlet实现一个简单的MVC框架,包括中央控制器DispatcherServlet负责请求分发,Action类处理业务逻辑,以及JSP作为视图层。此外,通过XML配置文件实现了动态加载Action类,增强了框架的灵活性。
摘要由CSDN通过智能技术生成

前言

在上一篇博客,我们介绍了MVC的演变过程,以及简单地实现了自定义MVC,在这篇博客中,我们进一步优化代码

一、 工作流程图

在这里插入图片描述

二、简单的实现自定义MVC

  • 创建一个能处理所有前端发送过来请求的Servle,即中央控制器,拿到所有方法的反射代码就在这里,并根据请求的类型调用相应的业务逻辑(去子控制器)
  • 创建一个子控制器,用于处理特定的用户请求或操作,这是真正处理用户请求的Servlet
  • 创建一个定义方法的Servlet,继承子控制器,供子控制器调用方法

Controller层——Servlet

中央控制器

package com.xqx.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;


/** 中央控制器 即工作流程图中的ActionServlet
 * @author W许潜行
 * 2023年6月29日 下午8:10:04
 */
@WebServlet("*.action")
public class DispatherServlet extends HttpServlet {
   
	Map<String,Action> mapAction=new HashMap<>();
	/**
	 * 初始化方法
	 */
	public void init() throws ServletException {
   
		mapAction.put("/book", new BookAction());
		super.init();
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
		//得到传过来的路径名
		String uri = request.getRequestURI();// /J2EE_MVC/book.action
		//得到请求的类
		uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));// /book
		//拿到对应的action
		Action action = mapAction.get(uri);
		//调用方法
		action.execute(request, response);
	}

}

当有请求进入时,我们首先获取请求的URI,并从中获取类似"/book"的路径名。然后,我们使用这个路径名作为键在mapAction中查找对应的Action对象。最后,执行该Action的execute方法来处理请求。

这个DispatcherServlet类的目的是根据传入的请求路径来分发请求给不同的Action类处理,通过这种方式实现请求的路由和控制,实现了基本的MVC模式

子控制器

package com.xqx.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 W许潜行 2023年6月29日 下午8:17:41
 */
public class Action {
   
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
		// 拿到jsp传来的method
		String method = request.getParameter("method");
		try {
   
			Method m = this.getClass().getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
			m.setAccessible(true);
			m.invoke(this, request, response);
		} catch (Exception e) {
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

这个Action类的作用是通过反射机制根据传入的method参数值来调用具体的方法进行请求处理。每个实际的Action类都可以继承这个基类,并重写具体的方法来实现自己的业务逻辑。

具体Action类

package com.xqx.framework;

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

/**定义crud方法
 * @author W许潜行
 * 2023年6月29日 下午8:55:46
 */
public class BookAction extends Action{
   
	public void list(HttpServletRequest request, HttpServletResponse response) {
   
		System.out.println("list");
	}

	public void upd(HttpServletRequest request, HttpServletResponse response) {
   
		System.out.println("upd");
	}

	public void del(HttpServletRequest request, HttpServletResponse response) {
   
		System.out.println("del");
	}

	public void add(HttpServletRequest request, HttpServletResponse response) {
   
		System.out.println("add");		
	}
}

view层——JSP

<%@ 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>
<h1>极易MVC</h1>
<a href="bookAdd.action">新增</a>
<a href="bookDel.action">删除</a>
<a href="bookUpd.action">修改</a>
<a href=
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值