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

J2EE基础之自定义MVC原理

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

J2EE基础之自定义MVC原理

目录

一、MVC简介

二、优缺点:

二、最初的增删改查

三、反射版的增删改查

四、自定义mvc后台代码实现


 

一、MVC简介

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

二、优缺点:

【优点】

  1. 耦合性低,方便维护,可以利于分工协作

  2. 重用性高

【缺点】

  1. 使得项目架构变得复杂,对开发人员要求高

二、最初的增删改查
  • demo1:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


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

  •  DelBookServlet:
package ps.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{
	@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 {
		System.out.println("处理书籍的 删除业务,调动BookBiz");
	}
	
}
  • AddBookServlet:
package ps.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 req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("处理书籍的 增加业务,调动BookBiz");
	}
	
}
  • EditBookServlet:
package ps.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{
	@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 {
		System.out.println("处理书籍的 修改业务,调动BookBiz");
	}
	
}
  •  ListBookServlet:
package ps.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{
	@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 {
		System.out.println("处理书籍的 查询业务,调动BookBiz");
	}
	
}
  • 运行结果:

  •  存在的问题:

    1.关于单个实体/表操作场景越多,需要新建的类也就越多,

        造成了项目中类的数量过于庞大
    2.当新增了业务,除了要添加该业务对应的方法
    3.反射相关代码,在每一个实体类对应的servlet中都存在
    4.每一个servlet中都有doget、dopost

三、反射版的增删改查

尝试用一个servlet写共有的增删改查

package ps.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{
	@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 methodName = req.getParameter("methodName");
//		methodName可能是add/del/edit/list/load/xxx/yyy/aaa...
//		前台传递什么方法,就调用当前类的对应的方法
		try {
			Method m = this.getClass()//BookServlet.class
			.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			m.setAccessible(true);
			//调用当前类实例的methodName方法
			m.invoke(this, req,resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		
	}
	private void load(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用load方法");
	}
	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方法");
	}
	
}
  • demo2:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



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




  •  测试结果:

 

 

四、自定义mvc后台代码实现

最后就是解决测试类很多重复的dopost和doget方法
自定义mvc框架工作原理图

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




Insert title here




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



  • OrderServlet:
package ps.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{
	@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 methodName = req.getParameter("methodName");
//		methodName可能是add/del/edit/list/load/xxx/yyy/aaa...
//		前台传递什么方法,就调用当前类的对应的方法
		try {
			Method m = this.getClass()//BookServlet.class
			.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			m.setAccessible(true);
			//调用当前类实例的methodName方法
			m.invoke(this, req,resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
	}
	private void load(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个orderservlet中调用load方法");
	}
	private void list(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个orderservlet中调用list方法");
	}
	private void edit(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("再同一个orderservlet中调用edit方法");
	}
	private void del(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("再同一个orderservlet中调用del方法");
	}
	private void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("再同一个orderservlet中调用add方法");
	}
	
}
  • 所用到的包类: 

新写上面framework包里的类:

  • Action:
package framework;

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


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

}
  • ActionSupport: (用来判断是什么请求ActionSupport.java)
package 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()//BookServlet.class
			.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			m.setAccessible(true);
			//调用当前类实例的methodName方法
			m.invoke(this, req,resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
  • DispatherServlet: (创建一个中央控制器DispatcherServlet.java(处理所有以.action的请求))
package 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 ps.web.BookAction;


@WebServlet("*.action")
public class DispatherServlet 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 {
		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);
	}
}
  • bookAction:
package ps.web;

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

import framework.Action;
import framework.ActionSupport;

public class BookAction extends ActionSupport{

	private void load(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用load方法");
	}
	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方法");
	}
	
}
  • 运行结果:

 今天的知识就分享到这里啦!咱们下次再见!

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

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

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