Spring Boot(二):Spring Boot Web综合开发篇
Spring Boot Web 开发主要包括接口层(C)、数据库层(M)、渲染层(V)三个层面。
一、JSON 接口层
在使用传统 Spring 开发项目,需要提供 json 接口时需要做如下配置
- 添加 jackjson 等相关 jar 包
- 配置 Spring Controller 扫描
- 对接的方法添加 @ResponseBody
传统 Spring 项目易因依赖缺失或配置错误导致 HTTP 406(不支持的媒体类型),Spring Boot 通过自动装配消除此类问题,默认类中的方法都会以 json 的格式返回。
- pom依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 简化配置
- 使用
@RestController
注解替代传统 Spring 的@Controller
+@ResponseBody
组合,默认所有方法返回 JSON 格式数据。 - 示例代码:
java
@RestController
public class UserController {
@GetMapping("/getUser")
public User getUser(){
return new User("admin", "123456", "aa@126.com", "aa123456","2017-06-07 11:12:23");
}
}
- 无需手动添加 Jackson 依赖,Spring Boot 已通过
spring-boot-starter-web
自动集成 JSON 序列化模块。
- 启动类
java
@SpringBootApplication
public class SpringBootWebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebApplication.class, args);
}
}
启动测试,访问
text
http://localhost:8080/getUser
二、数据库操作
在这里我们重点讲述 Mysql、spring mybatis 的使用,下面简单介绍一下如何在 Spring Boot 中使用。
- 添加依赖文件
xml
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 引入MySQL连接的依赖包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
- mybatis配置
yml
#数据库配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
#mybatis放置xml文件的地方,我们配置在classpath下的mapper文件夹下
mybatis:
mapper-locations: classpath*:mapper/*.xml
- mybatis放置xml文件的地方,我们配置在classpath下的mapper文件夹下
- 添加实体类User
java
public class User implements Serializable {
public User() {
}
public User(String name, String password, String mail, String date) {
this.name = name;
this.password = password;
this.mail = mail;
this.date = date;
}
// ID,用户名,密码,邮箱,注册时间
private Long id;
private String name;
private String password;
private String mail;
private String date;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
4.添加Dao层 UserDao
java
@Mapper
public interface UserDao{
/**
* @desc 插入
* @param user
*/
int insertUser(User user);
/**
* @desc 更新
* @param user
*/
void updateUser(User user);
/**
* @desc 删除
* @param id
*/
void delete(Long id);
/**
*
* @author cos
* @desc 返回结果的绑定
*/
List<User> findAll();
}
- 添加Service层UserService
java
public interface UserService {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
/**
* 插入数据
* @param user
* @return
*/
int insertUser(User user);
/**
* 更新数据
* @param user
*/
void updateUser(User user);
/**
* 删除数据
* @param id
*/
void delete(Long id);
}
- 添加Service实现层UserServiceImpl
java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> findAll() {
return userDao.findAll();
}
@Override
public int insertUser(User user) {
return userDao.insertUser(user);
}
@Override
public void updateUser(User user) {
userDao.updateUser(user);
}
@Override
public void delete(Long id) {
userDao.delete(id);
}
}
- 修改controller层 UserController
java
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getUser")
public User getUser(){
return new User("admin", "123456", "aa@126.com","2017-06-07 11:12:23");
}
/**
* 插入数据
* @return
*/
@GetMapping("/insert")
public int insert(){
User user = new User("admin", "123456", "aa@126.com", "2024-03-04 11:12:23");
user.setId(1L);
return userService.insertUser(user);
}
/**
* 更新数据
* @return
*/
@GetMapping("/update")
public String update(){
User user = new User("admin1", "1231456", "aa1@126.com", "2024-03-04 11:12:23");
user.setId(1L);
userService.updateUser(user);
return "update success";
}
/**
* 删除数据
* @return
*/
@GetMapping("/delete")
public String delete(){
userService.delete(1L);
return "delete success";
}
/**
* 查询所有数据
* @return
*/
@GetMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
}
- 添加XML 映射文件
xml
<?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.w3cjava.modules.user.dao.UserDao">
<sql id="testColumns">
a.id AS "id",
a.name AS "name",
a.password AS "password",
a.mail AS "mail",
a.date AS "date"
</sql>
<sql id="testJoins">
</sql>
<!-- 查询所有 -->
<select id="findAll" resultType="com.w3cjava.modules.user.entity.User">
select
<include refid="testColumns"/>
from user a
</select>
<!-- 新增 -->
<insert id="insertUser" parameterType="com.w3cjava.modules.user.entity.User">
INSERT INTO user (id,name, password,mail,date) VALUES (#{id},#{name}, #{password},#{mail},#{date})
</insert>
<!-- 更新 -->
<update id="updateUser" parameterType="com.w3cjava.modules.user.entity.User">
UPDATE user
SET name = #{name}, password = #{password},mail = #{mail},date = #{date}
WHERE id = #{id}
</update>
<!-- 删除 -->
<delete id="delete">
DELETE FROM user WHERE id =#{id}
</delete>
</mapper>
- 测试
启动项目,分别访问效果
text
http://localhost:8080/insert
text
http://localhost:8080/update
text
http://localhost:8080/findAll
text
http://localhost:8080/delete
三、渲染层
Spring Boot 推荐使用 Thymeleaf 来代替 Jsp。
Thymeleaf 介绍 Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 JSP,Velocity,FreeMaker 等,它也可以轻易的与 Spring MVC 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。
- 添加Thymeleaf依赖
xml
<!-- freemarker的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 配置文件
yaml
spring:
# freemarker配置
freemarker:
cache: false #关闭模板缓存,方便测试
settings:
template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
suffix: .html #指定Freemarker模板文件的后缀名
template-loader-path: classpath:/templates
- 添加渲染层controller:UserViewController,这地方是为了与UserController做区分,因UserController中使用了@RestController。
java
@Controller
public class UserViewController {
@Autowired
private UserService userService;
/**
* 查询所有数据 freemarker
* @param model
* @return
*/
@GetMapping("/list")
public String list(Model model){
model.addAttribute("userList", userService.findAll());
return "user";
}
}
- user.html
html
<!DOCTYPE html>
<html lang="" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<title>Hello freemarker!</title>
</head>
<body>
<table>
<tr>
<td>id</td>
<td>name</td>
<td>password</td>
<td>mail</td>
<td>date</td>
</tr>
<#list userList as user>
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.password}</td>
<td>${user.mail}</td>
<td>${user.date}</td>
</tr>
</#list>
</table>
</body>
</html>
- 测试freemarker
text
在测试前通过访问http://localhost:8080/insert添加一条测试数据
访问http://localhost:8080/list查看表格数据
通过上面的简单开发,实现了,从数据库获取数据,到控制层对数据的处理,再将处理好的数据通过freemarker展现到用户面前,完成了Spring Boot Web的一个简单闭环开发。