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>
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页