初识restful风格

在做Web开发的过程中,method常用的值是get和post. 可事实上,method值还可以是put和delete等等其他值。
既然method值如此丰富,那么就可以考虑使用同一个url,但是约定不同的method来实施不同的业务,这就是Restful的基本考虑。
CRUD是最常见的操作,在使用Restful 风格之前,通常的增加做法是这样的:

/addCategory?name=xxx


可是使用了Restful风格之后,增加就变成了:

/categories

URL就都使用一样的 "/categories",区别只是在于method不同,服务器根据method的不同来判断浏览器期望做的业务行为

一 .web.xml

   springmvc和form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter

filter的优先级高于servlet,所以没有先后之分,但最好在servletdispatcher前,

可配置的参数为methodParam,值必须为GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE中的一个。

 <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>

 二.jsp

listCategory.jsp 做了如下修改
1. 增加
action修改为"categories"
2. 删除
2.1 url修改为categories/id
2.2 点击超链后,会使用form提交,并且提交_method的值为delete, 这样在 springmvc得到后,就会以 method=delete 处理了。

$(function(){

$(".delete").click(function(){

var href=$(this).attr("href");

$("#formdelete").attr("action",href).submit();

return false;

})

})


3. 获取
3.1 url修改为了/categories/id

4. 在最开始增加了jquery.min.js的引入

<script type="text/javascript" src="js/jquery.min.js"></script>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 
 <script type="text/javascript" src="js/jquery.min.js"></script>
 
    <script type="text/javascript">
       /*将post method 改变为delete*/
      $(function(){                     
    	   $(".delete").click(function(){
    		   var href=$(this).attr("href");
    		   $("#formdelete").attr("action",href).submit();
    		   return false;
    	   })
       }) 
   </script>
   
 <div style="width:500px;margin:0px auto;text-align:center">
	<table align='center' border='1' cellspacing='0'>
	    <tr>
	        <td>id</td>
	        <td>name</td>
	        <td>编辑</td>
	        <td>删除</td>
	    </tr>
	    <c:forEach items="${cs}" var="c" varStatus="st">
	        <tr>
	            <td>${c.id}</td>
	            <td>${c.name}</td>
	            <td><a href="categories/${c.id}">编辑</a></td>
	            <td><a class="delete" href="categories/${c.id}">删除</a></td>
	        </tr>
	    </c:forEach>
	</table>
	<div style="text-align:center">
		<a href="?start=0">首  页</a>
		<a href="?start=${page.start-page.count}">上一页</a>
		<a href="?start=${page.start+page.count}">下一页</a>
		<a href="?start=${page.last}">末  页</a>
	</div>
	
	<div style="text-align:center;margin-top:40px">
		<form method="POST" action="categories">
				分类名称: <input name="name" value="" type="text"> <br><br>
				<input type="submit" value="增加分类">
		</form>
	</div>	
 </div>

    <form id="formdelete" action="" method="POST" >
       <input type="hidden" name="_method" value="DELETE">
   </form>

action修改为了 categories/xxx
注意:form 下增加 filed, 虽然这个form的method是post, 但是springmvc看到这个_method的值是put后,会把其修改为put.

<input type="hidden" name="_method" value="PUT">

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 
 <div style="width:500px;margin:0px auto;text-align:center">
	<div style="text-align:center;margin-top:40px">
		<form method="post" action="../categories/${c.id}">
			<input type="hidden" name="_method" value="PUT">
			分类名称: <input name="name" value="${c.name}" type="text"> <br><br>
			<input type="submit" value="修改分类">
		</form>

	</div>	
 </div>

注意:

HiddenHttpMethodFilter的父类是OncePerRequestFilter,它继承了父类的doFilterInternal方法,工作原理是将jsp页面的form表单的method属性值在doFilterInternal方法中转化为标准的Http方法,即GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE,然后到Controller中找到对应的方法。例如,在使用注解时我们可能会在Controller中用于@RequestMapping(value = "list", method = RequestMethod.PUT),所以如果你的表单中使用的是<form method="put">,那么这个表单会被提交到标了Method="PUT"的方法中。

        需要注意的是,由于doFilterInternal方法只对method为post的表单进行过滤,所以在页面中必须如下设置:
 

<form action="..." method="post">
        <input type="hidden" name="_method" value="put" />
        ......
</form>


//而不是
<form action="..." method="put">
      ......
</form>

三.控制层

RequestMapping都修改为/categories,只是method各不相同。 

package com.how2java.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.how2java.pojo.Category;
import com.how2java.service.CategoryService;
import com.how2java.util.Page;

// 告诉spring mvc这是一个控制器类
@Controller
@RequestMapping("")
public class CategoryController {
	@Autowired
	CategoryService categoryService;

	@RequestMapping(value="/categories",method=RequestMethod.GET)
	public ModelAndView listCategory(Page page){
	
		ModelAndView mav = new ModelAndView();
		List<Category> cs= categoryService.list(page);
		int total = categoryService.total();
		
		page.caculateLast(total);
		
		// 放入转发参数
		mav.addObject("cs", cs);
		// 放入jsp路径
		mav.setViewName("listCategory");
		return mav;
	}
	
	@RequestMapping(value="/categories",method=RequestMethod.POST)
	public ModelAndView addCategory(Category category){
		System.out.println("category.getName():"+category.getName());
		categoryService.add(category);
		ModelAndView mav = new ModelAndView("redirect:/categories");
	    return mav;
	}	
	
	@RequestMapping(value="/categories/{id}",method=RequestMethod.DELETE)
	public ModelAndView deleteCategory(Category category){
		categoryService.delete(category);
		ModelAndView mav = new ModelAndView("redirect:/categories");
		return mav;
	}	
	@RequestMapping(value="/categories/{id}",method=RequestMethod.GET)
	public ModelAndView editCategory(Category category){
		Category c= categoryService.get(category.getId());
		ModelAndView mav = new ModelAndView("editCategory");
		mav.addObject("c", c);
		return mav;
	}	
	@RequestMapping(value="/categories/{id}",method=RequestMethod.PUT)
	public ModelAndView updateCategory(Category category){
		categoryService.update(category);
		ModelAndView mav = new ModelAndView("redirect:/categories");
		return mav;
	}	

}

猜你喜欢

转载自blog.csdn.net/qq_38930240/article/details/86478553