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

J2EEE基础——自定义MVCkuan

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

J2EEE基础——自定义MVCkuan

目录

一、MVC介绍

二、原始版增删改查

三、反射版增删改查

四、自定义MVC后台版本的增删改查


一、MVC介绍         ①什么是MVC?

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

        ②MVC的优点

这里是引用耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动== MVC== 的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
重用性高

一个模型能被多个视图共享,这意味着从模型传回来的数据能以多种方式显示,而不需要为每一种显示方式编写特定的代码,大大减少了代码量。
部署快

使用 MVC 模式使开发时间得到相当大的缩减,后台程序员集中精力于业务逻辑,前端程序员集中精力于表现形式上。

可维护性高

分离视图层和业务逻辑层也使得 WEB 应用更易于维护和修改。

有利软件工程化管理

由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。

        ③MVC的缺点

增加系统结构和实现的复杂性

对于简单的界面,严格遵循 MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。所以说 MVC 不适合用于小型、中型应用程序。

视图与控制器间的过于紧密的连接

视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

视图对模型数据的低效率访问

依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。


二、原始版增删改查         案例一:书籍实体的增删改查(初版)

        jsp界面:

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




Insert title here


	目前的增删改查
	增加
	删除
	修改
	查看






        如上所示,我们得知我们要进行增删改查的操作的话需要四个Servlet进行操作:

AddServlet:

package com.zq.Servlet;

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("/AddBookServlet")
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");
	}
}

DelServlet:

package com.zq.Servlet;

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("/DelBookServlet")
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");
	}

}

UpdateServlet:

package com.zq.Servlet;

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("/UpdateBookServlet")
public class UpdateBookServlet 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");
	}
}

checkServlet:

package com.zq.Servlet;

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("/CheckBookServlet")
public class CheckBookServlet 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");
	}
}

        做完这些我们就可对书籍的增删改查有所操作了,按道理当我点击增加或者删除时,控制台要进行相应的提示打印信息:

 

         但是问题就是我们的Servlet太过于多,能不能做一个Servlet里面放多个方法呢?
可以的,只要我们传参数在Servlet中判断即可:

package com.zq.Servlet;

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(request,response);
		}else if("del".equals(methodName)) {
			del(request,response);
		}else if("update".equals(methodName)) {
			update(request,response);
		}else if("check".equals(methodName)) {
			check(request,response);
		}
	}
	
	private void load(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个Servlet中,调用查询单个的方法");
	}
	
	private void check(HttpServletRequest request, HttpServletResponse response) {
			System.out.println("在同一个Servlet中,调用查看的方法");
	}

	private void update(HttpServletRequest request, HttpServletResponse response) {
			System.out.println("在同一个Servlet中,调用修改的方法");
		
	}

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

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

        然后将我们的jsp页面传值就OK:

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

 

        但是随之而来第二个问题:如果我要增加一个新的业务那我是不是要改变BookServlet中的逻辑代码?能不能不改变逻辑代码直接写一个方法呢? 

        答案就是:反射版增删改查


三、反射版增删改查

        比如我新增一个回显的业务:

增加
	删除
	修改
	查看
	回显

        还是那个Servlet只用改变一下:
 

package com.zq.Servlet;

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");

		//前台传递什么方法就调用对应的方法
		
		try {
			Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
			m.setAccessible(true);
			m.invoke(this, request,response);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		
		
//		if("add".equals(methodName)) {
//			add(request,response);
//		}else if("del".equals(methodName)) {
//			del(request,response);
//		}else if("update".equals(methodName)) {
//			update(request,response);
//		}else if("check".equals(methodName)) {
//			check(request,response);
//		}
	}
	
	private void load(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个Servlet中,调用查询单个的方法");
	}
	
	private void check(HttpServletRequest request, HttpServletResponse response) {
			System.out.println("在同一个Servlet中,调用查看的方法");
	}

	private void update(HttpServletRequest request, HttpServletResponse response) {
			System.out.println("在同一个Servlet中,调用修改的方法");
		
	}

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

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

        

 

         这样的话就可以只用写一个方法而不用改动逻辑代码了。

但是问题又来了:如果我们新增了一个类比如Order类,他也有增删改查我们是否也要这样呢?

能不能我以后不管有什么类什么业务逻辑我直接写方法就OK呢?

        答案就是这次的自定义MVC啦!


四、自定义MVC后台版本的增删改查

 首先创建一个中央控制器DispatcherServlet.java(处理所有以.action的请求)

package com.zq.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.zq.Servlet.BookAction;
import com.zq.Servlet.OrederAction;


@WebServlet("*.action")
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 OrederAction());
	}

	@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);
	}
}

然后创建字控制器Action.java
当不知道这个事情具体该怎么做,单必须要做,这样我们就用抽象

package com.zq.framework;

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


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

然后创建一个中转站,用来判断是什么请求ActionSupport.java

package com.zq.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) {
		String methodName = request.getParameter("methodName");
		//前台传递什么方法就调用对应的方法
		try {
			Method m = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
			m.setAccessible(true);
			m.invoke(this, request,response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

最后我们的servlet就只剩下纯方法代码了(需要继承中转站)BookAction.java

package com.zq.Servlet;

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

import com.zq.framework.Action;
import com.zq.framework.ActionSupport;

public class BookAction extends ActionSupport {
	
	private void load(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个Servlet中,调用查询单个的方法");
	}
	
	private void check(HttpServletRequest request, HttpServletResponse response) {
			System.out.println("在同一个Servlet中,调用查看的方法");
	}

	private void update(HttpServletRequest request, HttpServletResponse response) {
			System.out.println("在同一个Servlet中,调用修改的方法");
		
	}

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

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

        完成了我们来看看结果吧:

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




Insert title here


	目前的增删改查
	增加
	删除
	修改
	查看

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

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

        

 

 

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

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

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