三层架构 & MVC

三层架构

  • 系统架构:整合应用系统程序大的结构。
  • 全局观,系统的健壮性,扛得住多少的并发量
  • 系统的复杂度-耦合度,维护困难
  • 架构->降低系统的耦合度
  • View - 视图层
  • Service - 业务逻辑层
    • 约定优于配置
    • 沟通成本
  • DAO - 数据访问层
    • 数据访问对象data access object
    • 存储介质
    • 安全问题
  • 现实生活中的场景->计算机
  • 业务才是核心,技术是辅助业务的

事务

  • 简单业务 - 只开启一个事务
  • 普通业务 - 开启三个事务,三张表,出错,回滚
  • 复杂业务 - 开启七个事务

多张表之间存在依赖关系->耦合度,强关联性

高内聚低耦合

  • 一个类只做一种事
  • 一个方法只做一件事
  • 写且只写一次

MVC模式

  • View
  • Model
    • 数据模型 - 实体类 entity
    • 业务模型 - 业务逻辑层 service
  • Controller

[演练]登录

项目创建

  • 新建文件夹,使用IDEA打开

1

  • 新建pom.xml文件

2

  • 交由maven托管

3

  • 新建文件夹,创建目录结构如下

4

  • 标记目录

5

6

7

8

  • 新建包

9

10

过度设计

三层架构-访问层

  1. 实体类-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 + '\'' +
                '}';
    }
}
  1. UserDAO
package com.funtl.login.demo.dao;

import com.funtl.login.demo.entity.User;

public interface UserDAO {
    public User login(String loginId, String loginPwd);
}
  1. 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

11

  1. 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);
    }
}
  1. 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);
        }
    }
}
posted @ 2020-03-27 17:41  索隆不喝酒  阅读(154)  评论(0编辑  收藏  举报