MVC架构

1.简介

MVC(Model-View-Controller)是软件工程中的一种软件架构,把软件系统分成三个部分:模型(Model),视图(View),控制器(Controller)

  • 模型(Model): 封装与应用逻辑相关的数据,通常与数据库直接交互
  • 视图(View): 负责数据的展示或收集数据
  • 控制器(Controller): 负责控制整个程序的流程,通常是根据不同情况调用模型来处理数据后将数据输出到视图

mvc的作用:分离职责,简化代码结构,使程序有更好的维护,重用,和扩展性

2.Servlet中的MVC实现

MVC只是一种思想,每种语言实现思路会有差异,在Servlet中表现为:JavaBean+JSP+Servlet

  • javaBean 相当于模型(Moel),其中数据模型用来表示数据对象,业务模型用来处理业务逻辑
  • JSP 相当于视图(View) 最终结果会展示到页面
  • Servlet 相当于控制器(Controller),用户通过jsp页面上的表单提交数据后,会发送请求到Servlet,Servlet会调用相应的模型来处理数据,处理完毕后渲染到jsp,响应给用户

实际开发中有更详细的拆分

  • entity 是数据实体类,是数据库表的对象表示,实体bean
  • dao 作用是与数据打交道,可以是数据库操作,也可以是文件读写操作,甚至是redis缓存操作,总之与数据操作有关的都放在这里。
  • dto 数据传输层,主要用于远程调用等需要大量传输对象的地方。假如一个表有25个数据,而显示的只要5个,所有没必要将所有的属性都传输过去。
  • service 业务逻辑层,业务逻辑层用于调用dao层,从而处理一下业务逻辑,如拼接SQL,处理事务等。
  • controller 控制器层,接收从视图层传过来的数据,然后选择service层中的某个业务来处理,接收service层返回的结果并选择视图层中的某个视图来显示结果。

举例使用javaBean + Jsp + Servlet开发登陆功能
登陆页面 login.jsp

<%--
  Created by IntelliJ IDEA.
  User: mike
  Date: 2020/12/6
  Time: 16:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>用户登录</title>
  </head>
  <body>
  <form method= "post" action="/login">
    <table align="center">
      <tr>
        <td>username:</td>
        <td><input type="text" name="username" value="${username}"/></td>
      </tr>
      <tr>
        <td>password:</td>
        <td><input type="text" name="password" value="${password}"/></td>
      </tr>
      <tr>
        <td></td>
        <td>
          <input type="submit" value="登陆"/>
          <input type="reset" value="重置"/>
          <span style="color: red">${error}</span>
        </td>
      </tr>
    </table>
  </form>
  </body>
</html>

登陆成功提示页面,success.jsp

<%--
  Created by IntelliJ IDEA.
  User: mike
  Date: 2020/12/6
  Time: 19:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆成功</title>
</head>
<body>
欢迎登陆,当前登陆用户为:${currentUser.name}
</body>
</html>

User实体类,bean

/**
 * @author mike
 * @date 2020-12-06
 * @desc user表实体类
 */
public class User {
	private int id;
	private String name;
	private String age;
	private String password;

	public void setId(int id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getName() {
		return this.name;
	}
	@Override
	public String toString() {
		return "user表实体类";
	}
}

数据访问层dao,UserDao

import java.sql.*;
import java.lang.ClassNotFoundException;

/**
 * @author mike
 * @date 2020-12-06
 * @desc user表数据访问层
 */
public class UserDao {
	public User login(String username,String password) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		User user = null;
		try {
			//连接数据库
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?character=UTF-8","root",
					"614168741");
			//查询user数据
			String sql = "select * from user_profile where name = ? and password= ?";
			ps = conn.prepareStatement(sql);
			ps.setString(1,username);
			ps.setString(2,password);
			rs = ps.executeQuery();
			while (rs.next()) {
				//封装数据到User中
				user = new User();
				user.setId(rs.getInt(1));
				user.setAge(rs.getString("age"));
				user.setName(rs.getString("name"));
				user.setPassword(rs.getString("password"));
			}
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		} finally {
			//关闭连接
			if (conn != null) {
				try {
					conn.close();
				} catch(SQLException e) {
					e.printStackTrace();
				}
			}

			if (ps != null) {
				try {
					ps.close();
				} catch(SQLException e) {
					e.printStackTrace();
				}
			}

			if (rs != null) {
				try {
					rs.close();
				} catch(SQLException e) {
					e.printStackTrace();
				}
			}
		}

		return user;
	}
}

UserServlet控制器

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author mike
 * @date 2020-12-06
 * @desc 用户登陆servlet,控制器
 */
@WebServlet(name="UserServlet",value="/login")
public class UserServlet extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}

	@Override
	public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
		//获取表单提交的数据
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		UserDao userDao  = new UserDao();
		User currentUser = userDao.login(username,password);
		if (currentUser == null) {
			request.setAttribute("error","用户名或密码错误");
			request.setAttribute("userName",username);
			request.setAttribute("password",password);
			request.getRequestDispatcher("login.jsp").forward(request,response);
		} else {
			HttpSession session = request.getSession();
			session.setAttribute("currentUser",currentUser);
			response.sendRedirect("success.jsp");
		}
	}

}

user_profile表结构

访问 http://localhost:8080/login.jsp 输入用户名密码验证

posted @ 2020-12-09 17:42  allgy  阅读(458)  评论(0编辑  收藏  举报