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

自定义mvc

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

自定义mvc

目录

一,MVC简介1.什么是mvc

二,最初的增删改查 

三,反射版的增删改查

 四,自定义MVC工作原理图​编辑

 五,自定义mvc后台代码实现中央控制器:


铁子们今天分享的是自定义mvc先看思维导图

 

一,MVC简介
1.什么是mvc

MVC(Model View Controller)是一种软件设计的框架模式,它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离。把众多的业务逻辑聚集到一个部件里面,当然这种比较官方的解释是不能让我们足够清晰的理解什么是MVC的。用通俗的话来讲,MVC的理念就是把数据处理、数据展示(界面)和程序/用户的交互三者分离开的一种编程模式

2.mvc的作用

MVC 属架构于模式的一种,所谓架构就是如何设计一个程序的结构。MVC 将程序结构划分为三层,每一层都对外提供了可供上层调用的接口,既能维系三层之间的联系,也能保持相对的独立性

二,最初的增删改查 

增加

package com.tsq.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 {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("处理书籍的增加业务调用bookbiz");
	}

}

删除

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

}

修改

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

}

查询

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

}

 

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

三,反射版的增删改查
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


目前做增删改查方法
增加
删除
修改
查看

类数量过多优化
增加
删除
修改
查看
查看

5

package com.tsq.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()//Bookservelt.class
    .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(request,response);
//  }else if("del".equals(methodName)) {
//   del(request,response);
//  }else if("edit".equals(methodName)) {
//   edit(request,response);
//  }else if("list".equals(methodName)) {
//   list(request,response);
//  }else if("list".equals(methodName)) {
//   load(request,response);
//  }
 }
 
 private void list(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 list 方法");
 }
 private void load(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 list 方法");
 }
 
 private void edit(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 edit 方法");
 }
 
 private void del(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 del 方法");
 }
 
 private void add(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 add 方法");
 }
 
}



 四,自定义MVC工作原理图

 

中央控制器:
package com.tsq.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.tsq.web.BookAction;
 

@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{
 private Map actions = new HashMap();
 
 //程序启动时,只会加载一次
 @Override
 public void init() throws ServletException {
  actions.put("/book", new BookAction());
	 
 }
 
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  // TODO Auto-generated method stub
  super.doGet(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);
 } 
 
}

子控制器

package com.tsq.framework;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 

public interface Action {
 void execute(HttpServletRequest request,HttpServletResponse response);
}

实现子控制器接口

package com.tsq.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 request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  String methodName = request.getParameter("methodName");
  try {
   Method m = this.getClass()//Bookservelt.class
    .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();
  }
 }
}

继承子控制器实现的接口

package com.tsq.web;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.tsq.framework.Action;
import com.tsq.framework.ActionSupport;
 
public class BookAction extends ActionSupport{
 
 private void list(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 list 方法");
 }
 private void load(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 list 方法");
 }
 
 private void edit(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 edit 方法");
 }
 
 private void del(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 del 方法");
 }
 
 private void add(HttpServletRequest request, HttpServletResponse response) {
  // TODO Auto-generated method stub
  System.out.println("在同一个servlet中调用 add 方法");
 }}

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

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

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