三层架构 & MVC
三层架构
系统架构
:整合应用系统程序大的结构。- 全局观,系统的健壮性,扛得住多少的并发量
- 系统的
复杂度
-耦合度,维护困难- 架构->降低系统的耦合度
- View - 视图层
- Service - 业务逻辑层
- 约定优于配置
- 沟通成本
- DAO - 数据访问层
- 数据访问对象data access object
- 存储介质
- 安全问题
- 现实生活中的场景->计算机
业务
才是核心,技术是辅助业务的
事务
- 简单业务 - 只开启一个事务
- 普通业务 - 开启三个事务,三张表,出错,回滚
- 复杂业务 - 开启七个事务
多张表之间存在依赖关系->耦合度,强关联性
高内聚低耦合
- 一个类只做一种事
- 一个方法只做一件事
- 写且只写一次
MVC模式
- View
- Model
- 数据模型 - 实体类 entity
- 业务模型 - 业务逻辑层 service
- Controller
[演练]登录
项目创建
- 新建文件夹,使用IDEA
打开
- 新建pom.xml文件
- 交由maven托管
- 新建文件夹,创建目录结构如下
- 标记目录
- 新建包
过度设计
三层架构-访问层
- 实体类-User
package com.funtl.login.demo.entity;
public class User {
private String userName;
private String loginId;
private String loginPwd;
//alt + insert
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getLoginPwd() {
return loginPwd;
}
public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", loginId='" + loginId + '\'' +
", loginPwd='" + loginPwd + '\'' +
'}';
}
}
- UserDAO
package com.funtl.login.demo.dao;
import com.funtl.login.demo.entity.User;
public interface UserDAO {
public User login(String loginId, String loginPwd);
}
- UserDAOImpl
package com.funtl.login.demo.dao.impl;
import com.funtl.login.demo.dao.UserDAO;
import com.funtl.login.demo.entity.User;
public class UserDAOImpl implements UserDAO {
/**
* 功能描述
* @author HHQ
* @param loginId 登录ID
* @param loginPwd 登录密码
* @return java.lang.String 登录结果
*/
public User login(String loginId, String loginPwd) {
//if(loginId.equals("admin")) //不这样写,因为可能出现空指针异常
/*
//这样的写法可能导致sql注入-不安全
if("admin".equals(loginId) && "123456".equals(loginPwd)){
return "成功";
}*/
User user = null;
if("admin".equals(loginId)){
if("123456".equals(loginPwd)){
user = new User();
user.setLoginId("admin");
user.setLoginPwd("123456");
user.setUserName("HHQ");
}
}
return user;
}
}
三层架构-业务逻辑层
- get post有什么区别
- get 明文 post 密文
- get 大小有限制 post没有限制
- 参数的区别
- post能上传文件 get传输流
- 语义区别:get 获取;post 提交
- post请求 - 两次,慢; get - 一次
- step01. 问服务器是否能传递数据
- step02. 传递数据
- 幂等性
shift+f6
- service
- UserService
public interface UserService {
public User login(String loginId, String loginPwd);
}
- UserServiceImpl
public class UserServiceImpl implements UserService {
//数据访问的具体实现
private UserDAO userDAO = new UserDAOImpl();
public User login(String loginId, String loginPwd){
return userDAO.login(loginId,loginPwd);
}
}
- web/controller
登录控制器
/**
* 登录控制器
* @ClassName LoginController
* @Description TODO
*
* @Author HHQ
* @Date 2020/3/25 15:44
* @Version 1.0
*/
public class LoginController extends HttpServlet {
private UserService userService = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String loginId = req.getParameter("loginId");
String loginPwd = req.getParameter("loginPwd");
User user = userService.login(loginId, loginPwd);
//登录成功
if(user == null){
req.getRequestDispatcher("/fail.jsp").forward(req,resp);
}
//登录失败
else{
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
}
}