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

自定义MVC原理

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

自定义MVC原理

目录

1.mvc简介

2.最初的增删改查

3.反射版的增删改查

4.自定义MVC后台代码实现

1.mvc简介

什么是mvc?
m:model
v:view
c:controller
分工明确,各司其职
 

2.最初的增删改查

 普通版的增删改查要写4-5个servlet,大量代码重复

AddBookServlet

package com.xbb.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("/book/add")
public class AddBookServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("处理书籍的增加业务,调用bookBiz");
	}

}

DelBookServlrt

package com.xbb.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("/book/edit")
public class DelBookServlrt extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("处理书籍的编辑业务,调用bookBiz");
	}

}

EditBookServlrt

package com.xbb.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("/book/del")
public class EditBookServlrt extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("处理书籍的删除业务,调用bookBiz");
	}

}

ListBookServlrt

package com.xbb.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("/book/list")
public class ListBookServlrt extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("处理书籍的查询业务,调用bookBiz");
	}

}

上述问题:
    1.关于单个实体/表操作的场景越来越多,造成的项目中的类的数量过的数量过于庞大
    2.当新增了业务的时候,除了要添加该业务对应的方法,同时还要改动原有的代码
    3.反射相关的代码,在每个实体类对应的selvlet中都存在
    4.每一个servlet中都有doget,dopost方法

3.反射版的增删改查
package com.xbb.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;

//@WebServlet("/book.action")
public class BookServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

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

	

	
	}

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

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

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

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

}

4.自定义MVC后台代码实现

中央控制器:

主要职能:接收浏览器请求,找的对应的处理人

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


@WebServlet("*.action")
public class DiapatcherServlet extends HttpServlet{
	private Map actions = new HashMap();
	
	//程序启动时,只会启动一次
	@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 {
		String uri = req.getRequestURI();
		//要拿到/book,就是最后一个/到最后一个.的位置
		uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
		Action action = actions.get(uri);
		action.execute(req, resp);
	}

}

 子控制器:
 对应请求的处理人

package com.xbb.framework;

import java.io.IOException;

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


public interface Action {
	 void execute(HttpServletRequest request, HttpServletResponse response) ;
}
package com.xbb.framework;

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

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

public class ActionSupport implements Action{

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
			//为了区分当前请求的目的:增删改查的目的,就从前台讲要调用的方法名传递到后台
			
			String methodName = request.getParameter("methodName");
			
			//methodName可能是add/del/edit/list/load/xxx/yyy/aaa
			//前台传递什么方法,就调用当前类的对应方法
			try {
				Method m = this.getClass()
				.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
				m.setAccessible(true);
				//调用当前类实例的方法
				m.invoke(this, request,response);
			} catch (Exception e) {
				e.printStackTrace();
			} 
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>





Insert title here


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




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


效果:

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

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

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