什么是mvc
1、什么是mvc
Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里,在改进和个性化定制界面的及用户交互的时候,不需要重新编写业务逻辑。mvc用于映射传统的输入、处理、输出功能在一个逻辑的图形用户界面的结构中。
1、mvc就是类似三层的一种架构,主要采用封装(分层)的思想,来降低耦合度,从而使我们的系统更灵活,扩展性更好。
2、model是应用程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据。
3、view是应用程序中处理数据显示的部分。通常视图是依据数据模型创建的。
4、controller是应用程序中处理数据交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送。
核心思想: 各司其职
计算器示例
1、定义一个子控制器
/**
* 子控制器
* 专门用来处理业务逻辑
* @author zrh
*
*/
public interface Action {
void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException ;
}
2、定义一个实体类
public class Cal {
private String num1;
private String num2;
public String getNum1() {
return num1;
}
public void setNum1(String num1) {
this.num1 = num1;
}
public String getNum2() {
return num2;
}
public void setNum2(String num2) {
this.num2 = num2;
}
public Cal(String num1, String num2) {
super();
this.num1 = num1;
this.num2 = num2;
}
public Cal() {
}
}
3、写4个具体的子控制器,分别是AddCalAction.java(+)DelCalAction.java(-)CCalAction.java(*)ChuCalAction.java(/)
代码分别如下:
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);
}
}
public class DelCalAction 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);
}
}
public class CCalAction 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);
}
}
public class ChuCalAction 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);
}
}
4、首先定义一个主控制器
/**
* 主控制器
* @author zrh
*
*/
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = -6096327977259690463L;
private Map<String, Action> actionMap = new HashMap<>();
public void init() {
actionMap.put("/addCal", new AddCalAction());
actionMap.put("/delCal", new DelCalAction());
actionMap.put("/cCal", new CCalAction());
actionMap.put("/chuCal", new ChuCalAction());
}
@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 {
init();
String url = req.getRequestURI();
url = url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));
Action action = actionMap.get(url);
action.execute(req, resp);
}
}
配置一下
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>com.zrh.framework.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
5、最后写一个提交表单cal
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function doSub(val) {
if(val==1){
calForm.action = "${pageContext.request.contextPath }/addCal.action";
}
else if(val==2){
calForm.action = "${pageContext.request.contextPath }/delCal.action";
}
else if(val==3){
calForm.action = "${pageContext.request.contextPath }/cCal.action";
}
else{
calForm.action = "${pageContext.request.contextPath }/chuCal.action";
}
calForm.submit();
}
</script>
</head>
<body>
<form id="calForm" name="calForm" action="${pageContext.request.contextPath }/addCal.action">
num1:<input type="text" name="num1"/></br>
num2:<input type="text" name="num2"/></br>
<button onclick="doSub(1)">+</button>
<button onclick="doSub(2)">-</button>
<button onclick="doSub(3)">*</button>
<button onclick="doSub(4)">/</button>
</form>
</body>
</html>
输出结果分别为:
2、mvc的优点
(1)多个视图共享一个模型,大大提高代码的可重用性。
(2)三个模块相互独立,改变其中一个不会影响其他两,所以依据这种设计模式能构建良好的松耦合性的组件。
(3)控制器提高了应用程序的灵活性和可控制性。控制器可以用来连接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提高强有力的手段。
使用MVC的目的
使用的MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
总结:
主控制器:查看是否有对应的子控制器来处理用户请求,如果就调用子控制器 来处理请求;没有就报错,就处理不了请求
子控制器:就是处理用户请求用的