MVC_01

什么是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的实现代码分离,从而使同一个程序可以使用不同的表现形式。

总结:
主控制器:查看是否有对应的子控制器来处理用户请求,如果就调用子控制器 来处理请求;没有就报错,就处理不了请求
子控制器:就是处理用户请求用的

猜你喜欢

转载自blog.csdn.net/Zhangrunhong/article/details/90903523
MVC