Spring Boot快速入门
Spring Boot 是一个快速开发框架,可以迅速搭建出一套基于 Spring 框架体系的应用,是 Spring Cloud 的基础。
Spring Boot 开启了各种自动装配,从而简化代码的开发,不需要编写各种配置文件,只需要引入相关依赖就可以迅速搭建一个应用。
特点
1、不需要 web.xml
2、不需要 springmvc.xml
3、不需要 tomcat,Spring Boot 内嵌了 tomcat
4、不需要配置 JSON 解析,支持 REST 架构
5、个性化配置非常简单
如何使用
1、创建 Maven 工程,导入相关依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
2、创建 Student 实体类
package com.southwind.entity;
import lombok.Data;
@Data
public class Student {
private long id;
private String name;
private int age;
}
3、StudentRepository
package com.southwind.repository;
import com.southwind.entity.Student;
import java.util.Collection;
public interface StudentRepository {
public Collection<Student> findAll();
public Student findById(long id);
public void saveOrUpdate(Student student);
public void deleteById(long id);
}
4、StudentRepositoryImpl
package com.southwind.repository.impl;
import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@Repository
public class StudentRepositoryImpl implements StudentRepository {
private static Map<Long,Student> studentMap;
static{
studentMap = new HashMap<>();
studentMap.put(1L,new Student(1L,"张三",22));
studentMap.put(2L,new Student(2L,"李四",23));
studentMap.put(3L,new Student(3L,"王五",24));
}
@Override
public Collection<Student> findAll() {
return studentMap.values();
}
@Override
public Student findById(long id) {
return studentMap.get(id);
}
@Override
public void saveOrUpdate(Student student) {
studentMap.put(student.getId(),student);
}
@Override
public void deleteById(long id) {
studentMap.remove(id);
}
}
5、StudentHandler
package com.southwind.controller;
import com.southwind.entity.Student;
import com.southwind.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
@RestController
@RequestMapping("/student")
public class StudentHandler {
@Autowired
private StudentRepository studentRepository;
@GetMapping("/findAll")
public Collection<Student> findAll(){
return studentRepository.findAll();
}
@GetMapping("/findById/{id}")
public Student findById(@PathVariable("id") long id){
return studentRepository.findById(id);
}
@PostMapping("/save")
public void save(@RequestBody Student student){
studentRepository.saveOrUpdate(student);
}
@PutMapping("/update")
public void update(@RequestBody Student student){
studentRepository.saveOrUpdate(student);
}
@DeleteMapping("/deleteById/{id}")
public void deleteById(@PathVariable("id") long id){
studentRepository.deleteById(id);
}
}
6、application.yml
server:
port: 9090
7、启动类
package com.southwind;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
@SpringBootApplication 表示当前类是 Spring Boot 的入口,Application 类的存放位置必须是其他相关业务类的存放位置的父级。
静态资源处理
spring boot默认加载文件的路径是:(这里加载的目录是resources下的)
/META-INF/resources/ /resources/ /static/ /public/
访问外部资源编写配置文件添加
@Configuration
public class SimpleWebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/Audio/**")
.addResourceLocations("file:E:/Java Project/bookwebsite/Audio/");
super.addResourceHandlers(registry);
}
}
内部静态资源在resources下的
@Configurationpublic class SimpleWebAppConfigurer extends WebMvcConfigurationSupport { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/Audio/**") .addResourceLocations("calsspath:/Audio"); super.addResourceHandlers(registry); }}
Spring Boot 整合 JSP
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.7.RELEASE</version></parent><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.6</version> <scope>provided</scope> </dependency></dependencies>
server: port: 8181spring: mvc: view: prefix: / suffix: .jsp
package com.southwind.controller;import com.southwind.entity.Student;import com.southwind.repository.StudentRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("/hello")public class HelloHandler { @Autowired private StudentRepository studentRepository; @GetMapping("/index") public ModelAndView index(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("index"); modelAndView.addObject("list",studentRepository.findAll()); return modelAndView; } @GetMapping("/deleteById/{id}") public String deleteById(@PathVariable("id") long id){ studentRepository.deleteById(id); return "redirect:/hello/index"; } @PostMapping("/save") public String save(Student student){ studentRepository.saveOrUpdate(student); return "redirect:/hello/index"; } @PostMapping("/update") public String update(Student student){ studentRepository.saveOrUpdate(student); return "redirect:/hello/index"; } @GetMapping("/findById/{id}") public ModelAndView findById(@PathVariable("id") long id){ ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("update"); modelAndView.addObject("student",studentRepository.findById(id)); return modelAndView; }}
<%-- Created by IntelliJ IDEA. User: southwind Date: 2019-03-21 Time: 12:02 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page isELIgnored="false" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head> <title>Title</title></head><body> <h1>学生信息</h1> <table> <tr> <th>学生编号</th> <th>学生姓名</th> <th>学生年龄</th> <th>操作</th> </tr> <c:forEach items="${list}" var="student"> <tr> <td>${student.id}</td> <td>${student.name}</td> <td>${student.age}</td> <td> <a href="/hello/findById/${student.id}">修改</a> <a href="/hello/deleteById/${student.id}">删除</a> </td> </tr> </c:forEach> </table> <a href="/save.jsp">添加学生</a></body></html>
<%-- Created by IntelliJ IDEA. User: southwind Date: 2019-03-21 Time: 12:09 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body> <form action="/hello/save" method="post"> ID:<input type="text" name="id"/><br/> name:<input type="text" name="name"/><br/> age:<input type="text" name="age"/><br/> <input type="submit" value="提交"/> </form></body></html>
<%-- Created by IntelliJ IDEA. User: southwind Date: 2019-03-21 Time: 12:09 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body> <form action="/hello/update" method="post"> ID:<input type="text" name="id" value="${student.id}" readonly/><br/> name:<input type="text" name="name" value="${student.name}"/><br/> age:<input type="text" name="age" value="${student.age}"/><br/> <input type="submit" value="提交"/> </form></body></html>
Spring Boot HTML
Spring Boot 可以结合 Thymeleaf 模版来整合 HTML,使用原生的 HTML 作为视图。
Thymeleaf 模版是面向 Web 和独立环境的 Java 模版引擎,能够处理 HTML、XML、JavaScript、CSS 等。
<p th:text="${message}"></p>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.7.RELEASE</version></parent><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.6</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency></dependencies>
server: port: 9090spring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8
package com.southwind.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/index")public class IndexHandler { @GetMapping("/index") public String index(){ System.out.println("index..."); return "index"; }}
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <h1>Hello World</h1></body></html>
如果希望客户端可以直接访问 HTML 资源,将这些资源放置在 static 路径下即可,否则必须通过 Handler 的后台映射才可以访问静态资源。
Spring Boot 数据校验
package com.southwind.entity;import lombok.Data;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;@Datapublic class User { @NotNull(message = "id不能为空") private Long id; @NotEmpty(message = "姓名不能为空") @Length(min = 2,message = "姓名长度不能小于2位") private String name; @Min(value = 16,message = "年龄必须大于16岁") private int age;}
@GetMapping("/validator")public void validatorUser(@Valid User user,BindingResult bindingResult){ System.out.println(user); if(bindingResult.hasErrors()){ List<ObjectError> list = bindingResult.getAllErrors(); for(ObjectError objectError:list){ System.out.println(objectError.getCode()+"-"+objectError.getDefaultMessage()); } }}
Spring Boot 整合 JDBC
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version></dependency>
server: port: 9090spring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
package com.southwind.entity;import lombok.Data;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;@Datapublic class User { @NotNull(message = "id不能为空") private Long id; @NotEmpty(message = "姓名不能为空") @Length(min = 2,message = "姓名长度不能小于2位") private String name; @Min(value = 60,message = "成绩必须大于60分") private double score;}
package com.southwind.repository;import com.southwind.entity.User;import java.util.List;public interface UserRepository { public List<User> findAll(); public User findById(long id); public void save(User user); public void update(User user); public void deleteById(long id);}
package com.southwind.repository.impl;import com.southwind.entity.User;import com.southwind.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import java.util.List;@Repositorypublic class UserRepositoryImpl implements UserRepository { @Autowired private JdbcTemplate jdbcTemplate; @Override public List<User> findAll() { return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class)); } @Override public User findById(long id) { return jdbcTemplate.queryForObject("select * from user where id = ?",new Object[]{id},new BeanPropertyRowMapper<>(User.class)); } @Override public void save(User user) { jdbcTemplate.update("insert into user(name,score) values(?,?)",user.getName(),user.getScore()); } @Override public void update(User user) { jdbcTemplate.update("update user set name = ?,score = ? where id = ?",user.getName(),user.getScore(),user.getId()); } @Override public void deleteById(long id) { jdbcTemplate.update("delete from user where id = ?",id); }}
package com.southwind.controller;import com.southwind.entity.User;import com.southwind.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;@RestController@RequestMapping("/user")public class UserHandler { @Autowired private UserRepository userRepository; @GetMapping("/findAll") public List<User> findAll(){ return userRepository.findAll(); } @GetMapping("/findById/{id}") public User findById(@PathVariable("id") long id){ return userRepository.findById(id); } @PostMapping("/save") public void save(@RequestBody User user){ userRepository.save(user); } @PutMapping("/update") public void update(@RequestBody User user){ userRepository.update(user); } @DeleteMapping("/deleteById/{id}") public void deleteById(@PathVariable("id") long id){ userRepository.deleteById(id); }}
Spring Boot 整合 MyBatis
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version></dependency>
server: port: 9090spring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8 datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Drivermybatis: mapper-locations: classpath:/mapping/*.xml type-aliases-package: com.southwind.entity
package com.southwind.mapper;import com.southwind.entity.User;import java.util.List;public interface UserRepository { public List<User> findAll(int index,int limit); public User findById(long id); public void save(User user); public void update(User user); public void deleteById(long id); public int count();}
<?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.southwind.mapper.UserRepository"> <select id="findAll" resultType="User"> select * from user limit #{param1},#{param2} </select> <select id="count" resultType="int"> select count(id) from user </select> <select id="findById" parameterType="long" resultType="User"> select * from user where id = #{id} </select> <insert id="save" parameterType="User"> insert into user(name,score) values(#{name},#{score}) </insert> <update id="update" parameterType="User"> update user set name = #{name},score = #{score} where id = #{id} </update> <delete id="deleteById" parameterType="long"> delete from user where id = #{id} </delete></mapper>
package com.southwind.entity;import lombok.Data;import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;@Datapublic class User { @NotNull(message = "id不能为空") private Long id; @NotEmpty(message = "姓名不能为空") @Length(min = 2,message = "姓名长度不能小于2位") private String name; @Min(value = 60,message = "成绩必须大于60分") private double score;}
package com.southwind.controller;import com.southwind.entity.User;import com.southwind.mapper.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("/mapper")public class UserMapperHandler { @Autowired private UserRepository userRepository; private int limit = 10; @GetMapping("/findAll/{page}") public ModelAndView findAll(@PathVariable("page") int page){ ModelAndView modelAndView = new ModelAndView(); int index = (page-1)*limit; modelAndView.setViewName("show"); modelAndView.addObject("list",userRepository.findAll(index,limit)); modelAndView.addObject("page",page);
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <form action="/mapper/save" method="post"> 用户姓名:<input type="text" name="name" /><br/> 用户成绩:<input type="text" name="score" /><br/> <input type="submit" value="提交"/> </form></body></html>
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <form action="/mapper/update" method="post"> 用户ID:<input type="text" name="id" th:value="${user.id}" readonly/><br/> 用户姓名:<input type="text" name="name" th:value="${user.name}" /><br/> 用户成绩:<input type="text" name="score" th:value="${user.score}" /><br/> <input type="submit" value="提交"/> </form></body></html>
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" th:src="@{/jquery-3.3.1.min.js}"></script> <script type="text/javascript"> $(function(){ $("#first").click(function(){ var page = $("#page").text(); page = parseInt(page); if(page == 1){ return false; } window.location.href="/mapper/findAll/1"; }); $("#previous").click(function(){ var page = $("#page").text(); page = parseInt(page); if(page == 1){ return false; } page = page-1; window.location.href="/mapper/findAll/"+page; }); $("#next").click(function(){ var page = $("#page").text(); var pages = $("#pages").text(); if(page == pages){ return false; } page = parseInt(page); page = page+1; window.location.href="/mapper/findAll/"+page; }); $("#last").click(function(){ var page = $("#page").text(); var pages = $("#pages").text(); if(page == pages){ return false; } window.location.href="/mapper/findAll/"+pages; }); }); </script></head><body> <h1>用户信息</h1> <table> <tr> <th>用户ID</th> <th>用户名</th> <th>成绩</th> <th>操作</th> </tr> <tr th:each="user:${list}"> <td th:text="${user.id}"></td> <td th:text="${user.name}"></td> <td th:text="${user.score}"></td> <td> <a th:href="@{/mapper/deleteById/{id}(id=${user.id})}">删除</a> <a th:href="@{/mapper/findById(id=${user.id})}">修改</a> </td> </tr> </table> <a id="first" href="javascript:void(0)">首页</a> <a id="previous" href="javascript:void(0)">上一页</a> <span id="page" th:text="${page}"></span>/<span id="pages" th:text="${pages}"></span> <a id="next" href="javascript:void(0)">下一页</a> <a id="last" href="javascript:void(0)">尾页</a><br/> <a href="/mapper/redirect/save">添加用户</a></body></html>
|