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

自定义MVC

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

自定义MVC

目录

一,MVC简介

二,最初版的曾删改查

三,反射版的增删改查

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


一,MVC简介

什么是mvc?

m:model------模型层

v:view-------视图层

c:controller-------控制层

优点:分工明确,各司其职

二,最初版的曾删改查

每一个方法都需要写一个类

一、以下就拿出一个类的代码来演示

package com.dengxiyan.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("/book/add")
public class AddServlet 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");
		
	}
	
}

《jsp界面代码》


存在问题:
    1.关于单个实体表操作场景越多,需要新建的类越多,造成了项目中类的数量过大
 

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




Insert title here



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



 效果图

三,反射版的增删改查

《代码演示》

package com.dengxiyan.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 {

	
	
	@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/...
		//前台传递什么方法,就调用当前类对应的方法
		try {
			Method m = this.getClass()//相当于BookServlet
				.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 lod(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  回显");
		
	}


	private void select(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  增加");
		
	}


	private void update(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  修改");

		
	}


	private void del(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  删除");
		
	}


	private void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  查看 ");
		
	}
	
}

 jsp代码


存在问题:
    当新增业务,除了要添加一个新的请求
    反射相关的代码,在每一个实体类对应的servlet中都存在
 

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




Insert title here




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



《效果图》 

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

根据以上逻辑图得知需建立以下类

DispatcherServlet(中央控制器)

主要功能:接收浏览器请求,找到对应的处理人。不处理任何业务逻辑,只接受请求

《代码演示》

提示:@WebServlet("*.action")这样写的好处在于,只要含有action路径的都能识别,就不用在多个类里写

package com.dengxiyan.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.dengxiyan.servlet.BookAction;



@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 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://location:8080/mvc/book.action?me....
		String uri = req.getRequestURI();//路径
//		要拿到/book,就是最后一个/到最会一个.的位置
		uri = uri.substring(uri.lastIndexOf("/"),
				uri.lastIndexOf("."));
		
		Action action = actions.get(uri);
		action.execute(req, resp);
	
	}
	
	
}

Action(自控制器)接口类     对应请求处理的人

《代码演示》

package com.dengxiyan.framework;

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


public interface Action {

	//封装继承多态
	 void execute(HttpServletRequest req, HttpServletResponse resp);
	
}

ActionSupport类

《代码演示》

此类需要实现子控制器(Action),同时要实现自控制器的方法execute。

package com.dengxiyan.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/...
		//前台传递什么方法,就调用当前类对应的方法
		try {
			Method m = this.getClass()//相当于BookServlet
				.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();
		}
		
	}

}

BookAction类,需要继承ActionSupport类,不用调用doGet及doPost方法,只需要执行以下方法即可,因为每一个servlet都有doget,dopost方法

《代码演示》

package com.dengxiyan.servlet;

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

import com.dengxiyan.framework.ActionSupport;

public class BookAction extends ActionSupport {

	private void lod(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  回显");
		
	}


	private void select(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  增加");
		
	}


	private void update(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  修改");

		
	}


	private void del(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  删除");
		
	}


	private void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("在同一个servlet中调用  查看 ");
		
	}

}

jsp界面代码

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




Insert title here



<%-- 目前的增删改查
增加
删除
修改
查看
 --%>




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



效果图 

效果同上,只是编码方式不

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

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

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