Skip to content

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 的格式返回。

  1. pom依赖
xml
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
  1. 简化配置
  • 使用 @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 序列化模块‌。
  1. 启动类
java
@SpringBootApplication
public class SpringBootWebApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootWebApplication.class, args);
    }
}

启动测试,访问

text
http://localhost:8080/getUser

image.png

二、数据库操作

在这里我们重点讲述 Mysql、spring mybatis 的使用,下面简单介绍一下如何在 Spring Boot 中使用。

  1. 添加依赖文件
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>
  1. 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文件夹下
  1. 添加实体类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();
}
  1. 添加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);

}
  1. 添加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);
    }
}
  1. 修改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();
    }
}
  1. 添加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>
  1. 测试

启动项目,分别访问效果

text
http://localhost:8080/insert

image.png

text
http://localhost:8080/update

image.png

text
http://localhost:8080/findAll

image.png

text
http://localhost:8080/delete

image.png

三、渲染层

Spring Boot 推荐使用 Thymeleaf 来代替 Jsp。

Thymeleaf 介绍 Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 JSP,Velocity,FreeMaker 等,它也可以轻易的与 Spring MVC 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

  1. 添加Thymeleaf依赖
xml
		<!-- freemarker的依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>
  1. 配置文件
yaml
spring:
  # freemarker配置
  freemarker:
    cache: false  #关闭模板缓存,方便测试
    settings:
      template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
    suffix: .html               #指定Freemarker模板文件的后缀名
    template-loader-path: classpath:/templates
  1. 添加渲染层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";
    }
}
  1. 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>
  1. 测试freemarker
text
在测试前通过访问http://localhost:8080/insert添加一条测试数据
访问http://localhost:8080/list查看表格数据

image.png

通过上面的简单开发,实现了,从数据库获取数据,到控制层对数据的处理,再将处理好的数据通过freemarker展现到用户面前,完成了Spring Boot Web的一个简单闭环开发。

四、源码

02-spring-boot-web