目录
一、MVC介绍
二、原始版增删改查
三、反射版增删改查
四、自定义MVC后台版本的增删改查
一、MVC介绍 ①什么是MVC?
②MVC的优点MVC(Model View Controller)是一种软件设计的框架模式,它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离。把众多的业务逻辑聚集到一个部件里面,当然这种比较官方的解释是不能让我们足够清晰的理解什么是MVC的。用通俗的话来讲,MVC的理念就是把数据处理、数据展示(界面)和程序/用户的交互三者分离开的一种编程模式
③MVC的缺点这里是引用耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动== MVC== 的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
重用性高一个模型能被多个视图共享,这意味着从模型传回来的数据能以多种方式显示,而不需要为每一种显示方式编写特定的代码,大大减少了代码量。
部署快使用 MVC 模式使开发时间得到相当大的缩减,后台程序员集中精力于业务逻辑,前端程序员集中精力于表现形式上。
可维护性高
分离视图层和业务逻辑层也使得 WEB 应用更易于维护和修改。
有利软件工程化管理
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。
增加系统结构和实现的复杂性
对于简单的界面,严格遵循 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
目前的增删改查
增加
删除
修改
查看
类的数量过多问题的优化
增加
删除
修改
查看
回显
订单类
增加
删除
修改
查看
回显



