SpringBoot
1.创建Maven工程,导入相关依赖
<!--继承父包-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
</parent>
<dependencies>
<!--web启动jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--配置lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
</dependencies>
2.创建Student实体类
package com.xing;
import lombok.Data;
@Data
public class Student {
private Long id;
private String name;
private int age;
}
3.StudentRepository
3.1 Restful风格
查询 get
修改 put
删除 delete
增加 post
3.2 接口实现类
package com.xing.repository;
import com.xing.entity.Student;
import java.util.Collection;
public interface StudentRepository {
public Collection<Student> findAll(); //查询所有,不只一个,要用集合承接
public Student findById(long id); //查询一个,只需要用Student接就好啦
public void saveOrUpdate(Student student); //保存或者更新,不只有一个参数,要用对象封装起来,不需要返回值
public void deleteById(long id); //根据id删除,不需要返回值
}
4.StudentRepositoryImPl
package com.xing.repository.impl;
import com.xing.entity.Student;
import com.xing.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; //定义静态的map集合
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.StudentHander
package com.xing.controller;
import com.xing.entity.Student;
import com.xing.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
@RestController
@RequestMapping("/student")
public class StudentHander {
@Autowired
private StudentRepository studentRepository;
@GetMapping("/findAll") //Rest风格,查询用get
public Collection<Student> findAll(){
return studentRepository.findAll();
}
@GetMapping("/findById/{id}") //Rest风格,查询用get
public Student findById(@PathVariable("id") long id){
return studentRepository.findById(id);
}
@PostMapping("/save") //Rest风格,新增用post,响应的是json格式,要用@RequestBody展示
public void save(@RequestBody Student student){
studentRepository.saveOrUpdate(student);
}
@PutMapping("/update") //Rest风格,修改用put,响应的是json格式,要用@RequestBody展示
public void update(@RequestBody Student student){
studentRepository.saveOrUpdate(student);
}
@DeleteMapping("/deleteById/{id}") //Rest风格,删除用delete
public void deleteById(@PathVariable("id") long id){
studentRepository.deleteById(id);
}
}
6.application.yml
server:
port: 9090
7.启动类
必须在其他包之上,是父级节点
package com.xing;
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类的存放位置,必须是其他相关业务类存放位置的父级位置
SpringBoot 整合JSP
1.pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.3.3.RELEASE</version>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--整合 JSP-->
<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>
<version>9.0.43</version>
</dependency>
<!--JSTL 标准标签库-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
2.创建application.yml
server:
port: 8181
spring:
mvc:
view:
prefix: /
suffix: .jsp
3.创建Handler
3.1.Controller区别
@RestController //返回的是数据
@Controller //返回的是模型和视图
3.2.Handler实现
package com.xing.controller;
import com.xing.entity.Student;
import com.xing.repository.StudentRepository;
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("/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}") //因为超链接是get传递的,所以现在暂时不能用rest请求
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.addObject("student",studentRepository.findById(id));
modelAndView.setViewName("update");
return modelAndView;
}
}
4.index.jsp
<%--
Created by IntelliJ IDEA.
User: xingfuhao
Date: 2021/4/6
Time: 13:03
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false"%>
<html>
<head>
<title>学生信息</title>
</head>
<body>
<h1>学生信息</h1>
<table>
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>学生年龄</td>
<td>操作</td>
</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: xingfuhao
Date: 2021/4/6
Time: 13:23
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 method="post" action="/hello/save">
ID:<input type="text" name="id" /><br/>
姓名:<input type="text" name="name"/><br/>
年龄:<input type="text" name="age"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
修改
<%--
Created by IntelliJ IDEA.
User: xingfuhao
Date: 2021/4/6
Time: 13:23
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 method="post" action="/hello/update">
ID:<input type="text" name="id" value="${student.id}" readonly/><br/>
姓名:<input type="text" name="name" value="${student.name}" /><br/>
年龄:<input type="text" name="age" value="${student.age}"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
SpringBoot 整合HTML
解释:
springBoot可以结合thymeleaf模版来整合HTML,使原生的的HTML作为视图
Thymeleaf模版是面向WEB和独立环境的java模版引擎,能够处理css, html,xml,javascript 等。
<P th:text="${message}"></P> //用Thymeleaf模版展示数据在页面的p标签内
1.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springBoot01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--继承父包-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
</parent>
<dependencies>
<!--web启动jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--配置lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--Thymeleaf模版-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
</project>
2.application.yml
server:
port: 9090
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mode: HTML5
encoding: UTF-8
3.Handler
package com.xing.controller;
import com.xing.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.List;
@Controller
@RequestMapping("/index")
public class IndexHandler {
@GetMapping("/index")
public String index(Model model){
System.out.println("index....");
List<Student> list=new ArrayList<>();
list.add(new Student(1L,"幸福哈",22));
list.add(new Student(2L,"张三",23));
list.add(new Student(3L,"李四",24));
model.addAttribute("list",list);
return "/index";
}
}
4.HTML
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>你好,初心少年</h1>
<table>
<tr>
<td>学生ID</td>
<td>学生姓名</td>
<td>学生年龄</td>
</tr>
<tr th:each="student:${list}">
<td th:text="${student.id}"></td>
<td th:text="${student.name}"></td>
<td th:text="${student.age}"></td>
</tr>
</table>
</body>
</html>
5 结果展示
如果希望客户端可以直接访问HTML资源,将这些资源放在static路径下即可,否则必须通过Handler的后台映射才可以访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VcW4sXya-1618276093167)(/Users/xingfuhao/Library/Application Support/typora-user-images/image-20210406204322453.png)]
Thymeleaf的常用用法
1.赋值,拼接
@GetMapping("/index2")
public String index2(Map<String,String> map){
map.put("name","张三");
return "index2";
}
<p th:text="${name}"></p>
<p th:text="学生姓名+${name}+你好"></p>
<p th:text="|学生姓名,${name}|"></p>
2.条件判断: if/unless
th:if 表示条件成立时显示内容,th:unless 表示条件不成立时显示内容
@GetMapping("/if")
public String index3(Map<String,Boolean> map){
map.put("flag",true);
return "index";
}
<p th:if="${flag==true}" th:text="if判断成立"></p>
<p th:unless="${flag==true}" th:text="unless判断成立"></p>
3.循环
@GetMapping("/index")
public String index(Model model){
System.out.println("index....");
List<Student> list=new ArrayList<>();
list.add(new Student(1L,"幸福哈",22));
list.add(new Student(2L,"张三",23));
list.add(new Student(3L,"李四",24));
model.addAttribute("list",list);
return "/index";
}
<table>
<tr>
<td>index</td>
<td>count</td>
<td>学生ID</td>
<td>学生姓名</td>
<td>学生年龄</td>
</tr>
<tr th:each="student,stat:${list}" th:style="'background-color:'+@{${stat.odd}?'red'}">
<td th:text="${stat.index}"></td>
<td th:text="${stat.count}"></td>
<td th:text="${student.id}"></td>
<td th:text="${student.name}"></td>
<td th:text="${student.age}"></td>
</tr>
</table>
循环用的比较多
stat 是状态变量,属性:
1.index集合中元素的 index (从0开始)
2.count集合中元素的 count (从1开始)
3.size 集合的大小
4.current当前迭代变量
5.even/odd当前迭代是否为奇数/偶数(从0开始)
6.first当前迭代元素是否为第一个
7.last当前迭代元素是否为最后一个
8.URL
Thymeleaf 对于url的处理是通过@{…}进行处理的,结合 th:href th:src
{na}(na=${name})作用域后台取值
<a th:href="@{http://www.baidu.com}">跳转1</a>
<a th:href="@{http://localhost:8989/index/url/{na}(na=${name})}">跳转2</a>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P6vC18eu-1618276093173)(/Users/xingfuhao/Library/Application Support/typora-user-images/image-20210411230726075.png)]
4.内嵌对象
可以直接通过#访问
1.dates: java.util.Date的功能方法
2.calendars: java.util.Calendar的功能方法
3.numbers: 格式化数字
4.strings: java.lang.String的功能和方法
5.objects: Obgect的功能和方法
6.bools: 对布尔求值的方法
7.arrays: 操作数组的功能和方法
8.lists: 操作集合的功能和方法
9.sets: 操作集合的功能和方法
10.maps: 操作集合的功能和方法
<!--格式化时间-->
<p th:text="${#dates.format(date,'yyyy-MM-dd HH:mm:ss')}"></p>
<!--创建时间,精确到天,秒-->
<p th:text="${#dates.createToday()}"></p>
<p th:text="${#dates.createNow()}"></p>
<!--判断是否为空-->
<p th:text="${#strings.isEmpty(name)}"></p>
<!--判断list是否为空-->
<p th:text="${#lists.isEmpty(users)}"></p>
<!--输出字符串的长度-->
<p th:text="${#strings.length(name)}"></p>
<p th:text="${#strings.concat(name,name,name)}"></p>//concat拼接
<p th:text="${#strings.randomAlphanumeric(count)}"></p>
5.SpringBoot 数据校验
@GetMapping("/util")
public String util(Model model ){
model.addAttribute("name","张三");
model.addAttribute("users",new ArrayList<>());
model.addAttribute("count",22);
model.addAttribute("date",new Date());
return "test1";
}
/*BindingResult是用于接收前一个参数校验(validate或valid)错误信息,
前端将不再显示错误信息statusCode == 200, 后端也不会抛出异常*/
@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());
}
}
}
@Data
public class User {
@NotNull(message = "id不能为空") //未输入值
private int id;
@NotEmpty(message = "姓名不能为空")//输入的值为空。姓名不能为空
@Length(min = 2,message = "姓名长度不能小于2位")
private String name;
@Min(value = 16,message = "年龄不能小于16岁")
private int age;
}
SpringBoot整合JDBC
1.pom.xml
<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.21</version>
</dependency>
2.application.yml
server:
port: 8989
spring:
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
3.实体类User
@Data
public 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;
}
4.UserRepository
package com.xing.repository;
import com.xing.entity.User;
import java.util.List;
public interface UserRepository {
public List<User> findAll(); //查出好多对象,要用list集合装载,查询出来
public User findById(long id); //根据id查询出来一个对象,用User接收就好啦 ,查询出来
public void save(User user); //保存的整个对象到数据库,不用看,就不需要返回值
public void update(User user); //修改的整个对象到数据库,不用看,就不需要返回值
public void deleteById(Long id); //根据id删除数据库对象,也不用看,不需要返回值
}
5.UserRepositoryImpl
@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate; //调用jdbc的模版,写sql语句,暂时不要mybatis
@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);
}
}
6.Hander
package com.xing.controller;
import com.xing.entity.User;
import com.xing.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;
//严格遵守rest风格
// 查 get
// 增加 post
// 修改 put
// 删除 delete
@GetMapping("/findAll")
public List<User> findAll(){
return userRepository.findAll();
}
//@PathVariable是用来,对指定请求的URL路径里面的变量
@GetMapping("/findById/{id}")
public User findById(@PathVariable("id") long id){
return userRepository.findById(id);
}
//@RequestBody把前端传过来的json对象,转成Java
@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);
}
}
springBoot整合mybatis
1.创建maven工程,pom.xml依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.创建数据表
use mbtest;
create table student
(
id int primary key auto_increment,
name VARCHAR(11),
score double,
birthday date
);
3.创建实体类
package com.xing.entity;
import lombok.Data;
import java.util.Date;
@Data
public class Student {
private long id;
private String name;
private Double score;
private Date birthday;
}
失败是常事,不如意也是常事
不会让你一直高兴的,人要找虐啊
出现这种文题,不搞了
只能保存一袭
谁谁谁
4.创建StudentRepository接口
package com.xing.repository;
import com.xing.entity.Student;
import java.util.List;
public interface StudentRepository {
public List<Student> findAll();
public Student findById(Long id);
public void save(Student student);
public void update(Student student);
public void deleteById(Long id);
}
5.在resources/mapping路径下创建StudentRepository接口对应的mapper.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">
<!-- namespace的值跟mapper接口的名称保持一致 -->
<mapper namespace="com.xing.repository.StudentRepository">
<select id="findAll" resultType="Student">
select * from student
</select>
<select id="findById" resultType="Student" parameterType="java.lang.Long">
select * from student where id=#{id}
</select>
<insert id="save" parameterType="Student">
insert into student(name,score,birthday) values (#{name},#{score},#{birthday})
</insert>
<update id="update" parameterType="Student">
update student set name=#{name},score=#{score},birthday=#{birthday} where id=#{id}
</update>
<delete id="deleteById" parameterType="java.lang.Long">
delete from student where id=#{id}
</delete>
</mapper>
6.创建StudentHandler,注入StudentRepository
package com.xing.controller;
import com.xing.entity.Student;
import com.xing.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class StudentHander {
@Autowired
private StudentRepository studentRepository;
@GetMapping("/findAll")
public List<Student> findAll(){
return studentRepository.findAll();
}
@GetMapping("/findById/{id}")
public Student findById(@PathVariable("id") Long id){
return studentRepository.findById(id);
}
@PostMapping("/save") //把请求过来的json对象,转化为java对象
public void save(@RequestBody Student student){
studentRepository.save(student);
}
@PutMapping("/update") //把请求过来的json对象,转化为java对象
public void update(@RequestBody Student student){
studentRepository.update(student);
}
@DeleteMapping("/delete/{id}")
public void delete(@PathVariable("id") Long id){
studentRepository.deleteById(id);
}
}
7.application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mbtest?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:/mapping/*.xml
type-aliases-package: com.xing.entity
8.创建Application
package com.xing;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.xing.repository")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}