有些项目我们可以采用“前端+后端”这种分离的方式进行开发。本篇博文,我将介绍我最近在用的spring boot后端的层次以及使用方法。
首先,我们使用的工具是IntelliJ IDEA,这里我们已经建立好了一个spring boot的工程,工程目录如下:
application.yml中配置了与数据库的连接字符串,数据库的密码,系统日志保存的位置,文件上传目录,以及后端服务所运行的端口号。
这里,我们有6个需要注意的文件夹,按照上图中的顺序从上到下依次是controller、dao、entity、service、impl和mapper。
下面,我将分别介绍这6个重要的文件夹中所存放的文件的作用:
entity:
实体层。这里写的是实体类的定义,数据表中的每个字段名都作为实体类中的一个成员变量,然后这里再实现每个成员变量的get和set的方法。
controller:
控制层。控制层中定义了提供给前端的接口的路径,前端使用本接口的方法(GET还是POST),以及需要传输的参数。前端发送来的请求首先传到“控制器”中,这里接受前端传来的请求,并将这个请求传到service层(调用了service层的接口)。
例如下图所示,前端调用的路径是http://127.0.0.1:8088/mlusers/loginMlusers,使用的是POST方法,参数有两个,分别是username和password。因为是@RequestParam,所以参数是通过url传输的,例如http://127.0.0.1:8088/mlusers/loginMlusers?username=admin&password=123456
除了@RequestParam这种传递参数的方法外,还有@RequestBody,这种是在http包的body层传输,格式是JSON格式,好处是在url中看不到参数的值因而更安全。
service:
服务层。该层定义了相关服务的接口,只是接口,实现接口的代码放在impl文件夹中。接受从控制层controller中传递过来的请求,然后将请求传递给DAO层。
impl:
服务层service接口的实现。在这里调用了DAO接口,将需要操作数据库的请求传递给DAO层。
dao:
数据库对后端服务的接口层。接受来自服务层service的请求,将请求传递给mapper。
这里@Param("username")中的username对应的是mapper层中#{}中的参数。
mapper:
数据库操作层,这里写SQL语句,实现dao接口,接受dao接口传入的参数并执行SQL语句操作数据库。
前面介绍了spring boot后端的层次结构,下面来简单说一下如何在前端调用后端的接口,也就是回答“前端和后端如何连接起来”的问题。
我们拿react-native前端举例。这是@RequestParam的情况,body部分写的是“key=val”这样的形式,headers中的Content-Type要用application/x-www-form-urlencoded哦!
fetch('http://127.0.0.1:8088/mlusers/loginMlusers',{ method:'POST', headers:{ 'Accept': 'application/json', 'Content-Type':'application/x-www-form-urlencoded'
}, body:"username=admin&password=123456",
}).then((response)=>response) //解析数据
.then((responseJson)=>{ //收到的数据
let usrname = JSON.parse(responseJson._bodyText).loginname; let pwd = JSON.parse(responseJson._bodyText).loginpwd; alert("用户名:"+usrname+" 密码:"+pwd);
}).catch((error)=>{ //错误处理
alert("连接服务器失败!");
});
如果是@RequestBody,那么将Content-Type改成application/json,然而body部分要写成形如这样的形式:
body: JSON.stringify({loginname:"admin"}),