這一節我們開始對項目進行分層,一般來說,一個web項目的層次結構如下圖所示:

controller層為我們的控制層,用來接收用戶的請求,比如新增一個學生的信息,新增的請求最先就是走到這一層。controller層只管接收用戶的請求,不會涉及太多的業務處理操作。但凡涉及到業務處理,就交給service層來操作。所以,controller層中必然擁有某一個service層的引用。
service層主要用來處理一些業務邏輯,不做任何的數據庫操作。數據庫的操作都交給dao層來做,因此,在service層中必然擁有一個dao層的引用。
一般來說,service層和dao層中,都是直接存放的接口類,然后專門有一個包放所有接口的具體實現類,impl就是指每個接口對應的實現類。
說了這么多概念,還是讓我們一步一步來實際操作吧。首先,新建兩個包,service包和dao包。

然后,在每個包里面再新建一個impl包,用來放所有的實現類。

接下來,我們在service包里面新建一個UserService接口類,注意,是接口哦:


有了接口以后,就得有對應的實現類,接着就在impl包下面建一個該接口的實現類,注意,是java類哦:


代碼:
public class UserServiceImpl implements UserService{
}
同理,建立 UserDao 接口和 UserDaoImpl 類。

建好之后,考慮到我們的UserController中,從前台拿到了username,password,name和sex的值,思考一下如何才能把這些東西傳到dao層呢?
我們可以在controller層中加入一個service層的引用:
@Controller
public class UserController {
//用戶業務類的引用
private UserService userService = new UserServiceImpl();
@RequestMapping("/addUser")
public void addUser(HttpServletRequest request , HttpServletResponse response){
String username = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
System.out.println(username);
System.out.println(password);
System.out.println(name);
System.out.println(sex);
}
}
然后,我們需要在addUser方法里面調用service層的方法,為了避免產生過多的參數,我們先創建一個bean包,專門用來存放實體類。然后,新建一個student實體類:

package com.app.bean;
public class Student {
private int id;
private String username;
private String password;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [id=" + id + ", username=" + username + ", password=" + password + ", name=" + name + ", sex="
+ sex + "]";
}
}
Spring框架支持數據動態綁定,所以我們直接這樣寫:
@Controller
public class UserController {
//用戶業務類的引用
private UserService userService = new UserServiceImpl();
@RequestMapping("/addUser")
public void addUser(HttpServletRequest request , HttpServletResponse response,Student student){
System.out.println(student);
}
}


可見,我們使用Spring來做數據綁定是非常easy的。
然后,調用service層的方法,把這個學生數據傳遞到service中去。
UserController:
@Controller
public class UserController {
//用戶業務類的引用
private UserService userService = new UserServiceImpl();
@RequestMapping("/addUser")
public void addUser(HttpServletRequest request , HttpServletResponse response,Student student){
userService.addUser(student);
}
}
UserService:
public interface UserService {
void addUser(Student student);
}
UserServiceImpl:
public class UserServiceImpl implements UserService{
@Override
public void addUser(Student student) {
}
}
同理,在service層中又需要加入一個dao層的引用,最終希望把student對象傳遞到dao層:
UserServiceImpl :
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
@Override
public void addUser(Student student) {
userDao.addUser(student);
}
}
UserDao :
public interface UserDao {
void addUser(Student student);
}
UserDaoImpl :
public class UserDaoImpl implements UserDao {
@Override
public void addUser(Student student) {
}
}
圖解:

以上就是整個的分層結構,然后,我們繼續學生新增的業務流程,改寫一下dao層的方法:
package com.app.dao.impl;
import java.util.HashMap;
import java.util.Map;
import com.app.bean.Student;
import com.app.dao.UserDao;
import com.simple.dao.SimpleDao;
public class UserDaoImpl implements UserDao {
@Override
public void addUser(Student student) {
SimpleDao dao = new SimpleDao();
Map map = new HashMap();
map.put("id", null);
map.put("username", student.getUsername());
map.put("password", student.getPassword());
map.put("name", student.getName());
map.put("sex", student.getSex());
dao.save("db_student", "t_student", map);
}
}
因為只是一個簡單的保存操作,我們直接調用simpleDao的save即可。測試過后,是完全沒問題的。
