栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

自定义MVC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自定义MVC

文章目录

一、什么是MVC

二、初版增删改查

三、反射版增删改查

四、MVC原理图


一、什么是MVC

自定义MVC的概念(不太懂去看看这篇,比较详细的介绍了MVChttps://blog.csdn.net/weixin_67450855/article/details/124335875?spm=1001.2014.3001.5502):
MVC全称名是Model(模型层) View(视图层) controller(控制层)

MVC模式分工明确,各司其职,同时也具有高类聚,低耦合的特点。

 为什么会有自定义MVC:
当我们自己项目要去写这么多servlet以及dao包中的方法时,往往都会出现一个共同的问题,那就是代码思路基本重复,从而就诞生了自定义MVC,帮助我们简化代码,减少类。 

二、初版增删改查

Servlet中的内容 

新建一个jsp页面 

目前增删改查的方法
增加
删除
修改
查询

运行效果

 上述方法有什么问题吗?樂⬇⬇

关于单个实体/表操作场景越多,需要新建的类也就越多,造成项目中的类数量过于庞大

我们可以用反射来解决这个问题

三、反射版增删改查

新建一个Servlet在 BookServlet 中进行代码操作

package com.hemingxiang.web;

import java.io.IOException;
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;

import com.sun.net.httpserver.HttpServer;
@WebServlet("/book.action")
public class BookServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//为了区分当前请求的目的,增删查改的目的,就从前台讲要调用的方法名传递到后台
		if("add".equals(methodName)) {//如果前台传递到后是add的请求就调用增加方法
			add(req,resp);
		}
		//如果前台传递到后是del的请求就调用删除方法
		else if("del".equals(methodName)) {
			del(req,resp);
		}
		else if("edit".equals(methodName)) {
			edit(req,resp);
		}
		else if("list".equals(methodName)) {
			list(req,resp);
		}
		else if("load".equals(methodName)) {
			load(req,resp);
		}
	}

	private void list(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用list方法");
	}

	private void edit(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用edit方法");
	}

	private void del(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用del方法");
	}

	private void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用add方法");
	}
}

 在原有的jsp页面添加

类数量过多问题优化
增加
删除
修改
查询
回显

运行效果同上,代码使用方法不同

 当新增了业务,除了需要添加该业务对应的方法(load),同时还要改动原有的代码,对BookServlet进行优化

优化源码

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//为了区分当前请求的目的,增删查改的目的,就从前台讲要调用的方法名传递到后台
		String methodName=req.getParameter("methodName");
		//methodName可能是add/del/edit/list/load...
		//前台传递说明方法就调用当前类的对应方法
		try {
			Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			m.setAccessible(true);
			//调用当前类实例的methodName方法,你传什么我调什么
			m.invoke(this, req,resp);
		} catch (Exception e) {
			e.printStackTrace();
		}


    private void load(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用load方法");
	}

 此时我们在实验一遍,在jsp页面中添加相同代码,将BookServlet中代码拷贝到对应的orderServlet中,运行还是同上

订单类增删改查
增加
删除
修改
查询
回显

 抛出两个问题:反射相关代码,在每一个实体类对应的servlet中都存在
                          每一个servlet中都有doget,dopost方法

⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

 四、MVC原理图

 接下来我们根据这张图,来部署代码解决上面的两个问题⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆

 中央控制器(对应图中ActionServlet)

package com.hemingxiang.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.hemingxiang.web.BookAction;

@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{

	//在map集合中找到那个变量 action
	private Map actions=new HashMap();
	//map中最初没有值,没有值怎么拿的到 所以初始化一下
	//程序启动时,只会加载一次
	@Override
	public void init() throws ServletException {
		actions.put("/book", new BookAction());
		//actions.put("/order", new BookAction());
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//拿地址http://localhost:8080/mvc/book.action?methodName=list
		String uri = req.getRequestURI();
		//要拿到 /book 就是最后一个 / 到最后一个 . 为止
		uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
		
		Action action = actions.get(uri);
        action.execute(req, resp);	
	}
}

 

 Action

package com.hemingxiang.framework;

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


public interface Action {

	 void execute(HttpServletRequest req, HttpServletResponse resp);
	
}

ActionSupport实现Action

package com.hemingxiang.framework;

import java.lang.reflect.Method;

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

public class ActionSupport implements Action{

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) {
		//为了区分当前请求的目的,增删查改的目的,就从前台讲要调用的方法名传递到后台
		String methodName=req.getParameter("methodName");
		//methodName可能是add/del/edit/list/load...
		//前台传递说明方法就调用当前类的对应方法
		try {
			Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			m.setAccessible(true);
			//调用当前类实例的methodName方法,你传什么我调什么
			m.invoke(this, req,resp);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

BookAction继承ActionSupport

package com.hemingxiang.web;

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

import com.hemingxiang.framework.Action;
import com.hemingxiang.framework.ActionSupport;

public class BookAction extends ActionSupport{
	
	private void list(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用list方法");
	}
	
	private void load(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用load方法");
	}

	private void edit(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用edit方法");
	}

	private void del(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用del方法");
	}

	private void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用add方法");
	}
}

本次文章所用到的类与包

--------------------------------------------------------------------------------------------------------

beybey~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号