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

自定义MVC原理

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

自定义MVC原理

目录

一、什么是MVC?

二、初版的增删改查

三、类过多的优化

 四、反射优化

五、MVC工作原理以及对应打码


一、什么是MVC?

M:model
V:view
C:controller
分工明确,各司其职
降低代码耦合度

二、初版的增删改查

写一个Demo01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


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



再写四个servlet在com.cdl.web包下

AddBookServlet

package com.cdl.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");
	}

}

DelBookServlet

package com.cdl.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 DelBookServlet 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");
	}

}

EditBookServlet

package com.cdl.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 EditBookServlet 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");
	}

}

ListBookServlet

package com.cdl.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 ListBookServlet 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");
	}

}

当点击增加控制台输出

点其他时

 

三、类过多的优化

建一个BookServlet

package com.cdl.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");

		
		if("add".equals(methodName)){
			如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
			add(req,resp);
		}
		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 load(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 方法");
	}
		
	
	}


 Demo01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


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

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


结果

点击修改和删除 控制台:

 

 四、反射优化

改变三中的BookServlet

package com.cdl.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);
//			调用当前类实例的methodName方法
			m.invoke(this, request,response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		
		
//		if("add".equals(methodName)){
//			如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
//			add(req,resp);
//		}
//		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 load(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 方法");
	}
		
	
	}


和三一致效果

五、MVC工作原理以及对应打码

 

在com.cdl.web中建一个OrderServlet

package com.cdl.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("/order.action")
public class OrderServlet 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);
//			调用当前类实例的methodName方法
			m.invoke(this, request,response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		
		
//		if("add".equals(methodName)){
//			如果前台传递到后台的是一个新增的请求,那么后台就调用新增方法
//			add(req,resp);
//		}
//		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("在用一个order中调用 list 方法");
	}
	
	private void load(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在用一个order中调用 list 方法");
	}
	
	private void edit(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在用一个order中调用 edit 方法");
	}

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

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

}

Demo02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


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

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

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


运行代码:

 建一个com.cdl.framework的包

建一个DispatcherServlet

package com.cdl.framework;

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

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

import com.cdl.web.BookAction;


public class DispatcherServlet 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 {
		//http://localhost:8080/mvc/book.aciton?methodName=list
		String uri = req.getRequestURI();
		//要拿到/book,就是最后一个/到最后一个点的位置
		uri=uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
		Action action = actions.get(uri);
		action.execute(req, resp);
	}
	
}

ActionSupport

package com.cdl.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/xxx/yyy/aaa...
//		前台传递什么方法,就调用当前类的对应方法
		try {
			Method m = this.getClass().getDeclaredMethod(methodName,  HttpServletRequest.class,HttpServletResponse.class);
			//打开访问权限
			m.setAccessible(true);
//			调用当前类实例的methodName方法
			m.invoke(this, req,resp);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	private void list(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在用一个servlet中调用list方法");
	}
	
	private void load(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方法");
	}
	

}

Action

package com.cdl.framework;

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


public interface Action {
	void execute(HttpServletRequest req,HttpServletResponse resp);
}

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

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

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