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 输入用户名密码验证