SpringMVC的学习(七)——RESTful风格

一、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;
	}
}

 

猜你喜欢

转载自blog.csdn.net/qq_41061437/article/details/83621279