MVC模式之mvc的简单使用
1.什么是MVC ?
MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器。
2.MVC使用的目的
在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如Windows系统资源管理器文件夹内容的显示方式,下面两张图中左边为详细信息显示方式,右边为中等图标显示方式,文件的内容并没有改变,改变的是显示的方式。不管用户使用何种类型的显示方式,文件的内容并没有改变,达到M和V分离的目的。
3.如何正确使用MVC
3.1首先我们要知道MVC的工作原理,下面是图解
这要注意的是:不能跨层调用,只能由上一层调用下一层。
3.2:接下来我们就开始来试一下这个MVC模式。就拿加减乘除来作为我们今天的学习目标吧!
我们就从展示界面开始。
在这里我要提一下,我们的action本来是有值的,后面的值会覆盖前面的值。所以不用担心
表单提交到我们的中央控制层,web的配置我就没有展示了。
package com.zking.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.zking.web.AddCalAction;
import com.zking.web.DelCalAction;
import com.zking.web.chenCalAction;
import com.zking.web.chuCalAction;
/**
* 主控制器
*
* @author huguiyun
*
*/
public class DispatcherSelelet extends HttpServlet {
private static final long serialVersionUID = 4610137993952463128L;
private Map<String, Action> actionMap = new HashMap<>();//定义一个集合,用来存取我们的模型
@Override
public void init() throws ServletException {//我们定义的init()方法,给Map集合赋值
actionMap.put("/addcla", new AddCalAction());// 加 这里的键不能随便定义,需要与我们表单提交的地址保持一致
actionMap.put("/delCla", new DelCalAction());// 减
actionMap.put("/chenCla", new chenCalAction());// 乘
actionMap.put("/chuCla", new chuCalAction());// 除
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String url = req.getRequestURI();//找到文件的名字
url = url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));//分割
System.out.println(url);//这里是我的测试
Action action = actionMap.get(url);//取值
System.out.println(action);//这里是我的测试
action.execute(req, resp);//调用我们写的子控制器的方法,同时吧我们的数据传过去
}
}
这里需要 注意 的是:
这里的键不能随便定义,需要与我们表单提交的地址保持一致。不然我们就会报空指针异常。
在这里要提到的是,我们的子控制器是一个接口
public interface Action {
//这个是我们刚刚调用的方法
void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
}
在我们的模型层里需要实现上面我们写的接口
加
/**
* 增法
*
* @author huguiyun
*
*/
public class AddCalAction implements Action {
@Override
public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String num1 = req.getParameter("num1");//接收表单提交过来的值
String num2 = req.getParameter("num2");
req.setAttribute("res", Integer.valueOf(num1) + Integer.valueOf(num2));//算法
req.getRequestDispatcher("calRes.jsp").forward(req, resp);
}
}
加减乘除,这里只需要改变+,-,*,/ 就能实现
下面我们就来展示我们的结果:
加
减
乘
除,这里的除是直接取整