mvc深入理解

01 model1开发模型

架构图

在这里插入图片描述

流程

①用户通过客户端浏览器请求服务器(form表单提交)
②服务器接收用户请求后调用JSP页(Controller)
③在JSP页面中调用JavaBean
④在JavaBean中连接及操作数据库,或者实现其他业务逻辑
⑤JavaBean将执行结果返回JSP页面
⑥服务器读取JSP页面中的内容(执行之后形成对应的HTML代码)
⑦最终结果返回给客户端

案例

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>login</title>
</head>
<body>
	<form action="loginchk.jsp">
		用户名:<input type=text name=name /><br/>
		密  码:<input type=password name=passwd /><br/>
		<input type=submit value=登录 />
		<input type=submit value=重置 />
	</form>
</body>
</html>

浏览器访问登录首页面之后,输入对应的信息,点击登录之后,表单提交。对应①的步骤
服务器接收到了该请求之后,就开始执行步骤②

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ page import="com.rjxy.domain.UserCheckBean" %>
<jsp:useBean id="user" scope="session" class="com.rjxy.domain.UserBean"/>
<jsp:setProperty name="user" property="*" />
<%
	//③在JSP页面中调用JavaBean
	UserCheckBean uc = new UserCheckBean(user);
	if(uc.validate())
	{
%>
	<jsp:forward page="welcome.jsp" />
<%
	}
	else{
		out.println("用户名或者密码错误,请<a href=\"login.jsp\">重新登录</a>");
	}
%>
package com.rjxy.domain;

//④在JavaBean中连接及操作数据库,或者实现其他业务逻辑
public class UserCheckBean {
	private UserBean user;
	public UserCheckBean() {
		
	}
	public UserCheckBean(UserBean user) {
		this.user = user;
	}
	public UserBean getUser() {
		return user;
	}
	public void setUser(UserBean user) {
		this.user = user;
	}
	public boolean validate() {
		String name = this.user.getName();
		String passwd = this.user.getPasswd();
		if("张三".equals(name) && "123".equals(passwd)) {
			return true;
		}
		//⑤JavaBean将执行结果返回JSP页面
		return false;
	}
}

package com.rjxy.domain;

public class UserBean {
	private String name;
	private String passwd;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	
}

对应的执行过程,写在了代码注释中。
在这里插入图片描述
在这里插入图片描述

优点

  • 执行效率高,开发效率比较高,适合小型项目

缺点

  • 逻辑混乱,页面混乱,维护困难,不易扩展

02 model2开发模型

图解

在这里插入图片描述

流程及案例

①用户通过客户端浏览器请求服务器

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<A href="model2Test/UserServlet">点击这里查看</A>
</body>
</html>

②服务器接收用户请求后调用Servlet

package com.rjxy.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;
import com.rjxy.domain.User;
import com.rjxy.service.UserService;

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public UserServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		UserService userService =  new UserService();
		//Servlet根据用户请求调用JavaBean处理业务
		User user = userService.find();
		request.setAttribute("user", user);
		request.getRequestDispatcher("/show.jsp").forward(request, response);
	}
}

③Servlet根据用户请求调用JavaBean处理业务

package com.rjxy.service;

import com.rjxy.dao.UserDao;
import com.rjxy.domain.User;

public class UserService {
	private UserDao userDao =  new UserDao();
	public User find() {
		return userDao.find();
	}
}

④在JavaBean中连接及操作数据库,或实现其他业务逻辑

package com.rjxy.dao;

import com.rjxy.domain.User;

public class UserDao {
	public User find() {
		//模仿
		return new User("zhangsan","123");
	}
}

⑤JavaBean将结果返回Servlet,在Servlet中将结果保存到请求对象中(在servlet中有体现)
对比两个图可以发现,service和dao在划分上都属于JavaBean
⑥由Servlet转发请求到JSP页面(在servlet中有体现)
⑦服务器读取JSP页面中的内容(将页面中静态与动态内容相结合)

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
用户名:  ${user.username}
密  码:  ${user.passwd }
</body>
</html>

⑧服务器将最终的结果返回给客户端浏览器进行显示。
在这里插入图片描述
在这里插入图片描述

优点

  • 将视图和业务分离,结构清晰,分工明确,维护方便,适合中大型项目。

缺点

  • 执行效率相对低,代码量大,重复代码比较多。

03 MVC概述

通过以上model2的案例,充分体现了MVC设计模式,下面是我认为最贴切的MVC三者的功能定义:

  • 模型:用于存放数据以及处理用户请求的业务逻辑
    解释:模型也就是model,我认为其中包括domain层,因为DAO层负责把数据拿出来放在domain层,所以说DAO层也属于M层,而业务层是对DAO层的封装重组实现具体功能的JAVABEAN,所以说他也归为M层,可见,无论是值Javabean还是处理业务的Javabean都是属于M层的,从定义上看,也是这样。
  • 视图:向控制器提交数据显示模型中的数据
    解释:向控制器提交数据从index.jsp页面就可以看出。而后者可从案例中看出,控制器把处理后的对象模型传递到request或者其他作用域中,然后在jsp页面可以用EL或者其他显示数据方式来显示数据。
  • 控制器:根据视图提出的请求,判断将请求和数据交给哪个模型处理。处理后的有关结果交给哪个视图进行更新
    这个是很明显的,控制器在model2中使用servlet写的,收到请求之后,进行处理,得先决定调用service的那个方法。处理完之后,根据处理的结果,还得写好转发到哪个视图页面进行显示。
发布了84 篇原创文章 · 获赞 90 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42512488/article/details/88851323