0,项目springmvc003简介
通过使用org.springframework.web.filter.HiddenHttpMethodFilter拦截器、@RequestMapping的限制请求方式,来实现REST风格的增删改查。
1,按照项目springmvc001搭建一个基本的springmvc框架。
2,新建一个RestController类。
我们注解的访问地址都是"/rest",只在后面的请求方式中做了相应的限制,分别代表增删改查(POST、DELTE、PUT、GET)。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/restController")
public class RestController {
@RequestMapping(value = "/rest", method = RequestMethod.POST)
public String restPost() {
System.out.println("restPost");
return "success";
}
@RequestMapping(value = "/rest", method = RequestMethod.DELETE)
public String restDelet() {
System.out.println("restDelet");
return "success";
}
@RequestMapping(value = "/rest", method = RequestMethod.PUT)
public String restPut() {
System.out.println("restPut");
return "success";
}
@RequestMapping(value = "/rest", method = RequestMethod.GET)
public String restGet() {
System.out.println("restGet");
return "success";
}
}
3,在index.jsp页面添加四类请求
也是四类请求分别表示增删改查与类的方法对应。
由于浏览器只能发出get和post的请求,我们的delete、put请求中均加入了一个name="_method"的隐藏属性。这个属性就是为了将post请求转换为put和delete请求。
<body>
<form action="restController/rest" method="post">
<input type="submit" value="RestPost">
</form>
<br><br>
<form action="restController/rest" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="RestDelete">
</form>
<br><br>
<form action="restController/rest" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="RestPut">
</form>
<br><br>
<a href="restController/rest">Rest Get</a>
</body>
4,在web.xml文件中添加org.springframework.web.filter.HiddenHttpMethodFilter拦截器
该拦截器的作用就是为了,将浏览器提交过来的post请求转换为put和delete请求。
之所以要加入name="_method"属性,我们根据源代码可以知道,该拦截器截获post请求,在请求域中查找_method属性,然后更具_method获得值来修改请求域中的method属性,即可以完成对post请求到put、delete请求的转换。这样RestController的方法就能识别不同的请求。
<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>