目录
一、自定义MVC
二、如何优化增删改查
三、自定义MVC框架
一、自定义MVC
1.自定义MVC的概念:
MVC全称名是Model(模型层) View(视图层) control(控制层),这三个层级分工明确,各司其职,使MVC具有高内聚、低耦合的特点
2.自定义MVC的作用:
我们采用MVC模式可以将这些重复的代码变为一个通用的代码,可以被多个实体使用。在一定程度上MVC的三层架构模式节省了很多开发的时间,以及减少了许多重复的代码
二、如何优化增删改查
1、我们先来看看最初版的增删改查
写四个Servlet分别对应增删改查,再从JSP界面调用这四个方法
Servlet
MVC全称名是Model(模型层) View(视图层) control(控制层),这三个层级分工明确,各司其职,使MVC具有高内聚、低耦合的特点
2.自定义MVC的作用:
我们采用MVC模式可以将这些重复的代码变为一个通用的代码,可以被多个实体使用。在一定程度上MVC的三层架构模式节省了很多开发的时间,以及减少了许多重复的代码
二、如何优化增删改查
1、我们先来看看最初版的增删改查
写四个Servlet分别对应增删改查,再从JSP界面调用这四个方法
Servlet
我们采用MVC模式可以将这些重复的代码变为一个通用的代码,可以被多个实体使用。在一定程度上MVC的三层架构模式节省了很多开发的时间,以及减少了许多重复的代码
二、如何优化增删改查
1、我们先来看看最初版的增删改查
写四个Servlet分别对应增删改查,再从JSP界面调用这四个方法
Servlet
1、我们先来看看最初版的增删改查
写四个Servlet分别对应增删改查,再从JSP界面调用这四个方法
Servlet
Servlet
JSP
从这我们可以发现了问题1:对于单个实体类BOOK我们就要建立四个Servlet了,同时面对不同的需求我们的操作也就越多需要建的类也就越多,造成了一个类膨胀的问题
2、优化类膨胀问题
这里做一个假设,我们在一个Servlet里写增删改查再进行判断前台传过来的请求,从而调用相应的方法。
如图所示:
Servlet
这里做一个假设,我们在一个Servlet里写增删改查再进行判断前台传过来的请求,从而调用相应的方法。
如图所示:
Servlet
JSP:
问题2:这个方法解决了类过多的问题但是如果我们新增方法,又要不断在红圈的地方增加判断方法,这些判断方法也是一个重复的代码,所以我们还要进一步优化
3、反射版增删改查
我们使用之前所分享过的反射方法,解决判断方法的重复代码
//为了区分当前请求的目的 ,增删改查的目的 就从前台将调用的方法传达到后台
String methodNmae = request.getParameter("methodName");
//methodName可以是add也可以是del或者其他
//前台传递什么方法 就调用当前类的对应方法
try {
Method m = this.getClass()//BookServlet.class
.getDeclaredMethod(methodNmae, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
问题3:但是如果我们需要再建一个实体或多个实体时,同样会发现反射方法以及doget和dopost方法也是重复的
三、自定义MVC框架
为了更好地解决第三个问题来给大家看看MVC工作原理图
我们使用之前所分享过的反射方法,解决判断方法的重复代码
//为了区分当前请求的目的 ,增删改查的目的 就从前台将调用的方法传达到后台
String methodNmae = request.getParameter("methodName");
//methodName可以是add也可以是del或者其他
//前台传递什么方法 就调用当前类的对应方法
try {
Method m = this.getClass()//BookServlet.class
.getDeclaredMethod(methodNmae, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
问题3:但是如果我们需要再建一个实体或多个实体时,同样会发现反射方法以及doget和dopost方法也是重复的
三、自定义MVC框架
为了更好地解决第三个问题来给大家看看MVC工作原理图
三、自定义MVC框架
为了更好地解决第三个问题来给大家看看MVC工作原理图
如上图所示:自定义MVC工作原理图,图中actionservlet是中央控制器,action是子控制器,excute为子控制器中的方法。
1、我们先来定义一个中央控制器
我们将浏览器比喻为点单的顾客,那么中央控制器就是服务员,帮助浏览器找到对应的处理人
package com.zjy.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.zjy.web.BookAction;
@WebServlet("
public interface Action {
void execute(HttpServletRequest request, HttpServletResponse response);
}
ActionSupport类:是Action类的实现类,里面只要反射出要用的哪一个对象,同时反射出要用到什么方法(methodname)
package com.zjy.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 methodNmae = request.getParameter("methodName");
//methodName可以是add也可以是del或者其他
//前台传递什么方法 就调用当前类的对应方法
try {
Method m = this.getClass()//BookServlet.class
.getDeclaredMethod(methodNmae, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、BookAction类:是子控制器下的最底层,这个类只专注做一件事,就是处理浏览器发送过来的请求,可以节约大量的时间。
package com.zjy.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zjy.framework.Action;
import com.zjy.framework.ActionSupport;
public class BookAction extends ActionSupport{
private void load(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用load方法");
}
private void list(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用list方法");
}
private void edit(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用edit方法");
}
private void del(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用del方法");
}
private void add(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用add方法");
}
}
好啦今天就先分享到这里啦,明天再完善哦
我们将浏览器比喻为点单的顾客,那么中央控制器就是服务员,帮助浏览器找到对应的处理人
package com.zjy.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.zjy.web.BookAction;
@WebServlet("
public interface Action {
void execute(HttpServletRequest request, HttpServletResponse response);
}
ActionSupport类:是Action类的实现类,里面只要反射出要用的哪一个对象,同时反射出要用到什么方法(methodname)
package com.zjy.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 methodNmae = request.getParameter("methodName");
//methodName可以是add也可以是del或者其他
//前台传递什么方法 就调用当前类的对应方法
try {
Method m = this.getClass()//BookServlet.class
.getDeclaredMethod(methodNmae, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、BookAction类:是子控制器下的最底层,这个类只专注做一件事,就是处理浏览器发送过来的请求,可以节约大量的时间。
package com.zjy.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zjy.framework.Action;
import com.zjy.framework.ActionSupport;
public class BookAction extends ActionSupport{
private void load(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用load方法");
}
private void list(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用list方法");
}
private void edit(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用edit方法");
}
private void del(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用del方法");
}
private void add(HttpServletRequest request, HttpServletResponse response) {
System.out.println("在同一个Servlet中调用add方法");
}
}
好啦今天就先分享到这里啦,明天再完善哦
package com.zjy.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 methodNmae = request.getParameter("methodName");
//methodName可以是add也可以是del或者其他
//前台传递什么方法 就调用当前类的对应方法
try {
Method m = this.getClass()//BookServlet.class
.getDeclaredMethod(methodNmae, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
//调用当前类实例的methodName方法
m.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}



