SpringBoot结合restful实现发送PUT、DELETE、GET、POST请求
1、Restful风格
Web开发的过程中,method常用的值是get和post,可事实上,method值还可以是put和delete等等其他值。
restful风格:
URL就都使用一样的 “/categories”,区别只是在于method不同,服务器根据method的不同来判断浏览器期望做的业务行为
2、创建Maven Web项目
文档结构图如下
3、导入jar包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.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>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- servlet依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat的支持. -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- springboot test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
4、增加application.properties
在src/main/resources 目录下增加 application.properties文件
#视图解析器的配置
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
#数据库的相关配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#表示自动更新表结构
spring.jpa.properties.hibernate.hbm2ddl.auto=update
5、创建Pojo
package com.how2java.springboot.pojo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity //表示是一个实体类
@Table(name="category_") //对应数据库中的表名
public class Category {
@Id //主键
@Column(name="id") //数据库中的列名
@GeneratedValue(strategy=GenerationType.IDENTITY) //主键生成策略,自动增长
private int id;
@Column(name="name")
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
6、DAO层,数据库访问层使用JPA
package com.how2java.springboot.dao;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import com.how2java.springboot.pojo.Category;
public interface CategoryDAO extends JpaRepository<Category,Serializable> {
}
7、添加SpringBoot启动类
package com.how2java.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Start {
public static void main(String[] args) {
SpringApplication.run(Start.class, args);
}
}
8、编写Controller层
package com.how2java.springboot.Controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.DeleteMapping;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.how2java.springboot.dao.CategoryDAO;
import com.how2java.springboot.pojo.Category;
/**
* @author 86182
* @verion:1.0
* @description:
*/
@Controller
public class CategoryController {
@Autowired
CategoryDAO dao;
@GetMapping("/categories")
//1. 在参数里接受当前是第几页 start ,以及每页显示多少条数据 size。 默认值分别是0和5。
public String listCategory(Model m,@RequestParam(value="start",defaultValue="0")int start,
@RequestParam(value="size",defaultValue="5")int size){
// 如果 start 为负,那么修改为0. 这个事情会发生在当前是首页,并点击了上一页的时候
start=start<0?0:start;
//spring data JPA 按照id降序
Sort sort=new Sort(Sort.Direction.DESC,"id");
// 根据start,size和sort创建分页对象
Pageable pageable=new PageRequest(start, size, sort);
/**
*根据这个分页对象获取结果page
*在这个page对象里,不仅包含了分页信息,还包含了数据信息,即有哪些分类数据。
* 这个可以通过getContent()获取出来
*/
Page<Category>page=dao.findAll(pageable);
m.addAttribute("page",page);
return "listCategory";
}
/**
* post提交请求
* @param c
* @return
*/
@PostMapping("/categories")
public String addCategory(Category c){
dao.save(c);
return "redirect:/categories";
}
/**
* delete请求
* @param c
* @return
*/
@DeleteMapping("/categories/{id}")
public String delete(Category c){
dao.delete(c);
return "redirect:/categories";
}
/**
* get请求
* @param m
* @param id
* @return
* @PathVariable 要绑定到的路径变量的名称
*/
@GetMapping("/categories/{id}")
public String editCategory(Model m,@PathVariable(name="id")int id){
Category c=dao.getOne(id);
m.addAttribute("c",c);
return "editCategory";
}
/**
* update请求
* @param c
* @return
*/
@PutMapping("/categories/{id}")
public String updateCategory(Category c){
//JPA 新增和修改用的都是save. 它根据实体类的id是否为0来判断是进行增加还是修改
dao.save(c);
return "redirect:/categories"; //重定向到列表
}
}
9、 列表页面
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8" isELIgnored="false"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>产品列表页面</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script>
$(function(){
$(".delete").click(function(){
var href=$(this).attr("href");
//url修改为categories/id
//点击超链后,会使用form提交,并且提交_method的值为delete,以达到和增加类似的效果
$('#formdelete').attr('action',href).submit();
return false;
});
});
</script>
<style>
td{
padding:10px;
}
div,form{
width:230px;
margin:auto;
}
</style>
</head>
<body>
<table align="center" border="1" cellspacing="0">
<tr>
<td>id</td>
<td>name</td>
<td>编辑</td>
<td>删除</td>
</tr>
<!--page.getContent遍历当前页面的Category对象。-->
<c:forEach items="${page.content }" var="c">
<tr>
<td>${c.id }</td>
<td>${c.name }</td>
<td>
<a href="categories/${c.id }">编辑</a>
</td>
<td>
<a href="categories/${c.id }" class="delete">删除</a>
</td>
</tr>
</c:forEach>
</table>
<br>
<div>
<a href="?start=0">首页</a>
<!-- 在分页的时候通过page.number获取当前页面-->
<a href="?start=${page.number-1 }">上一页</a>
<a href="?start=${page.number+1 }">下一页</a>
<!--page.totalPages获取总页面数 -->
<a href="?start=${page.totalPages-1 }">末页</a>
</div>
<form action="categories" method="post">
<input name="name">
<input type="submit" value="提交">
</form>
<form action="" method="post" id="formdelete">
<!-- 需要在页面上添加隐藏域告诉controller此请求是哪种请求方式: -->
<input type="hidden" value="DELETE" name="_method">
</form>
</body>
</html>
10、列表编辑页面
需要使用的是Restful风格,但是浏览器使用form提交信息的时候只支持GET和POST。
因为SpringBoot是SpringBoot自动配置好HiddenHttpMethodFilter 的,不需要像SpringMvc一样配置。
form标签下添加以下input标签即可,value值就是指定的请求方式
form 下增加 filed, 虽然这个form的method是post, 但是springmvc看到这个_method的值是put后,
会把其修改为put.
<input type="hidden" name="_method" value="PUT">
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>产品编辑页面</title>
</head>
<body>
<form action="/categories/${c.id}" method="post">
<input name="_method" value="PUT" type="hidden">
<input name="name" value="${c.name }">
<input type="submit" value="提交">
</form>
</body>
</html>