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

自定义mvc原理

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

自定义mvc原理

目录
  • 一、什么是mvc
  • 二、目前增删改查的代码的问题以及解决方法
  • 三、自定义mvc的工作原理和打印

一、什么是mvc

什么是mvc
m:model
v:view
c:controller-

优点:分工明确,各司其职j,降低代码的耦合度

二、目前增删改查的代码的问题以及解决方法

最主要的问题:关于单个实体/表操作场景越多,需要新建的类也就越多,造成了项目中类的数量过于庞大
如何解决:写一个stuservlet,实现doget和dopost方法,然后拿到前台要调用的方法名传递到后台,前台传递说明方法,就调用当前类的对应方法,对应的方法里面调用biz里面的dao方法
如何传递方法名href=“${pageContext.request.contextPath }/stu.action?mothodName=add”

下面展示 servlet代码。

package com.yzp.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("/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("mothodName");
		//methodName可可以是add/del/edit/list/load/xxxx/yyy/aaa....
		//前台传递说明方法,就调用当前类的对应方法
		try {
			Method m = this.getClass()//stuservlet
			.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class );
			m.setAccessible(true);
			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("load".equals(methodName)) {
//			load(request,response);
//		}
	}

	private void load(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个orderservlet中调用load方法");

	}

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

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

	private void edit(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个orderservlet中调用edit方法");
		
	}

	private void list(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个orderservlet中调用list方法");
		
	}

}

下面展示jsp代码。

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

三、自定义mvc的工作原理和打印

先建一个DispatcherServlet:中央控制器
然后再建一个子控制器:Action;写一个void execute(HttpServletRequest request, HttpServletResponse response);方法
写一个stuaction用来放对应的方法
然后再写一个ActionSupport类实现Action类,然后实现execute方法;将String methodName = request.getParameter(“mothodName”);
//methodName可可以是add/del/edit/list/load/xxxx/yyy/aaa…
//前台传递说明方法,就调用当前类的对应方法
try {
Method m = this.getClass()//stuservlet
.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class );
m.setAccessible(true);
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

放进去
下面展示 DispatcherServlet代码:中央控制器

package com.yzp.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;


@WebServlet("*.action")
public class DispatcherServlet extends HttpServlet{
	private Map actions = new HashMap();
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	//程序启动时,只会加载一次
	@Override
	public void init() throws ServletException {
		actions.put("/order", new StuAction());
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//http://localhost:8080/mvc/stu.action?methodName=list
		String uri = req.getRequestURI();
		//拿到/book,最后一个/最后一个点的位置
		uri=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
		Action action = actions.get(uri);
		action.execute(req, resp);
		
	}
	
	
}

下面展示 action类代码:写一个方法

package com.yzp.framework;

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


public interface Action {

	 void execute(HttpServletRequest request, HttpServletResponse response);
}

下面展示 ActionSupport类。保存共同代码

package com.yzp.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("mothodName");
		//methodName可可以是add/del/edit/list/load/xxxx/yyy/aaa....
		//前台传递说明方法,就调用当前类的对应方法
		try {
			Method m = this.getClass()//stuservlet
			.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class );
			m.setAccessible(true);
			m.invoke(this, request,response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	
}

下面展示一些 stuaction类:用来放方法

package com.yzp.framework;

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

public class StuAction extends ActionSupport {

	private void load(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个servlet中调用load方法");

	}

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

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

	private void edit(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个servlet中调用edit方法");
		
	}

	private void list(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("在同一个servlet中调用list方法");
		
	}
	
	

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

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

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