初识MVC

发布于:2024-04-30 ⋅ 阅读:(29) ⋅ 点赞:(0)

初识MVC

理论部分

今天第一次学MVC,拿到一个练手项目。现在来记录一下学习过程。

项目的背景就是个学生管理系统。我只做后端。
从大的来说MVC将应用程序分为三个主要组件(部分):

模型(Model)是应用程序的主要部分,包含了业务逻辑和数据。model往往代表了对象和数据库之间的数据连接。这里就对应下面的Service,dao。

视图(View)是model的可视化表示。可以是图形用户界面(GUI),而在 Web应用中,view通常是指渲染数据的 HTML。

控制器(Controller)是连接model和view的部分。它接收用户对view的输入,并将这些输入转化为对model的操作。

请添加图片描述
基于上图从左到又进行介绍。
最外面就是用户。然后到view层, 然后到controller层,service层,dao层,model层。

view层:就是可视化界面。是GUI用户图形化界面,在Web中就是用于渲染数据的HTML。

controller层:负责处理来自view层的交互事件,view要完成业务操作,就要请求controller层。然后controller就写了一个该交互事件的逻辑框架,也就是这个事件,有各种需求,每个需求对应一个函数,里面的具体的各种需求逻辑代码包给Service层实现。

service层:也叫业务层。这个包中的类通常实现应用程序的核心业务逻辑。在这里会进行数据操作,但是具体的数据操作并不在这里实现,而是交给dao层实现。这里只进行获取数据的前后的逻辑代码的编写。

dao层:这个包中的类通常负责直接与数据(库)进行交互,service和dao共同组成了MVC当中的"model"组件。可以这么理解:在Service层中用到的数据操作,全部都要写到这里来,因为只有dao层才能进行数据的实际操作。包括对数据的增删查改。

model层:这个包中的类通常代表应用程序的数据模型,也就是用户需要操作的数据。


实操部分

今天的目标是完成登录界面的逻辑。

View和controller

用户访问在view触发了登录事件。然后view就请求controller进行完成。controller中定义了大致的事件处理逻辑,来完成这个事件。
然后这个事件的需求大致如下。1.根据输入的用户名,查找用户名是否存在。
2.在用户名已存在的前提下,校验密码是否正确。3.// 用户名密码皆正确,登录成功。

一个需求就可以看成一个函数,用函数去完成功能。

这个就是处理这个事件的具体逻辑。这些需求的具体业务并不在这里实现。而是交给下一层的业务层Service进行实现,因为这些需求就是核心业务。

Service

然后的具体功能的函数要在这里实现,这里是业务逻辑的核心。简单来说上面分析出来的需求函数,要在这里实现。

需要注意的是在这里会进行数据操作,但是具体的数据操作并不在这里实现,而是交给dao层实现。这里只进行获取数据的前后的逻辑代码的编写。

简单的说:需求逻辑确实是在这里写,但是你的逻辑中如果有涉及到数据的访问操作,那这个数据访问操作你只能调用数据处理函数。然后这个数据处理函数全部放在dao层。也就是调用dao层的函数完成数据操作。

dao

你在Service里面想完成什么样的数据操作,那就把这个操作的函数写到这里来。用的时候就来这里调用。

model

说白了数据全存在这里,dao层中会访问到这个层定义的各种数据。


比如今天的作业:
dao层:接口添加两个方法,然后在dao层的实现类实现这两个方法。

getAllnotNullUser用户获取所有非空用户。
byUsernameGetPassword通过用户名获取用户的密码。

@Override
//获取所有的已存在不为空的用户。
public User[] getAllnotNullUser(){
    User[] users = UserData.USERS;
    int count = 0;
    for(int i = 0;i< users.length;i++){
        if(users[i]!=null){
            count++;
        }
    }
    User[] hasExistUsers = new User[count];
    for(int i = 0;i<count;i++){
        hasExistUsers[i] = users[i];
    }

    return hasExistUsers;
}

//通过账户名获取账户的密码。
@Override
public String byUsernameGetPassword(String account) {
    String backPassword = "";
    for(int i =0;i<UserData.USERS.length;i++){
        if(UserData.USERS[i].getUsername().equals(account)){
            backPassword = UserData.USERS[i].getPassword();
            return backPassword;
        }
    }
    return null;
}

然后在Service层调用这两个数据操作功能,进一步完成功能。

public boolean checkUserExist(String usernameInput) {
    // TODO 待实现
    //调用dao层获取所有已经存在的用户数据.
    //然后进行遍历,遍历的过程中匹配用户的输入是否成功匹配。
    User[] allnotNullUser = userDao.getAllnotNullUser();
    for(int i = 0;i<allnotNullUser.length;i++){
        if(allnotNullUser[i].getUsername().equals(usernameInput)){
            return true;
        }
    }

    return false;
}

public boolean checkPwdUsernameExists(User user) {
    // TODO 待实现
    //由于用户已经存在了,那么直接从user里面取出账户名
    //然后调用dao中的操作,通过用户名获取目标用户的密码。
    //然后回到这里和user的密码进行匹配。
    String correctPassword = userDao.byUsernameGetPassword(user.getUsername());
    if(correctPassword.equals(user.getPassword())){
        return true;
    }


    return false;
}

到这里登录功能就已经完成了。


网站公告

今日签到

点亮在社区的每一天
去签到