初识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通过用户名获取用户的密码。
java
@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层调用这两个数据操作功能,进一步完成功能。
java
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;
}
到这里登录功能就已经完成了。