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>