Spring Boot Start
第一次看Spring Boot相关的文档,用来慢慢理解SpringBoot的机制,这里我找到一个案例,这个案例实现的功能就是:将数据库里的表格userlist,查询,然后将数据返回给前端的接口。
一个简单 Spring Boot 项目
-
1、使用Maven来配置包的依赖关系
-
2、选择项目所需要的依赖包
这里是一个很简单的项目,所以选了Spring Boot DevTools、Spring Web、JDBC API、Mybatis FrameWork、PostgreSQL Driver 五个依赖包。(新建项目配置的Maven总是出现引入问题,需要在Setting里对项目进行重新设置,第一次创建SpringBoot项目需要一段时间来下载各种依赖) -
3、直接启动是会报错的,因为没有对数据库进行配置,在resources找到application.properties文件,修改为yml文件来对数据库进行配置。
server:
port: 8088
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/databasename
username: username
password:password
- 4、启动Spring Boot ,可以看到能够正常启动,访问http://localhost:8088/这个端口,我们能够拿到一个一个启动信息,Whitelabel Error Page,因为我没有在controller中写入任何返回信息。
- 5、在com.example.projectname下创建一个controller包,然后新建一个UserController类,给这个类添加一个RestController注解(这个是Spring 的Controller与ResponseBody两个的简称)。被注解的类将视为控制器,给类的函数加上一个处理请求地址映射的注解RequestMapping(“abc”),
package com.example.demoproject.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping("abc")
public String getString(){
return "Hello World";
}
}
-
6、重新启动项目,那么在网页访问端口地址:http://localhost:8088/abc,就拿到了Hello World信息,那么最简单的一个项目就这样。
-
7、前端日常访问后端,拿到的数据一般都是类似JSON或者JSON数据,所以我们在controller包中新建一个类,RequestMapping能自动帮我们把类转换成JSON数据类型。那么我们写一个简单的UserDemo类,然后在前端http://localhost:8088/def 这个访问拿到它
public class UserDemo {
private String name;
private int age;
public UserDemo(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@RequestMapping("def")
public UserDemo getUserDemo(){
UserDemo demo = new UserDemo("demo", 100);
return demo;
}
- 8、controller包UserController层写入,那么我就能够拿到后端返回的一个对象的JSON格式的结构数据{“name”:“demo”,“age”:100}
从数据库查找到数据并返回给前端请求。
1、数据库里有一个表
2、在com.example.project下建一个entity包,用来存放跟数据库表中一样的类实体User,变量id,name,age,email,以及构造函数与Get(),Set()方法。
3、在com.example.project下建一个mapper包,用来映射数据库返回的数据,一个List类型的方法,并通过Mapper来映射出返回的数据(不太懂这个)
package com.example.demoproject.mapper;
import com.example.demoproject.entity.User;
import java.util.List;
@Mapper
public interface UserMapper {
public List<User> findAll();
}
4、在resources中创建一个mapper文件夹(跟3最好名字一样,这样容易对应查找bug),在mapper文件夹新建一个UserMapper的xml文件,因为在java中对数据库的访问很麻烦,这里使用Mybatis来对数据库进行操作(可以在IDEA创建MyBatis文件模板)。
这里的namespace就是映射的接口文件路径,select id是接口中没有实现的抽象方法findAll(),resultType就是返回后的数据类型跟entity的User类进行对应
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demoproject.mapper">
<select id="findAll" resultType="com.example.demoproject.entity.User" >
select *
from userlist;
</select>
</mapper>
5、在com.example.project中创建业务逻辑,因为上面已经返回了数据库的数据,我们可以在service包里对数据进行处理,然后再返回给前端,
package com.example.demoproject.service;
import com.example.demoproject.entity.User;
import com.example.demoproject.mapper.UserMapper;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service//这里添加一个业务处理注解
public class UserService {
//通过接口UserMapper 返回的一个对象
@Autowired//自动装配,以为UserMapper是被Mapper注解的一个接口,这里的userMapper数据就是从数据库查找到的数据。
public UserMapper userMapper;
public List<User> dbDataProcess() {
/**对数据进行一个筛选,筛选出年龄大于30的User
* 首先是被自动*/
List<User> dbOriginData = userMapper.findAll();
List<User> dataResult = dbOriginData.stream().filter(ele -> ele.getAge() > 30).collect(Collectors.toList());
return dataResult;
}
}
6、这里仍然报错,因为么有在application.yml对Mybatis进行映射,也就是com.example.project的UserMapper跟resources的mapper文件夹的UseMaper.xml没有对应上,也就是从数据库拿到的数据不知道返回给哪一个接口?
server:
port: 8088
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/databasename
username: username
password: password
mybatis:
mapper-locations: classpath:mapper/*.xml
7、在controller中给处理前端的请求映射地址加上一个注解,因为UserService是一个类,我们没有给这个类创建对象,所以在这里使用一个自动装配的一个注解来创建一个类对象@Autowired,
@Autowired
private UserService userService;
@RequestMapping("abc")
public List<User> getUser() {
return userService.dbDataProcess();
}
8、最终结果
整体的项目地址在github上。
从本地返回给前端一个页面
前面我写了一个返回一个筛选过后的一个List,Spring Boot 自动处理为一个JSON格式文件,如果我们需要返回一个页面的时候,用同样的注解方法,@RestController是不行的,因为RestController的注解==ResponseBody+Controller,当使用RestController时候是无法返回指定页面的,因为这时候配置的视图解析器internalResourceViewResolver不起作用,返回的内容就是return里的内容(一般html的名字),如果需要返回特定的页面时候,就不要使用RestController,新建一个用来返回页面的类,使用Controller来来进行注解,那么就可以了。
@Controller
public class WebUser {
@RequestMapping("hello")
public String getHTML(){
return "hello";
}
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
p{color: red;background: burlywood}
</style>
</head>
<body>
<p >
Hello world data
</p>
</body>
</html>
这里之所以能够在getHTML()这个方法返回hello.html这个页面,其实一方面是注解来对访问进行映射,还有就是通过yaml(yml)配置文件,使用thymeleaf这个包来实现了"hello"====>hello.html的映射(这里的路径是templates文件夹下的html)。
server:
port: 5439
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/test
username: postgres
password: 721123
thymeleaf:
prefix: classpath:/templates/
suffix: .html
这里还出现了一个问题就是我们在配置thymeleaf这个依赖包,感觉这里很多的配置文件就是需要使用springboot下的依赖包,而不能直接使用第三方的依赖包,thymeleaf用于MVC结构中的View层。
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.1.0.M3</version>
</dependency>
换成就能完成相应的映射,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Spring Boot 框架结构
-
java 用来存放我们的代码
-
resourece 用来存放资源,/
-
- static一般用来存放静态资源,如:css,img,js等,/templates用来存放我们的网页资源
-
- application.properties这个是整个项目的应用配置,比如项目的数据库(上面的postgreSQL数据库的返回数据配置,数据库的端口,类型,ulr,name,password),mybatis的配置(),thymeleaf的配置(上面案例的返回网页),不过一般会把它改成yml格式,这这样看其阿里更有层次
-
pom.xml这里是Maven的配置文件,用来引入所有的相关SpringBoot包,我们新建项目选择的项目比如postgresql,mybatis,thymeleaf这些东西都在这里,如果前面忘了引入,也可以通过这里的maven配置文件添加,不过这里要添加的是SpringBoot的版本,如果直接引入官方版,可能导致不能使用。
-
test 测试类 为了快速测试结果(目前还没用到),一个blog