一、RESTful介绍
REST:即Representational State Transfer , (资源)表现层状态转化,是目前最流行的一种互联网软件架构。它结构清晰、符合标注、易于理解、方便扩展,所以越来越多的网站采用!
具体说,就是HTTP协议里面,四个表示操作方式的动词:
GET POST PUT DELETE
它们分别代表着四种基本操作:
- GET 用来获取资源 查询
- POST用来创建新资源 新增
- PUT用来更新资源 更新
- DELETE用来删除资源 删除
示例:
- /order/1 HTTP GET :得到id = 1 的 order
- /order/1 HTTP DELETE: 删除 id=1 的order
- /order HTTP PUT : 更新id = 1的 order
- /order HTTP POST : 新增 order
二、SpringMVC实现RESTful风格
HiddenHttpMethodFilter:浏览器form表单只支持GET和POST,不支持DELETE和PUT请求,Springmvc添加了一个过滤器,可以将这些请求转换为标准的http方法,支持GET,POST,DELETE,PUT请求!
三、RESTful风格接口开发
①HiddenHttpMethodFilter配置
web.xml添加HiddenHttpMethodFilter配置
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
控制层实现增删改查:
@Controller
@RequestMapping("/order")
public class OrderController {
OrderDao orderDao = new OrderDao();
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String list(Model model) {
// 获取用户列表
Collection<Order> all = orderDao.getAll();
model.addAttribute("orderList", all);
return "order/list";
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id) {
// 执行删除操作
System.out.println("id = " + id);
orderDao.delete(id);
return "redirect:/order/list";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getById(@PathVariable("id") Integer id, Model model) {
Order order = orderDao.get(id);
model.addAttribute("order", order);
return "order/update";
}
@RequestMapping(method = RequestMethod.PUT)
public String update(Order o) {
// 执行更新操作
Integer id = o.getId();
System.out.println("id = " + id);
orderDao.update(o);
return "redirect:/order/list";
}
@RequestMapping(method = RequestMethod.POST)
public String save(Order order) {
// 执行增加操作
orderDao.save(order);
return "redirect:/order/list";
}
}
list.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户首页</title>
</head>
<body>
<h1>获取用户列表</h1>
<table align="center" width="60%" border="1px" bordercolor="#FB5832"
CELLSPACING="0">
<tr>
<td>id</td>
<td>订单</td>
<td>金额</td>
<td>操作</td>
</tr>
<c:forEach items="${orderList }" var="order">
<tr>
<td>${order.id}</td>
<td>${order.code}</td>
<td>${order.money}</td>
<td>
<a href="javascript:void(0)"onclick="deleteById(${order.id})">删除</a>
<a href="${pageContext.request.contextPath}/order/${order.id}">更新</a>
</td>
</tr>
</c:forEach>
<a href="${pageContext.request.contextPath}/page/add">新增</a>
</table>
<form action="/order/1" method="post" id="deleteForm">
<input type="hidden" name="_method" value="DELETE" />
</form>
<script>
function deleteById(id) {
//TODO 删除
var form = document.getElementById("deleteForm");
form.action = "${pageContext.request.contextPath}/order/"+id;
form.submit();
}
</script>
</body>
</html>
需要注意: 由于doFilterInternal方法只对method为post的表单进行过滤,所以在页面中必须如下设置:
代表post请求,但是HiddenHttpMethodFilter将把本次请求转化成标准的put请求方式! name="_method"固定写法
add.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加订单</title>
</head>
<body>
<h3>添加订单</h3>
<form action="${pageContext.request.contextPath}/order" method="post">
<label for="code">订单<input id="code" type="text" name="code" /></label>
<label for="money">总金额<input id="money" type="text" name="money" /></label>
<button>添加订单</button>
</form>
</body>
</html>
update.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>更新订单</h3>
<form action="${pageContext.request.contextPath}/order" method="post">
<input type="hidden" name="_method" value="PUT" />
<label for="code">ID <input id="code" type="text" name="id"
value="${order.id}" /></label><br /> <label for="code">订单 <input
id="code" type="text" name="code" value="${order.code}" /></label><br /> <label
for="money">总金额<input id="money" type="text" name="money"
value="${order.money}" /></label><br />
<button>更新订单</button>
</form>
</body>
</html>
实体层
public class Order {
private Integer id;
private String code;
private Double money;
public Order() {
}
public Order(Integer id, String code, Double money) {
this.id = id;
this.code = code;
this.money = money;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
}
数据库访问层:
public class OrderDao {
private static Map<Integer, Order> orders = null;
// 虚拟数据
static {
orders = new HashMap<Integer, Order>();
orders.put(1, new Order(1, "订单1", 20.5));
orders.put(2, new Order(2, "订单2", 22.5));
orders.put(3, new Order(3, "订单3", 24.5));
orders.put(4, new Order(4, "订单4", 25.5));
orders.put(5, new Order(5, "订单5", 26.5));
}
public static Integer initId = 6; // 记录id
/**
* 保存/更新 order
*
* @param order
*/
public void save(Order order) {
if (order.getId() == null) {
order.setId(initId++);
}
orders.put(order.getId(), order);
}
/**
* 返回所有数据
*
* @return
*/
public Collection<Order> getAll() {
return orders.values();
}
/**
* 获取数据
*
* @param id
* @return
*/
public Order get(Integer id) {
return orders.get(id);
}
/**
* 删除
*
* @param id
*/
public void delete(Integer id) {
orders.remove(id);
}
/**
* 更新
*/
public int update(Order o) {
Order order = orders.get(o.getId());
order.setCode(o.getCode());
order.setMoney(o.getMoney());
return 1;
}
}